-(function(exports) {
-
- var bootstrap = (typeof exports.bootstrap === "object") ?
- exports.bootstrap :
- (exports.bootstrap = {});
-
- bootstrap.tooltip = function() {
+(() => {
+ var __create = Object.create;
+ var __defProp = Object.defineProperty;
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+ var __getOwnPropNames = Object.getOwnPropertyNames;
+ var __getProtoOf = Object.getPrototypeOf;
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
+ var __commonJS = (cb, mod) => function __require() {
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
+ };
+ var __export = (target, all) => {
+ for (var name2 in all)
+ __defProp(target, name2, { get: all[name2], enumerable: true });
+ };
+ var __copyProps = (to, from, except, desc) => {
+ if (from && typeof from === "object" || typeof from === "function") {
+ for (let key of __getOwnPropNames(from))
+ if (!__hasOwnProp.call(to, key) && key !== except)
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
+ }
+ return to;
+ };
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
- var tooltip = function(selection) {
- selection.each(setup);
- },
- animation = d3.functor(false),
- html = d3.functor(false),
- title = function() {
- var title = this.getAttribute("data-original-title");
- if (title) {
- return title;
- } else {
- title = this.getAttribute("title");
- this.removeAttribute("title");
- this.setAttribute("data-original-title", title);
+ // node_modules/diacritics/index.js
+ var require_diacritics = __commonJS({
+ "node_modules/diacritics/index.js"(exports2) {
+ exports2.remove = removeDiacritics2;
+ var replacementList = [
+ {
+ base: " ",
+ chars: "\xA0"
+ },
+ {
+ base: "0",
+ chars: "\u07C0"
+ },
+ {
+ base: "A",
+ chars: "\u24B6\uFF21\xC0\xC1\xC2\u1EA6\u1EA4\u1EAA\u1EA8\xC3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\xC4\u01DE\u1EA2\xC5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F"
+ },
+ {
+ base: "AA",
+ chars: "\uA732"
+ },
+ {
+ base: "AE",
+ chars: "\xC6\u01FC\u01E2"
+ },
+ {
+ base: "AO",
+ chars: "\uA734"
+ },
+ {
+ base: "AU",
+ chars: "\uA736"
+ },
+ {
+ base: "AV",
+ chars: "\uA738\uA73A"
+ },
+ {
+ base: "AY",
+ chars: "\uA73C"
+ },
+ {
+ base: "B",
+ chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181"
+ },
+ {
+ base: "C",
+ chars: "\u24B8\uFF23\uA73E\u1E08\u0106C\u0108\u010A\u010C\xC7\u0187\u023B"
+ },
+ {
+ base: "D",
+ chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779"
+ },
+ {
+ base: "Dh",
+ chars: "\xD0"
+ },
+ {
+ base: "DZ",
+ chars: "\u01F1\u01C4"
+ },
+ {
+ base: "Dz",
+ chars: "\u01F2\u01C5"
+ },
+ {
+ base: "E",
+ chars: "\u025B\u24BA\uFF25\xC8\xC9\xCA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\xCB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E\u1D07"
+ },
+ {
+ base: "F",
+ chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B"
+ },
+ {
+ base: "G",
+ chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262"
+ },
+ {
+ base: "H",
+ chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D"
+ },
+ {
+ base: "I",
+ chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197"
+ },
+ {
+ base: "J",
+ chars: "\u24BF\uFF2A\u0134\u0248\u0237"
+ },
+ {
+ base: "K",
+ chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2"
+ },
+ {
+ base: "L",
+ chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780"
+ },
+ {
+ base: "LJ",
+ chars: "\u01C7"
+ },
+ {
+ base: "Lj",
+ chars: "\u01C8"
+ },
+ {
+ base: "M",
+ chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB"
+ },
+ {
+ base: "N",
+ chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E"
+ },
+ {
+ base: "NJ",
+ chars: "\u01CA"
+ },
+ {
+ base: "Nj",
+ chars: "\u01CB"
+ },
+ {
+ base: "O",
+ 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"
+ },
+ {
+ base: "OE",
+ chars: "\u0152"
+ },
+ {
+ base: "OI",
+ chars: "\u01A2"
+ },
+ {
+ base: "OO",
+ chars: "\uA74E"
+ },
+ {
+ base: "OU",
+ chars: "\u0222"
+ },
+ {
+ base: "P",
+ chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754"
+ },
+ {
+ base: "Q",
+ chars: "\u24C6\uFF31\uA756\uA758\u024A"
+ },
+ {
+ base: "R",
+ chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782"
+ },
+ {
+ base: "S",
+ chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784"
+ },
+ {
+ base: "T",
+ chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786"
+ },
+ {
+ base: "Th",
+ chars: "\xDE"
+ },
+ {
+ base: "TZ",
+ chars: "\uA728"
+ },
+ {
+ base: "U",
+ 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"
+ },
+ {
+ base: "V",
+ chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245"
+ },
+ {
+ base: "VY",
+ chars: "\uA760"
+ },
+ {
+ base: "W",
+ chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72"
+ },
+ {
+ base: "X",
+ chars: "\u24CD\uFF38\u1E8A\u1E8C"
+ },
+ {
+ base: "Y",
+ chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE"
+ },
+ {
+ base: "Z",
+ chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762"
+ },
+ {
+ base: "a",
+ chars: "\u24D0\uFF41\u1E9A\xE0\xE1\xE2\u1EA7\u1EA5\u1EAB\u1EA9\xE3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\xE4\u01DF\u1EA3\xE5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250\u0251"
+ },
+ {
+ base: "aa",
+ chars: "\uA733"
+ },
+ {
+ base: "ae",
+ chars: "\xE6\u01FD\u01E3"
+ },
+ {
+ base: "ao",
+ chars: "\uA735"
+ },
+ {
+ base: "au",
+ chars: "\uA737"
+ },
+ {
+ base: "av",
+ chars: "\uA739\uA73B"
+ },
+ {
+ base: "ay",
+ chars: "\uA73D"
+ },
+ {
+ base: "b",
+ chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182"
+ },
+ {
+ base: "c",
+ chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\xE7\u1E09\u0188\u023C\uA73F\u2184"
+ },
+ {
+ base: "d",
+ chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA"
+ },
+ {
+ base: "dh",
+ chars: "\xF0"
+ },
+ {
+ base: "dz",
+ chars: "\u01F3\u01C6"
+ },
+ {
+ base: "e",
+ chars: "\u24D4\uFF45\xE8\xE9\xEA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\xEB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u01DD"
+ },
+ {
+ base: "f",
+ chars: "\u24D5\uFF46\u1E1F\u0192"
+ },
+ {
+ base: "ff",
+ chars: "\uFB00"
+ },
+ {
+ base: "fi",
+ chars: "\uFB01"
+ },
+ {
+ base: "fl",
+ chars: "\uFB02"
+ },
+ {
+ base: "ffi",
+ chars: "\uFB03"
+ },
+ {
+ base: "ffl",
+ chars: "\uFB04"
+ },
+ {
+ base: "g",
+ chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79"
+ },
+ {
+ base: "h",
+ chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265"
+ },
+ {
+ base: "hv",
+ chars: "\u0195"
+ },
+ {
+ base: "i",
+ chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131"
+ },
+ {
+ base: "j",
+ chars: "\u24D9\uFF4A\u0135\u01F0\u0249"
+ },
+ {
+ base: "k",
+ chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3"
+ },
+ {
+ base: "l",
+ chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D"
+ },
+ {
+ base: "lj",
+ chars: "\u01C9"
+ },
+ {
+ base: "m",
+ chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F"
+ },
+ {
+ base: "n",
+ chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509"
+ },
+ {
+ base: "nj",
+ chars: "\u01CC"
+ },
+ {
+ base: "o",
+ 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"
+ },
+ {
+ base: "oe",
+ chars: "\u0153"
+ },
+ {
+ base: "oi",
+ chars: "\u01A3"
+ },
+ {
+ base: "oo",
+ chars: "\uA74F"
+ },
+ {
+ base: "ou",
+ chars: "\u0223"
+ },
+ {
+ base: "p",
+ chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1"
+ },
+ {
+ base: "q",
+ chars: "\u24E0\uFF51\u024B\uA757\uA759"
+ },
+ {
+ base: "r",
+ chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783"
+ },
+ {
+ base: "s",
+ chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282"
+ },
+ {
+ base: "ss",
+ chars: "\xDF"
+ },
+ {
+ base: "t",
+ chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787"
+ },
+ {
+ base: "th",
+ chars: "\xFE"
+ },
+ {
+ base: "tz",
+ chars: "\uA729"
+ },
+ {
+ base: "u",
+ 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"
+ },
+ {
+ base: "v",
+ chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C"
+ },
+ {
+ base: "vy",
+ chars: "\uA761"
+ },
+ {
+ base: "w",
+ chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73"
+ },
+ {
+ base: "x",
+ chars: "\u24E7\uFF58\u1E8B\u1E8D"
+ },
+ {
+ base: "y",
+ chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF"
+ },
+ {
+ base: "z",
+ chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763"
+ }
+ ];
+ var diacriticsMap = {};
+ for (i2 = 0; i2 < replacementList.length; i2 += 1) {
+ chars = replacementList[i2].chars;
+ for (j2 = 0; j2 < chars.length; j2 += 1) {
+ diacriticsMap[chars[j2]] = replacementList[i2].base;
}
- return title;
- },
- over = "mouseenter.tooltip",
- out = "mouseleave.tooltip",
- placements = "top left bottom right".split(" "),
- placement = d3.functor("top");
-
- tooltip.title = function(_) {
- if (arguments.length) {
- title = d3.functor(_);
- return tooltip;
- } else {
- return title;
}
- };
-
- tooltip.html = function(_) {
- if (arguments.length) {
- html = d3.functor(_);
- return tooltip;
- } else {
- return html;
+ var chars;
+ var j2;
+ var i2;
+ function removeDiacritics2(str2) {
+ return str2.replace(/[^\u0000-\u007e]/g, function(c) {
+ return diacriticsMap[c] || c;
+ });
}
- };
+ exports2.replacementList = replacementList;
+ exports2.diacriticsMap = diacriticsMap;
+ }
+ });
- tooltip.placement = function(_) {
- if (arguments.length) {
- placement = d3.functor(_);
- return tooltip;
- } else {
- return placement;
+ // node_modules/alif-toolkit/lib/isArabic.js
+ var require_isArabic = __commonJS({
+ "node_modules/alif-toolkit/lib/isArabic.js"(exports2) {
+ "use strict";
+ Object.defineProperty(exports2, "__esModule", { value: true });
+ var arabicBlocks = [
+ [1536, 1791],
+ [1872, 1919],
+ [2208, 2303],
+ [64336, 65023],
+ [65136, 65279],
+ [69216, 69247],
+ [126064, 126143],
+ [126464, 126719]
+ ];
+ function isArabic(char) {
+ if (char.length > 1) {
+ throw new Error("isArabic works on only one-character strings");
+ }
+ let code = char.charCodeAt(0);
+ for (let i2 = 0; i2 < arabicBlocks.length; i2++) {
+ let block2 = arabicBlocks[i2];
+ if (code >= block2[0] && code <= block2[1]) {
+ return true;
+ }
+ }
+ return false;
}
- };
-
- tooltip.show = function(selection) {
- selection.each(show);
- };
-
- tooltip.hide = function(selection) {
- selection.each(hide);
- };
-
- tooltip.toggle = function(selection) {
- selection.each(toggle);
- };
-
- tooltip.destroy = function(selection) {
- selection
- .on(over, null)
- .on(out, null)
- .attr("title", function() {
- return this.getAttribute("data-original-title") || this.getAttribute("title");
- })
- .attr("data-original-title", null)
- .select(".tooltip")
- .remove();
- };
-
- function setup() {
- var root = d3.select(this),
- animate = animation.apply(this, arguments),
- tip = root.append("div")
- .attr("class", "tooltip");
-
- if (animate) {
- tip.classed("fade", true);
+ exports2.isArabic = isArabic;
+ function isMath(char) {
+ if (char.length > 2) {
+ throw new Error("isMath works on only one-character strings");
+ }
+ let code = char.charCodeAt(0);
+ return code >= 1632 && code <= 1644 || code >= 1776 && code <= 1785;
}
-
- // TODO "inside" checks?
-
- tip.append("div")
- .attr("class", "tooltip-arrow");
- tip.append("div")
- .attr("class", "tooltip-inner");
-
- var place = placement.apply(this, arguments);
- tip.classed(place, true);
-
- root.on(over, show);
- root.on(out, hide);
+ exports2.isMath = isMath;
}
+ });
- function show() {
- var root = d3.select(this),
- content = title.apply(this, arguments),
- tip = root.select(".tooltip")
- .classed("in", true),
- markup = html.apply(this, arguments),
- innercontent = tip.select(".tooltip-inner")[markup ? "html" : "text"](content),
- place = placement.apply(this, arguments),
- outer = getPosition(root.node()),
- inner = getPosition(tip.node()),
- pos;
-
- switch (place) {
- case "top":
- pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
- break;
- case "right":
- pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
- break;
- case "left":
- pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
- break;
- case "bottom":
- pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
- break;
- }
-
- tip.style(pos ?
- {left: ~~pos.x + "px", top: ~~pos.y + "px"} :
- {left: null, top: null});
-
- this.tooltipVisible = true;
- }
-
- function hide() {
- d3.select(this).select(".tooltip")
- .classed("in", false);
-
- this.tooltipVisible = false;
- }
-
- function toggle() {
- if (this.tooltipVisible) {
- hide.apply(this, arguments);
- } else {
- show.apply(this, arguments);
- }
- }
-
- return tooltip;
- };
-
- function getPosition(node) {
- var mode = d3.select(node).style('position');
- if (mode === 'absolute' || mode === 'static') {
- return {
- x: node.offsetLeft,
- y: node.offsetTop,
- w: node.offsetWidth,
- h: node.offsetHeight
- };
- } else {
- return {
- x: 0,
- y: 0,
- w: node.offsetWidth,
- h: node.offsetHeight
- };
- }
- }
-
-})(this);
-d3 = (function(){
- var d3 = {version: "3.1.5"}; // semver
-d3.ascending = function(a, b) {
- return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
-};
-d3.descending = function(a, b) {
- return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
-};
-d3.min = function(array, f) {
- var i = -1,
- n = array.length,
- a,
- b;
- if (arguments.length === 1) {
- while (++i < n && ((a = array[i]) == null || a != a)) a = undefined;
- while (++i < n) if ((b = array[i]) != null && a > b) a = b;
- } else {
- while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined;
- while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;
- }
- return a;
-};
-d3.max = function(array, f) {
- var i = -1,
- n = array.length,
- a,
- b;
- if (arguments.length === 1) {
- while (++i < n && ((a = array[i]) == null || a != a)) a = undefined;
- while (++i < n) if ((b = array[i]) != null && b > a) a = b;
- } else {
- while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined;
- while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
- }
- return a;
-};
-d3.extent = function(array, f) {
- var i = -1,
- n = array.length,
- a,
- b,
- c;
- if (arguments.length === 1) {
- while (++i < n && ((a = c = array[i]) == null || a != a)) a = c = undefined;
- while (++i < n) if ((b = array[i]) != null) {
- if (a > b) a = b;
- if (c < b) c = b;
- }
- } else {
- while (++i < n && ((a = c = f.call(array, array[i], i)) == null || a != a)) a = undefined;
- while (++i < n) if ((b = f.call(array, array[i], i)) != null) {
- if (a > b) a = b;
- if (c < b) c = b;
- }
- }
- return [a, c];
-};
-d3.sum = function(array, f) {
- var s = 0,
- n = array.length,
- a,
- i = -1;
-
- if (arguments.length === 1) {
- while (++i < n) if (!isNaN(a = +array[i])) s += a;
- } else {
- while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a;
- }
-
- return s;
-};
-function d3_number(x) {
- return x != null && !isNaN(x);
-}
-
-d3.mean = function(array, f) {
- var n = array.length,
- a,
- m = 0,
- i = -1,
- j = 0;
- if (arguments.length === 1) {
- while (++i < n) if (d3_number(a = array[i])) m += (a - m) / ++j;
- } else {
- while (++i < n) if (d3_number(a = f.call(array, array[i], i))) m += (a - m) / ++j;
- }
- return j ? m : undefined;
-};
-// R-7 per <http://en.wikipedia.org/wiki/Quantile>
-d3.quantile = function(values, p) {
- var H = (values.length - 1) * p + 1,
- h = Math.floor(H),
- v = +values[h - 1],
- e = H - h;
- return e ? v + e * (values[h] - v) : v;
-};
-
-d3.median = function(array, f) {
- if (arguments.length > 1) array = array.map(f);
- array = array.filter(d3_number);
- return array.length ? d3.quantile(array.sort(d3.ascending), .5) : undefined;
-};
-d3.bisector = function(f) {
- return {
- left: function(a, x, lo, hi) {
- if (arguments.length < 3) lo = 0;
- if (arguments.length < 4) hi = a.length;
- while (lo < hi) {
- var mid = lo + hi >>> 1;
- if (f.call(a, a[mid], mid) < x) lo = mid + 1;
- else hi = mid;
- }
- return lo;
- },
- right: function(a, x, lo, hi) {
- if (arguments.length < 3) lo = 0;
- if (arguments.length < 4) hi = a.length;
- while (lo < hi) {
- var mid = lo + hi >>> 1;
- if (x < f.call(a, a[mid], mid)) hi = mid;
- else lo = mid + 1;
- }
- return lo;
- }
- };
-};
-
-var d3_bisector = d3.bisector(function(d) { return d; });
-d3.bisectLeft = d3_bisector.left;
-d3.bisect = d3.bisectRight = d3_bisector.right;
-d3.shuffle = function(array) {
- var m = array.length, t, i;
- while (m) {
- i = Math.random() * m-- | 0;
- t = array[m], array[m] = array[i], array[i] = t;
- }
- return array;
-};
-d3.permute = function(array, indexes) {
- var permutes = [],
- i = -1,
- n = indexes.length;
- while (++i < n) permutes[i] = array[indexes[i]];
- return permutes;
-};
-
-d3.zip = function() {
- if (!(n = arguments.length)) return [];
- for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) {
- for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) {
- zip[j] = arguments[j][i];
- }
- }
- return zips;
-};
-
-function d3_zipLength(d) {
- return d.length;
-}
-
-d3.transpose = function(matrix) {
- return d3.zip.apply(d3, matrix);
-};
-d3.keys = function(map) {
- var keys = [];
- for (var key in map) keys.push(key);
- return keys;
-};
-d3.values = function(map) {
- var values = [];
- for (var key in map) values.push(map[key]);
- return values;
-};
-d3.entries = function(map) {
- var entries = [];
- for (var key in map) entries.push({key: key, value: map[key]});
- return entries;
-};
-d3.merge = function(arrays) {
- return Array.prototype.concat.apply([], arrays);
-};
-d3.range = function(start, stop, step) {
- if (arguments.length < 3) {
- step = 1;
- if (arguments.length < 2) {
- stop = start;
- start = 0;
- }
- }
- if ((stop - start) / step === Infinity) throw new Error("infinite range");
- var range = [],
- k = d3_range_integerScale(Math.abs(step)),
- i = -1,
- j;
- start *= k, stop *= k, step *= k;
- if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k);
- else while ((j = start + step * ++i) < stop) range.push(j / k);
- return range;
-};
-
-function d3_range_integerScale(x) {
- var k = 1;
- while (x * k % 1) k *= 10;
- return k;
-}
-function d3_class(ctor, properties) {
- try {
- for (var key in properties) {
- Object.defineProperty(ctor.prototype, key, {
- value: properties[key],
- enumerable: false
- });
- }
- } catch (e) {
- ctor.prototype = properties;
- }
-}
-
-d3.map = function(object) {
- var map = new d3_Map;
- for (var key in object) map.set(key, object[key]);
- return map;
-};
-
-function d3_Map() {}
-
-d3_class(d3_Map, {
- has: function(key) {
- return d3_map_prefix + key in this;
- },
- get: function(key) {
- return this[d3_map_prefix + key];
- },
- set: function(key, value) {
- return this[d3_map_prefix + key] = value;
- },
- remove: function(key) {
- key = d3_map_prefix + key;
- return key in this && delete this[key];
- },
- keys: function() {
- var keys = [];
- this.forEach(function(key) { keys.push(key); });
- return keys;
- },
- values: function() {
- var values = [];
- this.forEach(function(key, value) { values.push(value); });
- return values;
- },
- entries: function() {
- var entries = [];
- this.forEach(function(key, value) { entries.push({key: key, value: value}); });
- return entries;
- },
- forEach: function(f) {
- for (var key in this) {
- if (key.charCodeAt(0) === d3_map_prefixCode) {
- f.call(this, key.substring(1), this[key]);
- }
- }
- }
-});
-
-var d3_map_prefix = "\0", // prevent collision with built-ins
- d3_map_prefixCode = d3_map_prefix.charCodeAt(0);
-
-d3.nest = function() {
- var nest = {},
- keys = [],
- sortKeys = [],
- sortValues,
- rollup;
-
- function map(mapType, array, depth) {
- if (depth >= keys.length) return rollup
- ? rollup.call(nest, array) : (sortValues
- ? array.sort(sortValues)
- : array);
-
- var i = -1,
- n = array.length,
- key = keys[depth++],
- keyValue,
- object,
- setter,
- valuesByKey = new d3_Map,
- values;
-
- while (++i < n) {
- if (values = valuesByKey.get(keyValue = key(object = array[i]))) {
- values.push(object);
- } else {
- valuesByKey.set(keyValue, [object]);
- }
- }
-
- if (mapType) {
- object = mapType();
- setter = function(keyValue, values) {
- object.set(keyValue, map(mapType, values, depth));
- };
- } else {
- object = {};
- setter = function(keyValue, values) {
- object[keyValue] = map(mapType, values, depth);
+ // node_modules/alif-toolkit/lib/unicode-arabic.js
+ var require_unicode_arabic = __commonJS({
+ "node_modules/alif-toolkit/lib/unicode-arabic.js"(exports2) {
+ "use strict";
+ Object.defineProperty(exports2, "__esModule", { value: true });
+ var arabicReference = {
+ "alef": {
+ "normal": [
+ "\u0627"
+ ],
+ "madda_above": {
+ "normal": [
+ "\u0627\u0653",
+ "\u0622"
+ ],
+ "isolated": "\uFE81",
+ "final": "\uFE82"
+ },
+ "hamza_above": {
+ "normal": [
+ "\u0627\u0654",
+ "\u0623"
+ ],
+ "isolated": "\uFE83",
+ "final": "\uFE84"
+ },
+ "hamza_below": {
+ "normal": [
+ "\u0627\u0655",
+ "\u0625"
+ ],
+ "isolated": "\uFE87",
+ "final": "\uFE88"
+ },
+ "wasla": {
+ "normal": "\u0671",
+ "isolated": "\uFB50",
+ "final": "\uFB51"
+ },
+ "wavy_hamza_above": [
+ "\u0672"
+ ],
+ "wavy_hamza_below": [
+ "\u0627\u065F",
+ "\u0673"
+ ],
+ "high_hamza": [
+ "\u0675",
+ "\u0627\u0674"
+ ],
+ "indic_two_above": [
+ "\u0773"
+ ],
+ "indic_three_above": [
+ "\u0774"
+ ],
+ "fathatan": {
+ "normal": [
+ "\u0627\u064B"
+ ],
+ "final": "\uFD3C",
+ "isolated": "\uFD3D"
+ },
+ "isolated": "\uFE8D",
+ "final": "\uFE8E"
+ },
+ "beh": {
+ "normal": [
+ "\u0628"
+ ],
+ "dotless": [
+ "\u066E"
+ ],
+ "three_dots_horizontally_below": [
+ "\u0750"
+ ],
+ "dot_below_three_dots_above": [
+ "\u0751"
+ ],
+ "three_dots_pointing_upwards_below": [
+ "\u0752"
+ ],
+ "three_dots_pointing_upwards_below_two_dots_above": [
+ "\u0753"
+ ],
+ "two_dots_below_dot_above": [
+ "\u0754"
+ ],
+ "inverted_small_v_below": [
+ "\u0755"
+ ],
+ "small_v": [
+ "\u0756"
+ ],
+ "small_v_below": [
+ "\u08A0"
+ ],
+ "hamza_above": [
+ "\u08A1"
+ ],
+ "small_meem_above": [
+ "\u08B6"
+ ],
+ "isolated": "\uFE8F",
+ "final": "\uFE90",
+ "initial": "\uFE91",
+ "medial": "\uFE92"
+ },
+ "teh marbuta": {
+ "normal": [
+ "\u0629"
+ ],
+ "isolated": "\uFE93",
+ "final": "\uFE94"
+ },
+ "teh": {
+ "normal": [
+ "\u062A"
+ ],
+ "ring": [
+ "\u067C"
+ ],
+ "three_dots_above_downwards": [
+ "\u067D"
+ ],
+ "small_teh_above": [
+ "\u08B8"
+ ],
+ "isolated": "\uFE95",
+ "final": "\uFE96",
+ "initial": "\uFE97",
+ "medial": "\uFE98"
+ },
+ "theh": {
+ "normal": [
+ "\u062B"
+ ],
+ "isolated": "\uFE99",
+ "final": "\uFE9A",
+ "initial": "\uFE9B",
+ "medial": "\uFE9C"
+ },
+ "jeem": {
+ "normal": [
+ "\u062C"
+ ],
+ "two_dots_above": [
+ "\u08A2"
+ ],
+ "isolated": "\uFE9D",
+ "final": "\uFE9E",
+ "initial": "\uFE9F",
+ "medial": "\uFEA0"
+ },
+ "hah": {
+ "normal": [
+ "\u062D"
+ ],
+ "hamza_above": [
+ "\u0681"
+ ],
+ "two_dots_vertical_above": [
+ "\u0682"
+ ],
+ "three_dots_above": [
+ "\u0685"
+ ],
+ "two_dots_above": [
+ "\u0757"
+ ],
+ "three_dots_pointing_upwards_below": [
+ "\u0758"
+ ],
+ "small_tah_below": [
+ "\u076E"
+ ],
+ "small_tah_two_dots": [
+ "\u076F"
+ ],
+ "small_tah_above": [
+ "\u0772"
+ ],
+ "indic_four_below": [
+ "\u077C"
+ ],
+ "isolated": "\uFEA1",
+ "final": "\uFEA2",
+ "initial": "\uFEA3",
+ "medial": "\uFEA4"
+ },
+ "khah": {
+ "normal": [
+ "\u062E"
+ ],
+ "isolated": "\uFEA5",
+ "final": "\uFEA6",
+ "initial": "\uFEA7",
+ "medial": "\uFEA8"
+ },
+ "dal": {
+ "normal": [
+ "\u062F"
+ ],
+ "ring": [
+ "\u0689"
+ ],
+ "dot_below": [
+ "\u068A"
+ ],
+ "dot_below_small_tah": [
+ "\u068B"
+ ],
+ "three_dots_above_downwards": [
+ "\u068F"
+ ],
+ "four_dots_above": [
+ "\u0690"
+ ],
+ "inverted_v": [
+ "\u06EE"
+ ],
+ "two_dots_vertically_below_small_tah": [
+ "\u0759"
+ ],
+ "inverted_small_v_below": [
+ "\u075A"
+ ],
+ "three_dots_below": [
+ "\u08AE"
+ ],
+ "isolated": "\uFEA9",
+ "final": "\uFEAA"
+ },
+ "thal": {
+ "normal": [
+ "\u0630"
+ ],
+ "isolated": "\uFEAB",
+ "final": "\uFEAC"
+ },
+ "reh": {
+ "normal": [
+ "\u0631"
+ ],
+ "small_v": [
+ "\u0692"
+ ],
+ "ring": [
+ "\u0693"
+ ],
+ "dot_below": [
+ "\u0694"
+ ],
+ "small_v_below": [
+ "\u0695"
+ ],
+ "dot_below_dot_above": [
+ "\u0696"
+ ],
+ "two_dots_above": [
+ "\u0697"
+ ],
+ "four_dots_above": [
+ "\u0699"
+ ],
+ "inverted_v": [
+ "\u06EF"
+ ],
+ "stroke": [
+ "\u075B"
+ ],
+ "two_dots_vertically_above": [
+ "\u076B"
+ ],
+ "hamza_above": [
+ "\u076C"
+ ],
+ "small_tah_two_dots": [
+ "\u0771"
+ ],
+ "loop": [
+ "\u08AA"
+ ],
+ "small_noon_above": [
+ "\u08B9"
+ ],
+ "isolated": "\uFEAD",
+ "final": "\uFEAE"
+ },
+ "zain": {
+ "normal": [
+ "\u0632"
+ ],
+ "inverted_v_above": [
+ "\u08B2"
+ ],
+ "isolated": "\uFEAF",
+ "final": "\uFEB0"
+ },
+ "seen": {
+ "normal": [
+ "\u0633"
+ ],
+ "dot_below_dot_above": [
+ "\u069A"
+ ],
+ "three_dots_below": [
+ "\u069B"
+ ],
+ "three_dots_below_three_dots_above": [
+ "\u069C"
+ ],
+ "four_dots_above": [
+ "\u075C"
+ ],
+ "two_dots_vertically_above": [
+ "\u076D"
+ ],
+ "small_tah_two_dots": [
+ "\u0770"
+ ],
+ "indic_four_above": [
+ "\u077D"
+ ],
+ "inverted_v": [
+ "\u077E"
+ ],
+ "isolated": "\uFEB1",
+ "final": "\uFEB2",
+ "initial": "\uFEB3",
+ "medial": "\uFEB4"
+ },
+ "sheen": {
+ "normal": [
+ "\u0634"
+ ],
+ "dot_below": [
+ "\u06FA"
+ ],
+ "isolated": "\uFEB5",
+ "final": "\uFEB6",
+ "initial": "\uFEB7",
+ "medial": "\uFEB8"
+ },
+ "sad": {
+ "normal": [
+ "\u0635"
+ ],
+ "two_dots_below": [
+ "\u069D"
+ ],
+ "three_dots_above": [
+ "\u069E"
+ ],
+ "three_dots_below": [
+ "\u08AF"
+ ],
+ "isolated": "\uFEB9",
+ "final": "\uFEBA",
+ "initial": "\uFEBB",
+ "medial": "\uFEBC"
+ },
+ "dad": {
+ "normal": [
+ "\u0636"
+ ],
+ "dot_below": [
+ "\u06FB"
+ ],
+ "isolated": "\uFEBD",
+ "final": "\uFEBE",
+ "initial": "\uFEBF",
+ "medial": "\uFEC0"
+ },
+ "tah": {
+ "normal": [
+ "\u0637"
+ ],
+ "three_dots_above": [
+ "\u069F"
+ ],
+ "two_dots_above": [
+ "\u08A3"
+ ],
+ "isolated": "\uFEC1",
+ "final": "\uFEC2",
+ "initial": "\uFEC3",
+ "medial": "\uFEC4"
+ },
+ "zah": {
+ "normal": [
+ "\u0638"
+ ],
+ "isolated": "\uFEC5",
+ "final": "\uFEC6",
+ "initial": "\uFEC7",
+ "medial": "\uFEC8"
+ },
+ "ain": {
+ "normal": [
+ "\u0639"
+ ],
+ "three_dots_above": [
+ "\u06A0"
+ ],
+ "two_dots_above": [
+ "\u075D"
+ ],
+ "three_dots_pointing_downwards_above": [
+ "\u075E"
+ ],
+ "two_dots_vertically_above": [
+ "\u075F"
+ ],
+ "three_dots_below": [
+ "\u08B3"
+ ],
+ "isolated": "\uFEC9",
+ "final": "\uFECA",
+ "initial": "\uFECB",
+ "medial": "\uFECC"
+ },
+ "ghain": {
+ "normal": [
+ "\u063A"
+ ],
+ "dot_below": [
+ "\u06FC"
+ ],
+ "isolated": "\uFECD",
+ "final": "\uFECE",
+ "initial": "\uFECF",
+ "medial": "\uFED0"
+ },
+ "feh": {
+ "normal": [
+ "\u0641"
+ ],
+ "dotless": [
+ "\u06A1"
+ ],
+ "dot_moved_below": [
+ "\u06A2"
+ ],
+ "dot_below": [
+ "\u06A3"
+ ],
+ "three_dots_below": [
+ "\u06A5"
+ ],
+ "two_dots_below": [
+ "\u0760"
+ ],
+ "three_dots_pointing_upwards_below": [
+ "\u0761"
+ ],
+ "dot_below_three_dots_above": [
+ "\u08A4"
+ ],
+ "isolated": "\uFED1",
+ "final": "\uFED2",
+ "initial": "\uFED3",
+ "medial": "\uFED4"
+ },
+ "qaf": {
+ "normal": [
+ "\u0642"
+ ],
+ "dotless": [
+ "\u066F"
+ ],
+ "dot_above": [
+ "\u06A7"
+ ],
+ "three_dots_above": [
+ "\u06A8"
+ ],
+ "dot_below": [
+ "\u08A5"
+ ],
+ "isolated": "\uFED5",
+ "final": "\uFED6",
+ "initial": "\uFED7",
+ "medial": "\uFED8"
+ },
+ "kaf": {
+ "normal": [
+ "\u0643"
+ ],
+ "swash": [
+ "\u06AA"
+ ],
+ "ring": [
+ "\u06AB"
+ ],
+ "dot_above": [
+ "\u06AC"
+ ],
+ "three_dots_below": [
+ "\u06AE"
+ ],
+ "two_dots_above": [
+ "\u077F"
+ ],
+ "dot_below": [
+ "\u08B4"
+ ],
+ "isolated": "\uFED9",
+ "final": "\uFEDA",
+ "initial": "\uFEDB",
+ "medial": "\uFEDC"
+ },
+ "lam": {
+ "normal": [
+ "\u0644"
+ ],
+ "small_v": [
+ "\u06B5"
+ ],
+ "dot_above": [
+ "\u06B6"
+ ],
+ "three_dots_above": [
+ "\u06B7"
+ ],
+ "three_dots_below": [
+ "\u06B8"
+ ],
+ "bar": [
+ "\u076A"
+ ],
+ "double_bar": [
+ "\u08A6"
+ ],
+ "isolated": "\uFEDD",
+ "final": "\uFEDE",
+ "initial": "\uFEDF",
+ "medial": "\uFEE0"
+ },
+ "meem": {
+ "normal": [
+ "\u0645"
+ ],
+ "dot_above": [
+ "\u0765"
+ ],
+ "dot_below": [
+ "\u0766"
+ ],
+ "three_dots_above": [
+ "\u08A7"
+ ],
+ "isolated": "\uFEE1",
+ "final": "\uFEE2",
+ "initial": "\uFEE3",
+ "medial": "\uFEE4"
+ },
+ "noon": {
+ "normal": [
+ "\u0646"
+ ],
+ "dot_below": [
+ "\u06B9"
+ ],
+ "ring": [
+ "\u06BC"
+ ],
+ "three_dots_above": [
+ "\u06BD"
+ ],
+ "two_dots_below": [
+ "\u0767"
+ ],
+ "small_tah": [
+ "\u0768"
+ ],
+ "small_v": [
+ "\u0769"
+ ],
+ "isolated": "\uFEE5",
+ "final": "\uFEE6",
+ "initial": "\uFEE7",
+ "medial": "\uFEE8"
+ },
+ "heh": {
+ "normal": [
+ "\u0647"
+ ],
+ "isolated": "\uFEE9",
+ "final": "\uFEEA",
+ "initial": "\uFEEB",
+ "medial": "\uFEEC"
+ },
+ "waw": {
+ "normal": [
+ "\u0648"
+ ],
+ "hamza_above": {
+ "normal": [
+ "\u0624",
+ "\u0648\u0654"
+ ],
+ "isolated": "\uFE85",
+ "final": "\uFE86"
+ },
+ "high_hamza": [
+ "\u0676",
+ "\u0648\u0674"
+ ],
+ "ring": [
+ "\u06C4"
+ ],
+ "two_dots_above": [
+ "\u06CA"
+ ],
+ "dot_above": [
+ "\u06CF"
+ ],
+ "indic_two_above": [
+ "\u0778"
+ ],
+ "indic_three_above": [
+ "\u0779"
+ ],
+ "dot_within": [
+ "\u08AB"
+ ],
+ "isolated": "\uFEED",
+ "final": "\uFEEE"
+ },
+ "alef_maksura": {
+ "normal": [
+ "\u0649"
+ ],
+ "hamza_above": [
+ "\u0626",
+ "\u064A\u0654"
+ ],
+ "initial": "\uFBE8",
+ "medial": "\uFBE9",
+ "isolated": "\uFEEF",
+ "final": "\uFEF0"
+ },
+ "yeh": {
+ "normal": [
+ "\u064A"
+ ],
+ "hamza_above": {
+ "normal": [
+ "\u0626",
+ "\u0649\u0654"
+ ],
+ "isolated": "\uFE89",
+ "final": "\uFE8A",
+ "initial": "\uFE8B",
+ "medial": "\uFE8C"
+ },
+ "two_dots_below_hamza_above": [
+ "\u08A8"
+ ],
+ "high_hamza": [
+ "\u0678",
+ "\u064A\u0674"
+ ],
+ "tail": [
+ "\u06CD"
+ ],
+ "small_v": [
+ "\u06CE"
+ ],
+ "three_dots_below": [
+ "\u06D1"
+ ],
+ "two_dots_below_dot_above": [
+ "\u08A9"
+ ],
+ "two_dots_below_small_noon_above": [
+ "\u08BA"
+ ],
+ "isolated": "\uFEF1",
+ "final": "\uFEF2",
+ "initial": "\uFEF3",
+ "medial": "\uFEF4"
+ },
+ "tteh": {
+ "normal": [
+ "\u0679"
+ ],
+ "isolated": "\uFB66",
+ "final": "\uFB67",
+ "initial": "\uFB68",
+ "medial": "\uFB69"
+ },
+ "tteheh": {
+ "normal": [
+ "\u067A"
+ ],
+ "isolated": "\uFB5E",
+ "final": "\uFB5F",
+ "initial": "\uFB60",
+ "medial": "\uFB61"
+ },
+ "beeh": {
+ "normal": [
+ "\u067B"
+ ],
+ "isolated": "\uFB52",
+ "final": "\uFB53",
+ "initial": "\uFB54",
+ "medial": "\uFB55"
+ },
+ "peh": {
+ "normal": [
+ "\u067E"
+ ],
+ "small_meem_above": [
+ "\u08B7"
+ ],
+ "isolated": "\uFB56",
+ "final": "\uFB57",
+ "initial": "\uFB58",
+ "medial": "\uFB59"
+ },
+ "teheh": {
+ "normal": [
+ "\u067F"
+ ],
+ "isolated": "\uFB62",
+ "final": "\uFB63",
+ "initial": "\uFB64",
+ "medial": "\uFB65"
+ },
+ "beheh": {
+ "normal": [
+ "\u0680"
+ ],
+ "isolated": "\uFB5A",
+ "final": "\uFB5B",
+ "initial": "\uFB5C",
+ "medial": "\uFB5D"
+ },
+ "nyeh": {
+ "normal": [
+ "\u0683"
+ ],
+ "isolated": "\uFB76",
+ "final": "\uFB77",
+ "initial": "\uFB78",
+ "medial": "\uFB79"
+ },
+ "dyeh": {
+ "normal": [
+ "\u0684"
+ ],
+ "isolated": "\uFB72",
+ "final": "\uFB73",
+ "initial": "\uFB74",
+ "medial": "\uFB75"
+ },
+ "tcheh": {
+ "normal": [
+ "\u0686"
+ ],
+ "dot_above": [
+ "\u06BF"
+ ],
+ "isolated": "\uFB7A",
+ "final": "\uFB7B",
+ "initial": "\uFB7C",
+ "medial": "\uFB7D"
+ },
+ "tcheheh": {
+ "normal": [
+ "\u0687"
+ ],
+ "isolated": "\uFB7E",
+ "final": "\uFB7F",
+ "initial": "\uFB80",
+ "medial": "\uFB81"
+ },
+ "ddal": {
+ "normal": [
+ "\u0688"
+ ],
+ "isolated": "\uFB88",
+ "final": "\uFB89"
+ },
+ "dahal": {
+ "normal": [
+ "\u068C"
+ ],
+ "isolated": "\uFB84",
+ "final": "\uFB85"
+ },
+ "ddahal": {
+ "normal": [
+ "\u068D"
+ ],
+ "isolated": "\uFB82",
+ "final": "\uFB83"
+ },
+ "dul": {
+ "normal": [
+ "\u068F",
+ "\u068E"
+ ],
+ "isolated": "\uFB86",
+ "final": "\uFB87"
+ },
+ "rreh": {
+ "normal": [
+ "\u0691"
+ ],
+ "isolated": "\uFB8C",
+ "final": "\uFB8D"
+ },
+ "jeh": {
+ "normal": [
+ "\u0698"
+ ],
+ "isolated": "\uFB8A",
+ "final": "\uFB8B"
+ },
+ "veh": {
+ "normal": [
+ "\u06A4"
+ ],
+ "isolated": "\uFB6A",
+ "final": "\uFB6B",
+ "initial": "\uFB6C",
+ "medial": "\uFB6D"
+ },
+ "peheh": {
+ "normal": [
+ "\u06A6"
+ ],
+ "isolated": "\uFB6E",
+ "final": "\uFB6F",
+ "initial": "\uFB70",
+ "medial": "\uFB71"
+ },
+ "keheh": {
+ "normal": [
+ "\u06A9"
+ ],
+ "dot_above": [
+ "\u0762"
+ ],
+ "three_dots_above": [
+ "\u0763"
+ ],
+ "three_dots_pointing_upwards_below": [
+ "\u0764"
+ ],
+ "isolated": "\uFB8E",
+ "final": "\uFB8F",
+ "initial": "\uFB90",
+ "medial": "\uFB91"
+ },
+ "ng": {
+ "normal": [
+ "\u06AD"
+ ],
+ "isolated": "\uFBD3",
+ "final": "\uFBD4",
+ "initial": "\uFBD5",
+ "medial": "\uFBD6"
+ },
+ "gaf": {
+ "normal": [
+ "\u06AF"
+ ],
+ "ring": [
+ "\u06B0"
+ ],
+ "two_dots_below": [
+ "\u06B2"
+ ],
+ "three_dots_above": [
+ "\u06B4"
+ ],
+ "inverted_stroke": [
+ "\u08B0"
+ ],
+ "isolated": "\uFB92",
+ "final": "\uFB93",
+ "initial": "\uFB94",
+ "medial": "\uFB95"
+ },
+ "ngoeh": {
+ "normal": [
+ "\u06B1"
+ ],
+ "isolated": "\uFB9A",
+ "final": "\uFB9B",
+ "initial": "\uFB9C",
+ "medial": "\uFB9D"
+ },
+ "gueh": {
+ "normal": [
+ "\u06B3"
+ ],
+ "isolated": "\uFB96",
+ "final": "\uFB97",
+ "initial": "\uFB98",
+ "medial": "\uFB99"
+ },
+ "noon ghunna": {
+ "normal": [
+ "\u06BA"
+ ],
+ "isolated": "\uFB9E",
+ "final": "\uFB9F"
+ },
+ "rnoon": {
+ "normal": [
+ "\u06BB"
+ ],
+ "isolated": "\uFBA0",
+ "final": "\uFBA1",
+ "initial": "\uFBA2",
+ "medial": "\uFBA3"
+ },
+ "heh doachashmee": {
+ "normal": [
+ "\u06BE"
+ ],
+ "isolated": "\uFBAA",
+ "final": "\uFBAB",
+ "initial": "\uFBAC",
+ "medial": "\uFBAD"
+ },
+ "heh goal": {
+ "normal": [
+ "\u06C1"
+ ],
+ "hamza_above": [
+ "\u06C1\u0654",
+ "\u06C2"
+ ],
+ "isolated": "\uFBA6",
+ "final": "\uFBA7",
+ "initial": "\uFBA8",
+ "medial": "\uFBA9"
+ },
+ "teh marbuta goal": {
+ "normal": [
+ "\u06C3"
+ ]
+ },
+ "kirghiz oe": {
+ "normal": [
+ "\u06C5"
+ ],
+ "isolated": "\uFBE0",
+ "final": "\uFBE1"
+ },
+ "oe": {
+ "normal": [
+ "\u06C6"
+ ],
+ "isolated": "\uFBD9",
+ "final": "\uFBDA"
+ },
+ "u": {
+ "normal": [
+ "\u06C7"
+ ],
+ "hamza_above": {
+ "normal": [
+ "\u0677",
+ "\u06C7\u0674"
+ ],
+ "isolated": "\uFBDD"
+ },
+ "isolated": "\uFBD7",
+ "final": "\uFBD8"
+ },
+ "yu": {
+ "normal": [
+ "\u06C8"
+ ],
+ "isolated": "\uFBDB",
+ "final": "\uFBDC"
+ },
+ "kirghiz yu": {
+ "normal": [
+ "\u06C9"
+ ],
+ "isolated": "\uFBE2",
+ "final": "\uFBE3"
+ },
+ "ve": {
+ "normal": [
+ "\u06CB"
+ ],
+ "isolated": "\uFBDE",
+ "final": "\uFBDF"
+ },
+ "farsi yeh": {
+ "normal": [
+ "\u06CC"
+ ],
+ "indic_two_above": [
+ "\u0775"
+ ],
+ "indic_three_above": [
+ "\u0776"
+ ],
+ "indic_four_above": [
+ "\u0777"
+ ],
+ "isolated": "\uFBFC",
+ "final": "\uFBFD",
+ "initial": "\uFBFE",
+ "medial": "\uFBFF"
+ },
+ "e": {
+ "normal": [
+ "\u06D0"
+ ],
+ "isolated": "\uFBE4",
+ "final": "\uFBE5",
+ "initial": "\uFBE6",
+ "medial": "\uFBE7"
+ },
+ "yeh barree": {
+ "normal": [
+ "\u06D2"
+ ],
+ "hamza_above": {
+ "normal": [
+ "\u06D2\u0654",
+ "\u06D3"
+ ],
+ "isolated": "\uFBB0",
+ "final": "\uFBB1"
+ },
+ "indic_two_above": [
+ "\u077A"
+ ],
+ "indic_three_above": [
+ "\u077B"
+ ],
+ "isolated": "\uFBAE",
+ "final": "\uFBAF"
+ },
+ "ae": {
+ "normal": [
+ "\u06D5"
+ ],
+ "isolated": "\u06D5",
+ "final": "\uFEEA",
+ "yeh_above": {
+ "normal": [
+ "\u06C0",
+ "\u06D5\u0654"
+ ],
+ "isolated": "\uFBA4",
+ "final": "\uFBA5"
+ }
+ },
+ "rohingya yeh": {
+ "normal": [
+ "\u08AC"
+ ]
+ },
+ "low alef": {
+ "normal": [
+ "\u08AD"
+ ]
+ },
+ "straight waw": {
+ "normal": [
+ "\u08B1"
+ ]
+ },
+ "african feh": {
+ "normal": [
+ "\u08BB"
+ ]
+ },
+ "african qaf": {
+ "normal": [
+ "\u08BC"
+ ]
+ },
+ "african noon": {
+ "normal": [
+ "\u08BD"
+ ]
+ }
};
+ exports2.default = arabicReference;
}
+ });
- valuesByKey.forEach(setter);
- return object;
- }
-
- function entries(map, depth) {
- if (depth >= keys.length) return map;
-
- var array = [],
- sortKey = sortKeys[depth++];
-
- map.forEach(function(key, keyMap) {
- array.push({key: key, values: entries(keyMap, depth)});
- });
-
- return sortKey
- ? array.sort(function(a, b) { return sortKey(a.key, b.key); })
- : array;
- }
-
- nest.map = function(array, mapType) {
- return map(mapType, array, 0);
- };
-
- nest.entries = function(array) {
- return entries(map(d3.map, array, 0), 0);
- };
-
- nest.key = function(d) {
- keys.push(d);
- return nest;
- };
-
- // Specifies the order for the most-recently specified key.
- // Note: only applies to entries. Map keys are unordered!
- nest.sortKeys = function(order) {
- sortKeys[keys.length - 1] = order;
- return nest;
- };
-
- // Specifies the order for leaf values.
- // Applies to both maps and entries array.
- nest.sortValues = function(order) {
- sortValues = order;
- return nest;
- };
-
- nest.rollup = function(f) {
- rollup = f;
- return nest;
- };
-
- return nest;
-};
-
-d3.set = function(array) {
- var set = new d3_Set();
- if (array) for (var i = 0; i < array.length; i++) set.add(array[i]);
- return set;
-};
-
-function d3_Set() {}
-
-d3_class(d3_Set, {
- has: function(value) {
- return d3_map_prefix + value in this;
- },
- add: function(value) {
- this[d3_map_prefix + value] = true;
- return value;
- },
- remove: function(value) {
- value = d3_map_prefix + value;
- return value in this && delete this[value];
- },
- values: function() {
- var values = [];
- this.forEach(function(value) {
- values.push(value);
- });
- return values;
- },
- forEach: function(f) {
- for (var value in this) {
- if (value.charCodeAt(0) === d3_map_prefixCode) {
- f.call(this, value.substring(1));
- }
- }
- }
-});
-d3.behavior = {};
-var d3_document = document,
- d3_window = window;
-// Copies a variable number of methods from source to target.
-d3.rebind = function(target, source) {
- var i = 1, n = arguments.length, method;
- while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);
- return target;
-};
-
-// Method is assumed to be a standard D3 getter-setter:
-// If passed with no arguments, gets the value.
-// If passed with arguments, sets the value and returns the target.
-function d3_rebind(target, source, method) {
- return function() {
- var value = method.apply(source, arguments);
- return value === source ? target : value;
- };
-}
-
-d3.dispatch = function() {
- var dispatch = new d3_dispatch,
- i = -1,
- n = arguments.length;
- while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
- return dispatch;
-};
-
-function d3_dispatch() {}
-
-d3_dispatch.prototype.on = function(type, listener) {
- var i = type.indexOf("."),
- name = "";
-
- // Extract optional namespace, e.g., "click.foo"
- if (i >= 0) {
- name = type.substring(i + 1);
- type = type.substring(0, i);
- }
-
- if (type) return arguments.length < 2
- ? this[type].on(name)
- : this[type].on(name, listener);
-
- if (arguments.length === 2) {
- if (listener == null) for (type in this) {
- if (this.hasOwnProperty(type)) this[type].on(name, null);
- }
- return this;
- }
-};
-
-function d3_dispatch_event(dispatch) {
- var listeners = [],
- listenerByName = new d3_Map;
-
- function event() {
- var z = listeners, // defensive reference
- i = -1,
- n = z.length,
- l;
- while (++i < n) if (l = z[i].on) l.apply(this, arguments);
- return dispatch;
- }
-
- event.on = function(name, listener) {
- var l = listenerByName.get(name),
- i;
-
- // return the current listener, if any
- if (arguments.length < 2) return l && l.on;
-
- // remove the old listener, if any (with copy-on-write)
- if (l) {
- l.on = null;
- listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));
- listenerByName.remove(name);
- }
-
- // add the new listener, if any
- if (listener) listeners.push(listenerByName.set(name, {on: listener}));
-
- return dispatch;
- };
-
- return event;
-}
-
-d3.event = null;
-
-function d3_eventCancel() {
- d3.event.stopPropagation();
- d3.event.preventDefault();
-}
-
-function d3_eventSource() {
- var e = d3.event, s;
- while (s = e.sourceEvent) e = s;
- return e;
-}
-
-// Registers an event listener for the specified target that cancels the next
-// event for the specified type, but only if it occurs immediately. This is
-// useful to disambiguate dragging from clicking.
-function d3_eventSuppress(target, type) {
- function off() { target.on(type, null); }
- target.on(type, function() { d3_eventCancel(); off(); }, true);
- setTimeout(off, 0); // clear the handler if it doesn't fire
-}
-
-// Like d3.dispatch, but for custom events abstracting native UI events. These
-// events have a target component (such as a brush), a target element (such as
-// the svg:g element containing the brush) and the standard arguments `d` (the
-// target element's data) and `i` (the selection index of the target element).
-function d3_eventDispatch(target) {
- var dispatch = new d3_dispatch,
- i = 0,
- n = arguments.length;
-
- while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
-
- // Creates a dispatch context for the specified `thiz` (typically, the target
- // DOM element that received the source event) and `argumentz` (typically, the
- // data `d` and index `i` of the target element). The returned function can be
- // used to dispatch an event to any registered listeners; the function takes a
- // single argument as input, being the event to dispatch. The event must have
- // a "type" attribute which corresponds to a type registered in the
- // constructor. This context will automatically populate the "sourceEvent" and
- // "target" attributes of the event, as well as setting the `d3.event` global
- // for the duration of the notification.
- dispatch.of = function(thiz, argumentz) {
- return function(e1) {
- try {
- var e0 =
- e1.sourceEvent = d3.event;
- e1.target = target;
- d3.event = e1;
- dispatch[e1.type].apply(thiz, argumentz);
- } finally {
- d3.event = e0;
- }
- };
- };
-
- return dispatch;
-}
-
-d3.mouse = function(container) {
- return d3_mousePoint(container, d3_eventSource());
-};
-
-// https://bugs.webkit.org/show_bug.cgi?id=44083
-var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0;
-
-function d3_mousePoint(container, e) {
- var svg = container.ownerSVGElement || container;
- if (svg.createSVGPoint) {
- var point = svg.createSVGPoint();
- if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) {
- svg = d3.select(d3_document.body).append("svg")
- .style("position", "absolute")
- .style("top", 0)
- .style("left", 0);
- var ctm = svg[0][0].getScreenCTM();
- d3_mouse_bug44083 = !(ctm.f || ctm.e);
- svg.remove();
- }
- if (d3_mouse_bug44083) {
- point.x = e.pageX;
- point.y = e.pageY;
- } else {
- point.x = e.clientX;
- point.y = e.clientY;
- }
- point = point.matrixTransform(container.getScreenCTM().inverse());
- return [point.x, point.y];
- }
- var rect = container.getBoundingClientRect();
- return [e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop];
-};
-
-var d3_array = d3_arraySlice; // conversion for NodeLists
-
-function d3_arrayCopy(pseudoarray) {
- var i = -1, n = pseudoarray.length, array = [];
- while (++i < n) array.push(pseudoarray[i]);
- return array;
-}
-
-function d3_arraySlice(pseudoarray) {
- return Array.prototype.slice.call(pseudoarray);
-}
-
-try {
- d3_array(d3_document.documentElement.childNodes)[0].nodeType;
-} catch(e) {
- d3_array = d3_arrayCopy;
-}
-
-var d3_arraySubclass = [].__proto__?
-
-// Until ECMAScript supports array subclassing, prototype injection works well.
-function(array, prototype) {
- array.__proto__ = prototype;
-}:
-
-// And if your browser doesn't support __proto__, we'll use direct extension.
-function(array, prototype) {
- for (var property in prototype) array[property] = prototype[property];
-};
-
-d3.touches = function(container, touches) {
- if (arguments.length < 2) touches = d3_eventSource().touches;
- return touches ? d3_array(touches).map(function(touch) {
- var point = d3_mousePoint(container, touch);
- point.identifier = touch.identifier;
- return point;
- }) : [];
-};
-
-function d3_selection(groups) {
- d3_arraySubclass(groups, d3_selectionPrototype);
- return groups;
-}
-
-var d3_select = function(s, n) { return n.querySelector(s); },
- d3_selectAll = function(s, n) { return n.querySelectorAll(s); },
- d3_selectRoot = d3_document.documentElement,
- d3_selectMatcher = d3_selectRoot.matchesSelector || d3_selectRoot.webkitMatchesSelector || d3_selectRoot.mozMatchesSelector || d3_selectRoot.msMatchesSelector || d3_selectRoot.oMatchesSelector,
- d3_selectMatches = function(n, s) { return d3_selectMatcher.call(n, s); };
-
-// Prefer Sizzle, if available.
-if (typeof Sizzle === "function") {
- d3_select = function(s, n) { return Sizzle(s, n)[0] || null; };
- d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); };
- d3_selectMatches = Sizzle.matchesSelector;
-}
-
-var d3_selectionPrototype = [];
-
-d3.selection = function() {
- return d3_selectionRoot;
-};
-
-d3.selection.prototype = d3_selectionPrototype;
-
-
-d3_selectionPrototype.select = function(selector) {
- var subgroups = [],
- subgroup,
- subnode,
- group,
- node;
-
- if (typeof selector !== "function") selector = d3_selection_selector(selector);
-
- for (var j = -1, m = this.length; ++j < m;) {
- subgroups.push(subgroup = []);
- subgroup.parentNode = (group = this[j]).parentNode;
- for (var i = -1, n = group.length; ++i < n;) {
- if (node = group[i]) {
- subgroup.push(subnode = selector.call(node, node.__data__, i));
- if (subnode && "__data__" in node) subnode.__data__ = node.__data__;
- } else {
- subgroup.push(null);
- }
- }
- }
-
- return d3_selection(subgroups);
-};
-
-function d3_selection_selector(selector) {
- return function() {
- return d3_select(selector, this);
- };
-}
-
-d3_selectionPrototype.selectAll = function(selector) {
- var subgroups = [],
- subgroup,
- node;
-
- if (typeof selector !== "function") selector = d3_selection_selectorAll(selector);
-
- for (var j = -1, m = this.length; ++j < m;) {
- for (var group = this[j], i = -1, n = group.length; ++i < n;) {
- if (node = group[i]) {
- subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i)));
- subgroup.parentNode = node;
- }
- }
- }
-
- return d3_selection(subgroups);
-};
-
-function d3_selection_selectorAll(selector) {
- return function() {
- return d3_selectAll(selector, this);
- };
-}
-var d3_nsPrefix = {
- svg: "http://www.w3.org/2000/svg",
- xhtml: "http://www.w3.org/1999/xhtml",
- xlink: "http://www.w3.org/1999/xlink",
- xml: "http://www.w3.org/XML/1998/namespace",
- xmlns: "http://www.w3.org/2000/xmlns/"
-};
-
-d3.ns = {
- prefix: d3_nsPrefix,
- qualify: function(name) {
- var i = name.indexOf(":"),
- prefix = name;
- if (i >= 0) {
- prefix = name.substring(0, i);
- name = name.substring(i + 1);
- }
- return d3_nsPrefix.hasOwnProperty(prefix)
- ? {space: d3_nsPrefix[prefix], local: name}
- : name;
- }
-};
-
-d3_selectionPrototype.attr = function(name, value) {
- if (arguments.length < 2) {
-
- // For attr(string), return the attribute value for the first node.
- if (typeof name === "string") {
- var node = this.node();
- name = d3.ns.qualify(name);
- return name.local
- ? node.getAttributeNS(name.space, name.local)
- : node.getAttribute(name);
- }
-
- // For attr(object), the object specifies the names and values of the
- // attributes to set or remove. The values may be functions that are
- // evaluated for each element.
- for (value in name) this.each(d3_selection_attr(value, name[value]));
- return this;
- }
-
- return this.each(d3_selection_attr(name, value));
-};
-
-function d3_selection_attr(name, value) {
- name = d3.ns.qualify(name);
-
- // For attr(string, null), remove the attribute with the specified name.
- function attrNull() {
- this.removeAttribute(name);
- }
- function attrNullNS() {
- this.removeAttributeNS(name.space, name.local);
- }
-
- // For attr(string, string), set the attribute with the specified name.
- function attrConstant() {
- this.setAttribute(name, value);
- }
- function attrConstantNS() {
- this.setAttributeNS(name.space, name.local, value);
- }
-
- // For attr(string, function), evaluate the function for each element, and set
- // or remove the attribute as appropriate.
- function attrFunction() {
- var x = value.apply(this, arguments);
- if (x == null) this.removeAttribute(name);
- else this.setAttribute(name, x);
- }
- function attrFunctionNS() {
- var x = value.apply(this, arguments);
- if (x == null) this.removeAttributeNS(name.space, name.local);
- else this.setAttributeNS(name.space, name.local, x);
- }
-
- return value == null
- ? (name.local ? attrNullNS : attrNull) : (typeof value === "function"
- ? (name.local ? attrFunctionNS : attrFunction)
- : (name.local ? attrConstantNS : attrConstant));
-}
-function d3_collapse(s) {
- return s.trim().replace(/\s+/g, " ");
-}
-d3.requote = function(s) {
- return s.replace(d3_requote_re, "\\$&");
-};
-
-var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
-
-d3_selectionPrototype.classed = function(name, value) {
- if (arguments.length < 2) {
-
- // For classed(string), return true only if the first node has the specified
- // class or classes. Note that even if the browser supports DOMTokenList, it
- // probably doesn't support it on SVG elements (which can be animated).
- if (typeof name === "string") {
- var node = this.node(),
- n = (name = name.trim().split(/^|\s+/g)).length,
- i = -1;
- if (value = node.classList) {
- while (++i < n) if (!value.contains(name[i])) return false;
- } else {
- value = node.getAttribute("class");
- while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;
- }
- return true;
- }
-
- // For classed(object), the object specifies the names of classes to add or
- // remove. The values may be functions that are evaluated for each element.
- for (value in name) this.each(d3_selection_classed(value, name[value]));
- return this;
- }
-
- // Otherwise, both a name and a value are specified, and are handled as below.
- return this.each(d3_selection_classed(name, value));
-};
-
-function d3_selection_classedRe(name) {
- return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g");
-}
-
-// Multiple class names are allowed (e.g., "foo bar").
-function d3_selection_classed(name, value) {
- name = name.trim().split(/\s+/).map(d3_selection_classedName);
- var n = name.length;
-
- function classedConstant() {
- var i = -1;
- while (++i < n) name[i](this, value);
- }
-
- // When the value is a function, the function is still evaluated only once per
- // element even if there are multiple class names.
- function classedFunction() {
- var i = -1, x = value.apply(this, arguments);
- while (++i < n) name[i](this, x);
- }
-
- return typeof value === "function"
- ? classedFunction
- : classedConstant;
-}
-
-function d3_selection_classedName(name) {
- var re = d3_selection_classedRe(name);
- return function(node, value) {
- if (c = node.classList) return value ? c.add(name) : c.remove(name);
- var c = node.getAttribute("class") || "";
- if (value) {
- re.lastIndex = 0;
- if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name));
- } else {
- node.setAttribute("class", d3_collapse(c.replace(re, " ")));
- }
- };
-}
-
-d3_selectionPrototype.style = function(name, value, priority) {
- var n = arguments.length;
- if (n < 3) {
-
- // For style(object) or style(object, string), the object specifies the
- // names and values of the attributes to set or remove. The values may be
- // functions that are evaluated for each element. The optional string
- // specifies the priority.
- if (typeof name !== "string") {
- if (n < 2) value = "";
- for (priority in name) this.each(d3_selection_style(priority, name[priority], value));
- return this;
- }
-
- // For style(string), return the computed style value for the first node.
- if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name);
-
- // For style(string, string) or style(string, function), use the default
- // priority. The priority is ignored for style(string, null).
- priority = "";
- }
-
- // Otherwise, a name, value and priority are specified, and handled as below.
- return this.each(d3_selection_style(name, value, priority));
-};
-
-function d3_selection_style(name, value, priority) {
-
- // For style(name, null) or style(name, null, priority), remove the style
- // property with the specified name. The priority is ignored.
- function styleNull() {
- this.style.removeProperty(name);
- }
-
- // For style(name, string) or style(name, string, priority), set the style
- // property with the specified name, using the specified priority.
- function styleConstant() {
- this.style.setProperty(name, value, priority);
- }
-
- // For style(name, function) or style(name, function, priority), evaluate the
- // function for each element, and set or remove the style property as
- // appropriate. When setting, use the specified priority.
- function styleFunction() {
- var x = value.apply(this, arguments);
- if (x == null) this.style.removeProperty(name);
- else this.style.setProperty(name, x, priority);
- }
-
- return value == null
- ? styleNull : (typeof value === "function"
- ? styleFunction : styleConstant);
-}
-
-d3_selectionPrototype.property = function(name, value) {
- if (arguments.length < 2) {
-
- // For property(string), return the property value for the first node.
- if (typeof name === "string") return this.node()[name];
-
- // For property(object), the object specifies the names and values of the
- // properties to set or remove. The values may be functions that are
- // evaluated for each element.
- for (value in name) this.each(d3_selection_property(value, name[value]));
- return this;
- }
-
- // Otherwise, both a name and a value are specified, and are handled as below.
- return this.each(d3_selection_property(name, value));
-};
-
-function d3_selection_property(name, value) {
-
- // For property(name, null), remove the property with the specified name.
- function propertyNull() {
- delete this[name];
- }
-
- // For property(name, string), set the property with the specified name.
- function propertyConstant() {
- this[name] = value;
- }
-
- // For property(name, function), evaluate the function for each element, and
- // set or remove the property as appropriate.
- function propertyFunction() {
- var x = value.apply(this, arguments);
- if (x == null) delete this[name];
- else this[name] = x;
- }
-
- return value == null
- ? propertyNull : (typeof value === "function"
- ? propertyFunction : propertyConstant);
-}
-
-d3_selectionPrototype.text = function(value) {
- return arguments.length
- ? this.each(typeof value === "function"
- ? function() { var v = value.apply(this, arguments); this.textContent = v == null ? "" : v; } : value == null
- ? function() { this.textContent = ""; }
- : function() { this.textContent = value; })
- : this.node().textContent;
-};
-
-d3_selectionPrototype.html = function(value) {
- return arguments.length
- ? this.each(typeof value === "function"
- ? function() { var v = value.apply(this, arguments); this.innerHTML = v == null ? "" : v; } : value == null
- ? function() { this.innerHTML = ""; }
- : function() { this.innerHTML = value; })
- : this.node().innerHTML;
-};
-
-// TODO append(node)?
-// TODO append(function)?
-d3_selectionPrototype.append = function(name) {
- name = d3.ns.qualify(name);
-
- function append() {
- return this.appendChild(d3_document.createElementNS(this.namespaceURI, name));
- }
-
- function appendNS() {
- return this.appendChild(d3_document.createElementNS(name.space, name.local));
- }
-
- return this.select(name.local ? appendNS : append);
-};
-
-d3_selectionPrototype.insert = function(name, before) {
- name = d3.ns.qualify(name);
-
- if (typeof before !== "function") before = d3_selection_selector(before);
-
- function insert(d, i) {
- return this.insertBefore(
- d3_document.createElementNS(this.namespaceURI, name),
- before.call(this, d, i));
- }
-
- function insertNS(d, i) {
- return this.insertBefore(
- d3_document.createElementNS(name.space, name.local),
- before.call(this, d, i));
- }
-
- return this.select(name.local ? insertNS : insert);
-};
-
-// TODO remove(selector)?
-// TODO remove(node)?
-// TODO remove(function)?
-d3_selectionPrototype.remove = function() {
- return this.each(function() {
- var parent = this.parentNode;
- if (parent) parent.removeChild(this);
- });
-};
-
-d3_selectionPrototype.data = function(value, key) {
- var i = -1,
- n = this.length,
- group,
- node;
-
- // If no value is specified, return the first value.
- if (!arguments.length) {
- value = new Array(n = (group = this[0]).length);
- while (++i < n) {
- if (node = group[i]) {
- value[i] = node.__data__;
- }
- }
- return value;
- }
-
- function bind(group, groupData) {
- var i,
- n = group.length,
- m = groupData.length,
- n0 = Math.min(n, m),
- updateNodes = new Array(m),
- enterNodes = new Array(m),
- exitNodes = new Array(n),
- node,
- nodeData;
-
- if (key) {
- var nodeByKeyValue = new d3_Map,
- dataByKeyValue = new d3_Map,
- keyValues = [],
- keyValue;
-
- for (i = -1; ++i < n;) {
- keyValue = key.call(node = group[i], node.__data__, i);
- if (nodeByKeyValue.has(keyValue)) {
- exitNodes[i] = node; // duplicate selection key
- } else {
- nodeByKeyValue.set(keyValue, node);
- }
- keyValues.push(keyValue);
- }
-
- for (i = -1; ++i < m;) {
- keyValue = key.call(groupData, nodeData = groupData[i], i);
- if (node = nodeByKeyValue.get(keyValue)) {
- updateNodes[i] = node;
- node.__data__ = nodeData;
- } else if (!dataByKeyValue.has(keyValue)) { // no duplicate data key
- enterNodes[i] = d3_selection_dataNode(nodeData);
- }
- dataByKeyValue.set(keyValue, nodeData);
- nodeByKeyValue.remove(keyValue);
- }
-
- for (i = -1; ++i < n;) {
- if (nodeByKeyValue.has(keyValues[i])) {
- exitNodes[i] = group[i];
- }
- }
- } else {
- for (i = -1; ++i < n0;) {
- node = group[i];
- nodeData = groupData[i];
- if (node) {
- node.__data__ = nodeData;
- updateNodes[i] = node;
- } else {
- enterNodes[i] = d3_selection_dataNode(nodeData);
- }
- }
- for (; i < m; ++i) {
- enterNodes[i] = d3_selection_dataNode(groupData[i]);
- }
- for (; i < n; ++i) {
- exitNodes[i] = group[i];
- }
- }
-
- enterNodes.update
- = updateNodes;
-
- enterNodes.parentNode
- = updateNodes.parentNode
- = exitNodes.parentNode
- = group.parentNode;
-
- enter.push(enterNodes);
- update.push(updateNodes);
- exit.push(exitNodes);
- }
-
- var enter = d3_selection_enter([]),
- update = d3_selection([]),
- exit = d3_selection([]);
-
- if (typeof value === "function") {
- while (++i < n) {
- bind(group = this[i], value.call(group, group.parentNode.__data__, i));
- }
- } else {
- while (++i < n) {
- bind(group = this[i], value);
- }
- }
-
- update.enter = function() { return enter; };
- update.exit = function() { return exit; };
- return update;
-};
-
-function d3_selection_dataNode(data) {
- return {__data__: data};
-}
-
-d3_selectionPrototype.datum = function(value) {
- return arguments.length
- ? this.property("__data__", value)
- : this.property("__data__");
-};
-
-d3_selectionPrototype.filter = function(filter) {
- var subgroups = [],
- subgroup,
- group,
- node;
-
- if (typeof filter !== "function") filter = d3_selection_filter(filter);
-
- for (var j = 0, m = this.length; j < m; j++) {
- subgroups.push(subgroup = []);
- subgroup.parentNode = (group = this[j]).parentNode;
- for (var i = 0, n = group.length; i < n; i++) {
- if ((node = group[i]) && filter.call(node, node.__data__, i)) {
- subgroup.push(node);
- }
- }
- }
-
- return d3_selection(subgroups);
-};
-
-function d3_selection_filter(selector) {
- return function() {
- return d3_selectMatches(this, selector);
- };
-}
-
-d3_selectionPrototype.order = function() {
- for (var j = -1, m = this.length; ++j < m;) {
- for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
- if (node = group[i]) {
- if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
- next = node;
- }
- }
- }
- return this;
-};
-
-d3_selectionPrototype.sort = function(comparator) {
- comparator = d3_selection_sortComparator.apply(this, arguments);
- for (var j = -1, m = this.length; ++j < m;) this[j].sort(comparator);
- return this.order();
-};
-
-function d3_selection_sortComparator(comparator) {
- if (!arguments.length) comparator = d3.ascending;
- return function(a, b) {
- return (!a - !b) || comparator(a.__data__, b.__data__);
- };
-}
-function d3_noop() {}
-
-d3_selectionPrototype.on = function(type, listener, capture) {
- var n = arguments.length;
- if (n < 3) {
-
- // For on(object) or on(object, boolean), the object specifies the event
- // types and listeners to add or remove. The optional boolean specifies
- // whether the listener captures events.
- if (typeof type !== "string") {
- if (n < 2) listener = false;
- for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));
- return this;
- }
-
- // For on(string), return the listener for the first node.
- if (n < 2) return (n = this.node()["__on" + type]) && n._;
-
- // For on(string, function), use the default capture.
- capture = false;
- }
-
- // Otherwise, a type, listener and capture are specified, and handled as below.
- return this.each(d3_selection_on(type, listener, capture));
-};
-
-function d3_selection_on(type, listener, capture) {
- var name = "__on" + type,
- i = type.indexOf("."),
- wrap = d3_selection_onListener;
-
- if (i > 0) type = type.substring(0, i);
- var filter = d3_selection_onFilters.get(type);
- if (filter) type = filter, wrap = d3_selection_onFilter;
-
- function onRemove() {
- var l = this[name];
- if (l) {
- this.removeEventListener(type, l, l.$);
- delete this[name];
- }
- }
-
- function onAdd() {
- var l = wrap(listener, d3_array(arguments));
- if (typeof Raven !== 'undefined') l = Raven.wrap(l);
- onRemove.call(this);
- this.addEventListener(type, this[name] = l, l.$ = capture);
- l._ = listener;
- }
-
- function removeAll() {
- var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"),
- match;
- for (var name in this) {
- if (match = name.match(re)) {
- var l = this[name];
- this.removeEventListener(match[1], l, l.$);
- delete this[name];
- }
- }
- }
-
- return i
- ? listener ? onAdd : onRemove
- : listener ? d3_noop : removeAll;
-}
-
-var d3_selection_onFilters = d3.map({
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-});
-
-d3_selection_onFilters.forEach(function(k) {
- if ("on" + k in d3_document) d3_selection_onFilters.remove(k);
-});
-
-function d3_selection_onListener(listener, argumentz) {
- return function(e) {
- var o = d3.event; // Events can be reentrant (e.g., focus).
- d3.event = e;
- argumentz[0] = this.__data__;
- try {
- listener.apply(this, argumentz);
- } finally {
- d3.event = o;
- }
- };
-}
-
-function d3_selection_onFilter(listener, argumentz) {
- var l = d3_selection_onListener(listener, argumentz);
- return function(e) {
- var target = this, related = e.relatedTarget;
- if (!related || (related !== target && !(related.compareDocumentPosition(target) & 8))) {
- l.call(target, e);
- }
- };
-}
-
-d3_selectionPrototype.each = function(callback) {
- return d3_selection_each(this, function(node, i, j) {
- callback.call(node, node.__data__, i, j);
- });
-};
-
-function d3_selection_each(groups, callback) {
- for (var j = 0, m = groups.length; j < m; j++) {
- for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {
- if (node = group[i]) callback(node, i, j);
- }
- }
- return groups;
-}
-
-d3_selectionPrototype.call = function(callback) {
- var args = d3_array(arguments);
- callback.apply(args[0] = this, args);
- return this;
-};
-
-d3_selectionPrototype.empty = function() {
- return !this.node();
-};
-
-d3_selectionPrototype.node = function() {
- for (var j = 0, m = this.length; j < m; j++) {
- for (var group = this[j], i = 0, n = group.length; i < n; i++) {
- var node = group[i];
- if (node) return node;
- }
- }
- return null;
-};
-
-function d3_selection_enter(selection) {
- d3_arraySubclass(selection, d3_selection_enterPrototype);
- return selection;
-}
-
-var d3_selection_enterPrototype = [];
-
-d3.selection.enter = d3_selection_enter;
-d3.selection.enter.prototype = d3_selection_enterPrototype;
-
-d3_selection_enterPrototype.append = d3_selectionPrototype.append;
-d3_selection_enterPrototype.insert = d3_selectionPrototype.insert;
-d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;
-d3_selection_enterPrototype.node = d3_selectionPrototype.node;
-
-
-d3_selection_enterPrototype.select = function(selector) {
- var subgroups = [],
- subgroup,
- subnode,
- upgroup,
- group,
- node;
-
- for (var j = -1, m = this.length; ++j < m;) {
- upgroup = (group = this[j]).update;
- subgroups.push(subgroup = []);
- subgroup.parentNode = group.parentNode;
- for (var i = -1, n = group.length; ++i < n;) {
- if (node = group[i]) {
- subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i));
- subnode.__data__ = node.__data__;
- } else {
- subgroup.push(null);
- }
- }
- }
-
- return d3_selection(subgroups);
-};
-
-d3_selectionPrototype.transition = function() {
- var id = d3_transitionInheritId || ++d3_transitionId,
- subgroups = [],
- subgroup,
- node,
- transition = Object.create(d3_transitionInherit);
-
- transition.time = Date.now();
-
- for (var j = -1, m = this.length; ++j < m;) {
- subgroups.push(subgroup = []);
- for (var group = this[j], i = -1, n = group.length; ++i < n;) {
- if (node = group[i]) d3_transitionNode(node, i, id, transition);
- subgroup.push(node);
- }
- }
-
- return d3_transition(subgroups, id);
-};
-
-var d3_selectionRoot = d3_selection([[d3_document]]);
-
-d3_selectionRoot[0].parentNode = d3_selectRoot;
-
-// TODO fast singleton implementation!
-// TODO select(function)
-d3.select = function(selector) {
- return typeof selector === "string"
- ? d3_selectionRoot.select(selector)
- : d3_selection([[selector]]); // assume node
-};
-
-// TODO selectAll(function)
-d3.selectAll = function(selector) {
- return typeof selector === "string"
- ? d3_selectionRoot.selectAll(selector)
- : d3_selection([d3_array(selector)]); // assume node[]
-};
-
-d3.behavior.zoom = function() {
- var translate = [0, 0],
- translate0, // translate when we started zooming (to avoid drift)
- scale = 1,
- scale0, // scale when we started touching
- scaleExtent = d3_behavior_zoomInfinity,
- event = d3_eventDispatch(zoom, "zoom"),
- x0,
- x1,
- y0,
- y1,
- touchtime; // time of last touchstart (to detect double-tap)
-
- function zoom() {
- this.on("mousedown.zoom", mousedown)
- .on("mousemove.zoom", mousemove)
- .on(d3_behavior_zoomWheel + ".zoom", mousewheel)
- .on("dblclick.zoom", dblclick)
- .on("touchstart.zoom", touchstart)
- .on("touchmove.zoom", touchmove)
- .on("touchend.zoom", touchstart);
- }
-
- zoom.translate = function(x) {
- if (!arguments.length) return translate;
- translate = x.map(Number);
- rescale();
- return zoom;
- };
-
- zoom.scale = function(x) {
- if (!arguments.length) return scale;
- scale = +x;
- rescale();
- return zoom;
- };
-
- zoom.scaleExtent = function(x) {
- if (!arguments.length) return scaleExtent;
- scaleExtent = x == null ? d3_behavior_zoomInfinity : x.map(Number);
- return zoom;
- };
-
- zoom.x = function(z) {
- if (!arguments.length) return x1;
- x1 = z;
- x0 = z.copy();
- translate = [0, 0];
- scale = 1;
- return zoom;
- };
-
- zoom.y = function(z) {
- if (!arguments.length) return y1;
- y1 = z;
- y0 = z.copy();
- translate = [0, 0];
- scale = 1;
- return zoom;
- };
-
- function location(p) {
- return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
- }
-
- function point(l) {
- return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
- }
-
- function scaleTo(s) {
- scale = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));
- }
-
- function translateTo(p, l) {
- l = point(l);
- translate[0] += p[0] - l[0];
- translate[1] += p[1] - l[1];
- }
-
- function rescale() {
- if (x1) x1.domain(x0.range().map(function(x) { return (x - translate[0]) / scale; }).map(x0.invert));
- if (y1) y1.domain(y0.range().map(function(y) { return (y - translate[1]) / scale; }).map(y0.invert));
- }
-
- function dispatch(event) {
- rescale();
- d3.event.preventDefault();
- event({type: "zoom", scale: scale, translate: translate});
- }
-
- function mousedown() {
- var target = this,
- event_ = event.of(target, arguments),
- eventTarget = d3.event.target,
- moved = 0,
- w = d3.select(d3_window).on("mousemove.zoom", mousemove).on("mouseup.zoom", mouseup),
- l = location(d3.mouse(target));
-
- d3_window.focus();
- d3_eventCancel();
-
- function mousemove() {
- if (d3.event.which === 0) {
- mouseup();
- return;
- }
- moved = 1;
- translateTo(d3.mouse(target), l);
- dispatch(event_);
- }
-
- function mouseup() {
- if (moved) d3_eventCancel();
- w.on("mousemove.zoom", null).on("mouseup.zoom", null);
- if (moved && d3.event.target === eventTarget) d3_eventSuppress(w, "click.zoom");
- }
- }
-
- function mousewheel() {
- if (!translate0) translate0 = location(d3.mouse(this));
- scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * scale);
- translateTo(d3.mouse(this), translate0);
- dispatch(event.of(this, arguments));
- }
-
- function mousemove() {
- translate0 = null;
- }
-
- function dblclick() {
- var p = d3.mouse(this), l = location(p), k = Math.log(scale) / Math.LN2;
- scaleTo(Math.pow(2, d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1));
- translateTo(p, l);
- dispatch(event.of(this, arguments));
- }
-
- function touchstart() {
- var touches = d3.touches(this),
- now = Date.now();
-
- scale0 = scale;
- translate0 = {};
- touches.forEach(function(t) { translate0[t.identifier] = location(t); });
- d3_eventCancel();
-
- if (touches.length === 1) {
- if (now - touchtime < 500) { // dbltap
- var p = touches[0], l = location(touches[0]);
- scaleTo(scale * 2);
- translateTo(p, l);
- dispatch(event.of(this, arguments));
- }
- touchtime = now;
- }
- }
-
- function touchmove() {
- var touches = d3.touches(this),
- p0 = touches[0],
- l0 = translate0[p0.identifier];
- if (p1 = touches[1]) {
- var p1, l1 = translate0[p1.identifier];
- p0 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
- l0 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
- scaleTo(d3.event.scale * scale0);
- }
- translateTo(p0, l0);
- touchtime = null;
- dispatch(event.of(this, arguments));
- }
-
- return d3.rebind(zoom, event, "on");
-};
-
-var d3_behavior_zoomInfinity = [0, Infinity]; // default scale extent
-
-// https://developer.mozilla.org/en-US/docs/Mozilla_event_reference/wheel
-var d3_behavior_zoomDelta, d3_behavior_zoomWheel
- = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() { return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1); }, "wheel")
- : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() { return d3.event.wheelDelta; }, "mousewheel")
- : (d3_behavior_zoomDelta = function() { return -d3.event.detail; }, "MozMousePixelScroll");
-function d3_functor(v) {
- return typeof v === "function" ? v : function() { return v; };
-}
-
-d3.functor = d3_functor;
-
-var d3_timer_id = 0,
- d3_timer_byId = {},
- d3_timer_queue = null,
- d3_timer_interval, // is an interval (or frame) active?
- d3_timer_timeout; // is a timeout active?
-
-// The timer will continue to fire until callback returns true.
-d3.timer = function(callback, delay, then) {
- if (arguments.length < 3) {
- if (arguments.length < 2) delay = 0;
- else if (!isFinite(delay)) return;
- then = Date.now();
- }
-
- // If the callback's already in the queue, update it.
- var timer = d3_timer_byId[callback.id];
- if (timer && timer.callback === callback) {
- timer.then = then;
- timer.delay = delay;
- }
-
- // Otherwise, add the callback to the queue.
- else d3_timer_byId[callback.id = ++d3_timer_id] = d3_timer_queue = {
- callback: callback,
- then: then,
- delay: delay,
- next: d3_timer_queue
- };
-
- // Start animatin'!
- if (!d3_timer_interval) {
- d3_timer_timeout = clearTimeout(d3_timer_timeout);
- d3_timer_interval = 1;
- d3_timer_frame(d3_timer_step);
- }
-};
-
-function d3_timer_step() {
- var elapsed,
- now = Date.now(),
- t1 = d3_timer_queue;
-
- while (t1) {
- elapsed = now - t1.then;
- if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed);
- t1 = t1.next;
- }
-
- var delay = d3_timer_flush() - now;
- if (delay > 24) {
- if (isFinite(delay)) {
- clearTimeout(d3_timer_timeout);
- d3_timer_timeout = setTimeout(d3_timer_step, delay);
- }
- d3_timer_interval = 0;
- } else {
- d3_timer_interval = 1;
- d3_timer_frame(d3_timer_step);
- }
-}
-
-d3.timer.flush = function() {
- var elapsed,
- now = Date.now(),
- t1 = d3_timer_queue;
-
- while (t1) {
- elapsed = now - t1.then;
- if (!t1.delay) t1.flush = t1.callback(elapsed);
- t1 = t1.next;
- }
-
- d3_timer_flush();
-};
-
-// Flush after callbacks to avoid concurrent queue modification.
-function d3_timer_flush() {
- var t0 = null,
- t1 = d3_timer_queue,
- then = Infinity;
- while (t1) {
- if (t1.flush) {
- delete d3_timer_byId[t1.callback.id];
- t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next;
- } else {
- then = Math.min(then, t1.then + t1.delay);
- t1 = (t0 = t1).next;
- }
- }
- return then;
-}
-
-var d3_timer_frame = d3_window.requestAnimationFrame
- || d3_window.webkitRequestAnimationFrame
- || d3_window.mozRequestAnimationFrame
- || d3_window.oRequestAnimationFrame
- || d3_window.msRequestAnimationFrame
- || function(callback) { setTimeout(callback, 17); };
-var π = Math.PI,
- ε = 1e-6,
- d3_radians = π / 180,
- d3_degrees = 180 / π;
-
-function d3_sgn(x) {
- return x > 0 ? 1 : x < 0 ? -1 : 0;
-}
-
-function d3_acos(x) {
- return Math.acos(Math.max(-1, Math.min(1, x)));
-}
-
-function d3_asin(x) {
- return x > 1 ? π / 2 : x < -1 ? -π / 2 : Math.asin(x);
-}
-
-function d3_sinh(x) {
- return (Math.exp(x) - Math.exp(-x)) / 2;
-}
-
-function d3_cosh(x) {
- return (Math.exp(x) + Math.exp(-x)) / 2;
-}
-
-function d3_haversin(x) {
- return (x = Math.sin(x / 2)) * x;
-}
-d3.geo = {};
-function d3_identity(d) {
- return d;
-}
-function d3_true() {
- return true;
-}
-
-function d3_geo_spherical(cartesian) {
- return [
- Math.atan2(cartesian[1], cartesian[0]),
- Math.asin(Math.max(-1, Math.min(1, cartesian[2])))
- ];
-}
-
-function d3_geo_sphericalEqual(a, b) {
- return Math.abs(a[0] - b[0]) < ε && Math.abs(a[1] - b[1]) < ε;
-}
-
-// General spherical polygon clipping algorithm: takes a polygon, cuts it into
-// visible line segments and rejoins the segments by interpolating along the
-// clip edge.
-function d3_geo_clipPolygon(segments, compare, inside, interpolate, listener) {
- var subject = [],
- clip = [];
-
- segments.forEach(function(segment) {
- if ((n = segment.length - 1) <= 0) return;
- var n, p0 = segment[0], p1 = segment[n];
-
- // If the first and last points of a segment are coincident, then treat as
- // a closed ring.
- // TODO if all rings are closed, then the winding order of the exterior
- // ring should be checked.
- if (d3_geo_sphericalEqual(p0, p1)) {
- listener.lineStart();
- for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);
- listener.lineEnd();
- return;
- }
-
- var a = {point: p0, points: segment, other: null, visited: false, entry: true, subject: true},
- b = {point: p0, points: [p0], other: a, visited: false, entry: false, subject: false};
- a.other = b;
- subject.push(a);
- clip.push(b);
- a = {point: p1, points: [p1], other: null, visited: false, entry: false, subject: true};
- b = {point: p1, points: [p1], other: a, visited: false, entry: true, subject: false};
- a.other = b;
- subject.push(a);
- clip.push(b);
- });
- clip.sort(compare);
- d3_geo_clipPolygonLinkCircular(subject);
- d3_geo_clipPolygonLinkCircular(clip);
- if (!subject.length) return;
-
- if (inside) for (var i = 1, e = !inside(clip[0].point), n = clip.length; i < n; ++i) {
- clip[i].entry = (e = !e);
- }
-
- var start = subject[0],
- current,
- points,
- point;
- while (1) {
- // Find first unvisited intersection.
- current = start;
- while (current.visited) if ((current = current.next) === start) return;
- points = current.points;
- listener.lineStart();
- do {
- current.visited = current.other.visited = true;
- if (current.entry) {
- if (current.subject) {
- for (var i = 0; i < points.length; i++) listener.point((point = points[i])[0], point[1]);
- } else {
- interpolate(current.point, current.next.point, 1, listener);
- }
- current = current.next;
- } else {
- if (current.subject) {
- points = current.prev.points;
- for (var i = points.length; --i >= 0;) listener.point((point = points[i])[0], point[1]);
- } else {
- interpolate(current.point, current.prev.point, -1, listener);
- }
- current = current.prev;
- }
- current = current.other;
- points = current.points;
- } while (!current.visited);
- listener.lineEnd();
- }
-}
-
-function d3_geo_clipPolygonLinkCircular(array) {
- if (!(n = array.length)) return;
- var n,
- i = 0,
- a = array[0],
- b;
- while (++i < n) {
- a.next = b = array[i];
- b.prev = a;
- a = b;
- }
- a.next = b = array[0];
- b.prev = a;
-}
-
-function d3_geo_clip(pointVisible, clipLine, interpolate) {
- return function(listener) {
- var line = clipLine(listener);
-
- var clip = {
- point: point,
- lineStart: lineStart,
- lineEnd: lineEnd,
- polygonStart: function() {
- clip.point = pointRing;
- clip.lineStart = ringStart;
- clip.lineEnd = ringEnd;
- invisible = false;
- invisibleArea = visibleArea = 0;
- segments = [];
- listener.polygonStart();
- },
- polygonEnd: function() {
- clip.point = point;
- clip.lineStart = lineStart;
- clip.lineEnd = lineEnd;
-
- segments = d3.merge(segments);
- if (segments.length) {
- d3_geo_clipPolygon(segments, d3_geo_clipSort, null, interpolate, listener);
- } else if (visibleArea < -ε || invisible && invisibleArea < -ε) {
- listener.lineStart();
- interpolate(null, null, 1, listener);
- listener.lineEnd();
- }
- listener.polygonEnd();
- segments = null;
- },
- sphere: function() {
- listener.polygonStart();
- listener.lineStart();
- interpolate(null, null, 1, listener);
- listener.lineEnd();
- listener.polygonEnd();
- }
- };
-
- function point(λ, φ) { if (pointVisible(λ, φ)) listener.point(λ, φ); }
- function pointLine(λ, φ) { line.point(λ, φ); }
- function lineStart() { clip.point = pointLine; line.lineStart(); }
- function lineEnd() { clip.point = point; line.lineEnd(); }
-
- var segments,
- visibleArea,
- invisibleArea,
- invisible;
-
- var buffer = d3_geo_clipBufferListener(),
- ringListener = clipLine(buffer),
- ring;
-
- function pointRing(λ, φ) {
- ringListener.point(λ, φ);
- ring.push([λ, φ]);
- }
-
- function ringStart() {
- ringListener.lineStart();
- ring = [];
- }
-
- function ringEnd() {
- pointRing(ring[0][0], ring[0][1]);
- ringListener.lineEnd();
-
- var clean = ringListener.clean(),
- ringSegments = buffer.buffer(),
- segment,
- n = ringSegments.length;
-
- // TODO compute on-the-fly?
- if (!n) {
- invisible = true;
- invisibleArea += d3_geo_clipAreaRing(ring, -1);
- ring = null;
- return;
- }
- ring = null;
-
- // No intersections.
- // TODO compute on-the-fly?
- if (clean & 1) {
- segment = ringSegments[0];
- visibleArea += d3_geo_clipAreaRing(segment, 1);
- var n = segment.length - 1,
- i = -1,
- point;
- listener.lineStart();
- while (++i < n) listener.point((point = segment[i])[0], point[1]);
- listener.lineEnd();
- return;
- }
-
- // Rejoin connected segments.
- // TODO reuse bufferListener.rejoin()?
- if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
-
- segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));
- }
-
- return clip;
- };
-}
-
-function d3_geo_clipSegmentLength1(segment) {
- return segment.length > 1;
-}
-
-function d3_geo_clipBufferListener() {
- var lines = [],
- line;
- return {
- lineStart: function() { lines.push(line = []); },
- point: function(λ, φ) { line.push([λ, φ]); },
- lineEnd: d3_noop,
- buffer: function() {
- var buffer = lines;
- lines = [];
- line = null;
- return buffer;
- },
- rejoin: function() {
- if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
- }
- };
-}
-
-// Approximate polygon ring area (×2, since we only need the sign).
-// For an invisible polygon ring, we rotate longitudinally by 180°.
-// The invisible parameter should be 1, or -1 to rotate longitudinally.
-// Based on Robert. G. Chamberlain and William H. Duquette,
-// “Some Algorithms for Polygons on a Sphere”,
-// http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409
-function d3_geo_clipAreaRing(ring, invisible) {
- if (!(n = ring.length)) return 0;
- var n,
- i = 0,
- area = 0,
- p = ring[0],
- λ = p[0],
- φ = p[1],
- cosφ = Math.cos(φ),
- x0 = Math.atan2(invisible * Math.sin(λ) * cosφ, Math.sin(φ)),
- y0 = 1 - invisible * Math.cos(λ) * cosφ,
- x1 = x0,
- x, // λ'; λ rotated to south pole.
- y; // φ' = 1 + sin(φ); φ rotated to south pole.
- while (++i < n) {
- p = ring[i];
- cosφ = Math.cos(φ = p[1]);
- x = Math.atan2(invisible * Math.sin(λ = p[0]) * cosφ, Math.sin(φ));
- y = 1 - invisible * Math.cos(λ) * cosφ;
-
- // If both the current point and the previous point are at the north pole,
- // skip this point.
- if (Math.abs(y0 - 2) < ε && Math.abs(y - 2) < ε) continue;
-
- // If this or the previous point is at the south pole, or if this segment
- // goes through the south pole, the area is 0.
- if (Math.abs(y) < ε || Math.abs(y0) < ε) {}
-
- // If this segment goes through either pole…
- else if (Math.abs(Math.abs(x - x0) - π) < ε) {
- // For the north pole, compute lune area.
- if (y + y0 > 2) area += 4 * (x - x0);
- // For the south pole, the area is zero.
- }
-
- // If the previous point is at the north pole, then compute lune area.
- else if (Math.abs(y0 - 2) < ε) area += 4 * (x - x1);
-
- // Otherwise, the spherical triangle area is approximately
- // δλ * (1 + sinφ0 + 1 + sinφ) / 2.
- else area += ((3 * π + x - x0) % (2 * π) - π) * (y0 + y);
-
- x1 = x0, x0 = x, y0 = y;
- }
- return area;
-}
-
-// Intersection points are sorted along the clip edge. For both antimeridian
-// cutting and circle clipping, the same comparison is used.
-function d3_geo_clipSort(a, b) {
- return ((a = a.point)[0] < 0 ? a[1] - π / 2 - ε : π / 2 - a[1])
- - ((b = b.point)[0] < 0 ? b[1] - π / 2 - ε : π / 2 - b[1]);
-}
-
-var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate);
-
-// Takes a line and cuts into visible segments. Return values:
-// 0: there were intersections or the line was empty.
-// 1: no intersections.
-// 2: there were intersections, and the first and last segments should be
-// rejoined.
-function d3_geo_clipAntimeridianLine(listener) {
- var λ0 = NaN,
- φ0 = NaN,
- sλ0 = NaN,
- clean; // no intersections
-
- return {
- lineStart: function() {
- listener.lineStart();
- clean = 1;
- },
- point: function(λ1, φ1) {
- var sλ1 = λ1 > 0 ? π : -π,
- dλ = Math.abs(λ1 - λ0);
- if (Math.abs(dλ - π) < ε) { // line crosses a pole
- listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? π / 2 : -π / 2);
- listener.point(sλ0, φ0);
- listener.lineEnd();
- listener.lineStart();
- listener.point(sλ1, φ0);
- listener.point( λ1, φ0);
- clean = 0;
- } else if (sλ0 !== sλ1 && dλ >= π) { // line crosses antimeridian
- // handle degeneracies
- if (Math.abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;
- if (Math.abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;
- φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);
- listener.point(sλ0, φ0);
- listener.lineEnd();
- listener.lineStart();
- listener.point(sλ1, φ0);
- clean = 0;
- }
- listener.point(λ0 = λ1, φ0 = φ1);
- sλ0 = sλ1;
- },
- lineEnd: function() {
- listener.lineEnd();
- λ0 = φ0 = NaN;
- },
- // if there are intersections, we always rejoin the first and last segments.
- clean: function() { return 2 - clean; }
- };
-}
-
-function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {
- var cosφ0,
- cosφ1,
- sinλ0_λ1 = Math.sin(λ0 - λ1);
- return Math.abs(sinλ0_λ1) > ε
- ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1)
- - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0))
- / (cosφ0 * cosφ1 * sinλ0_λ1))
- : (φ0 + φ1) / 2;
-}
-
-function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {
- var φ;
- if (from == null) {
- φ = direction * π / 2;
- listener.point(-π, φ);
- listener.point( 0, φ);
- listener.point( π, φ);
- listener.point( π, 0);
- listener.point( π, -φ);
- listener.point( 0, -φ);
- listener.point(-π, -φ);
- listener.point(-π, 0);
- listener.point(-π, φ);
- } else if (Math.abs(from[0] - to[0]) > ε) {
- var s = (from[0] < to[0] ? 1 : -1) * π;
- φ = direction * s / 2;
- listener.point(-s, φ);
- listener.point( 0, φ);
- listener.point( s, φ);
- } else {
- listener.point(to[0], to[1]);
- }
-}
-// TODO
-// cross and scale return new vectors,
-// whereas add and normalize operate in-place
-
-function d3_geo_cartesian(spherical) {
- var λ = spherical[0],
- φ = spherical[1],
- cosφ = Math.cos(φ);
- return [
- cosφ * Math.cos(λ),
- cosφ * Math.sin(λ),
- Math.sin(φ)
- ];
-}
-
-function d3_geo_cartesianDot(a, b) {
- return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
-}
-
-function d3_geo_cartesianCross(a, b) {
- 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]
- ];
-}
-
-function d3_geo_cartesianAdd(a, b) {
- a[0] += b[0];
- a[1] += b[1];
- a[2] += b[2];
-}
-
-function d3_geo_cartesianScale(vector, k) {
- return [
- vector[0] * k,
- vector[1] * k,
- vector[2] * k
- ];
-}
-
-function d3_geo_cartesianNormalize(d) {
- var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
- d[0] /= l;
- d[1] /= l;
- d[2] /= l;
-}
-
-function d3_geo_equirectangular(λ, φ) {
- return [λ, φ];
-}
-
-(d3.geo.equirectangular = function() {
- return d3_geo_projection(d3_geo_equirectangular);
-}).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;
-
-d3.geo.rotation = function(rotate) {
- rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);
-
- function forward(coordinates) {
- coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
- return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
- }
-
- forward.invert = function(coordinates) {
- coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
- return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
- };
-
- return forward;
-};
-
-// Note: |δλ| must be < 2π
-function d3_geo_rotation(δλ, δφ, δγ) {
- return δλ ? (δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ))
- : d3_geo_rotationλ(δλ))
- : (δφ || δγ ? d3_geo_rotationφγ(δφ, δγ)
- : d3_geo_equirectangular);
-}
-
-function d3_geo_forwardRotationλ(δλ) {
- return function(λ, φ) {
- return λ += δλ, [λ > π ? λ - 2 * π : λ < -π ? λ + 2 * π : λ, φ];
- };
-}
-
-function d3_geo_rotationλ(δλ) {
- var rotation = d3_geo_forwardRotationλ(δλ);
- rotation.invert = d3_geo_forwardRotationλ(-δλ);
- return rotation;
-}
-
-function d3_geo_rotationφγ(δφ, δγ) {
- var cosδφ = Math.cos(δφ),
- sinδφ = Math.sin(δφ),
- cosδγ = Math.cos(δγ),
- sinδγ = Math.sin(δγ);
-
- function rotation(λ, φ) {
- var cosφ = Math.cos(φ),
- x = Math.cos(λ) * cosφ,
- y = Math.sin(λ) * cosφ,
- z = Math.sin(φ),
- k = z * cosδφ + x * sinδφ;
- return [
- Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ),
- Math.asin(Math.max(-1, Math.min(1, k * cosδγ + y * sinδγ)))
- ];
- }
-
- rotation.invert = function(λ, φ) {
- var cosφ = Math.cos(φ),
- x = Math.cos(λ) * cosφ,
- y = Math.sin(λ) * cosφ,
- z = Math.sin(φ),
- k = z * cosδγ - y * sinδγ;
- return [
- Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ),
- Math.asin(Math.max(-1, Math.min(1, k * cosδφ - x * sinδφ)))
- ];
- };
-
- return rotation;
-}
-
-d3.geo.circle = function() {
- var origin = [0, 0],
- angle,
- precision = 6,
- interpolate;
-
- function circle() {
- var center = typeof origin === "function" ? origin.apply(this, arguments) : origin,
- rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert,
- ring = [];
-
- interpolate(null, null, 1, {
- point: function(x, y) {
- ring.push(x = rotate(x, y));
- x[0] *= d3_degrees, x[1] *= d3_degrees;
- }
- });
-
- return {type: "Polygon", coordinates: [ring]};
- }
-
- circle.origin = function(x) {
- if (!arguments.length) return origin;
- origin = x;
- return circle;
- };
-
- circle.angle = function(x) {
- if (!arguments.length) return angle;
- interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);
- return circle;
- };
-
- circle.precision = function(_) {
- if (!arguments.length) return precision;
- interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);
- return circle;
- };
-
- return circle.angle(90);
-};
-
-// Interpolates along a circle centered at [0°, 0°], with a given radius and
-// precision.
-function d3_geo_circleInterpolate(radius, precision) {
- var cr = Math.cos(radius),
- sr = Math.sin(radius);
- return function(from, to, direction, listener) {
- if (from != null) {
- from = d3_geo_circleAngle(cr, from);
- to = d3_geo_circleAngle(cr, to);
- if (direction > 0 ? from < to: from > to) from += direction * 2 * π;
- } else {
- from = radius + direction * 2 * π;
- to = radius;
- }
- var point;
- for (var step = direction * precision, t = from; direction > 0 ? t > to : t < to; t -= step) {
- listener.point((point = d3_geo_spherical([
- cr,
- -sr * Math.cos(t),
- -sr * Math.sin(t)
- ]))[0], point[1]);
- }
- };
-}
-
-// Signed angle of a cartesian point relative to [cr, 0, 0].
-function d3_geo_circleAngle(cr, point) {
- var a = d3_geo_cartesian(point);
- a[0] -= cr;
- d3_geo_cartesianNormalize(a);
- var angle = d3_acos(-a[1]);
- return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);
-}
-
-// Clip features against a small circle centered at [0°, 0°].
-function d3_geo_clipCircle(radius) {
- var cr = Math.cos(radius),
- smallRadius = cr > 0,
- notHemisphere = Math.abs(cr) > ε, // TODO optimise for this common case
- interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);
-
- return d3_geo_clip(visible, clipLine, interpolate);
-
- function visible(λ, φ) {
- return Math.cos(λ) * Math.cos(φ) > cr;
- }
-
- // Takes a line and cuts into visible segments. Return values used for
- // polygon clipping:
- // 0: there were intersections or the line was empty.
- // 1: no intersections.
- // 2: there were intersections, and the first and last segments should be
- // rejoined.
- function clipLine(listener) {
- var point0, // previous point
- c0, // code for previous point
- v0, // visibility of previous point
- v00, // visibility of first point
- clean; // no intersections
- return {
- lineStart: function() {
- v00 = v0 = false;
- clean = 1;
- },
- point: function(λ, φ) {
- var point1 = [λ, φ],
- point2,
- v = visible(λ, φ),
- c = smallRadius
- ? v ? 0 : code(λ, φ)
- : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;
- if (!point0 && (v00 = v0 = v)) listener.lineStart();
- // Handle degeneracies.
- // TODO ignore if not clipping polygons.
- if (v !== v0) {
- point2 = intersect(point0, point1);
- if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {
- point1[0] += ε;
- point1[1] += ε;
- v = visible(point1[0], point1[1]);
- }
- }
- if (v !== v0) {
- clean = 0;
- if (v) {
- // outside going in
- listener.lineStart();
- point2 = intersect(point1, point0);
- listener.point(point2[0], point2[1]);
- } else {
- // inside going out
- point2 = intersect(point0, point1);
- listener.point(point2[0], point2[1]);
- listener.lineEnd();
- }
- point0 = point2;
- } else if (notHemisphere && point0 && smallRadius ^ v) {
- var t;
- // If the codes for two points are different, or are both zero,
- // and there this segment intersects with the small circle.
- if (!(c & c0) && (t = intersect(point1, point0, true))) {
- clean = 0;
- if (smallRadius) {
- listener.lineStart();
- listener.point(t[0][0], t[0][1]);
- listener.point(t[1][0], t[1][1]);
- listener.lineEnd();
- } else {
- listener.point(t[1][0], t[1][1]);
- listener.lineEnd();
- listener.lineStart();
- listener.point(t[0][0], t[0][1]);
- }
- }
- }
- if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {
- listener.point(point1[0], point1[1]);
- }
- point0 = point1, v0 = v, c0 = c;
- },
- lineEnd: function() {
- if (v0) listener.lineEnd();
- point0 = null;
- },
- // Rejoin first and last segments if there were intersections and the first
- // and last points were visible.
- clean: function() { return clean | ((v00 && v0) << 1); }
- };
- }
-
- // Intersects the great circle between a and b with the clip circle.
- function intersect(a, b, two) {
- var pa = d3_geo_cartesian(a),
- pb = d3_geo_cartesian(b);
-
- // We have two planes, n1.p = d1 and n2.p = d2.
- // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
- var n1 = [1, 0, 0], // normal
- n2 = d3_geo_cartesianCross(pa, pb),
- n2n2 = d3_geo_cartesianDot(n2, n2),
- n1n2 = n2[0], // d3_geo_cartesianDot(n1, n2),
- determinant = n2n2 - n1n2 * n1n2;
-
- // Two polar points.
- if (!determinant) return !two && a;
-
- var c1 = cr * n2n2 / determinant,
- c2 = -cr * n1n2 / determinant,
- n1xn2 = d3_geo_cartesianCross(n1, n2),
- A = d3_geo_cartesianScale(n1, c1),
- B = d3_geo_cartesianScale(n2, c2);
- d3_geo_cartesianAdd(A, B);
-
- // Solve |p(t)|^2 = 1.
- var u = n1xn2,
- w = d3_geo_cartesianDot(A, u),
- uu = d3_geo_cartesianDot(u, u),
- t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);
-
- if (t2 < 0) return;
-
- var t = Math.sqrt(t2),
- q = d3_geo_cartesianScale(u, (-w - t) / uu);
- d3_geo_cartesianAdd(q, A);
- q = d3_geo_spherical(q);
- if (!two) return q;
-
- // Two intersection points.
- var λ0 = a[0],
- λ1 = b[0],
- φ0 = a[1],
- φ1 = b[1],
- z;
- if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;
- var δλ = λ1 - λ0,
- polar = Math.abs(δλ - π) < ε,
- meridian = polar || δλ < ε;
-
- if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;
-
- // Check that the first point is between a and b.
- if (meridian
- ? polar
- ? φ0 + φ1 > 0 ^ q[1] < (Math.abs(q[0] - λ0) < ε ? φ0 : φ1)
- : φ0 <= q[1] && q[1] <= φ1
- : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {
- var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);
- d3_geo_cartesianAdd(q1, A);
- return [q, d3_geo_spherical(q1)];
- }
- }
-
- // Generates a 4-bit vector representing the location of a point relative to
- // the small circle's bounding box.
- function code(λ, φ) {
- var r = smallRadius ? radius : π - radius,
- code = 0;
- if (λ < -r) code |= 1; // left
- else if (λ > r) code |= 2; // right
- if (φ < -r) code |= 4; // below
- else if (φ > r) code |= 8; // above
- return code;
- }
-}
-
-var d3_geo_clipViewMAX = 1e9;
-
-function d3_geo_clipView(x0, y0, x1, y1) {
- return function(listener) {
- var listener_ = listener,
- bufferListener = d3_geo_clipBufferListener(),
- segments,
- polygon,
- ring;
-
- var clip = {
- point: point,
- lineStart: lineStart,
- lineEnd: lineEnd,
- polygonStart: function() {
- listener = bufferListener;
- segments = [];
- polygon = [];
- },
- polygonEnd: function() {
- listener = listener_;
- if ((segments = d3.merge(segments)).length) {
- listener.polygonStart();
- d3_geo_clipPolygon(segments, compare, inside, interpolate, listener);
- listener.polygonEnd();
- } else if (insidePolygon([x0, y0])) {
- listener.polygonStart(), listener.lineStart();
- interpolate(null, null, 1, listener);
- listener.lineEnd(), listener.polygonEnd();
- }
- segments = polygon = ring = null;
- }
- };
-
- function inside(point) {
- var a = corner(point, -1),
- i = insidePolygon([a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0]);
- return i;
- }
-
- function insidePolygon(p) {
- var wn = 0, // the winding number counter
- n = polygon.length,
- y = p[1];
-
- for (var i = 0; i < n; ++i) {
- for (var j = 1, v = polygon[i], m = v.length, a = v[0]; j < m; ++j) {
- b = v[j];
- if (a[1] <= y) {
- if (b[1] > y && isLeft(a, b, p) > 0) ++wn;
- } else {
- if (b[1] <= y && isLeft(a, b, p) < 0) --wn;
- }
- a = b;
- }
- }
- return wn !== 0;
- }
-
- function isLeft(a, b, c) {
- return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1]);
- }
-
- function interpolate(from, to, direction, listener) {
- var a = 0, a1 = 0;
- if (from == null ||
- (a = corner(from, direction)) !== (a1 = corner(to, direction)) ||
- comparePoints(from, to) < 0 ^ direction > 0) {
- do {
- listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
- } while ((a = (a + direction + 4) % 4) !== a1);
- } else {
- listener.point(to[0], to[1]);
- }
- }
-
- function visible(x, y) {
- return x0 <= x && x <= x1 && y0 <= y && y <= y1;
- }
-
- function point(x, y) {
- if (visible(x, y)) listener.point(x, y);
- }
-
- var x__, y__, v__, // first point
- x_, y_, v_, // previous point
- first;
-
- function lineStart() {
- clip.point = linePoint;
- if (polygon) polygon.push(ring = []);
- first = true;
- v_ = false;
- x_ = y_ = NaN;
- }
-
- function lineEnd() {
- // TODO rather than special-case polygons, simply handle them separately.
- // Ideally, coincident intersection points should be jittered to avoid
- // clipping issues.
- if (segments) {
- linePoint(x__, y__);
- if (v__ && v_) bufferListener.rejoin();
- segments.push(bufferListener.buffer());
- }
- clip.point = point;
- if (v_) listener.lineEnd();
- }
-
- function linePoint(x, y) {
- x = Math.max(-d3_geo_clipViewMAX, Math.min(d3_geo_clipViewMAX, x));
- y = Math.max(-d3_geo_clipViewMAX, Math.min(d3_geo_clipViewMAX, y));
- var v = visible(x, y);
- if (polygon) ring.push([x, y]);
- if (first) {
- x__ = x, y__ = y, v__ = v;
- first = false;
- if (v) {
- listener.lineStart();
- listener.point(x, y);
- }
- } else {
- if (v && v_) listener.point(x, y);
- else {
- var a = [x_, y_],
- b = [x, y];
- if (clipLine(a, b)) {
- if (!v_) {
- listener.lineStart();
- listener.point(a[0], a[1]);
- }
- listener.point(b[0], b[1]);
- if (!v) listener.lineEnd();
- } else {
- listener.lineStart();
- listener.point(x, y);
- }
- }
- }
- x_ = x, y_ = y, v_ = v;
- }
-
- return clip;
- };
-
- function corner(p, direction) {
- return Math.abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3
- : Math.abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1
- : Math.abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0
- : direction > 0 ? 3 : 2; // Math.abs(p[1] - y1) < ε
- }
-
- function compare(a, b) {
- return comparePoints(a.point, b.point);
- }
-
- function comparePoints(a, b) {
- var ca = corner(a, 1),
- cb = corner(b, 1);
- return ca !== cb ? ca - cb
- : ca === 0 ? b[1] - a[1]
- : ca === 1 ? a[0] - b[0]
- : ca === 2 ? a[1] - b[1]
- : b[0] - a[0];
- }
-
- // Liang–Barsky line clipping.
- function clipLine(a, b) {
- var dx = b[0] - a[0],
- dy = b[1] - a[1],
- t = [0, 1];
-
- if (Math.abs(dx) < ε && Math.abs(dy) < ε) return x0 <= a[0] && a[0] <= x1 && y0 <= a[1] && a[1] <= y1;
-
- if (d3_geo_clipViewT(x0 - a[0], dx, t) &&
- d3_geo_clipViewT(a[0] - x1, -dx, t) &&
- d3_geo_clipViewT(y0 - a[1], dy, t) &&
- d3_geo_clipViewT(a[1] - y1, -dy, t)) {
- if (t[1] < 1) {
- b[0] = a[0] + t[1] * dx;
- b[1] = a[1] + t[1] * dy;
- }
- if (t[0] > 0) {
- a[0] += t[0] * dx;
- a[1] += t[0] * dy;
- }
- return true;
- }
-
- return false;
- }
-}
-
-function d3_geo_clipViewT(num, denominator, t) {
- if (Math.abs(denominator) < ε) return num <= 0;
-
- var u = num / denominator;
-
- if (denominator > 0) {
- if (u > t[1]) return false;
- if (u > t[0]) t[0] = u;
- } else {
- if (u < t[0]) return false;
- if (u < t[1]) t[1] = u;
- }
- return true;
-}
-function d3_geo_compose(a, b) {
-
- function compose(x, y) {
- return x = a(x, y), b(x[0], x[1]);
- }
-
- if (a.invert && b.invert) compose.invert = function(x, y) {
- return x = b.invert(x, y), x && a.invert(x[0], x[1]);
- };
-
- return compose;
-}
-
-d3.geo.stream = function(object, listener) {
- if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {
- d3_geo_streamObjectType[object.type](object, listener);
- } else {
- d3_geo_streamGeometry(object, listener);
- }
-};
-
-function d3_geo_streamGeometry(geometry, listener) {
- if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {
- d3_geo_streamGeometryType[geometry.type](geometry, listener);
- }
-}
-
-var d3_geo_streamObjectType = {
- Feature: function(feature, listener) {
- d3_geo_streamGeometry(feature.geometry, listener);
- },
- FeatureCollection: function(object, listener) {
- var features = object.features, i = -1, n = features.length;
- while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);
- }
-};
-
-var d3_geo_streamGeometryType = {
- Sphere: function(object, listener) {
- listener.sphere();
- },
- Point: function(object, listener) {
- var coordinate = object.coordinates;
- listener.point(coordinate[0], coordinate[1]);
- },
- MultiPoint: function(object, listener) {
- var coordinates = object.coordinates, i = -1, n = coordinates.length, coordinate;
- while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1]);
- },
- LineString: function(object, listener) {
- d3_geo_streamLine(object.coordinates, listener, 0);
- },
- MultiLineString: function(object, listener) {
- var coordinates = object.coordinates, i = -1, n = coordinates.length;
- while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);
- },
- Polygon: function(object, listener) {
- d3_geo_streamPolygon(object.coordinates, listener);
- },
- MultiPolygon: function(object, listener) {
- var coordinates = object.coordinates, i = -1, n = coordinates.length;
- while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);
- },
- GeometryCollection: function(object, listener) {
- var geometries = object.geometries, i = -1, n = geometries.length;
- while (++i < n) d3_geo_streamGeometry(geometries[i], listener);
- }
-};
-
-function d3_geo_streamLine(coordinates, listener, closed) {
- var i = -1, n = coordinates.length - closed, coordinate;
- listener.lineStart();
- while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1]);
- listener.lineEnd();
-}
-
-function d3_geo_streamPolygon(coordinates, listener) {
- var i = -1, n = coordinates.length;
- listener.polygonStart();
- while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);
- listener.polygonEnd();
-}
-
-function d3_geo_resample(project) {
- var δ2 = .5, // precision, px²
- maxDepth = 16;
-
- function resample(stream) {
- var λ0, x0, y0, a0, b0, c0; // previous point
-
- var resample = {
- point: point,
- lineStart: lineStart,
- lineEnd: lineEnd,
- polygonStart: function() { stream.polygonStart(); resample.lineStart = polygonLineStart; },
- polygonEnd: function() { stream.polygonEnd(); resample.lineStart = lineStart; }
- };
-
- function point(x, y) {
- x = project(x, y);
- stream.point(x[0], x[1]);
- }
-
- function lineStart() {
- x0 = NaN;
- resample.point = linePoint;
- stream.lineStart();
- }
-
- function linePoint(λ, φ) {
- var c = d3_geo_cartesian([λ, φ]), p = project(λ, φ);
- resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
- stream.point(x0, y0);
- }
-
- function lineEnd() {
- resample.point = point;
- stream.lineEnd();
- }
-
- function polygonLineStart() {
- var λ00, φ00, x00, y00, a00, b00, c00; // first point
-
- lineStart();
-
- resample.point = function(λ, φ) {
- linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
- resample.point = linePoint;
- };
-
- resample.lineEnd = function() {
- resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);
- resample.lineEnd = lineEnd;
- lineEnd();
- };
- }
-
- return resample;
- }
-
- function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {
- var dx = x1 - x0,
- dy = y1 - y0,
- d2 = dx * dx + dy * dy;
- if (d2 > 4 * δ2 && depth--) {
- var a = a0 + a1,
- b = b0 + b1,
- c = c0 + c1,
- m = Math.sqrt(a * a + b * b + c * c),
- φ2 = Math.asin(c /= m),
- λ2 = Math.abs(Math.abs(c) - 1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a),
- p = project(λ2, φ2),
- x2 = p[0],
- y2 = p[1],
- dx2 = x2 - x0,
- dy2 = y2 - y0,
- dz = dy * dx2 - dx * dy2;
- if (dz * dz / d2 > δ2 || Math.abs((dx * dx2 + dy * dy2) / d2 - .5) > .3) {
- resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);
- stream.point(x2, y2);
- resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);
- }
- }
- }
-
- resample.precision = function(_) {
- if (!arguments.length) return Math.sqrt(δ2);
- maxDepth = (δ2 = _ * _) > 0 && 16;
- return resample;
- };
-
- return resample;
-}
-
-d3.geo.projection = d3_geo_projection;
-d3.geo.projectionMutator = d3_geo_projectionMutator;
-
-function d3_geo_projection(project) {
- return d3_geo_projectionMutator(function() { return project; })();
-}
-
-function d3_geo_projectionMutator(projectAt) {
- var project,
- rotate,
- projectRotate,
- projectResample = d3_geo_resample(function(x, y) { x = project(x, y); return [x[0] * k + δx, δy - x[1] * k]; }),
- k = 150, // scale
- x = 480, y = 250, // translate
- λ = 0, φ = 0, // center
- δλ = 0, δφ = 0, δγ = 0, // rotate
- δx, δy, // center
- preclip = d3_geo_clipAntimeridian,
- postclip = d3_identity,
- clipAngle = null,
- clipExtent = null;
-
- function projection(point) {
- point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);
- return [point[0] * k + δx, δy - point[1] * k];
- }
-
- function invert(point) {
- point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);
- return point && [point[0] * d3_degrees, point[1] * d3_degrees];
- }
-
- projection.stream = function(stream) {
- return d3_geo_projectionRadiansRotate(rotate, preclip(projectResample(postclip(stream))));
- };
-
- projection.clipAngle = function(_) {
- if (!arguments.length) return clipAngle;
- preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);
- return projection;
- };
-
- projection.clipExtent = function(_) {
- if (!arguments.length) return clipExtent;
- clipExtent = _;
- postclip = _ == null ? d3_identity : d3_geo_clipView(_[0][0], _[0][1], _[1][0], _[1][1]);
- return projection;
- };
-
- projection.scale = function(_) {
- if (!arguments.length) return k;
- k = +_;
- return reset();
- };
-
- projection.translate = function(_) {
- if (!arguments.length) return [x, y];
- x = +_[0];
- y = +_[1];
- return reset();
- };
-
- projection.center = function(_) {
- if (!arguments.length) return [λ * d3_degrees, φ * d3_degrees];
- λ = _[0] % 360 * d3_radians;
- φ = _[1] % 360 * d3_radians;
- return reset();
- };
-
- projection.rotate = function(_) {
- if (!arguments.length) return [δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees];
- δλ = _[0] % 360 * d3_radians;
- δφ = _[1] % 360 * d3_radians;
- δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;
- return reset();
- };
-
- d3.rebind(projection, projectResample, "precision");
-
- function reset() {
- projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);
- var center = project(λ, φ);
- δx = x - center[0] * k;
- δy = y + center[1] * k;
- return projection;
- }
-
- return function() {
- project = projectAt.apply(this, arguments);
- projection.invert = project.invert && invert;
- return reset();
- };
-}
-
-function d3_geo_projectionRadiansRotate(rotate, stream) {
- return {
- point: function(x, y) {
- y = rotate(x * d3_radians, y * d3_radians), x = y[0];
- stream.point(x > π ? x - 2 * π : x < -π ? x + 2 * π : x, y[1]);
- },
- sphere: function() { stream.sphere(); },
- lineStart: function() { stream.lineStart(); },
- lineEnd: function() { stream.lineEnd(); },
- polygonStart: function() { stream.polygonStart(); },
- polygonEnd: function() { stream.polygonEnd(); }
- };
-}
-
-function d3_geo_mercator(λ, φ) {
- return [λ, Math.log(Math.tan(π / 4 + φ / 2))];
-}
-
-d3_geo_mercator.invert = function(x, y) {
- return [x, 2 * Math.atan(Math.exp(y)) - π / 2];
-};
-
-function d3_geo_mercatorProjection(project) {
- var m = d3_geo_projection(project),
- scale = m.scale,
- translate = m.translate,
- clipExtent = m.clipExtent,
- clipAuto;
-
- m.scale = function() {
- var v = scale.apply(m, arguments);
- return v === m ? (clipAuto ? m.clipExtent(null) : m) : v;
- };
-
- m.translate = function() {
- var v = translate.apply(m, arguments);
- return v === m ? (clipAuto ? m.clipExtent(null) : m) : v;
- };
-
- m.clipExtent = function(_) {
- var v = clipExtent.apply(m, arguments);
- if (v === m) {
- if (clipAuto = _ == null) {
- var k = π * scale(), t = translate();
- clipExtent([[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]]);
- }
- } else if (clipAuto) {
- v = null;
- }
- return v;
- };
-
- return m.clipExtent(null);
-}
-
-(d3.geo.mercator = function() {
- return d3_geo_mercatorProjection(d3_geo_mercator);
-}).raw = d3_geo_mercator;
-
-function d3_geo_conic(projectAt) {
- var φ0 = 0,
- φ1 = π / 3,
- m = d3_geo_projectionMutator(projectAt),
- p = m(φ0, φ1);
-
- p.parallels = function(_) {
- if (!arguments.length) return [φ0 / π * 180, φ1 / π * 180];
- return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);
- };
-
- return p;
-}
-
-function d3_geo_conicEqualArea(φ0, φ1) {
- var sinφ0 = Math.sin(φ0),
- n = (sinφ0 + Math.sin(φ1)) / 2,
- C = 1 + sinφ0 * (2 * n - sinφ0),
- ρ0 = Math.sqrt(C) / n;
-
- function forward(λ, φ) {
- var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;
- return [
- ρ * Math.sin(λ *= n),
- ρ0 - ρ * Math.cos(λ)
- ];
- }
-
- forward.invert = function(x, y) {
- var ρ0_y = ρ0 - y;
- return [
- Math.atan2(x, ρ0_y) / n,
- Math.asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n))
- ];
- };
-
- return forward;
-}
-
-(d3.geo.conicEqualArea = function() {
- return d3_geo_conic(d3_geo_conicEqualArea);
-}).raw = d3_geo_conicEqualArea;
-
-// A composite projection for the United States, 960×500. The set of standard
-// parallels for each region comes from USGS, which is published here:
-// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
-d3.geo.albersUsa = function() {
- var lower48 = d3.geo.conicEqualArea()
- .rotate([98, 0])
- .center([0, 38])
- .parallels([29.5, 45.5]);
-
- var alaska = d3.geo.conicEqualArea()
- .rotate([160, 0])
- .center([0, 60])
- .parallels([55, 65]);
-
- var hawaii = d3.geo.conicEqualArea()
- .rotate([160, 0])
- .center([0, 20])
- .parallels([8, 18]);
-
- var puertoRico = d3.geo.conicEqualArea()
- .rotate([60, 0])
- .center([0, 10])
- .parallels([8, 18]);
-
- var alaskaInvert,
- hawaiiInvert,
- puertoRicoInvert;
-
- function albersUsa(coordinates) {
- return projection(coordinates)(coordinates);
- }
-
- function projection(point) {
- var lon = point[0],
- lat = point[1];
- return lat > 50 ? alaska
- : lon < -140 ? hawaii
- : lat < 21 ? puertoRico
- : lower48;
- }
-
- albersUsa.invert = function(coordinates) {
- return alaskaInvert(coordinates) || hawaiiInvert(coordinates) || puertoRicoInvert(coordinates) || lower48.invert(coordinates);
- };
-
- albersUsa.scale = function(x) {
- if (!arguments.length) return lower48.scale();
- lower48.scale(x);
- alaska.scale(x * .6);
- hawaii.scale(x);
- puertoRico.scale(x * 1.5);
- return albersUsa.translate(lower48.translate());
- };
-
- albersUsa.translate = function(x) {
- if (!arguments.length) return lower48.translate();
- var dz = lower48.scale(),
- dx = x[0],
- dy = x[1];
- lower48.translate(x);
- alaska.translate([dx - .40 * dz, dy + .17 * dz]);
- hawaii.translate([dx - .19 * dz, dy + .20 * dz]);
- puertoRico.translate([dx + .58 * dz, dy + .43 * dz]);
-
- alaskaInvert = d3_geo_albersUsaInvert(alaska, [[-180, 50], [-130, 72]]);
- hawaiiInvert = d3_geo_albersUsaInvert(hawaii, [[-164, 18], [-154, 24]]);
- puertoRicoInvert = d3_geo_albersUsaInvert(puertoRico, [[-67.5, 17.5], [-65, 19]]);
-
- return albersUsa;
- };
-
- return albersUsa.scale(1000);
-};
-
-function d3_geo_albersUsaInvert(projection, extent) {
- var a = projection(extent[0]),
- b = projection([.5 * (extent[0][0] + extent[1][0]), extent[0][1]]),
- c = projection([extent[1][0], extent[0][1]]),
- d = projection(extent[1]);
-
- var dya = b[1]- a[1],
- dxa = b[0]- a[0],
- dyb = c[1]- b[1],
- dxb = c[0]- b[0];
-
- var ma = dya / dxa,
- mb = dyb / dxb;
-
- // Find center of circle going through points [a, b, c].
- var cx = .5 * (ma * mb * (a[1] - c[1]) + mb * (a[0] + b[0]) - ma * (b[0] + c[0])) / (mb - ma),
- cy = (.5 * (a[0] + b[0]) - cx) / ma + .5 * (a[1] + b[1]);
-
- // Radial distance² from center.
- var dx0 = d[0] - cx,
- dy0 = d[1] - cy,
- dx1 = a[0] - cx,
- dy1 = a[1] - cy,
- r0 = dx0 * dx0 + dy0 * dy0,
- r1 = dx1 * dx1 + dy1 * dy1;
-
- // Angular extent.
- var a0 = Math.atan2(dy0, dx0),
- a1 = Math.atan2(dy1, dx1);
-
- return function(coordinates) {
- var dx = coordinates[0] - cx,
- dy = coordinates[1] - cy,
- r = dx * dx + dy * dy,
- a = Math.atan2(dy, dx);
- if (r0 < r && r < r1 && a0 < a && a < a1) return projection.invert(coordinates);
- };
-}
-
-d3.geo.area = function(object) {
- d3_geo_areaSum = 0;
- d3.geo.stream(object, d3_geo_area);
- return d3_geo_areaSum;
-};
-
-var d3_geo_areaSum,
- d3_geo_areaRingU,
- d3_geo_areaRingV;
-
-var d3_geo_area = {
- sphere: function() { d3_geo_areaSum += 4 * π; },
- point: d3_noop,
- lineStart: d3_noop,
- lineEnd: d3_noop,
-
- // Only count area for polygon rings.
- polygonStart: function() {
- d3_geo_areaRingU = 1, d3_geo_areaRingV = 0;
- d3_geo_area.lineStart = d3_geo_areaRingStart;
- },
- polygonEnd: function() {
- var area = 2 * Math.atan2(d3_geo_areaRingV, d3_geo_areaRingU);
- d3_geo_areaSum += area < 0 ? 4 * π + area : area;
- d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;
- }
-};
-
-function d3_geo_areaRingStart() {
- var λ00, φ00, λ0, cosφ0, sinφ0; // start point and two previous points
-
- // For the first point, …
- d3_geo_area.point = function(λ, φ) {
- d3_geo_area.point = nextPoint;
- λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), sinφ0 = Math.sin(φ);
- };
-
- // For subsequent points, …
- function nextPoint(λ, φ) {
- λ *= d3_radians;
- φ = φ * d3_radians / 2 + π / 4; // half the angular distance from south pole
-
- // Spherical excess E for a spherical triangle with vertices: south pole,
- // previous point, current point. Uses a formula derived from Cagnoli’s
- // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
- var dλ = λ - λ0,
- cosφ = Math.cos(φ),
- sinφ = Math.sin(φ),
- k = sinφ0 * sinφ,
- u0 = d3_geo_areaRingU,
- v0 = d3_geo_areaRingV,
- u = cosφ0 * cosφ + k * Math.cos(dλ),
- v = k * Math.sin(dλ);
- // ∑ arg(z) = arg(∏ z), where z = u + iv.
- d3_geo_areaRingU = u0 * u - v0 * v;
- d3_geo_areaRingV = v0 * u + u0 * v;
-
- // Advance the previous points.
- λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;
- }
-
- // For the last point, return to the start.
- d3_geo_area.lineEnd = function() {
- nextPoint(λ00, φ00);
- };
-}
-
-d3.geo.bounds = d3_geo_bounds(d3_identity);
-
-function d3_geo_bounds(projectStream) {
- var x0, y0, x1, y1;
-
- var bound = {
- point: boundPoint,
- lineStart: d3_noop,
- lineEnd: d3_noop,
-
- // While inside a polygon, ignore points in holes.
- polygonStart: function() { bound.lineEnd = boundPolygonLineEnd; },
- polygonEnd: function() { bound.point = boundPoint; }
- };
-
- function boundPoint(x, y) {
- if (x < x0) x0 = x;
- if (x > x1) x1 = x;
- if (y < y0) y0 = y;
- if (y > y1) y1 = y;
- }
-
- function boundPolygonLineEnd() {
- bound.point = bound.lineEnd = d3_noop;
- }
-
- return function(feature) {
- y1 = x1 = -(x0 = y0 = Infinity);
- d3.geo.stream(feature, projectStream(bound));
- return [[x0, y0], [x1, y1]];
- };
-}
-
-d3.geo.centroid = function(object) {
- d3_geo_centroidDimension = d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
- d3.geo.stream(object, d3_geo_centroid);
- var m;
- if (d3_geo_centroidW &&
- Math.abs(m = Math.sqrt(d3_geo_centroidX * d3_geo_centroidX + d3_geo_centroidY * d3_geo_centroidY + d3_geo_centroidZ * d3_geo_centroidZ)) > ε) {
- return [
- Math.atan2(d3_geo_centroidY, d3_geo_centroidX) * d3_degrees,
- Math.asin(Math.max(-1, Math.min(1, d3_geo_centroidZ / m))) * d3_degrees
- ];
- }
-};
-
-var d3_geo_centroidDimension,
- d3_geo_centroidW,
- d3_geo_centroidX,
- d3_geo_centroidY,
- d3_geo_centroidZ;
-
-var d3_geo_centroid = {
- sphere: function() {
- if (d3_geo_centroidDimension < 2) {
- d3_geo_centroidDimension = 2;
- d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
- }
- },
- point: d3_geo_centroidPoint,
- lineStart: d3_geo_centroidLineStart,
- lineEnd: d3_geo_centroidLineEnd,
- polygonStart: function() {
- if (d3_geo_centroidDimension < 2) {
- d3_geo_centroidDimension = 2;
- d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
- }
- d3_geo_centroid.lineStart = d3_geo_centroidRingStart;
- },
- polygonEnd: function() {
- d3_geo_centroid.lineStart = d3_geo_centroidLineStart;
- }
-};
-
-// Arithmetic mean of Cartesian vectors.
-function d3_geo_centroidPoint(λ, φ) {
- if (d3_geo_centroidDimension) return;
- ++d3_geo_centroidW;
- λ *= d3_radians;
- var cosφ = Math.cos(φ *= d3_radians);
- d3_geo_centroidX += (cosφ * Math.cos(λ) - d3_geo_centroidX) / d3_geo_centroidW;
- d3_geo_centroidY += (cosφ * Math.sin(λ) - d3_geo_centroidY) / d3_geo_centroidW;
- d3_geo_centroidZ += (Math.sin(φ) - d3_geo_centroidZ) / d3_geo_centroidW;
-}
-
-function d3_geo_centroidRingStart() {
- var λ00, φ00; // first point
-
- d3_geo_centroidDimension = 1;
- d3_geo_centroidLineStart();
- d3_geo_centroidDimension = 2;
-
- var linePoint = d3_geo_centroid.point;
- d3_geo_centroid.point = function(λ, φ) {
- linePoint(λ00 = λ, φ00 = φ);
- };
- d3_geo_centroid.lineEnd = function() {
- d3_geo_centroid.point(λ00, φ00);
- d3_geo_centroidLineEnd();
- d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;
- };
-}
-
-function d3_geo_centroidLineStart() {
- var x0, y0, z0; // previous point
-
- if (d3_geo_centroidDimension > 1) return;
- if (d3_geo_centroidDimension < 1) {
- d3_geo_centroidDimension = 1;
- d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
- }
-
- d3_geo_centroid.point = function(λ, φ) {
- λ *= d3_radians;
- var cosφ = Math.cos(φ *= d3_radians);
- x0 = cosφ * Math.cos(λ);
- y0 = cosφ * Math.sin(λ);
- z0 = Math.sin(φ);
- d3_geo_centroid.point = nextPoint;
- };
-
- function nextPoint(λ, φ) {
- λ *= d3_radians;
- var cosφ = Math.cos(φ *= d3_radians),
- x = cosφ * Math.cos(λ),
- y = cosφ * Math.sin(λ),
- z = Math.sin(φ),
- w = Math.atan2(
- Math.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);
- d3_geo_centroidW += w;
- d3_geo_centroidX += w * (x0 + (x0 = x));
- d3_geo_centroidY += w * (y0 + (y0 = y));
- d3_geo_centroidZ += w * (z0 + (z0 = z));
- }
-}
-
-function d3_geo_centroidLineEnd() {
- d3_geo_centroid.point = d3_geo_centroidPoint;
-}
-
-// TODO Unify this code with d3.geom.polygon area?
-
-var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {
- point: d3_noop,
- lineStart: d3_noop,
- lineEnd: d3_noop,
-
- // Only count area for polygon rings.
- polygonStart: function() {
- d3_geo_pathAreaPolygon = 0;
- d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;
- },
- polygonEnd: function() {
- d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;
- d3_geo_pathAreaSum += Math.abs(d3_geo_pathAreaPolygon / 2);
- }
-};
-
-function d3_geo_pathAreaRingStart() {
- var x00, y00, x0, y0;
-
- // For the first point, …
- d3_geo_pathArea.point = function(x, y) {
- d3_geo_pathArea.point = nextPoint;
- x00 = x0 = x, y00 = y0 = y;
- };
-
- // For subsequent points, …
- function nextPoint(x, y) {
- d3_geo_pathAreaPolygon += y0 * x - x0 * y;
- x0 = x, y0 = y;
- }
-
- // For the last point, return to the start.
- d3_geo_pathArea.lineEnd = function() {
- nextPoint(x00, y00);
- };
-}
-function d3_geo_pathBuffer() {
- var pointCircle = d3_geo_pathCircle(4.5),
- buffer = [];
-
- var stream = {
- point: point,
-
- // While inside a line, override point to moveTo then lineTo.
- lineStart: function() { stream.point = pointLineStart; },
- lineEnd: lineEnd,
-
- // While inside a polygon, override lineEnd to closePath.
- polygonStart: function() { stream.lineEnd = lineEndPolygon; },
- polygonEnd: function() { stream.lineEnd = lineEnd; stream.point = point; },
-
- pointRadius: function(_) {
- pointCircle = d3_geo_pathCircle(_);
- return stream;
- },
-
- result: function() {
- if (buffer.length) {
- var result = buffer.join("");
- buffer = [];
- return result;
- }
- }
- };
-
- function point(x, y) {
- buffer.push("M", x, ",", y, pointCircle);
- }
-
- function pointLineStart(x, y) {
- buffer.push("M", x, ",", y);
- stream.point = pointLine;
- }
-
- function pointLine(x, y) {
- buffer.push("L", x, ",", y);
- }
-
- function lineEnd() {
- stream.point = point;
- }
-
- function lineEndPolygon() {
- buffer.push("Z");
- }
-
- return stream;
-}
-
-// TODO Unify this code with d3.geom.polygon centroid?
-// TODO Enforce positive area for exterior, negative area for interior?
-
-var d3_geo_pathCentroid = {
- point: d3_geo_pathCentroidPoint,
-
- // For lines, weight by length.
- lineStart: d3_geo_pathCentroidLineStart,
- lineEnd: d3_geo_pathCentroidLineEnd,
-
- // For polygons, weight by area.
- polygonStart: function() {
- d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;
- },
- polygonEnd: function() {
- d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
- d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;
- d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;
- }
-};
-
-function d3_geo_pathCentroidPoint(x, y) {
- if (d3_geo_centroidDimension) return;
- d3_geo_centroidX += x;
- d3_geo_centroidY += y;
- ++d3_geo_centroidZ;
-}
-
-function d3_geo_pathCentroidLineStart() {
- var x0, y0;
-
- if (d3_geo_centroidDimension !== 1) {
- if (d3_geo_centroidDimension < 1) {
- d3_geo_centroidDimension = 1;
- d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
- } else return;
- }
-
- d3_geo_pathCentroid.point = function(x, y) {
- d3_geo_pathCentroid.point = nextPoint;
- x0 = x, y0 = y;
- };
-
- function nextPoint(x, y) {
- var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
- d3_geo_centroidX += z * (x0 + x) / 2;
- d3_geo_centroidY += z * (y0 + y) / 2;
- d3_geo_centroidZ += z;
- x0 = x, y0 = y;
- }
-}
-
-function d3_geo_pathCentroidLineEnd() {
- d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
-}
-
-function d3_geo_pathCentroidRingStart() {
- var x00, y00, x0, y0;
-
- if (d3_geo_centroidDimension < 2) {
- d3_geo_centroidDimension = 2;
- d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
- }
-
- // For the first point, …
- d3_geo_pathCentroid.point = function(x, y) {
- d3_geo_pathCentroid.point = nextPoint;
- x00 = x0 = x, y00 = y0 = y;
- };
-
- // For subsequent points, …
- function nextPoint(x, y) {
- var z = y0 * x - x0 * y;
- d3_geo_centroidX += z * (x0 + x);
- d3_geo_centroidY += z * (y0 + y);
- d3_geo_centroidZ += z * 3;
- x0 = x, y0 = y;
- }
-
- // For the last point, return to the start.
- d3_geo_pathCentroid.lineEnd = function() {
- nextPoint(x00, y00);
- };
-}
-
-function d3_geo_pathContext(context) {
- var pointRadius = 4.5;
-
- var stream = {
- point: point,
-
- // While inside a line, override point to moveTo then lineTo.
- lineStart: function() { stream.point = pointLineStart; },
- lineEnd: lineEnd,
-
- // While inside a polygon, override lineEnd to closePath.
- polygonStart: function() { stream.lineEnd = lineEndPolygon; },
- polygonEnd: function() { stream.lineEnd = lineEnd; stream.point = point; },
-
- pointRadius: function(_) {
- pointRadius = _;
- return stream;
- },
-
- result: d3_noop
- };
-
- function point(x, y) {
- context.moveTo(x, y);
- context.arc(x, y, pointRadius, 0, 2 * π);
- }
-
- function pointLineStart(x, y) {
- context.moveTo(x, y);
- stream.point = pointLine;
- }
-
- function pointLine(x, y) {
- context.lineTo(x, y);
- }
-
- function lineEnd() {
- stream.point = point;
- }
-
- function lineEndPolygon() {
- context.closePath();
- }
-
- return stream;
-}
-
-d3.geo.path = function() {
- var pointRadius = 4.5,
- projection,
- context,
- projectStream,
- contextStream;
-
- function path(object) {
- if (object) d3.geo.stream(object, projectStream(
- contextStream.pointRadius(typeof pointRadius === "function"
- ? +pointRadius.apply(this, arguments)
- : pointRadius)));
- return contextStream.result();
- }
-
- path.area = function(object) {
- d3_geo_pathAreaSum = 0;
- d3.geo.stream(object, projectStream(d3_geo_pathArea));
- return d3_geo_pathAreaSum;
- };
-
- path.centroid = function(object) {
- d3_geo_centroidDimension = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
- d3.geo.stream(object, projectStream(d3_geo_pathCentroid));
- return d3_geo_centroidZ ? [d3_geo_centroidX / d3_geo_centroidZ, d3_geo_centroidY / d3_geo_centroidZ] : undefined;
- };
-
- path.bounds = function(object) {
- return d3_geo_bounds(projectStream)(object);
- };
-
- path.projection = function(_) {
- if (!arguments.length) return projection;
- projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;
- return path;
- };
-
- path.context = function(_) {
- if (!arguments.length) return context;
- contextStream = (context = _) == null ? new d3_geo_pathBuffer : new d3_geo_pathContext(_);
- return path;
- };
-
- path.pointRadius = function(_) {
- if (!arguments.length) return pointRadius;
- pointRadius = typeof _ === "function" ? _ : +_;
- return path;
- };
-
- return path.projection(d3.geo.albersUsa()).context(null);
-};
-
-function d3_geo_pathCircle(radius) {
- return "m0," + radius
- + "a" + radius + "," + radius + " 0 1,1 0," + (-2 * radius)
- + "a" + radius + "," + radius + " 0 1,1 0," + (+2 * radius)
- + "z";
-}
-
-function d3_geo_pathProjectStream(project) {
- var resample = d3_geo_resample(function(λ, φ) { return project([λ * d3_degrees, φ * d3_degrees]); });
- return function(stream) {
- stream = resample(stream);
- return {
- point: function(λ, φ) { stream.point(λ * d3_radians, φ * d3_radians); },
- sphere: function() { stream.sphere(); },
- lineStart: function() { stream.lineStart(); },
- lineEnd: function() { stream.lineEnd(); },
- polygonStart: function() { stream.polygonStart(); },
- polygonEnd: function() { stream.polygonEnd(); }
- };
- };
-}
-d3.geom = {};
-
-d3.geom.polygon = function(coordinates) {
-
- coordinates.area = function() {
- var i = 0,
- n = coordinates.length,
- area = coordinates[n - 1][1] * coordinates[0][0] - coordinates[n - 1][0] * coordinates[0][1];
- while (++i < n) {
- area += coordinates[i - 1][1] * coordinates[i][0] - coordinates[i - 1][0] * coordinates[i][1];
- }
- return area * .5;
- };
-
- coordinates.centroid = function(k) {
- var i = -1,
- n = coordinates.length,
- x = 0,
- y = 0,
- a,
- b = coordinates[n - 1],
- c;
- if (!arguments.length) k = -1 / (6 * coordinates.area());
- while (++i < n) {
- a = b;
- b = coordinates[i];
- c = a[0] * b[1] - b[0] * a[1];
- x += (a[0] + b[0]) * c;
- y += (a[1] + b[1]) * c;
- }
- return [x * k, y * k];
- };
-
- // The Sutherland-Hodgman clipping algorithm.
- // Note: requires the clip polygon to be counterclockwise and convex.
- coordinates.clip = function(subject) {
- var input,
- i = -1,
- n = coordinates.length,
- j,
- m,
- a = coordinates[n - 1],
- b,
- c,
- d;
- while (++i < n) {
- input = subject.slice();
- subject.length = 0;
- b = coordinates[i];
- c = input[(m = input.length) - 1];
- j = -1;
- while (++j < m) {
- d = input[j];
- if (d3_geom_polygonInside(d, a, b)) {
- if (!d3_geom_polygonInside(c, a, b)) {
- subject.push(d3_geom_polygonIntersect(c, d, a, b));
- }
- subject.push(d);
- } else if (d3_geom_polygonInside(c, a, b)) {
- subject.push(d3_geom_polygonIntersect(c, d, a, b));
- }
- c = d;
- }
- a = b;
- }
- return subject;
- };
-
- return coordinates;
-};
-
-function d3_geom_polygonInside(p, a, b) {
- return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);
-}
-
-// Intersect two infinite lines cd and ab.
-function d3_geom_polygonIntersect(c, d, a, b) {
- var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3,
- y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3,
- ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);
- return [x1 + ua * x21, y1 + ua * y21];
-}
-
-var d3_ease_default = function() { return d3_identity; };
-
-var d3_ease = d3.map({
- linear: d3_ease_default,
- poly: d3_ease_poly,
- quad: function() { return d3_ease_quad; },
- cubic: function() { return d3_ease_cubic; },
- sin: function() { return d3_ease_sin; },
- exp: function() { return d3_ease_exp; },
- circle: function() { return d3_ease_circle; },
- elastic: d3_ease_elastic,
- back: d3_ease_back,
- bounce: function() { return d3_ease_bounce; }
-});
-
-var d3_ease_mode = d3.map({
- "in": d3_identity,
- "out": d3_ease_reverse,
- "in-out": d3_ease_reflect,
- "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); }
-});
-
-d3.ease = function(name) {
- var i = name.indexOf("-"),
- t = i >= 0 ? name.substring(0, i) : name,
- m = i >= 0 ? name.substring(i + 1) : "in";
- t = d3_ease.get(t) || d3_ease_default;
- m = d3_ease_mode.get(m) || d3_identity;
- return d3_ease_clamp(m(t.apply(null, Array.prototype.slice.call(arguments, 1))));
-};
-
-function d3_ease_clamp(f) {
- return function(t) {
- return t <= 0 ? 0 : t >= 1 ? 1 : f(t);
- };
-}
-
-function d3_ease_reverse(f) {
- return function(t) {
- return 1 - f(1 - t);
- };
-}
-
-function d3_ease_reflect(f) {
- return function(t) {
- return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t)));
- };
-}
-
-function d3_ease_quad(t) {
- return t * t;
-}
-
-function d3_ease_cubic(t) {
- return t * t * t;
-}
-
-// Optimized clamp(reflect(poly(3))).
-function d3_ease_cubicInOut(t) {
- if (t <= 0) return 0;
- if (t >= 1) return 1;
- var t2 = t * t, t3 = t2 * t;
- return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);
-}
-
-function d3_ease_poly(e) {
- return function(t) {
- return Math.pow(t, e);
- };
-}
-
-function d3_ease_sin(t) {
- return 1 - Math.cos(t * π / 2);
-}
-
-function d3_ease_exp(t) {
- return Math.pow(2, 10 * (t - 1));
-}
-
-function d3_ease_circle(t) {
- return 1 - Math.sqrt(1 - t * t);
-}
-
-function d3_ease_elastic(a, p) {
- var s;
- if (arguments.length < 2) p = 0.45;
- if (arguments.length) s = p / (2 * π) * Math.asin(1 / a);
- else a = 1, s = p / 4;
- return function(t) {
- return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * π / p);
- };
-}
-
-function d3_ease_back(s) {
- if (!s) s = 1.70158;
- return function(t) {
- return t * t * ((s + 1) * t - s);
- };
-}
-
-function d3_ease_bounce(t) {
- return t < 1 / 2.75 ? 7.5625 * t * t
- : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75
- : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375
- : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;
-}
-
-function d3_transition(groups, id) {
- d3_arraySubclass(groups, d3_transitionPrototype);
-
- groups.id = id; // Note: read-only!
-
- return groups;
-}
-
-var d3_transitionPrototype = [],
- d3_transitionId = 0,
- d3_transitionInheritId,
- d3_transitionInherit = {ease: d3_ease_cubicInOut, delay: 0, duration: 250};
-
-d3_transitionPrototype.call = d3_selectionPrototype.call;
-d3_transitionPrototype.empty = d3_selectionPrototype.empty;
-d3_transitionPrototype.node = d3_selectionPrototype.node;
-
-d3.transition = function(selection) {
- return arguments.length
- ? (d3_transitionInheritId ? selection.transition() : selection)
- : d3_selectionRoot.transition();
-};
-
-d3.transition.prototype = d3_transitionPrototype;
-
-
-d3_transitionPrototype.select = function(selector) {
- var id = this.id,
- subgroups = [],
- subgroup,
- subnode,
- node;
-
- if (typeof selector !== "function") selector = d3_selection_selector(selector);
-
- for (var j = -1, m = this.length; ++j < m;) {
- subgroups.push(subgroup = []);
- for (var group = this[j], i = -1, n = group.length; ++i < n;) {
- if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i))) {
- if ("__data__" in node) subnode.__data__ = node.__data__;
- d3_transitionNode(subnode, i, id, node.__transition__[id]);
- subgroup.push(subnode);
- } else {
- subgroup.push(null);
- }
- }
- }
-
- return d3_transition(subgroups, id);
-};
-
-d3_transitionPrototype.selectAll = function(selector) {
- var id = this.id,
- subgroups = [],
- subgroup,
- subnodes,
- node,
- subnode,
- transition;
-
- if (typeof selector !== "function") selector = d3_selection_selectorAll(selector);
-
- for (var j = -1, m = this.length; ++j < m;) {
- for (var group = this[j], i = -1, n = group.length; ++i < n;) {
- if (node = group[i]) {
- transition = node.__transition__[id];
- subnodes = selector.call(node, node.__data__, i);
- subgroups.push(subgroup = []);
- for (var k = -1, o = subnodes.length; ++k < o;) {
- d3_transitionNode(subnode = subnodes[k], k, id, transition);
- subgroup.push(subnode);
- }
- }
- }
- }
-
- return d3_transition(subgroups, id);
-};
-
-d3_transitionPrototype.filter = function(filter) {
- var subgroups = [],
- subgroup,
- group,
- node;
-
- if (typeof filter !== "function") filter = d3_selection_filter(filter);
-
- for (var j = 0, m = this.length; j < m; j++) {
- subgroups.push(subgroup = []);
- for (var group = this[j], i = 0, n = group.length; i < n; i++) {
- if ((node = group[i]) && filter.call(node, node.__data__, i)) {
- subgroup.push(node);
- }
- }
- }
-
- return d3_transition(subgroups, this.id, this.time).ease(this.ease());
-};
-function d3_Color() {}
-
-d3_Color.prototype.toString = function() {
- return this.rgb() + "";
-};
-
-d3.hsl = function(h, s, l) {
- return arguments.length === 1
- ? (h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l)
- : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl))
- : d3_hsl(+h, +s, +l);
-};
-
-function d3_hsl(h, s, l) {
- return new d3_Hsl(h, s, l);
-}
-
-function d3_Hsl(h, s, l) {
- this.h = h;
- this.s = s;
- this.l = l;
-}
-
-var d3_hslPrototype = d3_Hsl.prototype = new d3_Color;
-
-d3_hslPrototype.brighter = function(k) {
- k = Math.pow(0.7, arguments.length ? k : 1);
- return d3_hsl(this.h, this.s, this.l / k);
-};
-
-d3_hslPrototype.darker = function(k) {
- k = Math.pow(0.7, arguments.length ? k : 1);
- return d3_hsl(this.h, this.s, k * this.l);
-};
-
-d3_hslPrototype.rgb = function() {
- return d3_hsl_rgb(this.h, this.s, this.l);
-};
-
-function d3_hsl_rgb(h, s, l) {
- var m1,
- m2;
-
- /* Some simple corrections for h, s and l. */
- h = h % 360; if (h < 0) h += 360;
- s = s < 0 ? 0 : s > 1 ? 1 : s;
- l = l < 0 ? 0 : l > 1 ? 1 : l;
-
- /* From FvD 13.37, CSS Color Module Level 3 */
- m2 = l <= .5 ? l * (1 + s) : l + s - l * s;
- m1 = 2 * l - m2;
-
- function v(h) {
- if (h > 360) h -= 360;
- else if (h < 0) h += 360;
- if (h < 60) return m1 + (m2 - m1) * h / 60;
- if (h < 180) return m2;
- if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
- return m1;
- }
-
- function vv(h) {
- return Math.round(v(h) * 255);
- }
-
- return d3_rgb(vv(h + 120), vv(h), vv(h - 120));
-}
-
-d3.hcl = function(h, c, l) {
- return arguments.length === 1
- ? (h instanceof d3_Hcl ? d3_hcl(h.h, h.c, h.l)
- : (h instanceof d3_Lab ? d3_lab_hcl(h.l, h.a, h.b)
- : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b)))
- : d3_hcl(+h, +c, +l);
-};
-
-function d3_hcl(h, c, l) {
- return new d3_Hcl(h, c, l);
-}
-
-function d3_Hcl(h, c, l) {
- this.h = h;
- this.c = c;
- this.l = l;
-}
-
-var d3_hclPrototype = d3_Hcl.prototype = new d3_Color;
-
-d3_hclPrototype.brighter = function(k) {
- return d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));
-};
-
-d3_hclPrototype.darker = function(k) {
- return d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));
-};
-
-d3_hclPrototype.rgb = function() {
- return d3_hcl_lab(this.h, this.c, this.l).rgb();
-};
-
-function d3_hcl_lab(h, c, l) {
- return d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);
-}
-
-d3.lab = function(l, a, b) {
- return arguments.length === 1
- ? (l instanceof d3_Lab ? d3_lab(l.l, l.a, l.b)
- : (l instanceof d3_Hcl ? d3_hcl_lab(l.l, l.c, l.h)
- : d3_rgb_lab((l = d3.rgb(l)).r, l.g, l.b)))
- : d3_lab(+l, +a, +b);
-};
-
-function d3_lab(l, a, b) {
- return new d3_Lab(l, a, b);
-}
-
-function d3_Lab(l, a, b) {
- this.l = l;
- this.a = a;
- this.b = b;
-}
-
-// Corresponds roughly to RGB brighter/darker
-var d3_lab_K = 18;
-
-// D65 standard referent
-var d3_lab_X = 0.950470,
- d3_lab_Y = 1,
- d3_lab_Z = 1.088830;
-
-var d3_labPrototype = d3_Lab.prototype = new d3_Color;
-
-d3_labPrototype.brighter = function(k) {
- return d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
-};
-
-d3_labPrototype.darker = function(k) {
- return d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
-};
-
-d3_labPrototype.rgb = function() {
- return d3_lab_rgb(this.l, this.a, this.b);
-};
-
-function d3_lab_rgb(l, a, b) {
- var y = (l + 16) / 116,
- x = y + a / 500,
- z = y - b / 200;
- x = d3_lab_xyz(x) * d3_lab_X;
- y = d3_lab_xyz(y) * d3_lab_Y;
- z = d3_lab_xyz(z) * d3_lab_Z;
- return d3_rgb(
- d3_xyz_rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z),
- d3_xyz_rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
- d3_xyz_rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z)
- );
-}
-
-function d3_lab_hcl(l, a, b) {
- return d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l);
-}
-
-function d3_lab_xyz(x) {
- return x > 0.206893034 ? x * x * x : (x - 4 / 29) / 7.787037;
-}
-function d3_xyz_lab(x) {
- return x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;
-}
-
-function d3_xyz_rgb(r) {
- return Math.round(255 * (r <= 0.00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - 0.055));
-}
-
-d3.rgb = function(r, g, b) {
- return arguments.length === 1
- ? (r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b)
- : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb))
- : d3_rgb(~~r, ~~g, ~~b);
-};
-
-function d3_rgb(r, g, b) {
- return new d3_Rgb(r, g, b);
-}
-
-function d3_Rgb(r, g, b) {
- this.r = r;
- this.g = g;
- this.b = b;
-}
-
-var d3_rgbPrototype = d3_Rgb.prototype = new d3_Color;
-
-d3_rgbPrototype.brighter = function(k) {
- k = Math.pow(0.7, arguments.length ? k : 1);
- var r = this.r,
- g = this.g,
- b = this.b,
- i = 30;
- if (!r && !g && !b) return d3_rgb(i, i, i);
- if (r && r < i) r = i;
- if (g && g < i) g = i;
- if (b && b < i) b = i;
- return d3_rgb(
- Math.min(255, Math.floor(r / k)),
- Math.min(255, Math.floor(g / k)),
- Math.min(255, Math.floor(b / k)));
-};
-
-d3_rgbPrototype.darker = function(k) {
- k = Math.pow(0.7, arguments.length ? k : 1);
- return d3_rgb(
- Math.floor(k * this.r),
- Math.floor(k * this.g),
- Math.floor(k * this.b));
-};
-
-d3_rgbPrototype.hsl = function() {
- return d3_rgb_hsl(this.r, this.g, this.b);
-};
-
-d3_rgbPrototype.toString = function() {
- return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);
-};
-
-function d3_rgb_hex(v) {
- return v < 0x10
- ? "0" + Math.max(0, v).toString(16)
- : Math.min(255, v).toString(16);
-}
-
-function d3_rgb_parse(format, rgb, hsl) {
- var r = 0, // red channel; int in [0, 255]
- g = 0, // green channel; int in [0, 255]
- b = 0, // blue channel; int in [0, 255]
- m1, // CSS color specification match
- m2, // CSS color specification type (e.g., rgb)
- name;
-
- /* Handle hsl, rgb. */
- m1 = /([a-z]+)\((.*)\)/i.exec(format);
- if (m1) {
- m2 = m1[2].split(",");
- switch (m1[1]) {
- case "hsl": {
- return hsl(
- parseFloat(m2[0]), // degrees
- parseFloat(m2[1]) / 100, // percentage
- parseFloat(m2[2]) / 100 // percentage
- );
- }
- case "rgb": {
- return rgb(
- d3_rgb_parseNumber(m2[0]),
- d3_rgb_parseNumber(m2[1]),
- d3_rgb_parseNumber(m2[2])
- );
- }
- }
- }
-
- /* Named colors. */
- if (name = d3_rgb_names.get(format)) return rgb(name.r, name.g, name.b);
-
- /* Hexadecimal colors: #rgb and #rrggbb. */
- if (format != null && format.charAt(0) === "#") {
- if (format.length === 4) {
- r = format.charAt(1); r += r;
- g = format.charAt(2); g += g;
- b = format.charAt(3); b += b;
- } else if (format.length === 7) {
- r = format.substring(1, 3);
- g = format.substring(3, 5);
- b = format.substring(5, 7);
- }
- r = parseInt(r, 16);
- g = parseInt(g, 16);
- b = parseInt(b, 16);
- }
-
- return rgb(r, g, b);
-}
-
-function d3_rgb_hsl(r, g, b) {
- var min = Math.min(r /= 255, g /= 255, b /= 255),
- max = Math.max(r, g, b),
- d = max - min,
- h,
- s,
- l = (max + min) / 2;
- if (d) {
- s = l < .5 ? d / (max + min) : d / (2 - max - min);
- if (r == max) h = (g - b) / d + (g < b ? 6 : 0);
- else if (g == max) h = (b - r) / d + 2;
- else h = (r - g) / d + 4;
- h *= 60;
- } else {
- s = h = 0;
- }
- return d3_hsl(h, s, l);
-}
-
-function d3_rgb_lab(r, g, b) {
- r = d3_rgb_xyz(r);
- g = d3_rgb_xyz(g);
- b = d3_rgb_xyz(b);
- var x = d3_xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / d3_lab_X),
- y = d3_xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / d3_lab_Y),
- z = d3_xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / d3_lab_Z);
- return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));
-}
-
-function d3_rgb_xyz(r) {
- return (r /= 255) <= 0.04045 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4);
-}
-
-function d3_rgb_parseNumber(c) { // either integer or percentage
- var f = parseFloat(c);
- return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;
-}
-
-var d3_rgb_names = d3.map({
- aliceblue: "#f0f8ff",
- antiquewhite: "#faebd7",
- aqua: "#00ffff",
- aquamarine: "#7fffd4",
- azure: "#f0ffff",
- beige: "#f5f5dc",
- bisque: "#ffe4c4",
- black: "#000000",
- blanchedalmond: "#ffebcd",
- blue: "#0000ff",
- blueviolet: "#8a2be2",
- brown: "#a52a2a",
- burlywood: "#deb887",
- cadetblue: "#5f9ea0",
- chartreuse: "#7fff00",
- chocolate: "#d2691e",
- coral: "#ff7f50",
- cornflowerblue: "#6495ed",
- cornsilk: "#fff8dc",
- crimson: "#dc143c",
- cyan: "#00ffff",
- darkblue: "#00008b",
- darkcyan: "#008b8b",
- darkgoldenrod: "#b8860b",
- darkgray: "#a9a9a9",
- darkgreen: "#006400",
- darkgrey: "#a9a9a9",
- darkkhaki: "#bdb76b",
- darkmagenta: "#8b008b",
- darkolivegreen: "#556b2f",
- darkorange: "#ff8c00",
- darkorchid: "#9932cc",
- darkred: "#8b0000",
- darksalmon: "#e9967a",
- darkseagreen: "#8fbc8f",
- darkslateblue: "#483d8b",
- darkslategray: "#2f4f4f",
- darkslategrey: "#2f4f4f",
- darkturquoise: "#00ced1",
- darkviolet: "#9400d3",
- deeppink: "#ff1493",
- deepskyblue: "#00bfff",
- dimgray: "#696969",
- dimgrey: "#696969",
- dodgerblue: "#1e90ff",
- firebrick: "#b22222",
- floralwhite: "#fffaf0",
- forestgreen: "#228b22",
- fuchsia: "#ff00ff",
- gainsboro: "#dcdcdc",
- ghostwhite: "#f8f8ff",
- gold: "#ffd700",
- goldenrod: "#daa520",
- gray: "#808080",
- green: "#008000",
- greenyellow: "#adff2f",
- grey: "#808080",
- honeydew: "#f0fff0",
- hotpink: "#ff69b4",
- indianred: "#cd5c5c",
- indigo: "#4b0082",
- ivory: "#fffff0",
- khaki: "#f0e68c",
- lavender: "#e6e6fa",
- lavenderblush: "#fff0f5",
- lawngreen: "#7cfc00",
- lemonchiffon: "#fffacd",
- lightblue: "#add8e6",
- lightcoral: "#f08080",
- lightcyan: "#e0ffff",
- lightgoldenrodyellow: "#fafad2",
- lightgray: "#d3d3d3",
- lightgreen: "#90ee90",
- lightgrey: "#d3d3d3",
- lightpink: "#ffb6c1",
- lightsalmon: "#ffa07a",
- lightseagreen: "#20b2aa",
- lightskyblue: "#87cefa",
- lightslategray: "#778899",
- lightslategrey: "#778899",
- lightsteelblue: "#b0c4de",
- lightyellow: "#ffffe0",
- lime: "#00ff00",
- limegreen: "#32cd32",
- linen: "#faf0e6",
- magenta: "#ff00ff",
- maroon: "#800000",
- mediumaquamarine: "#66cdaa",
- mediumblue: "#0000cd",
- mediumorchid: "#ba55d3",
- mediumpurple: "#9370db",
- mediumseagreen: "#3cb371",
- mediumslateblue: "#7b68ee",
- mediumspringgreen: "#00fa9a",
- mediumturquoise: "#48d1cc",
- mediumvioletred: "#c71585",
- midnightblue: "#191970",
- mintcream: "#f5fffa",
- mistyrose: "#ffe4e1",
- moccasin: "#ffe4b5",
- navajowhite: "#ffdead",
- navy: "#000080",
- oldlace: "#fdf5e6",
- olive: "#808000",
- olivedrab: "#6b8e23",
- orange: "#ffa500",
- orangered: "#ff4500",
- orchid: "#da70d6",
- palegoldenrod: "#eee8aa",
- palegreen: "#98fb98",
- paleturquoise: "#afeeee",
- palevioletred: "#db7093",
- papayawhip: "#ffefd5",
- peachpuff: "#ffdab9",
- peru: "#cd853f",
- pink: "#ffc0cb",
- plum: "#dda0dd",
- powderblue: "#b0e0e6",
- purple: "#800080",
- red: "#ff0000",
- rosybrown: "#bc8f8f",
- royalblue: "#4169e1",
- saddlebrown: "#8b4513",
- salmon: "#fa8072",
- sandybrown: "#f4a460",
- seagreen: "#2e8b57",
- seashell: "#fff5ee",
- sienna: "#a0522d",
- silver: "#c0c0c0",
- skyblue: "#87ceeb",
- slateblue: "#6a5acd",
- slategray: "#708090",
- slategrey: "#708090",
- snow: "#fffafa",
- springgreen: "#00ff7f",
- steelblue: "#4682b4",
- tan: "#d2b48c",
- teal: "#008080",
- thistle: "#d8bfd8",
- tomato: "#ff6347",
- turquoise: "#40e0d0",
- violet: "#ee82ee",
- wheat: "#f5deb3",
- white: "#ffffff",
- whitesmoke: "#f5f5f5",
- yellow: "#ffff00",
- yellowgreen: "#9acd32"
-});
-
-d3_rgb_names.forEach(function(key, value) {
- d3_rgb_names.set(key, d3_rgb_parse(value, d3_rgb, d3_hsl_rgb));
-});
-
-d3.interpolateRgb = d3_interpolateRgb;
-
-function d3_interpolateRgb(a, b) {
- a = d3.rgb(a);
- b = d3.rgb(b);
- var ar = a.r,
- ag = a.g,
- ab = a.b,
- br = b.r - ar,
- bg = b.g - ag,
- bb = b.b - ab;
- return function(t) {
- return "#"
- + d3_rgb_hex(Math.round(ar + br * t))
- + d3_rgb_hex(Math.round(ag + bg * t))
- + d3_rgb_hex(Math.round(ab + bb * t));
- };
-}
-
-d3.transform = function(string) {
- var g = d3_document.createElementNS(d3.ns.prefix.svg, "g");
- return (d3.transform = function(string) {
- g.setAttribute("transform", string);
- var t = g.transform.baseVal.consolidate();
- return new d3_transform(t ? t.matrix : d3_transformIdentity);
- })(string);
-};
-
-// Compute x-scale and normalize the first row.
-// Compute shear and make second row orthogonal to first.
-// Compute y-scale and normalize the second row.
-// Finally, compute the rotation.
-function d3_transform(m) {
- var r0 = [m.a, m.b],
- r1 = [m.c, m.d],
- kx = d3_transformNormalize(r0),
- kz = d3_transformDot(r0, r1),
- ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;
- if (r0[0] * r1[1] < r1[0] * r0[1]) {
- r0[0] *= -1;
- r0[1] *= -1;
- kx *= -1;
- kz *= -1;
- }
- this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;
- this.translate = [m.e, m.f];
- this.scale = [kx, ky];
- this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;
-};
-
-d3_transform.prototype.toString = function() {
- return "translate(" + this.translate
- + ")rotate(" + this.rotate
- + ")skewX(" + this.skew
- + ")scale(" + this.scale
- + ")";
-};
-
-function d3_transformDot(a, b) {
- return a[0] * b[0] + a[1] * b[1];
-}
-
-function d3_transformNormalize(a) {
- var k = Math.sqrt(d3_transformDot(a, a));
- if (k) {
- a[0] /= k;
- a[1] /= k;
- }
- return k;
-}
-
-function d3_transformCombine(a, b, k) {
- a[0] += k * b[0];
- a[1] += k * b[1];
- return a;
-}
-
-var d3_transformIdentity = {a: 1, b: 0, c: 0, d: 1, e: 0, f: 0};
-d3.interpolateNumber = d3_interpolateNumber;
-
-function d3_interpolateNumber(a, b) {
- b -= a = +a;
- return function(t) { return a + b * t; };
-}
-
-d3.interpolateTransform = d3_interpolateTransform;
-
-function d3_interpolateTransform(a, b) {
- var s = [], // string constants and placeholders
- q = [], // number interpolators
- n,
- A = d3.transform(a),
- B = d3.transform(b),
- ta = A.translate,
- tb = B.translate,
- ra = A.rotate,
- rb = B.rotate,
- wa = A.skew,
- wb = B.skew,
- ka = A.scale,
- kb = B.scale;
-
- if (ta[0] != tb[0] || ta[1] != tb[1]) {
- s.push("translate(", null, ",", null, ")");
- q.push({i: 1, x: d3_interpolateNumber(ta[0], tb[0])}, {i: 3, x: d3_interpolateNumber(ta[1], tb[1])});
- } else if (tb[0] || tb[1]) {
- s.push("translate(" + tb + ")");
- } else {
- s.push("");
- }
-
- if (ra != rb) {
- if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360; // shortest path
- q.push({i: s.push(s.pop() + "rotate(", null, ")") - 2, x: d3_interpolateNumber(ra, rb)});
- } else if (rb) {
- s.push(s.pop() + "rotate(" + rb + ")");
- }
-
- if (wa != wb) {
- q.push({i: s.push(s.pop() + "skewX(", null, ")") - 2, x: d3_interpolateNumber(wa, wb)});
- } else if (wb) {
- s.push(s.pop() + "skewX(" + wb + ")");
- }
-
- if (ka[0] != kb[0] || ka[1] != kb[1]) {
- n = s.push(s.pop() + "scale(", null, ",", null, ")");
- q.push({i: n - 4, x: d3_interpolateNumber(ka[0], kb[0])}, {i: n - 2, x: d3_interpolateNumber(ka[1], kb[1])});
- } else if (kb[0] != 1 || kb[1] != 1) {
- s.push(s.pop() + "scale(" + kb + ")");
- }
-
- n = q.length;
- return function(t) {
- var i = -1, o;
- while (++i < n) s[(o = q[i]).i] = o.x(t);
- return s.join("");
- };
-}
-
-d3.interpolateObject = d3_interpolateObject;
-
-function d3_interpolateObject(a, b) {
- var i = {},
- c = {},
- k;
- for (k in a) {
- if (k in b) {
- i[k] = d3_interpolateByName(k)(a[k], b[k]);
- } else {
- c[k] = a[k];
- }
- }
- for (k in b) {
- if (!(k in a)) {
- c[k] = b[k];
- }
- }
- return function(t) {
- for (k in i) c[k] = i[k](t);
- return c;
- };
-}
-
-d3.interpolateArray = d3_interpolateArray;
-
-function d3_interpolateArray(a, b) {
- var x = [],
- c = [],
- na = a.length,
- nb = b.length,
- n0 = Math.min(a.length, b.length),
- i;
- for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));
- for (; i < na; ++i) c[i] = a[i];
- for (; i < nb; ++i) c[i] = b[i];
- return function(t) {
- for (i = 0; i < n0; ++i) c[i] = x[i](t);
- return c;
- };
-}
-
-d3.interpolateString = d3_interpolateString;
-
-function d3_interpolateString(a, b) {
- var m, // current match
- i, // current index
- j, // current index (for coalescing)
- s0 = 0, // start index of current string prefix
- s1 = 0, // end index of current string prefix
- s = [], // string constants and placeholders
- q = [], // number interpolators
- n, // q.length
- o;
-
- // Coerce inputs to strings.
- a = a + "", b = b + "";
-
- // Reset our regular expression!
- d3_interpolate_number.lastIndex = 0;
-
- // Find all numbers in b.
- for (i = 0; m = d3_interpolate_number.exec(b); ++i) {
- if (m.index) s.push(b.substring(s0, s1 = m.index));
- q.push({i: s.length, x: m[0]});
- s.push(null);
- s0 = d3_interpolate_number.lastIndex;
- }
- if (s0 < b.length) s.push(b.substring(s0));
-
- // Find all numbers in a.
- for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) {
- o = q[i];
- if (o.x == m[0]) { // The numbers match, so coalesce.
- if (o.i) {
- if (s[o.i + 1] == null) { // This match is followed by another number.
- s[o.i - 1] += o.x;
- s.splice(o.i, 1);
- for (j = i + 1; j < n; ++j) q[j].i--;
- } else { // This match is followed by a string, so coalesce twice.
- s[o.i - 1] += o.x + s[o.i + 1];
- s.splice(o.i, 2);
- for (j = i + 1; j < n; ++j) q[j].i -= 2;
- }
- } else {
- if (s[o.i + 1] == null) { // This match is followed by another number.
- s[o.i] = o.x;
- } else { // This match is followed by a string, so coalesce twice.
- s[o.i] = o.x + s[o.i + 1];
- s.splice(o.i + 1, 1);
- for (j = i + 1; j < n; ++j) q[j].i--;
- }
- }
- q.splice(i, 1);
- n--;
- i--;
- } else {
- o.x = d3_interpolateNumber(parseFloat(m[0]), parseFloat(o.x));
- }
- }
-
- // Remove any numbers in b not found in a.
- while (i < n) {
- o = q.pop();
- if (s[o.i + 1] == null) { // This match is followed by another number.
- s[o.i] = o.x;
- } else { // This match is followed by a string, so coalesce twice.
- s[o.i] = o.x + s[o.i + 1];
- s.splice(o.i + 1, 1);
- }
- n--;
- }
-
- // Special optimization for only a single match.
- if (s.length === 1) {
- return s[0] == null ? q[0].x : function() { return b; };
- }
-
- // Otherwise, interpolate each of the numbers and rejoin the string.
- return function(t) {
- for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t);
- return s.join("");
- };
-}
-
-var d3_interpolate_number = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
-
-d3.interpolate = d3_interpolate;
-
-function d3_interpolate(a, b) {
- var i = d3.interpolators.length, f;
- while (--i >= 0 && !(f = d3.interpolators[i](a, b)));
- return f;
-}
-
-function d3_interpolateByName(name) {
- return name == "transform"
- ? d3_interpolateTransform
- : d3_interpolate;
-}
-
-d3.interpolators = [
- function(a, b) {
- var t = typeof b;
- return (t === "string" || t !== typeof a ? (d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) ? d3_interpolateRgb : d3_interpolateString)
- : b instanceof d3_Color ? d3_interpolateRgb
- : t === "object" ? (Array.isArray(b) ? d3_interpolateArray : d3_interpolateObject)
- : d3_interpolateNumber)(a, b);
- }
-];
-
-d3_transitionPrototype.tween = function(name, tween) {
- var id = this.id;
- if (arguments.length < 2) return this.node().__transition__[id].tween.get(name);
- return d3_selection_each(this, tween == null
- ? function(node) { node.__transition__[id].tween.remove(name); }
- : function(node) { node.__transition__[id].tween.set(name, tween); });
-};
-
-function d3_transition_tween(groups, name, value, tween) {
- var id = groups.id;
- return d3_selection_each(groups, typeof value === "function"
- ? function(node, i, j) { node.__transition__[id].tween.set(name, tween(value.call(node, node.__data__, i, j))); }
- : (value = tween(value), function(node) { node.__transition__[id].tween.set(name, value); }));
-}
-
-d3_transitionPrototype.attr = function(nameNS, value) {
- if (arguments.length < 2) {
-
- // For attr(object), the object specifies the names and values of the
- // attributes to transition. The values may be functions that are
- // evaluated for each element.
- for (value in nameNS) this.attr(value, nameNS[value]);
- return this;
- }
-
- var interpolate = d3_interpolateByName(nameNS),
- name = d3.ns.qualify(nameNS);
-
- // For attr(string, null), remove the attribute with the specified name.
- function attrNull() {
- this.removeAttribute(name);
- }
- function attrNullNS() {
- this.removeAttributeNS(name.space, name.local);
- }
-
- return d3_transition_tween(this, "attr." + nameNS, value, function(b) {
-
- // For attr(string, string), set the attribute with the specified name.
- function attrString() {
- var a = this.getAttribute(name), i;
- return a !== b && (i = interpolate(a, b), function(t) { this.setAttribute(name, i(t)); });
- }
- function attrStringNS() {
- var a = this.getAttributeNS(name.space, name.local), i;
- return a !== b && (i = interpolate(a, b), function(t) { this.setAttributeNS(name.space, name.local, i(t)); });
- }
-
- return b == null ? (name.local ? attrNullNS : attrNull)
- : (b += "", name.local ? attrStringNS : attrString);
- });
-};
-
-d3_transitionPrototype.attrTween = function(nameNS, tween) {
- var name = d3.ns.qualify(nameNS);
-
- function attrTween(d, i) {
- var f = tween.call(this, d, i, this.getAttribute(name));
- return f && function(t) { this.setAttribute(name, f(t)); };
- }
-
- function attrTweenNS(d, i) {
- var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));
- return f && function(t) { this.setAttributeNS(name.space, name.local, f(t)); };
- }
-
- return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween);
-};
-
-d3_transitionPrototype.style = function(name, value, priority) {
- var n = arguments.length;
- if (n < 3) {
-
- // For style(object) or style(object, string), the object specifies the
- // names and values of the attributes to set or remove. The values may be
- // functions that are evaluated for each element. The optional string
- // specifies the priority.
- if (typeof name !== "string") {
- if (n < 2) value = "";
- for (priority in name) this.style(priority, name[priority], value);
- return this;
- }
-
- // For style(string, string) or style(string, function), use the default
- // priority. The priority is ignored for style(string, null).
- priority = "";
- }
-
- var interpolate = d3_interpolateByName(name);
-
- // For style(name, null) or style(name, null, priority), remove the style
- // property with the specified name. The priority is ignored.
- function styleNull() {
- this.style.removeProperty(name);
- }
-
- // Otherwise, a name, value and priority are specified, and handled as below.
- return d3_transition_tween(this, "style." + name, value, function(b) {
-
- // For style(name, string) or style(name, string, priority), set the style
- // property with the specified name, using the specified priority.
- function styleString() {
- var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i;
- return a !== b && (i = interpolate(a, b), function(t) { this.style.setProperty(name, i(t), priority); });
- }
-
- return b == null ? styleNull
- : (b += "", styleString);
- });
-};
-
-d3_transitionPrototype.styleTween = function(name, tween, priority) {
- if (arguments.length < 3) priority = "";
- return this.tween("style." + name, function(d, i) {
- var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name));
- return f && function(t) { this.style.setProperty(name, f(t), priority); };
- });
-};
-
-d3_transitionPrototype.text = function(value) {
- return d3_transition_tween(this, "text", value, d3_transition_text);
-};
-
-function d3_transition_text(b) {
- if (b == null) b = "";
- return function() { this.textContent = b; };
-}
-
-d3_transitionPrototype.remove = function() {
- return this.each("end.transition", function() {
- var p;
- if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this);
- });
-};
-
-d3_transitionPrototype.ease = function(value) {
- var id = this.id;
- if (arguments.length < 1) return this.node().__transition__[id].ease;
- if (typeof value !== "function") value = d3.ease.apply(d3, arguments);
- return d3_selection_each(this, function(node) { node.__transition__[id].ease = value; });
-};
-
-d3_transitionPrototype.delay = function(value) {
- var id = this.id;
- return d3_selection_each(this, typeof value === "function"
- ? function(node, i, j) { node.__transition__[id].delay = value.call(node, node.__data__, i, j) | 0; }
- : (value |= 0, function(node) { node.__transition__[id].delay = value; }));
-};
-
-d3_transitionPrototype.duration = function(value) {
- var id = this.id;
- return d3_selection_each(this, typeof value === "function"
- ? function(node, i, j) { node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j) | 0); }
- : (value = Math.max(1, value | 0), function(node) { node.__transition__[id].duration = value; }));
-};
-
-d3_transitionPrototype.each = function(type, listener) {
- var id = this.id;
- if (arguments.length < 2) {
- var inherit = d3_transitionInherit,
- inheritId = d3_transitionInheritId;
- d3_transitionInheritId = id;
- d3_selection_each(this, function(node, i, j) {
- d3_transitionInherit = node.__transition__[id];
- type.call(node, node.__data__, i, j);
- });
- d3_transitionInherit = inherit;
- d3_transitionInheritId = inheritId;
- } else {
- d3_selection_each(this, function(node) {
- node.__transition__[id].event.on(type, listener);
- });
- }
- return this;
-};
-
-d3_transitionPrototype.transition = function() {
- var id0 = this.id,
- id1 = ++d3_transitionId,
- subgroups = [],
- subgroup,
- group,
- node,
- transition;
-
- for (var j = 0, m = this.length; j < m; j++) {
- subgroups.push(subgroup = []);
- for (var group = this[j], i = 0, n = group.length; i < n; i++) {
- if (node = group[i]) {
- transition = Object.create(node.__transition__[id0]);
- transition.delay += transition.duration;
- d3_transitionNode(node, i, id1, transition);
- }
- subgroup.push(node);
- }
- }
-
- return d3_transition(subgroups, id1);
-};
-
-function d3_transitionNode(node, i, id, inherit) {
- var lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}),
- transition = lock[id];
-
- if (!transition) {
- var time = inherit.time;
-
- transition = lock[id] = {
- tween: new d3_Map,
- event: d3.dispatch("start", "end"), // TODO construct lazily?
- time: time,
- ease: inherit.ease,
- delay: inherit.delay,
- duration: inherit.duration
- };
-
- ++lock.count;
-
- d3.timer(function(elapsed) {
- var d = node.__data__,
- ease = transition.ease,
- event = transition.event,
- delay = transition.delay,
- duration = transition.duration,
- tweened = [];
-
- return delay <= elapsed
- ? start(elapsed)
- : d3.timer(start, delay, time), 1;
-
- function start(elapsed) {
- if (lock.active > id) return stop();
- lock.active = id;
- event.start.call(node, d, i);
-
- transition.tween.forEach(function(key, value) {
- if (value = value.call(node, d, i)) {
- tweened.push(value);
- }
- });
-
- if (!tick(elapsed)) d3.timer(tick, 0, time);
- return 1;
- }
-
- function tick(elapsed) {
- if (lock.active !== id) return stop();
-
- var t = (elapsed - delay) / duration,
- e = ease(t),
- n = tweened.length;
-
- while (n > 0) {
- tweened[--n].call(node, e);
- }
-
- if (t >= 1) {
- stop();
- event.end.call(node, d, i);
- return 1;
- }
- }
-
- function stop() {
- if (--lock.count) delete lock[id];
- else delete node.__transition__;
- return 1;
- }
- }, 0, time);
-
- return transition;
- }
-}
-
-d3.xhr = function(url, mimeType, callback) {
- var xhr = {},
- dispatch = d3.dispatch("progress", "load", "error"),
- headers = {},
- response = d3_identity,
- request = new (d3_window.XDomainRequest && /^(http(s)?:)?\/\//.test(url) ? XDomainRequest : XMLHttpRequest);
-
- "onload" in request
- ? request.onload = request.onerror = respond
- : request.onreadystatechange = function() { request.readyState > 3 && respond(); };
-
- function respond() {
- var s = request.status;
- !s && request.responseText || s >= 200 && s < 300 || s === 304
- ? dispatch.load.call(xhr, response.call(xhr, request))
- : dispatch.error.call(xhr, request);
- }
-
- request.onprogress = function(event) {
- var o = d3.event;
- d3.event = event;
- try { dispatch.progress.call(xhr, request); }
- finally { d3.event = o; }
- };
-
- xhr.header = function(name, value) {
- name = (name + "").toLowerCase();
- if (arguments.length < 2) return headers[name];
- if (value == null) delete headers[name];
- else headers[name] = value + "";
- return xhr;
- };
-
- // If mimeType is non-null and no Accept header is set, a default is used.
- xhr.mimeType = function(value) {
- if (!arguments.length) return mimeType;
- mimeType = value == null ? null : value + "";
- return xhr;
- };
-
- // Specify how to convert the response content to a specific type;
- // changes the callback value on "load" events.
- xhr.response = function(value) {
- response = value;
- return xhr;
- };
-
- // Convenience methods.
- ["get", "post"].forEach(function(method) {
- xhr[method] = function() {
- return xhr.send.apply(xhr, [method].concat(d3_array(arguments)));
- };
- });
-
- // If callback is non-null, it will be used for error and load events.
- xhr.send = function(method, data, callback) {
- if (arguments.length === 2 && typeof data === "function") callback = data, data = null;
- request.open(method, url, true);
- if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*";
- if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);
- if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);
- if (callback != null) xhr.on("error", callback).on("load", function(request) { callback(null, request); });
- request.send(data == null ? null : data);
- return xhr;
- };
-
- xhr.abort = function() {
- request.abort();
- return xhr;
- };
-
- d3.rebind(xhr, dispatch, "on");
-
- if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, mimeType = null;
- return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));
-};
-
-function d3_xhr_fixCallback(callback) {
- return callback.length === 1
- ? function(error, request) { callback(error == null ? request : null); }
- : callback;
-}
-
-d3.text = function() {
- return d3.xhr.apply(d3, arguments).response(d3_text);
-};
-
-function d3_text(request) {
- return request.responseText;
-}
-
-d3.json = function(url, callback) {
- return d3.xhr(url, "application/json", callback).response(d3_json);
-};
-
-function d3_json(request) {
- return JSON.parse(request.responseText);
-}
-
-d3.html = function(url, callback) {
- return d3.xhr(url, "text/html", callback).response(d3_html);
-};
-
-function d3_html(request) {
- var range = d3_document.createRange();
- range.selectNode(d3_document.body);
- return range.createContextualFragment(request.responseText);
-}
-
-d3.xml = function() {
- return d3.xhr.apply(d3, arguments).response(d3_xml);
-};
-
-function d3_xml(request) {
- return request.responseXML;
-}
- return d3;
-})();
-d3.combobox = function() {
- var event = d3.dispatch('accept'),
- data = [];
-
- var fetcher = function(val, data, cb) {
- cb(data.filter(function(d) {
- return d.title
- .toString()
- .toLowerCase()
- .indexOf(val.toLowerCase()) !== -1;
- }));
- };
-
- var combobox = function(input) {
- var idx = -1, container, shown = false;
-
- input
- .classed('combobox-input', true)
- .each(function() {
- var parent = this.parentNode,
- sibling = this.nextSibling;
- d3.select(parent)
- .insert('div', function() { return sibling; })
- .attr('class', 'combobox-carat')
- .on('mousedown', function () {
- // prevent the form element from blurring. it blurs
- // on mousedown
- d3.event.stopPropagation();
- d3.event.preventDefault();
- mousedown();
- });
- });
-
- function updateSize() {
- var rect = input.node().getBoundingClientRect();
- container.style({
- 'left': rect.left + 'px',
- 'width': rect.width + 'px',
- 'top': rect.height + rect.top + 'px'
- });
- }
-
- function blur() {
- // hide the combobox whenever the input element
- // loses focus
- slowHide();
- }
-
- function show() {
- if (!shown) {
- container = d3.select(document.body)
- .insert('div', ':first-child')
- .attr('class', 'combobox')
- .style({
- position: 'absolute',
- display: 'block',
- left: '0px'
- });
-
- d3.select(document.body)
- .on('scroll.combobox', updateSize, true);
-
- shown = true;
- }
- }
-
- function hide() {
- if (shown) {
- idx = -1;
- container.remove();
-
- d3.select(document.body)
- .on('scroll.combobox', null);
-
- shown = false;
- }
- }
-
- function slowHide() {
- window.setTimeout(hide, 150);
- }
- function keydown() {
- if (!shown) return;
- switch (d3.event.keyCode) {
- // down arrow
- case 40:
- next();
- d3.event.preventDefault();
- break;
- // up arrow
- case 38:
- prev();
- d3.event.preventDefault();
- break;
- // escape, tab
- case 13:
- d3.event.preventDefault();
- break;
- }
- d3.event.stopPropagation();
- }
-
- function keyup() {
- switch (d3.event.keyCode) {
- // escape
- case 27:
- hide();
- break;
- // escape, tab
- case 9:
- case 13:
- if (!shown) return;
- accept();
- break;
- default:
- update();
- d3.event.preventDefault();
- }
- d3.event.stopPropagation();
- }
-
- function accept() {
- if (container.select('a.selected').node()) {
- select(container.select('a.selected').datum());
- }
- hide();
- }
-
- function next() {
- var len = container.selectAll('a').data().length;
- idx = Math.min(idx + 1, len - 1);
- highlight();
- }
-
- function prev() {
- idx = Math.max(idx - 1, 0);
- highlight();
- }
-
- var prevValue, prevCompletion;
-
- function autocomplete(e, data) {
-
- var value = input.property('value'),
- match;
-
- for (var i = 0; i < data.length; i++) {
- if (data[i].value.toLowerCase().indexOf(value.toLowerCase()) === 0) {
- match = data[i].value;
- break;
- }
- }
-
- // backspace
- if (e.keyCode === 8) {
- prevValue = value;
- prevCompletion = '';
-
- } else if (value && match && value !== prevValue + prevCompletion) {
- prevValue = value;
- prevCompletion = match.substr(value.length);
- input.property('value', prevValue + prevCompletion);
- input.node().setSelectionRange(value.length, value.length + prevCompletion.length);
- }
- }
-
-
- function highlight() {
- container
- .selectAll('a')
- .classed('selected', function(d, i) { return i == idx; });
- var height = container.node().offsetHeight,
- top = container.select('a.selected').node().offsetTop,
- selectedHeight = container.select('a.selected').node().offsetHeight;
- if ((top + selectedHeight) < height) {
- container.node().scrollTop = 0;
- } else {
- container.node().scrollTop = top;
- }
- }
-
- function update(value) {
-
- if (typeof value === 'undefined') {
- value = input.property('value');
- }
-
- var e = d3.event;
-
- function render(data) {
-
- if (data.length &&
- document.activeElement === input.node()) show();
- else return hide();
-
- autocomplete(e, data);
-
- updateSize();
-
- var options = container
- .selectAll('a.combobox-option')
- .data(data, function(d) { return d.value; });
-
- options.enter()
- .append('a')
- .text(function(d) { return d.value; })
- .attr('class', 'combobox-option')
- .attr('title', function(d) { return d.title; })
- .on('click', select);
-
- options.exit().remove();
-
- options
- .classed('selected', function(d, i) { return i == idx; })
- .order();
- }
-
- fetcher.apply(input, [value, data, render]);
- }
-
- // select the choice given as d
- function select(d) {
- input
- .property('value', d.value)
- .trigger('change');
- event.accept(d);
- hide();
- }
-
- function mousedown() {
-
- if (shown) return hide();
-
- input.node().focus();
- update('');
-
- if (!container) return;
-
- var entries = container.selectAll('a'),
- height = container.node().scrollHeight / entries[0].length,
- w = d3.select(window);
-
- function getIndex(m) {
- return Math.floor((m[1] + container.node().scrollTop) / height);
- }
-
- function withinBounds(m) {
- var n = container.node();
- return m[0] >= 0 && m[0] < n.offsetWidth &&
- m[1] >= 0 && m[1] < n.offsetHeight;
- }
-
- w.on('mousemove.typeahead', function() {
- var m = d3.mouse(container.node());
- var within = withinBounds(m);
- var n = getIndex(m);
- entries.classed('selected', function(d, i) { return within && i === n; });
- });
-
- w.on('mouseup.typeahead', function() {
- var m = d3.mouse(container.node());
- if (withinBounds(m)) select(d3.select(entries[0][getIndex(m)]).datum());
- entries.classed('selected', false);
- w.on('mouseup.typeahead', null);
- w.on('mousemove.typeahead', null);
- });
- }
-
- input
- .on('blur.typeahead', blur)
- .on('keydown.typeahead', keydown)
- .on('keyup.typeahead', keyup)
- .on('mousedown.typeahead', mousedown);
- };
-
- combobox.fetcher = function(_) {
- if (!arguments.length) return fetcher;
- fetcher = _;
- return combobox;
- };
-
- combobox.data = function(_) {
- if (!arguments.length) return data;
- data = _;
- return combobox;
- };
-
- return d3.rebind(combobox, event, 'on');
-};
-
-d3.combobox.id = 0;
-d3.geo.tile = function() {
- var size = [960, 500],
- scale = 256,
- scaleExtent = [0, 20],
- translate = [size[0] / 2, size[1] / 2],
- zoomDelta = 0;
-
- function bound(_) {
- return Math.min(scaleExtent[1], Math.max(scaleExtent[0], _));
- }
-
- function tile() {
- var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0),
- z0 = bound(Math.round(z + zoomDelta)),
- k = Math.pow(2, z - z0 + 8),
- origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k],
- tiles = [],
- cols = d3.range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))),
- rows = d3.range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1])));
-
- rows.forEach(function(y) {
- cols.forEach(function(x) {
- tiles.push([x, y, z0]);
- });
- });
-
- tiles.translate = origin;
- tiles.scale = k;
-
- return tiles;
- }
-
- tile.scaleExtent = function(_) {
- if (!arguments.length) return scaleExtent;
- scaleExtent = _;
- return tile;
- };
-
- tile.size = function(_) {
- if (!arguments.length) return size;
- size = _;
- return tile;
- };
-
- tile.scale = function(_) {
- if (!arguments.length) return scale;
- scale = _;
- return tile;
- };
-
- tile.translate = function(_) {
- if (!arguments.length) return translate;
- translate = _;
- return tile;
- };
-
- tile.zoomDelta = function(_) {
- if (!arguments.length) return zoomDelta;
- zoomDelta = +_;
- return tile;
- };
-
- return tile;
-};
-d3.jsonp = function (url, callback) {
- function rand() {
- var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
- c = '', i = -1;
- while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
- return c;
- }
-
- function create(url) {
- var e = url.match(/callback=d3.jsonp.(\w+)/),
- c = e ? e[1] : rand();
- d3.jsonp[c] = function(data) {
- callback(data);
- delete d3.jsonp[c];
- script.remove();
- };
- return 'd3.jsonp.' + c;
- }
-
- var cb = create(url),
- script = d3.select('head')
- .append('script')
- .attr('type', 'text/javascript')
- .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
-};
-/*
- * This code is licensed under the MIT license.
- *
- * Copyright © 2013, iD authors.
- *
- * Portions copyright © 2011, Keith Cirkel
- * See https://github.com/keithamus/jwerty
- *
- */
-d3.keybinding = function(namespace) {
- var bindings = [];
-
- function matches(binding, event) {
- for (var p in binding.event) {
- if (event[p] != binding.event[p])
- return false;
- }
-
- return (!binding.capture) === (event.eventPhase !== Event.CAPTURING_PHASE);
- }
-
- function capture() {
- for (var i = 0; i < bindings.length; i++) {
- var binding = bindings[i];
- if (matches(binding, d3.event)) {
- binding.callback();
- }
- }
- }
-
- function bubble() {
- var tagName = d3.select(d3.event.target).node().tagName;
- if (tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA') {
- return;
- }
- capture();
- }
-
- function keybinding(selection) {
- selection = selection || d3.select(document);
- selection.on('keydown.capture' + namespace, capture, true);
- selection.on('keydown.bubble' + namespace, bubble, false);
- return keybinding;
- }
-
- keybinding.off = function(selection) {
- selection = selection || d3.select(document);
- selection.on('keydown.capture' + namespace, null);
- selection.on('keydown.bubble' + namespace, null);
- return keybinding;
- };
-
- keybinding.on = function(code, callback, capture) {
- var binding = {
- event: {
- keyCode: 0,
- shiftKey: false,
- ctrlKey: false,
- altKey: false,
- metaKey: false
- },
- capture: capture,
- callback: callback
- };
-
- code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
-
- for (var i = 0; i < code.length; i++) {
- // Normalise matching errors
- if (code[i] === '++') code[i] = '+';
-
- if (code[i] in d3.keybinding.modifierCodes) {
- binding.event[d3.keybinding.modifierProperties[d3.keybinding.modifierCodes[code[i]]]] = true;
- } else if (code[i] in d3.keybinding.keyCodes) {
- binding.event.keyCode = d3.keybinding.keyCodes[code[i]];
- }
- }
-
- bindings.push(binding);
-
- return keybinding;
- };
-
- return keybinding;
-};
-
-(function () {
- d3.keybinding.modifierCodes = {
- // Shift key, ⇧
- '⇧': 16, shift: 16,
- // CTRL key, on Mac: ⌃
- '⌃': 17, ctrl: 17,
- // ALT key, on Mac: ⌥ (Alt)
- '⌥': 18, alt: 18, option: 18,
- // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
- '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
- };
-
- d3.keybinding.modifierProperties = {
- 16: 'shiftKey',
- 17: 'ctrlKey',
- 18: 'altKey',
- 91: 'metaKey'
- };
-
- d3.keybinding.keyCodes = {
- // Backspace key, on Mac: ⌫ (Backspace)
- '⌫': 8, backspace: 8,
- // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
- '⇥': 9, '⇆': 9, tab: 9,
- // Return key, ↩
- '↩': 13, 'return': 13, enter: 13, '⌅': 13,
- // Pause/Break key
- 'pause': 19, 'pause-break': 19,
- // Caps Lock key, ⇪
- '⇪': 20, caps: 20, 'caps-lock': 20,
- // Escape key, on Mac: ⎋, on Windows: Esc
- '⎋': 27, escape: 27, esc: 27,
- // Space key
- space: 32,
- // Page-Up key, or pgup, on Mac: ↖
- '↖': 33, pgup: 33, 'page-up': 33,
- // Page-Down key, or pgdown, on Mac: ↘
- '↘': 34, pgdown: 34, 'page-down': 34,
- // END key, on Mac: ⇟
- '⇟': 35, end: 35,
- // HOME key, on Mac: ⇞
- '⇞': 36, home: 36,
- // Insert key, or ins
- ins: 45, insert: 45,
- // Delete key, on Mac: ⌦ (Delete)
- '⌦': 46, del: 46, 'delete': 46,
- // Left Arrow Key, or ←
- '←': 37, left: 37, 'arrow-left': 37,
- // Up Arrow Key, or ↑
- '↑': 38, up: 38, 'arrow-up': 38,
- // Right Arrow Key, or →
- '→': 39, right: 39, 'arrow-right': 39,
- // Up Arrow Key, or ↓
- '↓': 40, down: 40, 'arrow-down': 40,
- // odities, printing characters that come out wrong:
- // Num-Multiply, or *
- '*': 106, star: 106, asterisk: 106, multiply: 106,
- // Num-Plus or +
- '+': 107, 'plus': 107,
- // Num-Subtract, or -
- '-': 109, subtract: 109,
- // Semicolon
- ';': 186, semicolon:186,
- // = or equals
- '=': 187, 'equals': 187,
- // Comma, or ,
- ',': 188, comma: 188,
- 'dash': 189, //???
- // Period, or ., or full-stop
- '.': 190, period: 190, 'full-stop': 190,
- // Slash, or /, or forward-slash
- '/': 191, slash: 191, 'forward-slash': 191,
- // Tick, or `, or back-quote
- '`': 192, tick: 192, 'back-quote': 192,
- // Open bracket, or [
- '[': 219, 'open-bracket': 219,
- // Back slash, or \
- '\\': 220, 'back-slash': 220,
- // Close backet, or ]
- ']': 221, 'close-bracket': 221,
- // Apostrophe, or Quote, or '
- '\'': 222, quote: 222, apostrophe: 222
- };
-
- // NUMPAD 0-9
- var i = 95, n = 0;
- while (++i < 106) {
- d3.keybinding.keyCodes['num-' + n] = i;
- ++n;
- }
-
- // 0-9
- i = 47; n = 0;
- while (++i < 58) {
- d3.keybinding.keyCodes[n] = i;
- ++n;
- }
-
- // F1-F25
- i = 111; n = 1;
- while (++i < 136) {
- d3.keybinding.keyCodes['f' + n] = i;
- ++n;
- }
-
- // a-z
- i = 64;
- while (++i < 91) {
- d3.keybinding.keyCodes[String.fromCharCode(i).toLowerCase()] = i;
- }
-})();
-d3.selection.prototype.one = function (type, listener, capture) {
- var target = this, typeOnce = type + ".once";
- function one() {
- target.on(typeOnce, null);
- listener.apply(this, arguments);
- }
- target.on(typeOnce, one, capture);
- return this;
-};
-d3.selection.prototype.size = function (size) {
- if (!arguments.length) {
- var node = this.node();
- return [node.offsetWidth,
- node.offsetHeight];
- }
- return this.attr({width: size[0], height: size[1]});
-};
-d3.selection.prototype.trigger = function (type) {
- this.each(function() {
- var evt = document.createEvent('HTMLEvents');
- evt.initEvent(type, true, true);
- this.dispatchEvent(evt);
- });
-};
-d3.typeahead = function() {
- var event = d3.dispatch('accept'),
- autohighlight = false,
- data;
-
- var typeahead = function(selection) {
- var container,
- hidden,
- idx = autohighlight ? 0 : -1;
-
- function setup() {
- var rect = selection.node().getBoundingClientRect();
- container = d3.select(document.body)
- .append('div').attr('class', 'typeahead')
- .style({
- position: 'absolute',
- left: rect.left + 'px',
- top: rect.bottom + 'px'
- });
- selection
- .on('keyup.typeahead', key);
- hidden = false;
- }
-
- function hide() {
- container.remove();
- idx = autohighlight ? 0 : -1;
- hidden = true;
- }
-
- function slowHide() {
- if (autohighlight) {
- if (container.select('a.selected').node()) {
- select(container.select('a.selected').datum());
- event.accept();
- }
- }
- window.setTimeout(hide, 150);
- }
-
- selection
- .on('focus.typeahead', setup)
- .on('blur.typeahead', slowHide);
-
- function key() {
- var len = container.selectAll('a').data().length;
- if (d3.event.keyCode === 40) {
- idx = Math.min(idx + 1, len - 1);
- return highlight();
- } else if (d3.event.keyCode === 38) {
- idx = Math.max(idx - 1, 0);
- return highlight();
- } else if (d3.event.keyCode === 13) {
- if (container.select('a.selected').node()) {
- select(container.select('a.selected').datum());
- }
- event.accept();
- hide();
- } else {
- update();
- }
- }
-
- function highlight() {
- container
- .selectAll('a')
- .classed('selected', function(d, i) { return i == idx; });
- }
-
- function update() {
- if (hidden) setup();
-
- data(selection, function(data) {
- container.style('display', function() {
- return data.length ? 'block' : 'none';
- });
-
- var options = container
- .selectAll('a')
- .data(data, function(d) { return d.value; });
-
- options.enter()
- .append('a')
- .text(function(d) { return d.value; })
- .attr('title', function(d) { return d.title; })
- .on('click', select);
-
- options.exit().remove();
-
- options
- .classed('selected', function(d, i) { return i == idx; });
- });
- }
-
- function select(d) {
- selection
- .property('value', d.value)
- .trigger('change');
- }
-
- };
-
- typeahead.data = function(_) {
- if (!arguments.length) return data;
- data = _;
- return typeahead;
- };
-
- typeahead.autohighlight = function(_) {
- if (!arguments.length) return autohighlight;
- autohighlight = _;
- return typeahead;
- };
-
- return d3.rebind(typeahead, event, 'on');
-};
-// Tooltips and svg mask used to highlight certain features
-d3.curtain = function() {
-
- var event = d3.dispatch(),
- surface,
- tooltip,
- darkness;
-
- function curtain(selection) {
-
- surface = selection.append('svg')
- .attr('id', 'curtain')
- .style({
- 'z-index': 1000,
- 'pointer-events': 'none',
- 'position': 'absolute',
- 'top': 0,
- 'left': 0
- });
-
- darkness = surface.append('path')
- .attr({
- x: 0,
- y: 0,
- 'class': 'curtain-darkness'
- });
-
- d3.select(window).on('resize.curtain', resize);
-
- tooltip = selection.append('div')
- .attr('class', 'tooltip')
- .style('z-index', 1002);
-
- tooltip.append('div').attr('class', 'tooltip-arrow');
- tooltip.append('div').attr('class', 'tooltip-inner');
-
- resize();
-
- function resize() {
- surface.attr({
- width: window.innerWidth,
- height: window.innerHeight
- });
- curtain.cut(darkness.datum());
- }
- }
-
- curtain.reveal = function(box, text, tooltipclass, duration) {
- if (typeof box === 'string') box = d3.select(box).node();
- if (box.getBoundingClientRect) box = box.getBoundingClientRect();
-
- curtain.cut(box, duration);
-
- if (text) {
- // pseudo markdown bold text hack
- var parts = text.split('**');
- var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
- if (parts[1]) html += '<span class="bold">' + parts[1] + '</span>';
-
- var size = tooltip.classed('in', true)
- .select('.tooltip-inner')
- .html(html)
- .size();
-
- var pos;
-
- var w = window.innerWidth,
- h = window.innerHeight;
-
- if (box.top + box.height < Math.min(100, box.width + box.left)) {
- side = 'bottom';
- pos = [box.left + box.width / 2 - size[0]/ 2, box.top + box.height];
-
- } else if (box.left + box.width + 300 < window.innerWidth) {
- side = 'right';
- pos = [box.left + box.width, box.top + box.height / 2 - size[1] / 2];
-
- } else if (box.left > 300) {
- side = 'left';
- pos = [box.left - 200, box.top + box.height / 2 - size[1] / 2];
- } else {
- side = 'bottom';
- pos = [box.left, box.top + box.height];
- }
-
- pos = [
- Math.min(Math.max(10, pos[0]), w - size[0] - 10),
- Math.min(Math.max(10, pos[1]), h - size[1] - 10)
- ];
-
-
- if (duration !== 0 || !tooltip.classed(side)) tooltip.call(iD.ui.Toggle(true));
-
- tooltip
- .style('top', pos[1] + 'px')
- .style('left', pos[0] + 'px')
- .attr('class', 'curtain-tooltip tooltip in ' + side + ' ' + tooltipclass)
- .select('.tooltip-inner')
- .html(html);
-
- } else {
- tooltip.call(iD.ui.Toggle(false));
- }
- };
-
- curtain.cut = function(datum, duration) {
- darkness.datum(datum);
-
- (duration === 0 ? darkness : darkness.transition().duration(duration || 600))
- .attr('d', function(d) {
- var string = "M 0,0 L 0," + window.innerHeight + " L " +
- window.innerWidth + "," + window.innerHeight + "L" +
- window.innerWidth + ",0 Z";
-
- if (!d) return string;
- return string + 'M' +
- d.left + ',' + d.top + 'L' +
- d.left + ',' + (d.top + d.height) + 'L' +
- (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
- (d.left + d.width) + ',' + (d.top) + 'Z';
-
- });
- };
-
- curtain.remove = function() {
- surface.remove();
- tooltip.remove();
- };
-
- return d3.rebind(curtain, event, 'on');
-};
-var JXON = new (function () {
- var
- sValueProp = "keyValue", sAttributesProp = "keyAttributes", sAttrPref = "@", /* you can customize these values */
- aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
-
- function parseText (sValue) {
- if (rIsNull.test(sValue)) { return null; }
- if (rIsBool.test(sValue)) { return sValue.toLowerCase() === "true"; }
- if (isFinite(sValue)) { return parseFloat(sValue); }
- if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
- return sValue;
- }
-
- function EmptyTree () { }
- EmptyTree.prototype.toString = function () { return "null"; };
- EmptyTree.prototype.valueOf = function () { return null; };
-
- function objectify (vValue) {
- return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
- }
-
- function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
- var
- nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
- bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
-
- var
- sProp, vContent, nLength = 0, sCollectedTxt = "",
- vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
-
- if (bChildren) {
- for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
- oNode = oParentNode.childNodes.item(nItem);
- if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is "CDATASection" (4) */
- else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is "Text" (3) */
- else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is "Element" (1) */
- }
- }
-
- var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
-
- if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
-
- for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
- sProp = aCache[nElId].nodeName.toLowerCase();
- vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
- if (vResult.hasOwnProperty(sProp)) {
- if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
- vResult[sProp].push(vContent);
- } else {
- vResult[sProp] = vContent;
- nLength++;
- }
- }
-
- if (bAttributes) {
- var
- nAttrLen = oParentNode.attributes.length,
- sAPrefix = bNesteAttr ? "" : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
-
- for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
- oAttrib = oParentNode.attributes.item(nAttrib);
- oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
- }
-
- if (bNesteAttr) {
- if (bFreeze) { Object.freeze(oAttrParent); }
- vResult[sAttributesProp] = oAttrParent;
- nLength -= nAttrLen - 1;
- }
- }
-
- if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
- vResult[sValueProp] = vBuiltVal;
- } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
- vResult = vBuiltVal;
- }
-
- if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
-
- aCache.length = nLevelStart;
-
- return vResult;
- }
-
- function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
- var vValue, oChild;
-
- if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
- oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
- } else if (oParentObj.constructor === Date) {
- oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));
- }
-
- for (var sName in oParentObj) {
- vValue = oParentObj[sName];
- if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
- if (sName === sValueProp) {
- if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
- } else if (sName === sAttributesProp) { /* verbosity level is 3 */
- for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
- } else if (sName.charAt(0) === sAttrPref) {
- oParentEl.setAttribute(sName.slice(1), vValue);
- } else if (vValue.constructor === Array) {
- for (var nItem = 0; nItem < vValue.length; nItem++) {
- oChild = oXMLDoc.createElement(sName);
- loadObjTree(oXMLDoc, oChild, vValue[nItem]);
- oParentEl.appendChild(oChild);
- }
- } else {
- oChild = oXMLDoc.createElement(sName);
- if (vValue instanceof Object) {
- loadObjTree(oXMLDoc, oChild, vValue);
- } else if (vValue !== null && vValue !== true) {
- oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
- }
- oParentEl.appendChild(oChild);
- }
- }
- }
-
- this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
- var _nVerb = arguments.length > 1 && typeof nVerbosity === "number" ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
- return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);
- };
-
- this.unbuild = function (oObjTree) {
- var oNewDoc = document.implementation.createDocument("", "", null);
- loadObjTree(oNewDoc, oNewDoc, oObjTree);
- return oNewDoc;
- };
-
- this.stringify = function (oObjTree) {
- return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
- };
-})();
-// var myObject = JXON.build(doc);
-// we got our javascript object! try: alert(JSON.stringify(myObject));
-
-// var newDoc = JXON.unbuild(myObject);
-// we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
-/*!
- * Lo-Dash 1.0.0-rc.3 <http://lodash.com>
- * (c) 2012 John-David Dalton <http://allyoucanleet.com/>
- * Based on Underscore.js 1.4.3 <http://underscorejs.org>
- * (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
- * Available under MIT license <http://lodash.com/license>
- */
-;(function(window, undefined) {
-
- /** Detect free variable `exports` */
- var freeExports = typeof exports == 'object' && exports;
-
- /** Detect free variable `global` and use it as `window` */
- var freeGlobal = typeof global == 'object' && global;
- if (freeGlobal.global === freeGlobal) {
- window = freeGlobal;
- }
-
- /** Used for array and object method references */
- var arrayRef = [],
- // avoid a Closure Compiler bug by creatively creating an object
- objectRef = new function(){};
-
- /** Used to generate unique IDs */
- var idCounter = 0;
-
- /** Used internally to indicate various things */
- var indicatorObject = objectRef;
-
- /** Used by `cachedContains` as the default size when optimizations are enabled for large arrays */
- var largeArraySize = 30;
-
- /** Used to restore the original `_` reference in `noConflict` */
- var oldDash = window._;
-
- /** Used to detect template delimiter values that require a with-statement */
- var reComplexDelimiter = /[-?+=!~*%&^<>|{(\/]|\[\D|\b(?:delete|in|instanceof|new|typeof|void)\b/;
-
- /** Used to match HTML entities */
- var reEscapedHtml = /&(?:amp|lt|gt|quot|#x27);/g;
-
- /** Used to match empty string literals in compiled template source */
- var reEmptyStringLeading = /\b__p \+= '';/g,
- reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
- reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
-
- /** Used to match regexp flags from their coerced string values */
- var reFlags = /\w*$/;
-
- /** Used to insert the data object variable into compiled template source */
- var reInsertVariable = /(?:__e|__t = )\(\s*(?![\d\s"']|this\.)/g;
-
- /** Used to detect if a method is native */
- var reNative = RegExp('^' +
- (objectRef.valueOf + '')
- .replace(/[.*+?^=!:${}()|[\]\/\\]/g, '\\$&')
- .replace(/valueOf|for [^\]]+/g, '.+?') + '$'
- );
-
- /**
- * Used to match ES6 template delimiters
- * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-7.8.6
- */
- var reEsTemplate = /\$\{((?:(?=\\?)\\?[\s\S])*?)}/g;
-
- /** Used to match "interpolate" template delimiters */
- var reInterpolate = /<%=([\s\S]+?)%>/g;
-
- /** Used to ensure capturing order of template delimiters */
- var reNoMatch = /($^)/;
-
- /** Used to match HTML characters */
- var reUnescapedHtml = /[&<>"']/g;
-
- /** Used to match unescaped characters in compiled string literals */
- var reUnescapedString = /['\n\r\t\u2028\u2029\\]/g;
-
- /** Used to fix the JScript [[DontEnum]] bug */
- var shadowed = [
- 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',
- 'toLocaleString', 'toString', 'valueOf'
- ];
-
- /** Used to make template sourceURLs easier to identify */
- var templateCounter = 0;
-
- /** Native method shortcuts */
- var ceil = Math.ceil,
- concat = arrayRef.concat,
- floor = Math.floor,
- getPrototypeOf = reNative.test(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,
- hasOwnProperty = objectRef.hasOwnProperty,
- push = arrayRef.push,
- propertyIsEnumerable = objectRef.propertyIsEnumerable,
- toString = objectRef.toString;
-
- /* Native method shortcuts for methods with the same name as other `lodash` methods */
- var nativeBind = reNative.test(nativeBind = slice.bind) && nativeBind,
- nativeIsArray = reNative.test(nativeIsArray = Array.isArray) && nativeIsArray,
- nativeIsFinite = window.isFinite,
- nativeIsNaN = window.isNaN,
- nativeKeys = reNative.test(nativeKeys = Object.keys) && nativeKeys,
- nativeMax = Math.max,
- nativeMin = Math.min,
- nativeRandom = Math.random;
-
- /** `Object#toString` result shortcuts */
- var argsClass = '[object Arguments]',
- arrayClass = '[object Array]',
- boolClass = '[object Boolean]',
- dateClass = '[object Date]',
- funcClass = '[object Function]',
- numberClass = '[object Number]',
- objectClass = '[object Object]',
- regexpClass = '[object RegExp]',
- stringClass = '[object String]';
-
- /** Detect various environments */
- var isIeOpera = !!window.attachEvent,
- isV8 = nativeBind && !/\n|true/.test(nativeBind + isIeOpera);
-
- /* Detect if `Function#bind` exists and is inferred to be fast (all but V8) */
- var isBindFast = nativeBind && !isV8;
-
- /* Detect if `Object.keys` exists and is inferred to be fast (IE, Opera, V8) */
- var isKeysFast = nativeKeys && (isIeOpera || isV8);
-
- /**
- * Detect the JScript [[DontEnum]] bug:
- *
- * In IE < 9 an objects own properties, shadowing non-enumerable ones, are
- * made non-enumerable as well.
- */
- var hasDontEnumBug;
-
- /** Detect if own properties are iterated after inherited properties (IE < 9) */
- var iteratesOwnLast;
-
- /**
- * Detect if `Array#shift` and `Array#splice` augment array-like objects
- * incorrectly:
- *
- * Firefox < 10, IE compatibility mode, and IE < 9 have buggy Array `shift()`
- * and `splice()` functions that fail to remove the last element, `value[0]`,
- * of array-like objects even though the `length` property is set to `0`.
- * The `shift()` method is buggy in IE 8 compatibility mode, while `splice()`
- * is buggy regardless of mode in IE < 9 and buggy in compatibility mode in IE 9.
- */
- var hasObjectSpliceBug = (hasObjectSpliceBug = { '0': 1, 'length': 1 },
- arrayRef.splice.call(hasObjectSpliceBug, 0, 1), hasObjectSpliceBug[0]);
-
- /** Detect if an `arguments` object's indexes are non-enumerable (IE < 9) */
- var nonEnumArgs = true;
-
- (function() {
- var props = [];
- function ctor() { this.x = 1; }
- ctor.prototype = { 'valueOf': 1, 'y': 1 };
- for (var prop in new ctor) { props.push(prop); }
- for (prop in arguments) { nonEnumArgs = !prop; }
-
- hasDontEnumBug = !/valueOf/.test(props);
- iteratesOwnLast = props[0] != 'x';
- }(1));
-
- /** Detect if `arguments` objects are `Object` objects (all but Opera < 10.5) */
- var argsAreObjects = arguments.constructor == Object;
-
- /** Detect if `arguments` objects [[Class]] is unresolvable (Firefox < 4, IE < 9) */
- var noArgsClass = !isArguments(arguments);
-
- /**
- * Detect lack of support for accessing string characters by index:
- *
- * IE < 8 can't access characters by index and IE 8 can only access
- * characters by index on string literals.
- */
- var noCharByIndex = ('x'[0] + Object('x')[0]) != 'xx';
-
- /**
- * Detect if a node's [[Class]] is unresolvable (IE < 9)
- * and that the JS engine won't error when attempting to coerce an object to
- * a string without a `toString` property value of `typeof` "function".
- */
- try {
- var noNodeClass = ({ 'toString': 0 } + '', toString.call(document) == objectClass);
- } catch(e) { }
-
- /**
- * Detect if sourceURL syntax is usable without erroring:
- *
- * The JS engine embedded in Adobe products will throw a syntax error when
- * it encounters a single line comment beginning with the `@` symbol.
- *
- * The JS engine in Narwhal will generate the function `function anonymous(){//}`
- * and throw a syntax error.
- *
- * Avoid comments beginning `@` symbols in IE because they are part of its
- * non-standard conditional compilation support.
- * http://msdn.microsoft.com/en-us/library/121hztk3(v=vs.94).aspx
- */
- try {
- var useSourceURL = (Function('//@')(), !isIeOpera);
- } catch(e) { }
-
- /** Used to identify object classifications that `_.clone` supports */
- var cloneableClasses = {};
- cloneableClasses[funcClass] = false;
- cloneableClasses[argsClass] = cloneableClasses[arrayClass] =
- cloneableClasses[boolClass] = cloneableClasses[dateClass] =
- cloneableClasses[numberClass] = cloneableClasses[objectClass] =
- cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;
-
- /** Used to lookup a built-in constructor by [[Class]] */
- var ctorByClass = {};
- ctorByClass[arrayClass] = Array;
- ctorByClass[boolClass] = Boolean;
- ctorByClass[dateClass] = Date;
- ctorByClass[objectClass] = Object;
- ctorByClass[numberClass] = Number;
- ctorByClass[regexpClass] = RegExp;
- ctorByClass[stringClass] = String;
-
- /** Used to determine if values are of the language type Object */
- var objectTypes = {
- 'boolean': false,
- 'function': true,
- 'object': true,
- 'number': false,
- 'string': false,
- 'undefined': false
- };
-
- /** Used to escape characters for inclusion in compiled string literals */
- var stringEscapes = {
- '\\': '\\',
- "'": "'",
- '\n': 'n',
- '\r': 'r',
- '\t': 't',
- '\u2028': 'u2028',
- '\u2029': 'u2029'
- };
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Creates a `lodash` object, that wraps the given `value`, to enable
- * method chaining.
- *
- * The chainable wrapper functions are:
- * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`, `compose`,
- * `concat`, `countBy`, `debounce`, `defaults`, `defer`, `delay`, `difference`,
- * `filter`, `flatten`, `forEach`, `forIn`, `forOwn`, `functions`, `groupBy`,
- * `initial`, `intersection`, `invert`, `invoke`, `keys`, `map`, `max`, `memoize`,
- * `merge`, `min`, `object`, `omit`, `once`, `pairs`, `partial`, `pick`, `pluck`,
- * `push`, `range`, `reject`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,
- * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `union`, `uniq`,
- * `unshift`, `values`, `where`, `without`, `wrap`, and `zip`
- *
- * The non-chainable wrapper functions are:
- * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `has`, `identity`,
- * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`, `isEmpty`,
- * `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`, `isObject`,
- * `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`, `lastIndexOf`,
- * `mixin`, `noConflict`, `pop`, `random`, `reduce`, `reduceRight`, `result`,
- * `shift`, `size`, `some`, `sortedIndex`, `template`, `unescape`, and `uniqueId`
- *
- * The wrapper functions `first` and `last` return wrapped values when `n` is
- * passed, otherwise they return unwrapped values.
- *
- * @name _
- * @constructor
- * @category Chaining
- * @param {Mixed} value The value to wrap in a `lodash` instance.
- * @returns {Object} Returns a `lodash` instance.
- */
- function lodash(value) {
- // exit early if already wrapped, even if wrapped by a different `lodash` constructor
- if (value && typeof value == 'object' && value.__wrapped__) {
- return value;
- }
- // allow invoking `lodash` without the `new` operator
- if (!(this instanceof lodash)) {
- return new lodash(value);
- }
- this.__wrapped__ = value;
- }
-
- /**
- * By default, the template delimiters used by Lo-Dash are similar to those in
- * embedded Ruby (ERB). Change the following template settings to use alternative
- * delimiters.
- *
- * @static
- * @memberOf _
- * @type Object
- */
- lodash.templateSettings = {
-
- /**
- * Used to detect `data` property values to be HTML-escaped.
- *
- * @static
- * @memberOf _.templateSettings
- * @type RegExp
- */
- 'escape': /<%-([\s\S]+?)%>/g,
-
- /**
- * Used to detect code to be evaluated.
- *
- * @static
- * @memberOf _.templateSettings
- * @type RegExp
- */
- 'evaluate': /<%([\s\S]+?)%>/g,
-
- /**
- * Used to detect `data` property values to inject.
- *
- * @static
- * @memberOf _.templateSettings
- * @type RegExp
- */
- 'interpolate': reInterpolate,
-
- /**
- * Used to reference the data object in the template text.
- *
- * @static
- * @memberOf _.templateSettings
- * @type String
- */
- 'variable': ''
- };
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * The template used to create iterator functions.
- *
- * @private
- * @param {Obect} data The data object used to populate the text.
- * @returns {String} Returns the interpolated text.
- */
- var iteratorTemplate = template(
- // conditional strict mode
- "<% if (obj.useStrict) { %>'use strict';\n<% } %>" +
-
- // the `iteratee` may be reassigned by the `top` snippet
- 'var index, iteratee = <%= firstArg %>, ' +
- // assign the `result` variable an initial value
- 'result = <%= firstArg %>;\n' +
- // exit early if the first argument is falsey
- 'if (!<%= firstArg %>) return result;\n' +
- // add code before the iteration branches
- '<%= top %>;\n' +
-
- // array-like iteration:
- '<% if (arrayLoop) { %>' +
- 'var length = iteratee.length; index = -1;\n' +
- "if (typeof length == 'number') {" +
-
- // add support for accessing string characters by index if needed
- ' <% if (noCharByIndex) { %>\n' +
- ' if (isString(iteratee)) {\n' +
- " iteratee = iteratee.split('')\n" +
- ' }' +
- ' <% } %>\n' +
-
- // iterate over the array-like value
- ' while (++index < length) {\n' +
- ' <%= arrayLoop %>\n' +
- ' }\n' +
- '}\n' +
- 'else {' +
-
- // object iteration:
- // add support for iterating over `arguments` objects if needed
- ' <% } else if (nonEnumArgs) { %>\n' +
- ' var length = iteratee.length; index = -1;\n' +
- ' if (length && isArguments(iteratee)) {\n' +
- ' while (++index < length) {\n' +
- " index += '';\n" +
- ' <%= objectLoop %>\n' +
- ' }\n' +
- ' } else {' +
- ' <% } %>' +
-
- // Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1
- // (if the prototype or a property on the prototype has been set)
- // incorrectly sets a function's `prototype` property [[Enumerable]]
- // value to `true`. Because of this Lo-Dash standardizes on skipping
- // the the `prototype` property of functions regardless of its
- // [[Enumerable]] value.
- ' <% if (!hasDontEnumBug) { %>\n' +
- " var skipProto = typeof iteratee == 'function' && \n" +
- " propertyIsEnumerable.call(iteratee, 'prototype');\n" +
- ' <% } %>' +
-
- // iterate own properties using `Object.keys` if it's fast
- ' <% if (isKeysFast && useHas) { %>\n' +
- ' var ownIndex = -1,\n' +
- ' ownProps = objectTypes[typeof iteratee] ? nativeKeys(iteratee) : [],\n' +
- ' length = ownProps.length;\n\n' +
- ' while (++ownIndex < length) {\n' +
- ' index = ownProps[ownIndex];\n' +
- " <% if (!hasDontEnumBug) { %>if (!(skipProto && index == 'prototype')) {\n <% } %>" +
- ' <%= objectLoop %>\n' +
- ' <% if (!hasDontEnumBug) { %>}\n<% } %>' +
- ' }' +
-
- // else using a for-in loop
- ' <% } else { %>\n' +
- ' for (index in iteratee) {<%' +
- ' if (!hasDontEnumBug || useHas) { %>\n if (<%' +
- " if (!hasDontEnumBug) { %>!(skipProto && index == 'prototype')<% }" +
- ' if (!hasDontEnumBug && useHas) { %> && <% }' +
- ' if (useHas) { %>hasOwnProperty.call(iteratee, index)<% }' +
- ' %>) {' +
- ' <% } %>\n' +
- ' <%= objectLoop %>;' +
- ' <% if (!hasDontEnumBug || useHas) { %>\n }<% } %>\n' +
- ' }' +
- ' <% } %>' +
-
- // Because IE < 9 can't set the `[[Enumerable]]` attribute of an
- // existing property and the `constructor` property of a prototype
- // defaults to non-enumerable, Lo-Dash skips the `constructor`
- // property when it infers it's iterating over a `prototype` object.
- ' <% if (hasDontEnumBug) { %>\n\n' +
- ' var ctor = iteratee.constructor;\n' +
- ' <% for (var k = 0; k < 7; k++) { %>\n' +
- " index = '<%= shadowed[k] %>';\n" +
- ' if (<%' +
- " if (shadowed[k] == 'constructor') {" +
- ' %>!(ctor && ctor.prototype === iteratee) && <%' +
- ' } %>hasOwnProperty.call(iteratee, index)) {\n' +
- ' <%= objectLoop %>\n' +
- ' }' +
- ' <% } %>' +
- ' <% } %>' +
- ' <% if (arrayLoop || nonEnumArgs) { %>\n}<% } %>\n' +
-
- // add code to the bottom of the iteration function
- '<%= bottom %>;\n' +
- // finally, return the `result`
- 'return result'
- );
-
- /** Reusable iterator options for `assign` and `defaults` */
- var assignIteratorOptions = {
- 'args': 'object, source, guard',
- 'top':
- "for (var argsIndex = 1, argsLength = typeof guard == 'number' ? 2 : arguments.length; argsIndex < argsLength; argsIndex++) {\n" +
- ' if ((iteratee = arguments[argsIndex])) {',
- 'objectLoop': 'result[index] = iteratee[index]',
- 'bottom': ' }\n}'
- };
-
- /**
- * Reusable iterator options shared by `each`, `forIn`, and `forOwn`.
- */
- var eachIteratorOptions = {
- 'args': 'collection, callback, thisArg',
- 'top': "callback = callback && typeof thisArg == 'undefined' ? callback : createCallback(callback, thisArg)",
- 'arrayLoop': 'if (callback(iteratee[index], index, collection) === false) return result',
- 'objectLoop': 'if (callback(iteratee[index], index, collection) === false) return result'
- };
-
- /** Reusable iterator options for `forIn` and `forOwn` */
- var forOwnIteratorOptions = {
- 'arrayLoop': null
- };
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Creates a function optimized to search large arrays for a given `value`,
- * starting at `fromIndex`, using strict equality for comparisons, i.e. `===`.
- *
- * @private
- * @param {Array} array The array to search.
- * @param {Mixed} value The value to search for.
- * @param {Number} [fromIndex=0] The index to search from.
- * @param {Number} [largeSize=30] The length at which an array is considered large.
- * @returns {Boolean} Returns `true` if `value` is found, else `false`.
- */
- function cachedContains(array, fromIndex, largeSize) {
- fromIndex || (fromIndex = 0);
-
- var length = array.length,
- isLarge = (length - fromIndex) >= (largeSize || largeArraySize);
-
- if (isLarge) {
- var cache = {},
- index = fromIndex - 1;
-
- while (++index < length) {
- // manually coerce `value` to a string because `hasOwnProperty`, in some
- // older versions of Firefox, coerces objects incorrectly
- var key = array[index] + '';
- (hasOwnProperty.call(cache, key) ? cache[key] : (cache[key] = [])).push(array[index]);
- }
- }
- return function(value) {
- if (isLarge) {
- var key = value + '';
- return hasOwnProperty.call(cache, key) && indexOf(cache[key], value) > -1;
- }
- return indexOf(array, value, fromIndex) > -1;
- }
- }
-
- /**
- * Used by `_.max` and `_.min` as the default `callback` when a given
- * `collection` is a string value.
- *
- * @private
- * @param {String} value The character to inspect.
- * @returns {Number} Returns the code unit of given character.
- */
- function charAtCallback(value) {
- return value.charCodeAt(0);
- }
-
- /**
- * Used by `sortBy` to compare transformed `collection` values, stable sorting
- * them in ascending order.
- *
- * @private
- * @param {Object} a The object to compare to `b`.
- * @param {Object} b The object to compare to `a`.
- * @returns {Number} Returns the sort order indicator of `1` or `-1`.
- */
- function compareAscending(a, b) {
- var ai = a.index,
- bi = b.index;
-
- a = a.criteria;
- b = b.criteria;
-
- // ensure a stable sort in V8 and other engines
- // http://code.google.com/p/v8/issues/detail?id=90
- if (a !== b) {
- if (a > b || typeof a == 'undefined') {
- return 1;
- }
- if (a < b || typeof b == 'undefined') {
- return -1;
- }
- }
- return ai < bi ? -1 : 1;
- }
-
- /**
- * Creates a function that, when called, invokes `func` with the `this`
- * binding of `thisArg` and prepends any `partailArgs` to the arguments passed
- * to the bound function.
- *
- * @private
- * @param {Function|String} func The function to bind or the method name.
- * @param {Mixed} [thisArg] The `this` binding of `func`.
- * @param {Array} partialArgs An array of arguments to be partially applied.
- * @returns {Function} Returns the new bound function.
- */
- function createBound(func, thisArg, partialArgs) {
- var isFunc = isFunction(func),
- isPartial = !partialArgs,
- key = thisArg;
-
- // juggle arguments
- if (isPartial) {
- partialArgs = thisArg;
- }
- if (!isFunc) {
- thisArg = func;
- }
-
- function bound() {
- // `Function#bind` spec
- // http://es5.github.com/#x15.3.4.5
- var args = arguments,
- thisBinding = isPartial ? this : thisArg;
-
- if (!isFunc) {
- func = thisArg[key];
- }
- if (partialArgs.length) {
- args = args.length
- ? partialArgs.concat(slice(args))
- : partialArgs;
- }
- if (this instanceof bound) {
- // ensure `new bound` is an instance of `bound` and `func`
- noop.prototype = func.prototype;
- thisBinding = new noop;
- noop.prototype = null;
-
- // mimic the constructor's `return` behavior
- // http://es5.github.com/#x13.2.2
- var result = func.apply(thisBinding, args);
- return isObject(result) ? result : thisBinding;
- }
- return func.apply(thisBinding, args);
- }
- return bound;
- }
-
- /**
- * Produces an iteration callback bound to an optional `thisArg`. If `func` is
- * a property name, the callback will return the property value for a given element.
- *
- * @private
- * @param {Function|String} [func=identity|property] The function called per
- * iteration or property name to query.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @param {Object} [accumulating] Used to indicate that the callback should
- * accept an `accumulator` argument.
- * @returns {Function} Returns a callback function.
- */
- function createCallback(func, thisArg, accumulating) {
- if (!func) {
- return identity;
- }
- if (typeof func != 'function') {
- return function(object) {
- return object[func];
- };
- }
- if (typeof thisArg != 'undefined') {
- if (accumulating) {
- return function(accumulator, value, index, object) {
- return func.call(thisArg, accumulator, value, index, object);
- };
- }
- return function(value, index, object) {
- return func.call(thisArg, value, index, object);
- };
- }
- return func;
- }
-
- /**
- * Creates compiled iteration functions.
- *
- * @private
- * @param {Object} [options1, options2, ...] The compile options object(s).
- * useHas - A boolean to specify using `hasOwnProperty` checks in the object loop.
- * args - A string of comma separated arguments the iteration function will accept.
- * top - A string of code to execute before the iteration branches.
- * arrayLoop - A string of code to execute in the array loop.
- * objectLoop - A string of code to execute in the object loop.
- * bottom - A string of code to execute after the iteration branches.
- *
- * @returns {Function} Returns the compiled function.
- */
- function createIterator() {
- var data = {
- 'arrayLoop': '',
- 'bottom': '',
- 'hasDontEnumBug': hasDontEnumBug,
- 'isKeysFast': isKeysFast,
- 'objectLoop': '',
- 'nonEnumArgs': nonEnumArgs,
- 'noCharByIndex': noCharByIndex,
- 'shadowed': shadowed,
- 'top': '',
- 'useHas': true
- };
-
- // merge options into a template data object
- for (var object, index = 0; object = arguments[index]; index++) {
- for (var key in object) {
- data[key] = object[key];
- }
- }
- var args = data.args;
- data.firstArg = /^[^,]+/.exec(args)[0];
-
- // create the function factory
- var factory = Function(
- 'createCallback, hasOwnProperty, isArguments, isString, objectTypes, ' +
- 'nativeKeys, propertyIsEnumerable',
- 'return function(' + args + ') {\n' + iteratorTemplate(data) + '\n}'
- );
- // return the compiled function
- return factory(
- createCallback, hasOwnProperty, isArguments, isString, objectTypes,
- nativeKeys, propertyIsEnumerable
- );
- }
-
- /**
- * A function compiled to iterate `arguments` objects, arrays, objects, and
- * strings consistenly across environments, executing the `callback` for each
- * element in the `collection`. The `callback` is bound to `thisArg` and invoked
- * with three arguments; (value, index|key, collection). Callbacks may exit
- * iteration early by explicitly returning `false`.
- *
- * @private
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Array|Object|String} Returns `collection`.
- */
- var each = createIterator(eachIteratorOptions);
-
- /**
- * Used by `template` to escape characters for inclusion in compiled
- * string literals.
- *
- * @private
- * @param {String} match The matched character to escape.
- * @returns {String} Returns the escaped character.
- */
- function escapeStringChar(match) {
- return '\\' + stringEscapes[match];
- }
-
- /**
- * Used by `escape` to convert characters to HTML entities.
- *
- * @private
- * @param {String} match The matched character to escape.
- * @returns {String} Returns the escaped character.
- */
- function escapeHtmlChar(match) {
- return htmlEscapes[match];
- }
-
- /**
- * Checks if `value` is a DOM node in IE < 9.
- *
- * @private
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is a DOM node, else `false`.
- */
- function isNode(value) {
- // IE < 9 presents DOM nodes as `Object` objects except they have `toString`
- // methods that are `typeof` "string" and still can coerce nodes to strings
- return typeof value.toString != 'function' && typeof (value + '') == 'string';
- }
-
- /**
- * A no-operation function.
- *
- * @private
- */
- function noop() {
- // no operation performed
- }
-
- /**
- * Slices the `collection` from the `start` index up to, but not including,
- * the `end` index.
- *
- * Note: This function is used, instead of `Array#slice`, to support node lists
- * in IE < 9 and to ensure dense arrays are returned.
- *
- * @private
- * @param {Array|Object|String} collection The collection to slice.
- * @param {Number} start The start index.
- * @param {Number} end The end index.
- * @returns {Array} Returns the new array.
- */
- function slice(array, start, end) {
- start || (start = 0);
- if (typeof end == 'undefined') {
- end = array ? array.length : 0;
- }
- var index = -1,
- length = end - start || 0,
- result = Array(length < 0 ? 0 : length);
-
- while (++index < length) {
- result[index] = array[start + index];
- }
- return result;
- }
-
- /**
- * Used by `unescape` to convert HTML entities to characters.
- *
- * @private
- * @param {String} match The matched character to unescape.
- * @returns {String} Returns the unescaped character.
- */
- function unescapeHtmlChar(match) {
- return htmlUnescapes[match];
- }
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Assigns own enumerable properties of source object(s) to the `destination`
- * object. Subsequent sources will overwrite propery assignments of previous
- * sources.
- *
- * @static
- * @memberOf _
- * @alias extend
- * @category Objects
- * @param {Object} object The destination object.
- * @param {Object} [source1, source2, ...] The source objects.
- * @returns {Object} Returns the destination object.
- * @example
- *
- * _.assign({ 'name': 'moe' }, { 'age': 40 });
- * // => { 'name': 'moe', 'age': 40 }
- */
- var assign = createIterator(assignIteratorOptions);
-
- /**
- * Checks if `value` is an `arguments` object.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is an `arguments` object, else `false`.
- * @example
- *
- * (function() { return _.isArguments(arguments); })(1, 2, 3);
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
- function isArguments(value) {
- return toString.call(value) == argsClass;
- }
- // fallback for browsers that can't detect `arguments` objects by [[Class]]
- if (noArgsClass) {
- isArguments = function(value) {
- return value ? hasOwnProperty.call(value, 'callee') : false;
- };
- }
-
- /**
- * Iterates over `object`'s own and inherited enumerable properties, executing
- * the `callback` for each property. The `callback` is bound to `thisArg` and
- * invoked with three arguments; (value, key, object). Callbacks may exit iteration
- * early by explicitly returning `false`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * function Dog(name) {
- * this.name = name;
- * }
- *
- * Dog.prototype.bark = function() {
- * alert('Woof, woof!');
- * };
- *
- * _.forIn(new Dog('Dagny'), function(value, key) {
- * alert(key);
- * });
- * // => alerts 'name' and 'bark' (order is not guaranteed)
- */
- var forIn = createIterator(eachIteratorOptions, forOwnIteratorOptions, {
- 'useHas': false
- });
-
- /**
- * Iterates over an object's own enumerable properties, executing the `callback`
- * for each property. The `callback` is bound to `thisArg` and invoked with three
- * arguments; (value, key, object). Callbacks may exit iteration early by explicitly
- * returning `false`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
- * alert(key);
- * });
- * // => alerts '0', '1', and 'length' (order is not guaranteed)
- */
- var forOwn = createIterator(eachIteratorOptions, forOwnIteratorOptions);
-
- /**
- * A fallback implementation of `isPlainObject` that checks if a given `value`
- * is an object created by the `Object` constructor, assuming objects created
- * by the `Object` constructor have no inherited enumerable properties and that
- * there are no `Object.prototype` extensions.
- *
- * @private
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if `value` is a plain object, else `false`.
- */
- function shimIsPlainObject(value) {
- // avoid non-objects and false positives for `arguments` objects
- var result = false;
- if (!(value && typeof value == 'object') || isArguments(value)) {
- return result;
- }
- // check that the constructor is `Object` (i.e. `Object instanceof Object`)
- var ctor = value.constructor;
- if ((!isFunction(ctor) && (!noNodeClass || !isNode(value))) || ctor instanceof ctor) {
- // IE < 9 iterates inherited properties before own properties. If the first
- // iterated property is an object's own property then there are no inherited
- // enumerable properties.
- if (iteratesOwnLast) {
- forIn(value, function(value, key, object) {
- result = !hasOwnProperty.call(object, key);
- return false;
- });
- return result === false;
- }
- // In most environments an object's own properties are iterated before
- // its inherited properties. If the last iterated property is an object's
- // own property then there are no inherited enumerable properties.
- forIn(value, function(value, key) {
- result = key;
- });
- return result === false || hasOwnProperty.call(value, result);
- }
- return result;
- }
-
- /**
- * A fallback implementation of `Object.keys` that produces an array of the
- * given object's own enumerable property names.
- *
- * @private
- * @param {Object} object The object to inspect.
- * @returns {Array} Returns a new array of property names.
- */
- function shimKeys(object) {
- var result = [];
- forOwn(object, function(value, key) {
- result.push(key);
- });
- return result;
- }
-
- /**
- * Used to convert characters to HTML entities:
- *
- * Though the `>` character is escaped for symmetry, characters like `>` and `/`
- * don't require escaping in HTML and have no special meaning unless they're part
- * of a tag or an unquoted attribute value.
- * http://mathiasbynens.be/notes/ambiguous-ampersands (under "semi-related fun fact")
- */
- var htmlEscapes = {
- '&': '&',
- '<': '<',
- '>': '>',
- '"': '"',
- "'": '''
- };
-
- /** Used to convert HTML entities to characters */
- var htmlUnescapes = invert(htmlEscapes);
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Creates a clone of `value`. If `deep` is `true`, nested objects will also
- * be cloned, otherwise they will be assigned by reference.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to clone.
- * @param {Boolean} deep A flag to indicate a deep clone.
- * @param- {Object} [guard] Internally used to allow this method to work with
- * others like `_.map` without using their callback `index` argument for `deep`.
- * @param- {Array} [stackA=[]] Internally used to track traversed source objects.
- * @param- {Array} [stackB=[]] Internally used to associate clones with their
- * source counterparts.
- * @returns {Mixed} Returns the cloned `value`.
- * @example
- *
- * var stooges = [
- * { 'name': 'moe', 'age': 40 },
- * { 'name': 'larry', 'age': 50 },
- * { 'name': 'curly', 'age': 60 }
- * ];
- *
- * var shallow = _.clone(stooges);
- * shallow[0] === stooges[0];
- * // => true
- *
- * var deep = _.clone(stooges, true);
- * deep[0] === stooges[0];
- * // => false
- */
- function clone(value, deep, guard, stackA, stackB) {
- if (value == null) {
- return value;
- }
- if (guard) {
- deep = false;
- }
- // inspect [[Class]]
- var isObj = isObject(value);
- if (isObj) {
- var className = toString.call(value);
- if (!cloneableClasses[className] || (noNodeClass && isNode(value))) {
- return value;
- }
- var isArr = isArray(value);
- }
- // shallow clone
- if (!isObj || !deep) {
- return isObj
- ? (isArr ? slice(value) : assign({}, value))
- : value;
- }
- var ctor = ctorByClass[className];
- switch (className) {
- case boolClass:
- case dateClass:
- return new ctor(+value);
-
- case numberClass:
- case stringClass:
- return new ctor(value);
-
- case regexpClass:
- return ctor(value.source, reFlags.exec(value));
- }
- // check for circular references and return corresponding clone
- stackA || (stackA = []);
- stackB || (stackB = []);
-
- var length = stackA.length;
- while (length--) {
- if (stackA[length] == value) {
- return stackB[length];
- }
- }
- // init cloned object
- var result = isArr ? ctor(value.length) : {};
-
- // add the source value to the stack of traversed objects
- // and associate it with its clone
- stackA.push(value);
- stackB.push(result);
-
- // recursively populate clone (susceptible to call stack limits)
- (isArr ? forEach : forOwn)(value, function(objValue, key) {
- result[key] = clone(objValue, deep, null, stackA, stackB);
- });
-
- // add array properties assigned by `RegExp#exec`
- if (isArr) {
- if (hasOwnProperty.call(value, 'index')) {
- result.index = value.index;
- }
- if (hasOwnProperty.call(value, 'input')) {
- result.input = value.input;
- }
- }
- return result;
- }
-
- /**
- * Creates a deep clone of `value`. Functions and DOM nodes are **not** cloned.
- * The enumerable properties of `arguments` objects and objects created by
- * constructors other than `Object` are cloned to plain `Object` objects.
- *
- * Note: This function is loosely based on the structured clone algorithm.
- * See http://www.w3.org/TR/html5/common-dom-interfaces.html#internal-structured-cloning-algorithm.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to deep clone.
- * @returns {Mixed} Returns the deep cloned `value`.
- * @example
- *
- * var stooges = [
- * { 'name': 'moe', 'age': 40 },
- * { 'name': 'larry', 'age': 50 },
- * { 'name': 'curly', 'age': 60 }
- * ];
- *
- * var deep = _.cloneDeep(stooges);
- * deep[0] === stooges[0];
- * // => false
- */
- function cloneDeep(value) {
- return clone(value, true);
- }
-
- /**
- * Assigns own enumerable properties of source object(s) to the `destination`
- * object for all `destination` properties that resolve to `null`/`undefined`.
- * Once a property is set, additional defaults of the same property will be
- * ignored.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The destination object.
- * @param {Object} [default1, default2, ...] The default objects.
- * @returns {Object} Returns the destination object.
- * @example
- *
- * var iceCream = { 'flavor': 'chocolate' };
- * _.defaults(iceCream, { 'flavor': 'vanilla', 'sprinkles': 'rainbow' });
- * // => { 'flavor': 'chocolate', 'sprinkles': 'rainbow' }
- */
- var defaults = createIterator(assignIteratorOptions, {
- 'objectLoop': 'if (result[index] == null) ' + assignIteratorOptions.objectLoop
- });
-
- /**
- * Creates a sorted array of all enumerable properties, own and inherited,
- * of `object` that have function values.
- *
- * @static
- * @memberOf _
- * @alias methods
- * @category Objects
- * @param {Object} object The object to inspect.
- * @returns {Array} Returns a new array of property names that have function values.
- * @example
- *
- * _.functions(_);
- * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]
- */
- function functions(object) {
- var result = [];
- forIn(object, function(value, key) {
- if (isFunction(value)) {
- result.push(key);
- }
- });
- return result.sort();
- }
-
- /**
- * Checks if the specified object `property` exists and is a direct property,
- * instead of an inherited property.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to check.
- * @param {String} property The property to check for.
- * @returns {Boolean} Returns `true` if key is a direct property, else `false`.
- * @example
- *
- * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');
- * // => true
- */
- function has(object, property) {
- return object ? hasOwnProperty.call(object, property) : false;
- }
-
- /**
- * Creates an object composed of the inverted keys and values of the given `object`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to invert.
- * @returns {Object} Returns the created inverted object.
- * @example
- *
- * _.invert({ 'first': 'Moe', 'second': 'Larry', 'third': 'Curly' });
- * // => { 'Moe': 'first', 'Larry': 'second', 'Curly': 'third' } (order is not guaranteed)
- */
- function invert(object) {
- var result = {};
- forOwn(object, function(value, key) {
- result[value] = key;
- });
- return result;
- }
-
- /**
- * Checks if `value` is an array.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is an array, else `false`.
- * @example
- *
- * (function() { return _.isArray(arguments); })();
- * // => false
- *
- * _.isArray([1, 2, 3]);
- * // => true
- */
- var isArray = nativeIsArray || function(value) {
- // `instanceof` may cause a memory leak in IE 7 if `value` is a host object
- // http://ajaxian.com/archives/working-aroung-the-instanceof-memory-leak
- return (argsAreObjects && value instanceof Array) || toString.call(value) == arrayClass;
- };
-
- /**
- * Checks if `value` is a boolean (`true` or `false`) value.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is a boolean value, else `false`.
- * @example
- *
- * _.isBoolean(null);
- * // => false
- */
- function isBoolean(value) {
- return value === true || value === false || toString.call(value) == boolClass;
- }
-
- /**
- * Checks if `value` is a date.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is a date, else `false`.
- * @example
- *
- * _.isDate(new Date);
- * // => true
- */
- function isDate(value) {
- return value instanceof Date || toString.call(value) == dateClass;
- }
-
- /**
- * Checks if `value` is a DOM element.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is a DOM element, else `false`.
- * @example
- *
- * _.isElement(document.body);
- * // => true
- */
- function isElement(value) {
- return value ? value.nodeType === 1 : false;
- }
-
- /**
- * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
- * length of `0` and objects with no own enumerable properties are considered
- * "empty".
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Array|Object|String} value The value to inspect.
- * @returns {Boolean} Returns `true` if the `value` is empty, else `false`.
- * @example
- *
- * _.isEmpty([1, 2, 3]);
- * // => false
- *
- * _.isEmpty({});
- * // => true
- *
- * _.isEmpty('');
- * // => true
- */
- function isEmpty(value) {
- var result = true;
- if (!value) {
- return result;
- }
- var className = toString.call(value),
- length = value.length;
-
- if ((className == arrayClass || className == stringClass ||
- className == argsClass || (noArgsClass && isArguments(value))) ||
- (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {
- return !length;
- }
- forOwn(value, function() {
- return (result = false);
- });
- return result;
- }
-
- /**
- * Performs a deep comparison between two values to determine if they are
- * equivalent to each other.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} a The value to compare.
- * @param {Mixed} b The other value to compare.
- * @param- {Object} [stackA=[]] Internally used track traversed `a` objects.
- * @param- {Object} [stackB=[]] Internally used track traversed `b` objects.
- * @returns {Boolean} Returns `true` if the values are equvalent, else `false`.
- * @example
- *
- * var moe = { 'name': 'moe', 'luckyNumbers': [13, 27, 34] };
- * var clone = { 'name': 'moe', 'luckyNumbers': [13, 27, 34] };
- *
- * moe == clone;
- * // => false
- *
- * _.isEqual(moe, clone);
- * // => true
- */
- function isEqual(a, b, stackA, stackB) {
- // exit early for identical values
- if (a === b) {
- // treat `+0` vs. `-0` as not equal
- return a !== 0 || (1 / a == 1 / b);
- }
- // a strict comparison is necessary because `null == undefined`
- if (a == null || b == null) {
- return a === b;
- }
- // compare [[Class]] names
- var className = toString.call(a),
- otherName = toString.call(b);
-
- if (className == argsClass) {
- className = objectClass;
- }
- if (otherName == argsClass) {
- otherName = objectClass;
- }
- if (className != otherName) {
- return false;
- }
- switch (className) {
- case boolClass:
- case dateClass:
- // coerce dates and booleans to numbers, dates to milliseconds and booleans
- // to `1` or `0`, treating invalid dates coerced to `NaN` as not equal
- return +a == +b;
-
- case numberClass:
- // treat `NaN` vs. `NaN` as equal
- return a != +a
- ? b != +b
- // but treat `+0` vs. `-0` as not equal
- : (a == 0 ? (1 / a == 1 / b) : a == +b);
-
- case regexpClass:
- case stringClass:
- // coerce regexes to strings (http://es5.github.com/#x15.10.6.4)
- // treat string primitives and their corresponding object instances as equal
- return a == b + '';
- }
- var isArr = className == arrayClass;
- if (!isArr) {
- // unwrap any `lodash` wrapped values
- if (a.__wrapped__ || b.__wrapped__) {
- return isEqual(a.__wrapped__ || a, b.__wrapped__ || b);
- }
- // exit for functions and DOM nodes
- if (className != objectClass || (noNodeClass && (isNode(a) || isNode(b)))) {
- return false;
- }
- // in older versions of Opera, `arguments` objects have `Array` constructors
- var ctorA = !argsAreObjects && isArguments(a) ? Object : a.constructor,
- ctorB = !argsAreObjects && isArguments(b) ? Object : b.constructor;
-
- // non `Object` object instances with different constructors are not equal
- if (ctorA != ctorB && !(
- isFunction(ctorA) && ctorA instanceof ctorA &&
- isFunction(ctorB) && ctorB instanceof ctorB
- )) {
- return false;
- }
- }
- // assume cyclic structures are equal
- // the algorithm for detecting cyclic structures is adapted from ES 5.1
- // section 15.12.3, abstract operation `JO` (http://es5.github.com/#x15.12.3)
- stackA || (stackA = []);
- stackB || (stackB = []);
-
- var length = stackA.length;
- while (length--) {
- if (stackA[length] == a) {
- return stackB[length] == b;
- }
- }
- var index = -1,
- result = true,
- size = 0;
-
- // add `a` and `b` to the stack of traversed objects
- stackA.push(a);
- stackB.push(b);
-
- // recursively compare objects and arrays (susceptible to call stack limits)
- if (isArr) {
- // compare lengths to determine if a deep comparison is necessary
- size = a.length;
- result = size == b.length;
-
- if (result) {
- // deep compare the contents, ignoring non-numeric properties
- while (size--) {
- if (!(result = isEqual(a[size], b[size], stackA, stackB))) {
- break;
- }
- }
- }
- return result;
- }
- // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`
- // which, in this case, is more costly
- forIn(a, function(value, key, a) {
- if (hasOwnProperty.call(a, key)) {
- // count the number of properties.
- size++;
- // deep compare each property value.
- return (result = hasOwnProperty.call(b, key) && isEqual(value, b[key], stackA, stackB));
- }
- });
-
- if (result) {
- // ensure both objects have the same number of properties
- forIn(b, function(value, key, b) {
- if (hasOwnProperty.call(b, key)) {
- // `size` will be `-1` if `b` has more properties than `a`
- return (result = --size > -1);
- }
- });
- }
- return result;
- }
-
- /**
- * Checks if `value` is, or can be coerced to, a finite number.
- *
- * Note: This is not the same as native `isFinite`, which will return true for
- * booleans and empty strings. See http://es5.github.com/#x15.1.2.5.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is a finite number, else `false`.
- * @example
- *
- * _.isFinite(-101);
- * // => true
- *
- * _.isFinite('10');
- * // => true
- *
- * _.isFinite(true);
- * // => false
- *
- * _.isFinite('');
- * // => false
- *
- * _.isFinite(Infinity);
- * // => false
- */
- function isFinite(value) {
- return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));
- }
-
- /**
- * Checks if `value` is a function.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is a function, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- */
- function isFunction(value) {
- return typeof value == 'function';
- }
- // fallback for older versions of Chrome and Safari
- if (isFunction(/x/)) {
- isFunction = function(value) {
- return value instanceof Function || toString.call(value) == funcClass;
- };
- }
-
- /**
- * Checks if `value` is the language type of Object.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
- function isObject(value) {
- // check if the value is the ECMAScript language type of Object
- // http://es5.github.com/#x8
- // and avoid a V8 bug
- // http://code.google.com/p/v8/issues/detail?id=2291
- return value ? objectTypes[typeof value] : false;
- }
-
- /**
- * Checks if `value` is `NaN`.
- *
- * Note: This is not the same as native `isNaN`, which will return `true` for
- * `undefined` and other values. See http://es5.github.com/#x15.1.2.4.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is `NaN`, else `false`.
- * @example
- *
- * _.isNaN(NaN);
- * // => true
- *
- * _.isNaN(new Number(NaN));
- * // => true
- *
- * isNaN(undefined);
- * // => true
- *
- * _.isNaN(undefined);
- * // => false
- */
- function isNaN(value) {
- // `NaN` as a primitive is the only value that is not equal to itself
- // (perform the [[Class]] check first to avoid errors with some host objects in IE)
- return isNumber(value) && value != +value
- }
-
- /**
- * Checks if `value` is `null`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is `null`, else `false`.
- * @example
- *
- * _.isNull(null);
- * // => true
- *
- * _.isNull(undefined);
- * // => false
- */
- function isNull(value) {
- return value === null;
- }
-
- /**
- * Checks if `value` is a number.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is a number, else `false`.
- * @example
- *
- * _.isNumber(8.4 * 5);
- * // => true
- */
- function isNumber(value) {
- return typeof value == 'number' || toString.call(value) == numberClass;
- }
-
- /**
- * Checks if a given `value` is an object created by the `Object` constructor.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if `value` is a plain object, else `false`.
- * @example
- *
- * function Stooge(name, age) {
- * this.name = name;
- * this.age = age;
- * }
- *
- * _.isPlainObject(new Stooge('moe', 40));
- * // => false
- *
- * _.isPlainObject([1, 2, 3]);
- * // => false
- *
- * _.isPlainObject({ 'name': 'moe', 'age': 40 });
- * // => true
- */
- var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {
- if (!(value && typeof value == 'object')) {
- return false;
- }
- var valueOf = value.valueOf,
- objProto = typeof valueOf == 'function' && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
-
- return objProto
- ? value == objProto || (getPrototypeOf(value) == objProto && !isArguments(value))
- : shimIsPlainObject(value);
- };
-
- /**
- * Checks if `value` is a regular expression.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is a regular expression, else `false`.
- * @example
- *
- * _.isRegExp(/moe/);
- * // => true
- */
- function isRegExp(value) {
- return value instanceof RegExp || toString.call(value) == regexpClass;
- }
-
- /**
- * Checks if `value` is a string.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is a string, else `false`.
- * @example
- *
- * _.isString('moe');
- * // => true
- */
- function isString(value) {
- return typeof value == 'string' || toString.call(value) == stringClass;
- }
-
- /**
- * Checks if `value` is `undefined`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Mixed} value The value to check.
- * @returns {Boolean} Returns `true` if the `value` is `undefined`, else `false`.
- * @example
- *
- * _.isUndefined(void 0);
- * // => true
- */
- function isUndefined(value) {
- return typeof value == 'undefined';
- }
-
- /**
- * Creates an array composed of the own enumerable property names of `object`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to inspect.
- * @returns {Array} Returns a new array of property names.
- * @example
- *
- * _.keys({ 'one': 1, 'two': 2, 'three': 3 });
- * // => ['one', 'two', 'three'] (order is not guaranteed)
- */
- var keys = !nativeKeys ? shimKeys : function(object) {
- // avoid iterating over the `prototype` property
- return typeof object == 'function' && propertyIsEnumerable.call(object, 'prototype')
- ? shimKeys(object)
- : (isObject(object) ? nativeKeys(object) : []);
- };
-
- /**
- * Merges enumerable properties of the source object(s) into the `destination`
- * object. Subsequent sources will overwrite propery assignments of previous
- * sources.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The destination object.
- * @param {Object} [source1, source2, ...] The source objects.
- * @param- {Object} [indicator] Internally used to indicate that the `stack`
- * argument is an array of traversed objects instead of another source object.
- * @param- {Array} [stackA=[]] Internally used to track traversed source objects.
- * @param- {Array} [stackB=[]] Internally used to associate values with their
- * source counterparts.
- * @returns {Object} Returns the destination object.
- * @example
- *
- * var stooges = [
- * { 'name': 'moe' },
- * { 'name': 'larry' }
- * ];
- *
- * var ages = [
- * { 'age': 40 },
- * { 'age': 50 }
- * ];
- *
- * _.merge(stooges, ages);
- * // => [{ 'name': 'moe', 'age': 40 }, { 'name': 'larry', 'age': 50 }]
- */
- function merge(object, source, indicator) {
- var args = arguments,
- index = 0,
- length = 2,
- stackA = args[3],
- stackB = args[4];
-
- if (indicator !== indicatorObject) {
- stackA = [];
- stackB = [];
-
- // work with `_.reduce` by only using its callback `accumulator` and `value` arguments
- if (typeof indicator != 'number') {
- length = args.length;
- }
- }
- while (++index < length) {
- forOwn(args[index], function(source, key) {
- var found, isArr, value;
- if (source && ((isArr = isArray(source)) || isPlainObject(source))) {
- // avoid merging previously merged cyclic sources
- var stackLength = stackA.length;
- while (stackLength--) {
- found = stackA[stackLength] == source;
- if (found) {
- break;
- }
- }
- if (found) {
- object[key] = stackB[stackLength];
- }
- else {
- // add `source` and associated `value` to the stack of traversed objects
- stackA.push(source);
- stackB.push(value = (value = object[key], isArr)
- ? (isArray(value) ? value : [])
- : (isPlainObject(value) ? value : {})
- );
- // recursively merge objects and arrays (susceptible to call stack limits)
- object[key] = merge(value, source, indicatorObject, stackA, stackB);
- }
- } else if (source != null) {
- object[key] = source;
- }
- });
- }
- return object;
- }
-
- /**
- * Creates a shallow clone of `object` excluding the specified properties.
- * Property names may be specified as individual arguments or as arrays of
- * property names. If `callback` is passed, it will be executed for each property
- * in the `object`, omitting the properties `callback` returns truthy for. The
- * `callback` is bound to `thisArg` and invoked with three arguments; (value, key, object).
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The source object.
- * @param {Function|String} callback|[prop1, prop2, ...] The properties to omit
- * or the function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns an object without the omitted properties.
- * @example
- *
- * _.omit({ 'name': 'moe', 'age': 40, 'userid': 'moe1' }, 'userid');
- * // => { 'name': 'moe', 'age': 40 }
- *
- * _.omit({ 'name': 'moe', '_hint': 'knucklehead', '_seed': '96c4eb' }, function(value, key) {
- * return key.charAt(0) == '_';
- * });
- * // => { 'name': 'moe' }
- */
- function omit(object, callback, thisArg) {
- var isFunc = typeof callback == 'function',
- result = {};
-
- if (isFunc) {
- callback = createCallback(callback, thisArg);
- } else {
- var props = concat.apply(arrayRef, arguments);
- }
- forIn(object, function(value, key, object) {
- if (isFunc
- ? !callback(value, key, object)
- : indexOf(props, key, 1) < 0
- ) {
- result[key] = value;
- }
- });
- return result;
- }
-
- /**
- * Creates a two dimensional array of the given object's key-value pairs,
- * i.e. `[[key1, value1], [key2, value2]]`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to inspect.
- * @returns {Array} Returns new array of key-value pairs.
- * @example
- *
- * _.pairs({ 'moe': 30, 'larry': 40, 'curly': 50 });
- * // => [['moe', 30], ['larry', 40], ['curly', 50]] (order is not guaranteed)
- */
- function pairs(object) {
- var result = [];
- forOwn(object, function(value, key) {
- result.push([key, value]);
- });
- return result;
- }
-
- /**
- * Creates a shallow clone of `object` composed of the specified properties.
- * Property names may be specified as individual arguments or as arrays of
- * property names. If `callback` is passed, it will be executed for each property
- * in the `object`, picking the properties `callback` returns truthy for. The
- * `callback` is bound to `thisArg` and invoked with three arguments; (value, key, object).
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The source object.
- * @param {Function|String} callback|[prop1, prop2, ...] The properties to pick
- * or the function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns an object composed of the picked properties.
- * @example
- *
- * _.pick({ 'name': 'moe', 'age': 40, 'userid': 'moe1' }, 'name', 'age');
- * // => { 'name': 'moe', 'age': 40 }
- *
- * _.pick({ 'name': 'moe', '_hint': 'knucklehead', '_seed': '96c4eb' }, function(value, key) {
- * return key.charAt(0) != '_';
- * });
- * // => { 'name': 'moe' }
- */
- function pick(object, callback, thisArg) {
- var result = {};
- if (typeof callback != 'function') {
- var index = 0,
- props = concat.apply(arrayRef, arguments),
- length = props.length;
-
- while (++index < length) {
- var key = props[index];
- if (key in object) {
- result[key] = object[key];
- }
- }
- } else {
- callback = createCallback(callback, thisArg);
- forIn(object, function(value, key, object) {
- if (callback(value, key, object)) {
- result[key] = value;
- }
- });
- }
- return result;
- }
-
- /**
- * Creates an array composed of the own enumerable property values of `object`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to inspect.
- * @returns {Array} Returns a new array of property values.
- * @example
- *
- * _.values({ 'one': 1, 'two': 2, 'three': 3 });
- * // => [1, 2, 3]
- */
- function values(object) {
- var result = [];
- forOwn(object, function(value) {
- result.push(value);
- });
- return result;
- }
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Checks if a given `target` element is present in a `collection` using strict
- * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used
- * as the offset from the end of the collection.
- *
- * @static
- * @memberOf _
- * @alias include
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Mixed} target The value to check for.
- * @param {Number} [fromIndex=0] The index to search from.
- * @returns {Boolean} Returns `true` if the `target` element is found, else `false`.
- * @example
- *
- * _.contains([1, 2, 3], 1);
- * // => true
- *
- * _.contains([1, 2, 3], 1, 2);
- * // => false
- *
- * _.contains({ 'name': 'moe', 'age': 40 }, 'moe');
- * // => true
- *
- * _.contains('curly', 'ur');
- * // => true
- */
- function contains(collection, target, fromIndex) {
- var index = -1,
- length = collection ? collection.length : 0,
- result = false;
-
- fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;
- if (typeof length == 'number') {
- result = (isString(collection)
- ? collection.indexOf(target, fromIndex)
- : indexOf(collection, target, fromIndex)
- ) > -1;
- } else {
- each(collection, function(value) {
- if (++index >= fromIndex) {
- return !(result = value === target);
- }
- });
- }
- return result;
- }
-
- /**
- * Creates an object composed of keys returned from running each element of
- * `collection` through a `callback`. The corresponding value of each key is
- * the number of times the key was returned by `callback`. The `callback` is
- * bound to `thisArg` and invoked with three arguments; (value, index|key, collection).
- * The `callback` argument may also be the name of a property to count by (e.g. 'length').
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function|String} callback|property The function called per iteration
- * or property name to count by.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns the composed aggregate object.
- * @example
- *
- * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });
- * // => { '4': 1, '6': 2 }
- *
- * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);
- * // => { '4': 1, '6': 2 }
- *
- * _.countBy(['one', 'two', 'three'], 'length');
- * // => { '3': 2, '5': 1 }
- */
- function countBy(collection, callback, thisArg) {
- var result = {};
- callback = createCallback(callback, thisArg);
-
- forEach(collection, function(value, key, collection) {
- key = callback(value, key, collection);
- (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);
- });
- return result;
- }
-
- /**
- * Checks if the `callback` returns a truthy value for **all** elements of a
- * `collection`. The `callback` is bound to `thisArg` and invoked with three
- * arguments; (value, index|key, collection).
- *
- * @static
- * @memberOf _
- * @alias all
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Boolean} Returns `true` if all elements pass the callback check,
- * else `false`.
- * @example
- *
- * _.every([true, 1, null, 'yes'], Boolean);
- * // => false
- */
- function every(collection, callback, thisArg) {
- var result = true;
- callback = createCallback(callback, thisArg);
-
- if (isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- while (++index < length) {
- if (!(result = !!callback(collection[index], index, collection))) {
- break;
- }
- }
- } else {
- each(collection, function(value, index, collection) {
- return (result = !!callback(value, index, collection));
- });
- }
- return result;
- }
-
- /**
- * Examines each element in a `collection`, returning an array of all elements
- * the `callback` returns truthy for. The `callback` is bound to `thisArg` and
- * invoked with three arguments; (value, index|key, collection).
- *
- * @static
- * @memberOf _
- * @alias select
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a new array of elements that passed the callback check.
- * @example
- *
- * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
- * // => [2, 4, 6]
- */
- function filter(collection, callback, thisArg) {
- var result = [];
- callback = createCallback(callback, thisArg);
-
- if (isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- while (++index < length) {
- var value = collection[index];
- if (callback(value, index, collection)) {
- result.push(value);
- }
- }
- } else {
- each(collection, function(value, index, collection) {
- if (callback(value, index, collection)) {
- result.push(value);
- }
- });
- }
- return result;
- }
-
- /**
- * Examines each element in a `collection`, returning the first one the `callback`
- * returns truthy for. The function returns as soon as it finds an acceptable
- * element, and does not iterate over the entire `collection`. The `callback` is
- * bound to `thisArg` and invoked with three arguments; (value, index|key, collection).
- *
- * @static
- * @memberOf _
- * @alias detect
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Mixed} Returns the element that passed the callback check,
- * else `undefined`.
- * @example
- *
- * var even = _.find([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
- * // => 2
- */
- function find(collection, callback, thisArg) {
- var result;
- callback = createCallback(callback, thisArg);
-
- forEach(collection, function(value, index, collection) {
- if (callback(value, index, collection)) {
- result = value;
- return false;
- }
- });
- return result;
- }
-
- /**
- * Iterates over a `collection`, executing the `callback` for each element in
- * the `collection`. The `callback` is bound to `thisArg` and invoked with three
- * arguments; (value, index|key, collection). Callbacks may exit iteration early
- * by explicitly returning `false`.
- *
- * @static
- * @memberOf _
- * @alias each
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Array|Object|String} Returns `collection`.
- * @example
- *
- * _([1, 2, 3]).forEach(alert).join(',');
- * // => alerts each number and returns '1,2,3'
- *
- * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, alert);
- * // => alerts each number value (order is not guaranteed)
- */
- function forEach(collection, callback, thisArg) {
- if (callback && typeof thisArg == 'undefined' && isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- while (++index < length) {
- if (callback(collection[index], index, collection) === false) {
- break;
- }
- }
- } else {
- each(collection, callback, thisArg);
- }
- return collection;
- }
-
- /**
- * Creates an object composed of keys returned from running each element of
- * `collection` through a `callback`. The corresponding value of each key is an
- * array of elements passed to `callback` that returned the key. The `callback`
- * is bound to `thisArg` and invoked with three arguments; (value, index|key, collection).
- * The `callback` argument may also be the name of a property to group by (e.g. 'length').
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function|String} callback|property The function called per iteration
- * or property name to group by.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns the composed aggregate object.
- * @example
- *
- * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });
- * // => { '4': [4.2], '6': [6.1, 6.4] }
- *
- * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);
- * // => { '4': [4.2], '6': [6.1, 6.4] }
- *
- * _.groupBy(['one', 'two', 'three'], 'length');
- * // => { '3': ['one', 'two'], '5': ['three'] }
- */
- function groupBy(collection, callback, thisArg) {
- var result = {};
- callback = createCallback(callback, thisArg);
-
- forEach(collection, function(value, key, collection) {
- key = callback(value, key, collection);
- (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);
- });
- return result;
- }
-
- /**
- * Invokes the method named by `methodName` on each element in the `collection`,
- * returning an array of the results of each invoked method. Additional arguments
- * will be passed to each invoked method. If `methodName` is a function it will
- * be invoked for, and `this` bound to, each element in the `collection`.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function|String} methodName The name of the method to invoke or
- * the function invoked per iteration.
- * @param {Mixed} [arg1, arg2, ...] Arguments to invoke the method with.
- * @returns {Array} Returns a new array of the results of each invoked method.
- * @example
- *
- * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
- * // => [[1, 5, 7], [1, 2, 3]]
- *
- * _.invoke([123, 456], String.prototype.split, '');
- * // => [['1', '2', '3'], ['4', '5', '6']]
- */
- function invoke(collection, methodName) {
- var args = slice(arguments, 2),
- isFunc = typeof methodName == 'function',
- result = [];
-
- forEach(collection, function(value) {
- result.push((isFunc ? methodName : value[methodName]).apply(value, args));
- });
- return result;
- }
-
- /**
- * Creates an array of values by running each element in the `collection`
- * through a `callback`. The `callback` is bound to `thisArg` and invoked with
- * three arguments; (value, index|key, collection).
- *
- * @static
- * @memberOf _
- * @alias collect
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a new array of the results of each `callback` execution.
- * @example
- *
- * _.map([1, 2, 3], function(num) { return num * 3; });
- * // => [3, 6, 9]
- *
- * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });
- * // => [3, 6, 9] (order is not guaranteed)
- */
- function map(collection, callback, thisArg) {
- var index = -1,
- length = collection ? collection.length : 0,
- result = Array(typeof length == 'number' ? length : 0);
-
- callback = createCallback(callback, thisArg);
- if (isArray(collection)) {
- while (++index < length) {
- result[index] = callback(collection[index], index, collection);
- }
- } else {
- each(collection, function(value, key, collection) {
- result[++index] = callback(value, key, collection);
- });
- }
- return result;
- }
-
- /**
- * Retrieves the maximum value of an `array`. If `callback` is passed,
- * it will be executed for each value in the `array` to generate the
- * criterion by which the value is ranked. The `callback` is bound to
- * `thisArg` and invoked with three arguments; (value, index, collection).
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function} [callback] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Mixed} Returns the maximum value.
- * @example
- *
- * var stooges = [
- * { 'name': 'moe', 'age': 40 },
- * { 'name': 'larry', 'age': 50 },
- * { 'name': 'curly', 'age': 60 }
- * ];
- *
- * _.max(stooges, function(stooge) { return stooge.age; });
- * // => { 'name': 'curly', 'age': 60 };
- */
- function max(collection, callback, thisArg) {
- var computed = -Infinity,
- index = -1,
- length = collection ? collection.length : 0,
- result = computed;
-
- if (callback || !isArray(collection)) {
- callback = !callback && isString(collection)
- ? charAtCallback
- : createCallback(callback, thisArg);
-
- each(collection, function(value, index, collection) {
- var current = callback(value, index, collection);
- if (current > computed) {
- computed = current;
- result = value;
- }
- });
- } else {
- while (++index < length) {
- if (collection[index] > result) {
- result = collection[index];
- }
- }
- }
- return result;
- }
-
- /**
- * Retrieves the minimum value of an `array`. If `callback` is passed,
- * it will be executed for each value in the `array` to generate the
- * criterion by which the value is ranked. The `callback` is bound to `thisArg`
- * and invoked with three arguments; (value, index, collection).
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function} [callback] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Mixed} Returns the minimum value.
- * @example
- *
- * _.min([10, 5, 100, 2, 1000]);
- * // => 2
- */
- function min(collection, callback, thisArg) {
- var computed = Infinity,
- index = -1,
- length = collection ? collection.length : 0,
- result = computed;
-
- if (callback || !isArray(collection)) {
- callback = !callback && isString(collection)
- ? charAtCallback
- : createCallback(callback, thisArg);
-
- each(collection, function(value, index, collection) {
- var current = callback(value, index, collection);
- if (current < computed) {
- computed = current;
- result = value;
- }
- });
- } else {
- while (++index < length) {
- if (collection[index] < result) {
- result = collection[index];
- }
- }
- }
- return result;
- }
-
- /**
- * Retrieves the value of a specified property from all elements in
- * the `collection`.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {String} property The property to pluck.
- * @returns {Array} Returns a new array of property values.
- * @example
- *
- * var stooges = [
- * { 'name': 'moe', 'age': 40 },
- * { 'name': 'larry', 'age': 50 },
- * { 'name': 'curly', 'age': 60 }
- * ];
- *
- * _.pluck(stooges, 'name');
- * // => ['moe', 'larry', 'curly']
- */
- function pluck(collection, property) {
- return map(collection, property + '');
- }
-
- /**
- * Boils down a `collection` to a single value. The initial state of the
- * reduction is `accumulator` and each successive step of it should be returned
- * by the `callback`. The `callback` is bound to `thisArg` and invoked with 4
- * arguments; for arrays they are (accumulator, value, index|key, collection).
- *
- * @static
- * @memberOf _
- * @alias foldl, inject
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [accumulator] Initial value of the accumulator.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Mixed} Returns the accumulated value.
- * @example
- *
- * var sum = _.reduce([1, 2, 3], function(memo, num) { return memo + num; });
- * // => 6
- */
- function reduce(collection, callback, accumulator, thisArg) {
- var noaccum = arguments.length < 3;
- callback = createCallback(callback, thisArg, indicatorObject);
-
- if (isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- if (noaccum) {
- accumulator = collection[++index];
- }
- while (++index < length) {
- accumulator = callback(accumulator, collection[index], index, collection);
- }
- } else {
- each(collection, function(value, index, collection) {
- accumulator = noaccum
- ? (noaccum = false, value)
- : callback(accumulator, value, index, collection)
- });
- }
- return accumulator;
- }
-
- /**
- * The right-associative version of `_.reduce`.
- *
- * @static
- * @memberOf _
- * @alias foldr
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [accumulator] Initial value of the accumulator.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Mixed} Returns the accumulated value.
- * @example
- *
- * var list = [[0, 1], [2, 3], [4, 5]];
- * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
- * // => [4, 5, 2, 3, 0, 1]
- */
- function reduceRight(collection, callback, accumulator, thisArg) {
- var iteratee = collection,
- length = collection ? collection.length : 0,
- noaccum = arguments.length < 3;
-
- if (typeof length != 'number') {
- var props = keys(collection);
- length = props.length;
- } else if (noCharByIndex && isString(collection)) {
- iteratee = collection.split('');
- }
- callback = createCallback(callback, thisArg, indicatorObject);
- forEach(collection, function(value, index, collection) {
- index = props ? props[--length] : --length;
- accumulator = noaccum
- ? (noaccum = false, iteratee[index])
- : callback(accumulator, iteratee[index], index, collection);
- });
- return accumulator;
- }
-
- /**
- * The opposite of `_.filter`, this method returns the values of a
- * `collection` that `callback` does **not** return truthy for.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a new array of elements that did **not** pass the
- * callback check.
- * @example
- *
- * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
- * // => [1, 3, 5]
- */
- function reject(collection, callback, thisArg) {
- callback = createCallback(callback, thisArg);
- return filter(collection, function(value, index, collection) {
- return !callback(value, index, collection);
- });
- }
-
- /**
- * Creates an array of shuffled `array` values, using a version of the
- * Fisher-Yates shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|String} collection The collection to shuffle.
- * @returns {Array} Returns a new shuffled collection.
- * @example
- *
- * _.shuffle([1, 2, 3, 4, 5, 6]);
- * // => [4, 1, 6, 3, 5, 2]
- */
- function shuffle(collection) {
- var index = -1,
- result = Array(collection ? collection.length : 0);
-
- forEach(collection, function(value) {
- var rand = floor(nativeRandom() * (++index + 1));
- result[index] = result[rand];
- result[rand] = value;
- });
- return result;
- }
-
- /**
- * Gets the size of the `collection` by returning `collection.length` for arrays
- * and array-like objects or the number of own enumerable properties for objects.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|String} collection The collection to inspect.
- * @returns {Number} Returns `collection.length` or number of own enumerable properties.
- * @example
- *
- * _.size([1, 2]);
- * // => 2
- *
- * _.size({ 'one': 1, 'two': 2, 'three': 3 });
- * // => 3
- *
- * _.size('curly');
- * // => 5
- */
- function size(collection) {
- var length = collection ? collection.length : 0;
- return typeof length == 'number' ? length : keys(collection).length;
- }
-
- /**
- * Checks if the `callback` returns a truthy value for **any** element of a
- * `collection`. The function returns as soon as it finds passing value, and
- * does not iterate over the entire `collection`. The `callback` is bound to
- * `thisArg` and invoked with three arguments; (value, index|key, collection).
- *
- * @static
- * @memberOf _
- * @alias any
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Boolean} Returns `true` if any element passes the callback check,
- * else `false`.
- * @example
- *
- * _.some([null, 0, 'yes', false], Boolean);
- * // => true
- */
- function some(collection, callback, thisArg) {
- var result;
- callback = createCallback(callback, thisArg);
-
- if (isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- while (++index < length) {
- if ((result = callback(collection[index], index, collection))) {
- break;
- }
- }
- } else {
- each(collection, function(value, index, collection) {
- return !(result = callback(value, index, collection));
- });
- }
- return !!result;
- }
-
- /**
- * Creates an array, stable sorted in ascending order by the results of
- * running each element of `collection` through a `callback`. The `callback`
- * is bound to `thisArg` and invoked with three arguments; (value, index|key, collection).
- * The `callback` argument may also be the name of a property to sort by (e.g. 'length').
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Function|String} callback|property The function called per iteration
- * or property name to sort by.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a new array of sorted elements.
- * @example
- *
- * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });
- * // => [3, 1, 2]
- *
- * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);
- * // => [3, 1, 2]
- *
- * _.sortBy(['larry', 'brendan', 'moe'], 'length');
- * // => ['moe', 'larry', 'brendan']
- */
- function sortBy(collection, callback, thisArg) {
- var result = [];
- callback = createCallback(callback, thisArg);
-
- forEach(collection, function(value, index, collection) {
- result.push({
- 'criteria': callback(value, index, collection),
- 'index': index,
- 'value': value
- });
- });
-
- var length = result.length;
- result.sort(compareAscending);
- while (length--) {
- result[length] = result[length].value;
- }
- return result;
- }
-
- /**
- * Converts the `collection` to an array.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|String} collection The collection to convert.
- * @returns {Array} Returns the new converted array.
- * @example
- *
- * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);
- * // => [2, 3, 4]
- */
- function toArray(collection) {
- var length = collection ? collection.length : 0;
- if (typeof length == 'number') {
- return noCharByIndex && isString(collection)
- ? collection.split('')
- : slice(collection);
- }
- return values(collection);
- }
-
- /**
- * Examines each element in a `collection`, returning an array of all elements
- * that contain the given `properties`.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|String} collection The collection to iterate over.
- * @param {Object} properties The object of property values to filter by.
- * @returns {Array} Returns a new array of elements that contain the given `properties`.
- * @example
- *
- * var stooges = [
- * { 'name': 'moe', 'age': 40 },
- * { 'name': 'larry', 'age': 50 },
- * { 'name': 'curly', 'age': 60 }
- * ];
- *
- * _.where(stooges, { 'age': 40 });
- * // => [{ 'name': 'moe', 'age': 40 }]
- */
- function where(collection, properties) {
- var props = keys(properties);
- return filter(collection, function(object) {
- var length = props.length;
- while (length--) {
- var result = object[props[length]] === properties[props[length]];
- if (!result) {
- break;
- }
- }
- return !!result;
- });
- }
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Creates an array with all falsey values of `array` removed. The values
- * `false`, `null`, `0`, `""`, `undefined` and `NaN` are all falsey.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to compact.
- * @returns {Array} Returns a new filtered array.
- * @example
- *
- * _.compact([0, 1, false, 2, '', 3]);
- * // => [1, 2, 3]
- */
- function compact(array) {
- var index = -1,
- length = array ? array.length : 0,
- result = [];
-
- while (++index < length) {
- var value = array[index];
- if (value) {
- result.push(value);
- }
- }
- return result;
- }
-
- /**
- * Creates an array of `array` elements not present in the other arrays
- * using strict equality for comparisons, i.e. `===`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to process.
- * @param {Array} [array1, array2, ...] Arrays to check.
- * @returns {Array} Returns a new array of `array` elements not present in the
- * other arrays.
- * @example
- *
- * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);
- * // => [1, 3, 4]
- */
- function difference(array) {
- var index = -1,
- length = array ? array.length : 0,
- flattened = concat.apply(arrayRef, arguments),
- contains = cachedContains(flattened, length),
- result = [];
-
- while (++index < length) {
- var value = array[index];
- if (!contains(value)) {
- result.push(value);
- }
- }
- return result;
- }
-
- /**
- * Gets the first element of the `array`. Pass `n` to return the first `n`
- * elements of the `array`.
- *
- * @static
- * @memberOf _
- * @alias head, take
- * @category Arrays
- * @param {Array} array The array to query.
- * @param {Number} [n] The number of elements to return.
- * @param- {Object} [guard] Internally used to allow this method to work with
- * others like `_.map` without using their callback `index` argument for `n`.
- * @returns {Mixed} Returns the first element, or an array of the first `n`
- * elements, of `array`.
- * @example
- *
- * _.first([5, 4, 3, 2, 1]);
- * // => 5
- */
- function first(array, n, guard) {
- if (array) {
- var length = array.length;
- return (n == null || guard)
- ? array[0]
- : slice(array, 0, nativeMin(nativeMax(0, n), length));
- }
- }
-
- /**
- * Flattens a nested array (the nesting can be to any depth). If `shallow` is
- * truthy, `array` will only be flattened a single level.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to compact.
- * @param {Boolean} shallow A flag to indicate only flattening a single level.
- * @returns {Array} Returns a new flattened array.
- * @example
- *
- * _.flatten([1, [2], [3, [[4]]]]);
- * // => [1, 2, 3, 4];
- *
- * _.flatten([1, [2], [3, [[4]]]], true);
- * // => [1, 2, 3, [[4]]];
- */
- function flatten(array, shallow) {
- var index = -1,
- length = array ? array.length : 0,
- result = [];
-
- while (++index < length) {
- var value = array[index];
-
- // recursively flatten arrays (susceptible to call stack limits)
- if (isArray(value)) {
- push.apply(result, shallow ? value : flatten(value));
- } else {
- result.push(value);
- }
- }
- return result;
- }
-
- /**
- * Gets the index at which the first occurrence of `value` is found using
- * strict equality for comparisons, i.e. `===`. If the `array` is already
- * sorted, passing `true` for `fromIndex` will run a faster binary search.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to search.
- * @param {Mixed} value The value to search for.
- * @param {Boolean|Number} [fromIndex=0] The index to search from or `true` to
- * perform a binary search on a sorted `array`.
- * @returns {Number} Returns the index of the matched value or `-1`.
- * @example
- *
- * _.indexOf([1, 2, 3, 1, 2, 3], 2);
- * // => 1
- *
- * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);
- * // => 4
- *
- * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);
- * // => 2
- */
- function indexOf(array, value, fromIndex) {
- var index = -1,
- length = array ? array.length : 0;
-
- if (typeof fromIndex == 'number') {
- index = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0) - 1;
- } else if (fromIndex) {
- index = sortedIndex(array, value);
- return array[index] === value ? index : -1;
- }
- while (++index < length) {
- if (array[index] === value) {
- return index;
- }
- }
- return -1;
- }
-
- /**
- * Gets all but the last element of `array`. Pass `n` to exclude the last `n`
- * elements from the result.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to query.
- * @param {Number} [n=1] The number of elements to exclude.
- * @param- {Object} [guard] Internally used to allow this method to work with
- * others like `_.map` without using their callback `index` argument for `n`.
- * @returns {Array} Returns all but the last element, or `n` elements, of `array`.
- * @example
- *
- * _.initial([3, 2, 1]);
- * // => [3, 2]
- */
- function initial(array, n, guard) {
- if (!array) {
- return [];
- }
- var length = array.length;
- n = n == null || guard ? 1 : n || 0;
- return slice(array, 0, nativeMin(nativeMax(0, length - n), length));
- }
-
- /**
- * Computes the intersection of all the passed-in arrays using strict equality
- * for comparisons, i.e. `===`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} [array1, array2, ...] Arrays to process.
- * @returns {Array} Returns a new array of unique elements that are present
- * in **all** of the arrays.
- * @example
- *
- * _.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
- * // => [1, 2]
- */
- function intersection(array) {
- var args = arguments,
- argsLength = args.length,
- cache = { '0': {} },
- index = -1,
- length = array ? array.length : 0,
- isLarge = length >= 100,
- result = [],
- seen = result;
-
- outer:
- while (++index < length) {
- var value = array[index];
- if (isLarge) {
- var key = value + '';
- var inited = hasOwnProperty.call(cache[0], key)
- ? !(seen = cache[0][key])
- : (seen = cache[0][key] = []);
- }
- if (inited || indexOf(seen, value) < 0) {
- if (isLarge) {
- seen.push(value);
- }
- var argsIndex = argsLength;
- while (--argsIndex) {
- if (!(cache[argsIndex] || (cache[argsIndex] = cachedContains(args[argsIndex], 0, 100)))(value)) {
- continue outer;
- }
- }
- result.push(value);
- }
- }
- return result;
- }
-
- /**
- * Gets the last element of the `array`. Pass `n` to return the last `n`
- * elements of the `array`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to query.
- * @param {Number} [n] The number of elements to return.
- * @param- {Object} [guard] Internally used to allow this method to work with
- * others like `_.map` without using their callback `index` argument for `n`.
- * @returns {Mixed} Returns the last element, or an array of the last `n`
- * elements, of `array`.
- * @example
- *
- * _.last([3, 2, 1]);
- * // => 1
- */
- function last(array, n, guard) {
- if (array) {
- var length = array.length;
- return (n == null || guard) ? array[length - 1] : slice(array, nativeMax(0, length - n));
- }
- }
-
- /**
- * Gets the index at which the last occurrence of `value` is found using strict
- * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used
- * as the offset from the end of the collection.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to search.
- * @param {Mixed} value The value to search for.
- * @param {Number} [fromIndex=array.length-1] The index to search from.
- * @returns {Number} Returns the index of the matched value or `-1`.
- * @example
- *
- * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
- * // => 4
- *
- * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);
- * // => 1
- */
- function lastIndexOf(array, value, fromIndex) {
- var index = array ? array.length : 0;
- if (typeof fromIndex == 'number') {
- index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;
- }
- while (index--) {
- if (array[index] === value) {
- return index;
- }
- }
- return -1;
- }
-
- /**
- * Creates an object composed from arrays of `keys` and `values`. Pass either
- * a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`, or
- * two arrays, one of `keys` and one of corresponding `values`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} keys The array of keys.
- * @param {Array} [values=[]] The array of values.
- * @returns {Object} Returns an object composed of the given keys and
- * corresponding values.
- * @example
- *
- * _.object(['moe', 'larry', 'curly'], [30, 40, 50]);
- * // => { 'moe': 30, 'larry': 40, 'curly': 50 }
- */
- function object(keys, values) {
- var index = -1,
- length = keys ? keys.length : 0,
- result = {};
-
- while (++index < length) {
- var key = keys[index];
- if (values) {
- result[key] = values[index];
- } else {
- result[key[0]] = key[1];
- }
- }
- return result;
- }
-
- /**
- * Creates an array of numbers (positive and/or negative) progressing from
- * `start` up to but not including `stop`. This method is a port of Python's
- * `range()` function. See http://docs.python.org/library/functions.html#range.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Number} [start=0] The start of the range.
- * @param {Number} end The end of the range.
- * @param {Number} [step=1] The value to increment or descrement by.
- * @returns {Array} Returns a new range array.
- * @example
- *
- * _.range(10);
- * // => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- *
- * _.range(1, 11);
- * // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- *
- * _.range(0, 30, 5);
- * // => [0, 5, 10, 15, 20, 25]
- *
- * _.range(0, -10, -1);
- * // => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
- *
- * _.range(0);
- * // => []
- */
- function range(start, end, step) {
- start = +start || 0;
- step = +step || 1;
-
- if (end == null) {
- end = start;
- start = 0;
- }
- // use `Array(length)` so V8 will avoid the slower "dictionary" mode
- // http://youtu.be/XAqIpGU8ZZk#t=17m25s
- var index = -1,
- length = nativeMax(0, ceil((end - start) / step)),
- result = Array(length);
-
- while (++index < length) {
- result[index] = start;
- start += step;
- }
- return result;
- }
-
- /**
- * The opposite of `_.initial`, this method gets all but the first value of
- * `array`. Pass `n` to exclude the first `n` values from the result.
- *
- * @static
- * @memberOf _
- * @alias drop, tail
- * @category Arrays
- * @param {Array} array The array to query.
- * @param {Number} [n=1] The number of elements to exclude.
- * @param- {Object} [guard] Internally used to allow this method to work with
- * others like `_.map` without using their callback `index` argument for `n`.
- * @returns {Array} Returns all but the first element, or `n` elements, of `array`.
- * @example
- *
- * _.rest([3, 2, 1]);
- * // => [2, 1]
- */
- function rest(array, n, guard) {
- return slice(array, (n == null || guard) ? 1 : nativeMax(0, n));
- }
-
- /**
- * Uses a binary search to determine the smallest index at which the `value`
- * should be inserted into `array` in order to maintain the sort order of the
- * sorted `array`. If `callback` is passed, it will be executed for `value` and
- * each element in `array` to compute their sort ranking. The `callback` is
- * bound to `thisArg` and invoked with one argument; (value). The `callback`
- * argument may also be the name of a property to order by.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to iterate over.
- * @param {Mixed} value The value to evaluate.
- * @param {Function|String} [callback=identity|property] The function called
- * per iteration or property name to order by.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Number} Returns the index at which the value should be inserted
- * into `array`.
- * @example
- *
- * _.sortedIndex([20, 30, 50], 40);
- * // => 2
- *
- * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
- * // => 2
- *
- * var dict = {
- * 'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }
- * };
- *
- * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
- * return dict.wordToNumber[word];
- * });
- * // => 2
- *
- * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
- * return this.wordToNumber[word];
- * }, dict);
- * // => 2
- */
- function sortedIndex(array, value, callback, thisArg) {
- var low = 0,
- high = array ? array.length : low;
-
- // explicitly reference `identity` for better inlining in Firefox
- callback = callback ? createCallback(callback, thisArg) : identity;
- value = callback(value);
-
- while (low < high) {
- var mid = (low + high) >>> 1;
- callback(array[mid]) < value
- ? low = mid + 1
- : high = mid;
- }
- return low;
- }
-
- /**
- * Computes the union of the passed-in arrays using strict equality for
- * comparisons, i.e. `===`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} [array1, array2, ...] Arrays to process.
- * @returns {Array} Returns a new array of unique values, in order, that are
- * present in one or more of the arrays.
- * @example
- *
- * _.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
- * // => [1, 2, 3, 101, 10]
- */
- function union() {
- return uniq(concat.apply(arrayRef, arguments));
- }
-
- /**
- * Creates a duplicate-value-free version of the `array` using strict equality
- * for comparisons, i.e. `===`. If the `array` is already sorted, passing `true`
- * for `isSorted` will run a faster algorithm. If `callback` is passed, each
- * element of `array` is passed through a callback` before uniqueness is computed.
- * The `callback` is bound to `thisArg` and invoked with three arguments; (value, index, array).
- *
- * @static
- * @memberOf _
- * @alias unique
- * @category Arrays
- * @param {Array} array The array to process.
- * @param {Boolean} [isSorted=false] A flag to indicate that the `array` is already sorted.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a duplicate-value-free array.
- * @example
- *
- * _.uniq([1, 2, 1, 3, 1]);
- * // => [1, 2, 3]
- *
- * _.uniq([1, 1, 2, 2, 3], true);
- * // => [1, 2, 3]
- *
- * _.uniq([1, 2, 1.5, 3, 2.5], function(num) { return Math.floor(num); });
- * // => [1, 2, 3]
- *
- * _.uniq([1, 2, 1.5, 3, 2.5], function(num) { return this.floor(num); }, Math);
- * // => [1, 2, 3]
- */
- function uniq(array, isSorted, callback, thisArg) {
- var index = -1,
- length = array ? array.length : 0,
- result = [],
- seen = result;
-
- // juggle arguments
- if (typeof isSorted == 'function') {
- thisArg = callback;
- callback = isSorted;
- isSorted = false;
- }
- // init value cache for large arrays
- var isLarge = !isSorted && length >= 75;
- if (isLarge) {
- var cache = {};
- }
- if (callback) {
- seen = [];
- callback = createCallback(callback, thisArg);
- }
- while (++index < length) {
- var value = array[index],
- computed = callback ? callback(value, index, array) : value;
-
- if (isLarge) {
- var key = computed + '';
- var inited = hasOwnProperty.call(cache, key)
- ? !(seen = cache[key])
- : (seen = cache[key] = []);
- }
- if (isSorted
- ? !index || seen[seen.length - 1] !== computed
- : inited || indexOf(seen, computed) < 0
- ) {
- if (callback || isLarge) {
- seen.push(computed);
- }
- result.push(value);
- }
- }
- return result;
- }
-
- /**
- * Creates an array with all occurrences of the passed values removed using
- * strict equality for comparisons, i.e. `===`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to filter.
- * @param {Mixed} [value1, value2, ...] Values to remove.
- * @returns {Array} Returns a new filtered array.
- * @example
- *
- * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
- * // => [2, 3, 4]
- */
- function without(array) {
- var index = -1,
- length = array ? array.length : 0,
- contains = cachedContains(arguments, 1, 20),
- result = [];
-
- while (++index < length) {
- var value = array[index];
- if (!contains(value)) {
- result.push(value);
- }
- }
- return result;
- }
-
- /**
- * Groups the elements of each array at their corresponding indexes. Useful for
- * separate data sources that are coordinated through matching array indexes.
- * For a matrix of nested arrays, `_.zip.apply(...)` can transpose the matrix
- * in a similar fashion.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} [array1, array2, ...] Arrays to process.
- * @returns {Array} Returns a new array of grouped elements.
- * @example
- *
- * _.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]);
- * // => [['moe', 30, true], ['larry', 40, false], ['curly', 50, false]]
- */
- function zip(array) {
- var index = -1,
- length = array ? max(pluck(arguments, 'length')) : 0,
- result = Array(length);
-
- while (++index < length) {
- result[index] = pluck(arguments, index);
- }
- return result;
- }
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Creates a function that is restricted to executing `func` only after it is
- * called `n` times. The `func` is executed with the `this` binding of the
- * created function.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Number} n The number of times the function must be called before
- * it is executed.
- * @param {Function} func The function to restrict.
- * @returns {Function} Returns the new restricted function.
- * @example
- *
- * var renderNotes = _.after(notes.length, render);
- * _.forEach(notes, function(note) {
- * note.asyncSave({ 'success': renderNotes });
- * });
- * // `renderNotes` is run once, after all notes have saved
- */
- function after(n, func) {
- if (n < 1) {
- return func();
- }
- return function() {
- if (--n < 1) {
- return func.apply(this, arguments);
- }
- };
- }
-
- /**
- * Creates a function that, when called, invokes `func` with the `this`
- * binding of `thisArg` and prepends any additional `bind` arguments to those
- * passed to the bound function.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to bind.
- * @param {Mixed} [thisArg] The `this` binding of `func`.
- * @param {Mixed} [arg1, arg2, ...] Arguments to be partially applied.
- * @returns {Function} Returns the new bound function.
- * @example
- *
- * var func = function(greeting) {
- * return greeting + ' ' + this.name;
- * };
- *
- * func = _.bind(func, { 'name': 'moe' }, 'hi');
- * func();
- * // => 'hi moe'
- */
- function bind(func, thisArg) {
- // use `Function#bind` if it exists and is fast
- // (in V8 `Function#bind` is slower except when partially applied)
- return isBindFast || (nativeBind && arguments.length > 2)
- ? nativeBind.call.apply(nativeBind, arguments)
- : createBound(func, thisArg, slice(arguments, 2));
- }
-
- /**
- * Binds methods on `object` to `object`, overwriting the existing method.
- * If no method names are provided, all the function properties of `object`
- * will be bound.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Object} object The object to bind and assign the bound methods to.
- * @param {String} [methodName1, methodName2, ...] Method names on the object to bind.
- * @returns {Object} Returns `object`.
- * @example
- *
- * var buttonView = {
- * 'label': 'lodash',
- * 'onClick': function() { alert('clicked: ' + this.label); }
- * };
- *
- * _.bindAll(buttonView);
- * jQuery('#lodash_button').on('click', buttonView.onClick);
- * // => When the button is clicked, `this.label` will have the correct value
- */
- function bindAll(object) {
- var funcs = arguments,
- index = funcs.length > 1 ? 0 : (funcs = functions(object), -1),
- length = funcs.length;
-
- while (++index < length) {
- var key = funcs[index];
- object[key] = bind(object[key], object);
- }
- return object;
- }
-
- /**
- * Creates a function that, when called, invokes the method at `object[key]`
- * and prepends any additional `bindKey` arguments to those passed to the bound
- * function. This method differs from `_.bind` by allowing bound functions to
- * reference methods that will be redefined or don't yet exist.
- * See http://michaux.ca/articles/lazy-function-definition-pattern.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Object} object The object the method belongs to.
- * @param {String} key The key of the method.
- * @param {Mixed} [arg1, arg2, ...] Arguments to be partially applied.
- * @returns {Function} Returns the new bound function.
- * @example
- *
- * var object = {
- * 'name': 'moe',
- * 'greet': function(greeting) {
- * return greeting + ' ' + this.name;
- * }
- * };
- *
- * var func = _.bindKey(object, 'greet', 'hi');
- * func();
- * // => 'hi moe'
- *
- * object.greet = function(greeting) {
- * return greeting + ', ' + this.name + '!';
- * };
- *
- * func();
- * // => 'hi, moe!'
- */
- function bindKey(object, key) {
- return createBound(object, key, slice(arguments, 2));
- }
-
- /**
- * Creates a function that is the composition of the passed functions,
- * where each function consumes the return value of the function that follows.
- * In math terms, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.
- * Each function is executed with the `this` binding of the composed function.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} [func1, func2, ...] Functions to compose.
- * @returns {Function} Returns the new composed function.
- * @example
- *
- * var greet = function(name) { return 'hi: ' + name; };
- * var exclaim = function(statement) { return statement + '!'; };
- * var welcome = _.compose(exclaim, greet);
- * welcome('moe');
- * // => 'hi: moe!'
- */
- function compose() {
- var funcs = arguments;
- return function() {
- var args = arguments,
- length = funcs.length;
-
- while (length--) {
- args = [funcs[length].apply(this, args)];
- }
- return args[0];
- };
- }
-
- /**
- * Creates a function that will delay the execution of `func` until after
- * `wait` milliseconds have elapsed since the last time it was invoked. Pass
- * `true` for `immediate` to cause debounce to invoke `func` on the leading,
- * instead of the trailing, edge of the `wait` timeout. Subsequent calls to
- * the debounced function will return the result of the last `func` call.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to debounce.
- * @param {Number} wait The number of milliseconds to delay.
- * @param {Boolean} immediate A flag to indicate execution is on the leading
- * edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * var lazyLayout = _.debounce(calculateLayout, 300);
- * jQuery(window).on('resize', lazyLayout);
- */
- function debounce(func, wait, immediate) {
- var args,
- result,
- thisArg,
- timeoutId;
-
- function delayed() {
- timeoutId = null;
- if (!immediate) {
- result = func.apply(thisArg, args);
- }
- }
- return function() {
- var isImmediate = immediate && !timeoutId;
- args = arguments;
- thisArg = this;
-
- clearTimeout(timeoutId);
- timeoutId = setTimeout(delayed, wait);
-
- if (isImmediate) {
- result = func.apply(thisArg, args);
- }
- return result;
- };
- }
-
- /**
- * Executes the `func` function after `wait` milliseconds. Additional arguments
- * will be passed to `func` when it is invoked.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to delay.
- * @param {Number} wait The number of milliseconds to delay execution.
- * @param {Mixed} [arg1, arg2, ...] Arguments to invoke the function with.
- * @returns {Number} Returns the `setTimeout` timeout id.
- * @example
- *
- * var log = _.bind(console.log, console);
- * _.delay(log, 1000, 'logged later');
- * // => 'logged later' (Appears after one second.)
- */
- function delay(func, wait) {
- var args = slice(arguments, 2);
- return setTimeout(function() { func.apply(undefined, args); }, wait);
- }
-
- /**
- * Defers executing the `func` function until the current call stack has cleared.
- * Additional arguments will be passed to `func` when it is invoked.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to defer.
- * @param {Mixed} [arg1, arg2, ...] Arguments to invoke the function with.
- * @returns {Number} Returns the `setTimeout` timeout id.
- * @example
- *
- * _.defer(function() { alert('deferred'); });
- * // returns from the function before `alert` is called
- */
- function defer(func) {
- var args = slice(arguments, 1);
- return setTimeout(function() { func.apply(undefined, args); }, 1);
- }
-
- /**
- * Creates a function that memoizes the result of `func`. If `resolver` is
- * passed, it will be used to determine the cache key for storing the result
- * based on the arguments passed to the memoized function. By default, the first
- * argument passed to the memoized function is used as the cache key. The `func`
- * is executed with the `this` binding of the memoized function.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to have its output memoized.
- * @param {Function} [resolver] A function used to resolve the cache key.
- * @returns {Function} Returns the new memoizing function.
- * @example
- *
- * var fibonacci = _.memoize(function(n) {
- * return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
- * });
- */
- function memoize(func, resolver) {
- var cache = {};
- return function() {
- var key = resolver ? resolver.apply(this, arguments) : arguments[0];
- return hasOwnProperty.call(cache, key)
- ? cache[key]
- : (cache[key] = func.apply(this, arguments));
- };
- }
-
- /**
- * Creates a function that is restricted to execute `func` once. Repeat calls to
- * the function will return the value of the first call. The `func` is executed
- * with the `this` binding of the created function.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to restrict.
- * @returns {Function} Returns the new restricted function.
- * @example
- *
- * var initialize = _.once(createApplication);
- * initialize();
- * initialize();
- * // Application is only created once.
- */
- function once(func) {
- var result,
- ran = false;
-
- return function() {
- if (ran) {
- return result;
- }
- ran = true;
- result = func.apply(this, arguments);
-
- // clear the `func` variable so the function may be garbage collected
- func = null;
- return result;
- };
- }
-
- /**
- * Creates a function that, when called, invokes `func` with any additional
- * `partial` arguments prepended to those passed to the new function. This
- * method is similar to `bind`, except it does **not** alter the `this` binding.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to partially apply arguments to.
- * @param {Mixed} [arg1, arg2, ...] Arguments to be partially applied.
- * @returns {Function} Returns the new partially applied function.
- * @example
- *
- * var greet = function(greeting, name) { return greeting + ': ' + name; };
- * var hi = _.partial(greet, 'hi');
- * hi('moe');
- * // => 'hi: moe'
- */
- function partial(func) {
- return createBound(func, slice(arguments, 1));
- }
-
- /**
- * Creates a function that, when executed, will only call the `func`
- * function at most once per every `wait` milliseconds. If the throttled
- * function is invoked more than once during the `wait` timeout, `func` will
- * also be called on the trailing edge of the timeout. Subsequent calls to the
- * throttled function will return the result of the last `func` call.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to throttle.
- * @param {Number} wait The number of milliseconds to throttle executions to.
- * @returns {Function} Returns the new throttled function.
- * @example
- *
- * var throttled = _.throttle(updatePosition, 100);
- * jQuery(window).on('scroll', throttled);
- */
- function throttle(func, wait) {
- var args,
- result,
- thisArg,
- timeoutId,
- lastCalled = 0;
-
- function trailingCall() {
- lastCalled = new Date;
- timeoutId = null;
- result = func.apply(thisArg, args);
- }
- return function() {
- var now = new Date,
- remaining = wait - (now - lastCalled);
-
- args = arguments;
- thisArg = this;
-
- if (remaining <= 0) {
- clearTimeout(timeoutId);
- timeoutId = null;
- lastCalled = now;
- result = func.apply(thisArg, args);
- }
- else if (!timeoutId) {
- timeoutId = setTimeout(trailingCall, remaining);
- }
- return result;
- };
- }
-
- /**
- * Creates a function that passes `value` to the `wrapper` function as its
- * first argument. Additional arguments passed to the function are appended
- * to those passed to the `wrapper` function. The `wrapper` is executed with
- * the `this` binding of the created function.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Mixed} value The value to wrap.
- * @param {Function} wrapper The wrapper function.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var hello = function(name) { return 'hello ' + name; };
- * hello = _.wrap(hello, function(func) {
- * return 'before, ' + func('moe') + ', after';
- * });
- * hello();
- * // => 'before, hello moe, after'
- */
- function wrap(value, wrapper) {
- return function() {
- var args = [value];
- push.apply(args, arguments);
- return wrapper.apply(this, args);
- };
- }
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Converts the characters `&`, `<`, `>`, `"`, and `'` in `string` to their
- * corresponding HTML entities.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {String} string The string to escape.
- * @returns {String} Returns the escaped string.
- * @example
- *
- * _.escape('Moe, Larry & Curly');
- * // => 'Moe, Larry & Curly'
- */
- function escape(string) {
- return string == null ? '' : (string + '').replace(reUnescapedHtml, escapeHtmlChar);
- }
-
- /**
- * This function returns the first argument passed to it.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {Mixed} value Any value.
- * @returns {Mixed} Returns `value`.
- * @example
- *
- * var moe = { 'name': 'moe' };
- * moe === _.identity(moe);
- * // => true
- */
- function identity(value) {
- return value;
- }
-
- /**
- * Adds functions properties of `object` to the `lodash` function and chainable
- * wrapper.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {Object} object The object of function properties to add to `lodash`.
- * @example
- *
- * _.mixin({
- * 'capitalize': function(string) {
- * return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
- * }
- * });
- *
- * _.capitalize('larry');
- * // => 'Larry'
- *
- * _('curly').capitalize();
- * // => 'Curly'
- */
- function mixin(object) {
- forEach(functions(object), function(methodName) {
- var func = lodash[methodName] = object[methodName];
-
- lodash.prototype[methodName] = function() {
- var args = [this.__wrapped__];
- push.apply(args, arguments);
-
- var result = func.apply(lodash, args);
- return new lodash(result);
- };
- });
- }
-
- /**
- * Reverts the '_' variable to its previous value and returns a reference to
- * the `lodash` function.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @returns {Function} Returns the `lodash` function.
- * @example
- *
- * var lodash = _.noConflict();
- */
- function noConflict() {
- window._ = oldDash;
- return this;
- }
-
- /**
- * Produces a random number between `min` and `max` (inclusive). If only one
- * argument is passed, a number between `0` and the given number will be returned.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {Number} [min=0] The minimum possible value.
- * @param {Number} [max=1] The maximum possible value.
- * @returns {Number} Returns a random number.
- * @example
- *
- * _.random(0, 5);
- * // => a number between 1 and 5
- *
- * _.random(5);
- * // => also a number between 1 and 5
- */
- function random(min, max) {
- if (min == null && max == null) {
- max = 1;
- }
- min = +min || 0;
- if (max == null) {
- max = min;
- min = 0;
- }
- return min + floor(nativeRandom() * ((+max || 0) - min + 1));
- }
-
- /**
- * Resolves the value of `property` on `object`. If `property` is a function
- * it will be invoked and its result returned, else the property value is
- * returned. If `object` is falsey, then `null` is returned.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {Object} object The object to inspect.
- * @param {String} property The property to get the value of.
- * @returns {Mixed} Returns the resolved value.
- * @example
- *
- * var object = {
- * 'cheese': 'crumpets',
- * 'stuff': function() {
- * return 'nonsense';
- * }
- * };
- *
- * _.result(object, 'cheese');
- * // => 'crumpets'
- *
- * _.result(object, 'stuff');
- * // => 'nonsense'
- */
- function result(object, property) {
- // based on Backbone's private `getValue` function
- // https://github.com/documentcloud/backbone/blob/0.9.2/backbone.js#L1419-1424
- var value = object ? object[property] : null;
- return isFunction(value) ? object[property]() : value;
- }
-
- /**
- * A micro-templating method that handles arbitrary delimiters, preserves
- * whitespace, and correctly escapes quotes within interpolated code.
- *
- * Note: In the development build `_.template` utilizes sourceURLs for easier
- * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
- *
- * Note: Lo-Dash may be used in Chrome extensions by either creating a `lodash csp`
- * build and avoiding `_.template` use, or loading Lo-Dash in a sandboxed page.
- * See http://developer.chrome.com/trunk/extensions/sandboxingEval.html
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {String} text The template text.
- * @param {Obect} data The data object used to populate the text.
- * @param {Object} options The options object.
- * escape - The "escape" delimiter regexp.
- * evaluate - The "evaluate" delimiter regexp.
- * interpolate - The "interpolate" delimiter regexp.
- * sourceURL - The sourceURL of the template's compiled source.
- * variable - The data object variable name.
- *
- * @returns {Function|String} Returns a compiled function when no `data` object
- * is given, else it returns the interpolated text.
- * @example
- *
- * // using a compiled template
- * var compiled = _.template('hello <%= name %>');
- * compiled({ 'name': 'moe' });
- * // => 'hello moe'
- *
- * var list = '<% _.forEach(people, function(name) { %><li><%= name %></li><% }); %>';
- * _.template(list, { 'people': ['moe', 'larry', 'curly'] });
- * // => '<li>moe</li><li>larry</li><li>curly</li>'
- *
- * // using the "escape" delimiter to escape HTML in data property values
- * _.template('<b><%- value %></b>', { 'value': '<script>' });
- * // => '<b><script></b>'
- *
- * // using the ES6 delimiter as an alternative to the default "interpolate" delimiter
- * _.template('hello ${ name }', { 'name': 'curly' });
- * // => 'hello curly'
- *
- * // using the internal `print` function in "evaluate" delimiters
- * _.template('<% print("hello " + epithet); %>!', { 'epithet': 'stooge' });
- * // => 'hello stooge!'
- *
- * // using custom template delimiters
- * _.templateSettings = {
- * 'interpolate': /{{([\s\S]+?)}}/g
- * };
- *
- * _.template('hello {{ name }}!', { 'name': 'mustache' });
- * // => 'hello mustache!'
- *
- * // using the `sourceURL` option to specify a custom sourceURL for the template
- * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });
- * compiled(data);
- * // => find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector
- *
- * // using the `variable` option to ensure a with-statement isn't used in the compiled template
- * var compiled = _.template('hello <%= data.name %>!', null, { 'variable': 'data' });
- * compiled.source;
- * // => function(data) {
- * var __t, __p = '', __e = _.escape;
- * __p += 'hello ' + ((__t = ( data.name )) == null ? '' : __t) + '!';
- * return __p;
- * }
- *
- * // using the `source` property to inline compiled templates for meaningful
- * // line numbers in error messages and a stack trace
- * fs.writeFileSync(path.join(cwd, 'jst.js'), '\
- * var JST = {\
- * "main": ' + _.template(mainText).source + '\
- * };\
- * ');
- */
- function template(text, data, options) {
- // based on John Resig's `tmpl` implementation
- // http://ejohn.org/blog/javascript-micro-templating/
- // and Laura Doktorova's doT.js
- // https://github.com/olado/doT
- text || (text = '');
- options || (options = {});
-
- var isEvaluating,
- result,
- settings = lodash.templateSettings,
- index = 0,
- interpolate = options.interpolate || settings.interpolate || reNoMatch,
- source = "__p += '",
- variable = options.variable || settings.variable,
- hasVariable = variable;
-
- // compile regexp to match each delimiter
- var reDelimiters = RegExp(
- (options.escape || settings.escape || reNoMatch).source + '|' +
- interpolate.source + '|' +
- (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
- (options.evaluate || settings.evaluate || reNoMatch).source + '|$'
- , 'g');
-
- text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
- interpolateValue || (interpolateValue = esTemplateValue);
-
- // escape characters that cannot be included in string literals
- source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);
-
- // replace delimiters with snippets
- if (escapeValue) {
- source += "' +\n__e(" + escapeValue + ") +\n'";
- }
- if (evaluateValue) {
- source += "';\n" + evaluateValue + ";\n__p += '";
- }
- if (interpolateValue) {
- source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
- }
- isEvaluating || (isEvaluating = evaluateValue || reComplexDelimiter.test(escapeValue || interpolateValue));
- index = offset + match.length;
-
- // the JS engine embedded in Adobe products requires returning the `match`
- // string in order to produce the correct `offset` value
- return match;
- });
-
- source += "';\n";
-
- // if `variable` is not specified and the template contains "evaluate"
- // delimiters, wrap a with-statement around the generated code to add the
- // data object to the top of the scope chain
- if (!hasVariable) {
- variable = 'obj';
- if (isEvaluating) {
- source = 'with (' + variable + ') {\n' + source + '\n}\n';
- }
- else {
- // avoid a with-statement by prepending data object references to property names
- var reDoubleVariable = RegExp('(\\(\\s*)' + variable + '\\.' + variable + '\\b', 'g');
- source = source
- .replace(reInsertVariable, '$&' + variable + '.')
- .replace(reDoubleVariable, '$1__d');
- }
- }
-
- // cleanup code by stripping empty strings
- source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
- .replace(reEmptyStringMiddle, '$1')
- .replace(reEmptyStringTrailing, '$1;');
-
- // frame code as the function body
- source = 'function(' + variable + ') {\n' +
- (hasVariable ? '' : variable + ' || (' + variable + ' = {});\n') +
- "var __t, __p = '', __e = _.escape" +
- (isEvaluating
- ? ', __j = Array.prototype.join;\n' +
- "function print() { __p += __j.call(arguments, '') }\n"
- : (hasVariable ? '' : ', __d = ' + variable + '.' + variable + ' || ' + variable) + ';\n'
- ) +
- source +
- 'return __p\n}';
-
- // use a sourceURL for easier debugging
- // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
- var sourceURL = useSourceURL
- ? '\n//@ sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']')
- : '';
-
- try {
- result = Function('_', 'return ' + source + sourceURL)(lodash);
- } catch(e) {
- e.source = source;
- throw e;
- }
-
- if (data) {
- return result(data);
- }
- // provide the compiled function's source via its `toString` method, in
- // supported environments, or the `source` property as a convenience for
- // inlining compiled templates during the build process
- result.source = source;
- return result;
- }
-
- /**
- * Executes the `callback` function `n` times, returning an array of the results
- * of each `callback` execution. The `callback` is bound to `thisArg` and invoked
- * with one argument; (index).
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {Number} n The number of times to execute the callback.
- * @param {Function} callback The function called per iteration.
- * @param {Mixed} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a new array of the results of each `callback` execution.
- * @example
- *
- * var diceRolls = _.times(3, _.partial(_.random, 1, 6));
- * // => [3, 6, 4]
- *
- * _.times(3, function(n) { mage.castSpell(n); });
- * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively
- *
- * _.times(3, function(n) { this.cast(n); }, mage);
- * // => also calls `mage.castSpell(n)` three times
- */
- function times(n, callback, thisArg) {
- n = +n || 0;
- var index = -1,
- result = Array(n);
-
- while (++index < n) {
- result[index] = callback.call(thisArg, index);
- }
- return result;
- }
-
- /**
- * The opposite of `_.escape`, this method converts the HTML entities
- * `&`, `<`, `>`, `"`, and `'` in `string` to their
- * corresponding characters.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {String} string The string to unescape.
- * @returns {String} Returns the unescaped string.
- * @example
- *
- * _.unescape('Moe, Larry & Curly');
- * // => 'Moe, Larry & Curly'
- */
- function unescape(string) {
- return string == null ? '' : (string + '').replace(reEscapedHtml, unescapeHtmlChar);
- }
-
- /**
- * Generates a unique ID. If `prefix` is passed, the ID will be appended to it.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {String} [prefix] The value to prefix the ID with.
- * @returns {String} Returns the unique ID.
- * @example
- *
- * _.uniqueId('contact_');
- * // => 'contact_104'
- *
- * _.uniqueId();
- * // => '105'
- */
- function uniqueId(prefix) {
- return (prefix == null ? '' : prefix + '') + (++idCounter);
- }
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Invokes `interceptor` with the `value` as the first argument, and then
- * returns `value`. The purpose of this method is to "tap into" a method chain,
- * in order to perform operations on intermediate results within the chain.
- *
- * @static
- * @memberOf _
- * @category Chaining
- * @param {Mixed} value The value to pass to `interceptor`.
- * @param {Function} interceptor The function to invoke.
- * @returns {Mixed} Returns `value`.
- * @example
- *
- * _.chain([1, 2, 3, 200])
- * .filter(function(num) { return num % 2 == 0; })
- * .tap(alert)
- * .map(function(num) { return num * num; })
- * .value();
- * // => // [2, 200] (alerted)
- * // => [4, 40000]
- */
- function tap(value, interceptor) {
- interceptor(value);
- return value;
- }
-
- /**
- * Produces the `toString` result of the wrapped value.
- *
- * @name toString
- * @memberOf _
- * @category Chaining
- * @returns {String} Returns the string result.
- * @example
- *
- * _([1, 2, 3]).toString();
- * // => '1,2,3'
- */
- function wrapperToString() {
- return this.__wrapped__ + '';
- }
-
- /**
- * Extracts the wrapped value.
- *
- * @name valueOf
- * @memberOf _
- * @alias value
- * @category Chaining
- * @returns {Mixed} Returns the wrapped value.
- * @example
- *
- * _([1, 2, 3]).valueOf();
- * // => [1, 2, 3]
- */
- function wrapperValueOf() {
- return this.__wrapped__;
- }
-
- /*--------------------------------------------------------------------------*/
-
- // add functions that return wrapped values when chaining
- lodash.after = after;
- lodash.assign = assign;
- lodash.bind = bind;
- lodash.bindAll = bindAll;
- lodash.bindKey = bindKey;
- lodash.compact = compact;
- lodash.compose = compose;
- lodash.countBy = countBy;
- lodash.debounce = debounce;
- lodash.defaults = defaults;
- lodash.defer = defer;
- lodash.delay = delay;
- lodash.difference = difference;
- lodash.filter = filter;
- lodash.flatten = flatten;
- lodash.forEach = forEach;
- lodash.forIn = forIn;
- lodash.forOwn = forOwn;
- lodash.functions = functions;
- lodash.groupBy = groupBy;
- lodash.initial = initial;
- lodash.intersection = intersection;
- lodash.invert = invert;
- lodash.invoke = invoke;
- lodash.keys = keys;
- lodash.map = map;
- lodash.max = max;
- lodash.memoize = memoize;
- lodash.merge = merge;
- lodash.min = min;
- lodash.object = object;
- lodash.omit = omit;
- lodash.once = once;
- lodash.pairs = pairs;
- lodash.partial = partial;
- lodash.pick = pick;
- lodash.pluck = pluck;
- lodash.range = range;
- lodash.reject = reject;
- lodash.rest = rest;
- lodash.shuffle = shuffle;
- lodash.sortBy = sortBy;
- lodash.tap = tap;
- lodash.throttle = throttle;
- lodash.times = times;
- lodash.toArray = toArray;
- lodash.union = union;
- lodash.uniq = uniq;
- lodash.values = values;
- lodash.where = where;
- lodash.without = without;
- lodash.wrap = wrap;
- lodash.zip = zip;
-
- // add aliases
- lodash.collect = map;
- lodash.drop = rest;
- lodash.each = forEach;
- lodash.extend = assign;
- lodash.methods = functions;
- lodash.select = filter;
- lodash.tail = rest;
- lodash.unique = uniq;
-
- // add functions to `lodash.prototype`
- mixin(lodash);
-
- /*--------------------------------------------------------------------------*/
-
- // add functions that return unwrapped values when chaining
- lodash.clone = clone;
- lodash.cloneDeep = cloneDeep;
- lodash.contains = contains;
- lodash.escape = escape;
- lodash.every = every;
- lodash.find = find;
- lodash.has = has;
- lodash.identity = identity;
- lodash.indexOf = indexOf;
- lodash.isArguments = isArguments;
- lodash.isArray = isArray;
- lodash.isBoolean = isBoolean;
- lodash.isDate = isDate;
- lodash.isElement = isElement;
- lodash.isEmpty = isEmpty;
- lodash.isEqual = isEqual;
- lodash.isFinite = isFinite;
- lodash.isFunction = isFunction;
- lodash.isNaN = isNaN;
- lodash.isNull = isNull;
- lodash.isNumber = isNumber;
- lodash.isObject = isObject;
- lodash.isPlainObject = isPlainObject;
- lodash.isRegExp = isRegExp;
- lodash.isString = isString;
- lodash.isUndefined = isUndefined;
- lodash.lastIndexOf = lastIndexOf;
- lodash.mixin = mixin;
- lodash.noConflict = noConflict;
- lodash.random = random;
- lodash.reduce = reduce;
- lodash.reduceRight = reduceRight;
- lodash.result = result;
- lodash.size = size;
- lodash.some = some;
- lodash.sortedIndex = sortedIndex;
- lodash.template = template;
- lodash.unescape = unescape;
- lodash.uniqueId = uniqueId;
-
- // add aliases
- lodash.all = every;
- lodash.any = some;
- lodash.detect = find;
- lodash.foldl = reduce;
- lodash.foldr = reduceRight;
- lodash.include = contains;
- lodash.inject = reduce;
-
- forOwn(lodash, function(func, methodName) {
- if (!lodash.prototype[methodName]) {
- lodash.prototype[methodName] = function() {
- var args = [this.__wrapped__];
- push.apply(args, arguments);
- return func.apply(lodash, args);
- };
- }
- });
-
- /*--------------------------------------------------------------------------*/
-
- // add functions capable of returning wrapped and unwrapped values when chaining
- lodash.first = first;
- lodash.last = last;
-
- // add aliases
- lodash.take = first;
- lodash.head = first;
-
- forOwn(lodash, function(func, methodName) {
- if (!lodash.prototype[methodName]) {
- lodash.prototype[methodName]= function(n, guard) {
- var result = func(this.__wrapped__, n, guard);
- return (n == null || guard) ? result : new lodash(result);
- };
- }
- });
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * The semantic version number.
- *
- * @static
- * @memberOf _
- * @type String
- */
- lodash.VERSION = '1.0.0-rc.3';
-
- // add "Chaining" functions to the wrapper
- lodash.prototype.toString = wrapperToString;
- lodash.prototype.value = wrapperValueOf;
- lodash.prototype.valueOf = wrapperValueOf;
-
- // add `Array` functions that return unwrapped values
- each(['join', 'pop', 'shift'], function(methodName) {
- var func = arrayRef[methodName];
- lodash.prototype[methodName] = function() {
- return func.apply(this.__wrapped__, arguments);
- };
- });
-
- // add `Array` functions that return the wrapped value
- each(['push', 'reverse', 'sort', 'unshift'], function(methodName) {
- var func = arrayRef[methodName];
- lodash.prototype[methodName] = function() {
- func.apply(this.__wrapped__, arguments);
- return this;
- };
- });
-
- // add `Array` functions that return new wrapped values
- each(['concat', 'slice', 'splice'], function(methodName) {
- var func = arrayRef[methodName];
- lodash.prototype[methodName] = function() {
- var result = func.apply(this.__wrapped__, arguments);
- return new lodash(result);
- };
- });
-
- // avoid array-like object bugs with `Array#shift` and `Array#splice`
- // in Firefox < 10 and IE < 9
- if (hasObjectSpliceBug) {
- each(['pop', 'shift', 'splice'], function(methodName) {
- var func = arrayRef[methodName],
- isSplice = methodName == 'splice';
-
- lodash.prototype[methodName] = function() {
- var value = this.__wrapped__,
- result = func.apply(value, arguments);
-
- if (value.length === 0) {
- delete value[0];
- }
- return isSplice ? new lodash(result) : result;
- };
- });
- }
-
- // add pseudo private property to be used and removed during the build process
- lodash._each = each;
- lodash._iteratorTemplate = iteratorTemplate;
-
- /*--------------------------------------------------------------------------*/
-
- // expose Lo-Dash
- // some AMD build optimizers, like r.js, check for specific condition patterns like the following:
- if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
- // Expose Lo-Dash to the global object even when an AMD loader is present in
- // case Lo-Dash was injected by a third-party script and not intended to be
- // loaded as a module. The global assignment can be reverted in the Lo-Dash
- // module via its `noConflict()` method.
- window._ = lodash;
-
- // define as an anonymous module so, through path mapping, it can be
- // referenced as the "underscore" module
- define(function() {
- return lodash;
- });
- }
- // check for `exports` after `define` in case a build optimizer adds an `exports` object
- else if (freeExports) {
- // in Node.js or RingoJS v0.8.0+
- if (typeof module == 'object' && module && module.exports == freeExports) {
- (module.exports = lodash)._ = lodash;
- }
- // in Narwhal or RingoJS v0.7.0-
- else {
- freeExports._ = lodash;
- }
- }
- else {
- // in a browser or Rhino
- window._ = lodash;
- }
-}(this));
-(function(e){if("function"==typeof bootstrap)bootstrap("osmauth",e);else if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else if("undefined"!=typeof ses){if(!ses.ok())return;ses.makeOsmAuth=e}else"undefined"!=typeof window?window.osmAuth=e():global.osmAuth=e()})(function(){var define,ses,bootstrap,module,exports;
-return (function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({1:[function(require,module,exports){
-var ohauth = require('ohauth'),
- store = require('store');
-
-// # osm-auth
-//
-// This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
-// object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
-// does not support custom headers, which this uses everywhere.
-module.exports = function(o) {
-
- var oauth = {};
-
- // authenticated users will also have a request token secret, but it's
- // not used in transactions with the server
- oauth.authenticated = function() {
- return !!(token('oauth_token') && token('oauth_token_secret'));
- };
-
- oauth.logout = function() {
- token('oauth_token', '');
- token('oauth_token_secret', '');
- token('oauth_request_token_secret', '');
- return oauth;
- };
-
- // TODO: detect lack of click event
- oauth.authenticate = function(callback) {
- if (oauth.authenticated()) return callback();
-
- oauth.logout();
-
- // ## Getting a request token
- var params = timenonce(getAuth(o)),
- url = o.url + '/oauth/request_token';
-
- params.oauth_signature = ohauth.signature(
- o.oauth_secret, '',
- ohauth.baseString('POST', url, params));
-
- // Create a 600x550 popup window in the center of the screen
- var w = 600, h = 550,
- settings = [
- ['width', w], ['height', h],
- ['left', screen.width / 2 - w / 2],
- ['top', screen.height / 2 - h / 2]].map(function(x) {
- return x.join('=');
- }).join(','),
- popup = window.open('about:blank', 'oauth_window', settings);
-
- // Request a request token. When this is complete, the popup
- // window is redirected to OSM's authorization page.
- ohauth.xhr('POST', url, params, null, {}, reqTokenDone);
- o.loading();
-
- function reqTokenDone(err, xhr) {
- o.done();
- if (err) return callback(err);
- var resp = ohauth.stringQs(xhr.response);
- token('oauth_request_token_secret', resp.oauth_token_secret);
- popup.location = o.url + '/oauth/authorize?' + ohauth.qsString({
- oauth_token: resp.oauth_token,
- oauth_callback: location.href.replace('index.html', '')
- .replace(/#.+/, '') + o.landing
- });
- }
-
- // Called by a function in a landing page, in the popup window. The
- // window closes itself.
- window.authComplete = function(token) {
- var oauth_token = ohauth.stringQs(token.split('?')[1]);
- get_access_token(oauth_token.oauth_token);
- delete window.authComplete;
- };
-
- // ## Getting an request token
- //
- // At this point we have an `oauth_token`, brought in from a function
- // call on a landing page popup.
- function get_access_token(oauth_token) {
- var url = o.url + '/oauth/access_token',
- params = timenonce(getAuth(o)),
- request_token_secret = token('oauth_request_token_secret');
- params.oauth_token = oauth_token;
- params.oauth_signature = ohauth.signature(
- o.oauth_secret,
- request_token_secret,
- ohauth.baseString('POST', url, params));
-
- // ## Getting an access token
- //
- // The final token required for authentication. At this point
- // we have a `request token secret`
- ohauth.xhr('POST', url, params, null, {}, accessTokenDone);
- o.loading();
- }
-
- function accessTokenDone(err, xhr) {
- o.done();
- if (err) return callback(err);
- var access_token = ohauth.stringQs(xhr.response);
- token('oauth_token', access_token.oauth_token);
- token('oauth_token_secret', access_token.oauth_token_secret);
- callback(null, oauth);
- }
- };
-
- // # xhr
- //
- // A single XMLHttpRequest wrapper that does authenticated calls if the
- // user has logged in.
- oauth.xhr = function(options, callback) {
- if (!oauth.authenticated()) {
- if (o.auto) return oauth.authenticate(run);
- else return callback('not authenticated', null);
- } else return run();
-
- function run() {
- var params = timenonce(getAuth(o)),
- url = o.url + options.path,
- oauth_token_secret = token('oauth_token_secret');
-
- params.oauth_token = token('oauth_token');
- params.oauth_signature = ohauth.signature(
- o.oauth_secret,
- oauth_token_secret,
- ohauth.baseString(options.method, url, params));
-
- ohauth.xhr(options.method,
- url, params, options.content, options.options, done);
- }
-
- function done(err, xhr) {
- if (err) return callback(err);
- else if (xhr.responseXML) return callback(err, xhr.responseXML);
- else return callback(err, xhr.response);
- }
- };
-
- // pre-authorize this object, if we can just get a token and token_secret
- // from the start
- oauth.preauth = function(c) {
- if (!c) return;
- if (c.oauth_token) token('oauth_token', c.oauth_token);
- if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
- return oauth;
- };
-
- oauth.options = function(_) {
- if (!arguments.length) return o;
-
- o = _;
-
- o.url = o.url || 'http://www.openstreetmap.org';
- o.landing = o.landing || 'land.html';
-
- // Optional loading and loading-done functions for nice UI feedback.
- // by default, no-ops
- o.loading = o.loading || function() {};
- o.done = o.done || function() {};
-
- return oauth.preauth(o);
- };
-
- // 'stamp' an authentication object from `getAuth()`
- // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
- // and timestamp
- function timenonce(o) {
- o.oauth_timestamp = ohauth.timestamp();
- o.oauth_nonce = ohauth.nonce();
- return o;
- }
-
- // get/set tokens. These are prefixed with the base URL so that `osm-auth`
- // can be used with multiple APIs and the keys in `localStorage`
- // will not clash
- function token(x, y) {
- if (arguments.length === 1) return store.get(o.url + x);
- else if (arguments.length === 2) return store.set(o.url + x, y);
- }
-
- // Get an authentication object. If you just add and remove properties
- // from a single object, you'll need to use `delete` to make sure that
- // it doesn't contain undesired properties for authentication
- function getAuth(o) {
- return {
- oauth_consumer_key: o.oauth_consumer_key,
- oauth_signature_method: "HMAC-SHA1"
- };
- }
-
- // potentially pre-authorize
- oauth.options(o);
-
- return oauth;
-};
-
-},{"store":2,"ohauth":3}],2:[function(require,module,exports){
-/* Copyright (c) 2010-2012 Marcus Westin
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-;(function(){
- var store = {},
- win = window,
- doc = win.document,
- localStorageName = 'localStorage',
- namespace = '__storejs__',
- storage
-
- store.disabled = false
- store.set = function(key, value) {}
- store.get = function(key) {}
- store.remove = function(key) {}
- store.clear = function() {}
- store.transact = function(key, defaultVal, transactionFn) {
- var val = store.get(key)
- if (transactionFn == null) {
- transactionFn = defaultVal
- defaultVal = null
- }
- if (typeof val == 'undefined') { val = defaultVal || {} }
- transactionFn(val)
- store.set(key, val)
- }
- store.getAll = function() {}
-
- store.serialize = function(value) {
- return JSON.stringify(value)
- }
- store.deserialize = function(value) {
- if (typeof value != 'string') { return undefined }
- try { return JSON.parse(value) }
- catch(e) { return value || undefined }
- }
-
- // Functions to encapsulate questionable FireFox 3.6.13 behavior
- // when about.config::dom.storage.enabled === false
- // See https://github.com/marcuswestin/store.js/issues#issue/13
- function isLocalStorageNameSupported() {
- try { return (localStorageName in win && win[localStorageName]) }
- catch(err) { return false }
- }
-
- if (isLocalStorageNameSupported()) {
- storage = win[localStorageName]
- store.set = function(key, val) {
- if (val === undefined) { return store.remove(key) }
- storage.setItem(key, store.serialize(val))
- return val
- }
- store.get = function(key) { return store.deserialize(storage.getItem(key)) }
- store.remove = function(key) { storage.removeItem(key) }
- store.clear = function() { storage.clear() }
- store.getAll = function() {
- var ret = {}
- for (var i=0; i<storage.length; ++i) {
- var key = storage.key(i)
- ret[key] = store.get(key)
- }
- return ret
- }
- } else if (doc.documentElement.addBehavior) {
- var storageOwner,
- storageContainer
- // Since #userData storage applies only to specific paths, we need to
- // somehow link our data to a specific path. We choose /favicon.ico
- // as a pretty safe option, since all browsers already make a request to
- // this URL anyway and being a 404 will not hurt us here. We wrap an
- // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
- // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
- // since the iframe access rules appear to allow direct access and
- // manipulation of the document element, even for a 404 page. This
- // document can be used instead of the current document (which would
- // have been limited to the current path) to perform #userData storage.
- try {
- storageContainer = new ActiveXObject('htmlfile')
- storageContainer.open()
- storageContainer.write('<s' + 'cript>document.w=window</s' + 'cript><iframe src="/favicon.ico"></frame>')
- storageContainer.close()
- storageOwner = storageContainer.w.frames[0].document
- storage = storageOwner.createElement('div')
- } catch(e) {
- // somehow ActiveXObject instantiation failed (perhaps some special
- // security settings or otherwse), fall back to per-path storage
- storage = doc.createElement('div')
- storageOwner = doc.body
- }
- function withIEStorage(storeFunction) {
- return function() {
- var args = Array.prototype.slice.call(arguments, 0)
- args.unshift(storage)
- // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
- // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
- storageOwner.appendChild(storage)
- storage.addBehavior('#default#userData')
- storage.load(localStorageName)
- var result = storeFunction.apply(store, args)
- storageOwner.removeChild(storage)
- return result
- }
- }
-
- // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40
- var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g")
- function ieKeyFix(key) {
- return key.replace(forbiddenCharsRegex, '___')
- }
- store.set = withIEStorage(function(storage, key, val) {
- key = ieKeyFix(key)
- if (val === undefined) { return store.remove(key) }
- storage.setAttribute(key, store.serialize(val))
- storage.save(localStorageName)
- return val
- })
- store.get = withIEStorage(function(storage, key) {
- key = ieKeyFix(key)
- return store.deserialize(storage.getAttribute(key))
- })
- store.remove = withIEStorage(function(storage, key) {
- key = ieKeyFix(key)
- storage.removeAttribute(key)
- storage.save(localStorageName)
- })
- store.clear = withIEStorage(function(storage) {
- var attributes = storage.XMLDocument.documentElement.attributes
- storage.load(localStorageName)
- for (var i=0, attr; attr=attributes[i]; i++) {
- storage.removeAttribute(attr.name)
- }
- storage.save(localStorageName)
- })
- store.getAll = withIEStorage(function(storage) {
- var attributes = storage.XMLDocument.documentElement.attributes
- storage.load(localStorageName)
- var ret = {}
- for (var i=0, attr; attr=attributes[i]; ++i) {
- ret[attr] = store.get(attr)
- }
- return ret
- })
- }
-
- try {
- store.set(namespace, namespace)
- if (store.get(namespace) != namespace) { store.disabled = true }
- store.remove(namespace)
- } catch(e) {
- store.disabled = true
- }
- store.enabled = !store.disabled
-
- if (typeof module != 'undefined' && typeof module != 'function') { module.exports = store }
- else if (typeof define === 'function' && define.amd) { define(store) }
- else { this.store = store }
-})();
-
-},{}],3:[function(require,module,exports){
-'use strict';
-
-var hashes = require('jshashes'),
- sha1 = new hashes.SHA1();
-
-var ohauth = {};
-
-ohauth.qsString = function(obj) {
- return Object.keys(obj).sort().map(function(key) {
- return encodeURIComponent(key) + '=' +
- encodeURIComponent(obj[key]);
- }).join('&');
-};
-
-ohauth.stringQs = function(str) {
- return str.split('&').reduce(function(obj, pair){
- var parts = pair.split('=');
- obj[parts[0]] = (null === parts[1]) ?
- '' : decodeURIComponent(parts[1]);
- return obj;
- }, {});
-};
-
-ohauth.rawxhr = function(method, url, data, headers, callback) {
- var xhr = new XMLHttpRequest(),
- twoHundred = /^20\d$/;
- xhr.onreadystatechange = function() {
- if (4 == xhr.readyState && 0 !== xhr.status) {
- if (twoHundred.test(xhr.status)) callback(null, xhr);
- else return callback(xhr, null);
- }
- };
- xhr.onerror = function(e) { return callback(e, null); };
- xhr.open(method, url, true);
- for (var h in headers) xhr.setRequestHeader(h, headers[h]);
- xhr.send(data);
-};
-
-ohauth.xhr = function(method, url, auth, data, options, callback) {
- var headers = (options && options.header) || {
- 'Content-Type': 'application/x-www-form-urlencoded'
- };
- headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
- ohauth.rawxhr(method, url, data, headers, callback);
-};
-
-ohauth.nonce = function() {
- for (var o = ''; o.length < 6;) {
- o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
- }
- return o;
-};
-
-ohauth.authHeader = function(obj) {
- return Object.keys(obj).sort().map(function(key) {
- return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
- }).join(', ');
-};
-
-ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
-
-ohauth.percentEncode = function(s) {
- return encodeURIComponent(s)
- .replace(/\!/g, '%21').replace(/\'/g, '%27')
- .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
-};
-
-ohauth.baseString = function(method, url, params) {
- if (params.oauth_signature) delete params.oauth_signature;
- return [
- method,
- ohauth.percentEncode(url),
- ohauth.percentEncode(ohauth.qsString(params))].join('&');
-};
-
-ohauth.signature = function(oauth_secret, token_secret, baseString) {
- return sha1.b64_hmac(
- ohauth.percentEncode(oauth_secret) + '&' +
- ohauth.percentEncode(token_secret),
- baseString);
-};
-
-module.exports = ohauth;
-
-},{"jshashes":4}],4:[function(require,module,exports){
-(function(global){/**\r
- * jsHashes - A fast and independent hashing library pure JavaScript implemented (ES5 compliant) for both server and client side\r
- * \r
- * @class Hashes\r
- * @author Tomas Aparicio <tomas@rijndael-project.com>\r
- * @license New BSD (see LICENSE file)\r
- * @version 1.0.3\r
- *\r
- * Algorithms specification:\r
- *\r
- * MD5 <http://www.ietf.org/rfc/rfc1321.txt>\r
- * RIPEMD-160 <http://homes.esat.kuleuven.be/~bosselae/ripemd160.html>\r
- * SHA1 <http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf>\r
- * SHA256 <http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf>\r
- * SHA512 <http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf>\r
- * HMAC <http://www.ietf.org/rfc/rfc2104.txt>\r
- *\r
- */\r
-(function(){\r
- var Hashes;\r
- \r
- // private helper methods\r
- function utf8Encode(input) {\r
- var x, y, output = '', i = -1, l = input.length;\r
- while ((i+=1) < l) {\r
- /* Decode utf-16 surrogate pairs */\r
- x = input.charCodeAt(i);\r
- y = i + 1 < l ? input.charCodeAt(i + 1) : 0;\r
- if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {\r
- x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);\r
- i += 1;\r
- }\r
- /* Encode output as utf-8 */\r
- if (x <= 0x7F) {\r
- output += String.fromCharCode(x);\r
- } else if (x <= 0x7FF) {\r
- output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),\r
- 0x80 | ( x & 0x3F));\r
- } else if (x <= 0xFFFF) {\r
- output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),\r
- 0x80 | ((x >>> 6 ) & 0x3F),\r
- 0x80 | ( x & 0x3F));\r
- } else if (x <= 0x1FFFFF) {\r
- output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),\r
- 0x80 | ((x >>> 12) & 0x3F),\r
- 0x80 | ((x >>> 6 ) & 0x3F),\r
- 0x80 | ( x & 0x3F));\r
- }\r
- }\r
- return output;\r
- }\r
- \r
- function utf8Decode(str_data) {\r
- var i, ac, c1, c2, c3, arr = [], l = str_data.length;\r
- i = ac = c1 = c2 = c3 = 0;\r
- str_data += '';\r
-\r
- while (i < l) {\r
- c1 = str_data.charCodeAt(i);\r
- ac += 1;\r
- if (c1 < 128) {\r
- arr[ac] = String.fromCharCode(c1);\r
- i+=1;\r
- } else if (c1 > 191 && c1 < 224) {\r
- c2 = str_data.charCodeAt(i + 1);\r
- arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\r
- i += 2;\r
- } else {\r
- c2 = str_data.charCodeAt(i + 1);\r
- c3 = str_data.charCodeAt(i + 2);\r
- arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r
- i += 3;\r
- }\r
- }\r
- return arr.join('');\r
- }\r
-\r
- /**\r
- * Add integers, wrapping at 2^32. This uses 16-bit operations internally\r
- * to work around bugs in some JS interpreters.\r
- */\r
- function safe_add(x, y) {\r
- var lsw = (x & 0xFFFF) + (y & 0xFFFF),\r
- msw = (x >> 16) + (y >> 16) + (lsw >> 16);\r
- return (msw << 16) | (lsw & 0xFFFF);\r
- }\r
-\r
- /**\r
- * Bitwise rotate a 32-bit number to the left.\r
- */\r
- function bit_rol(num, cnt) {\r
- return (num << cnt) | (num >>> (32 - cnt));\r
- }\r
-\r
- /**\r
- * Convert a raw string to a hex string\r
- */\r
- function rstr2hex(input, hexcase) {\r
- var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',\r
- output = '', x, i = 0, l = input.length;\r
- for (; i < l; i+=1) {\r
- x = input.charCodeAt(i);\r
- output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);\r
- }\r
- return output;\r
- }\r
-\r
- /**\r
- * Encode a string as utf-16\r
- */\r
- function str2rstr_utf16le(input) {\r
- var i, l = input.length, output = '';\r
- for (i = 0; i < l; i+=1) {\r
- output += String.fromCharCode( input.charCodeAt(i) & 0xFF, (input.charCodeAt(i) >>> 8) & 0xFF);\r
- }\r
- return output;\r
- }\r
-\r
- function str2rstr_utf16be(input) {\r
- var i, l = input.length, output = '';\r
- for (i = 0; i < l; i+=1) {\r
- output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF, input.charCodeAt(i) & 0xFF);\r
- }\r
- return output;\r
- }\r
-\r
- /**\r
- * Convert an array of big-endian words to a string\r
- */\r
- function binb2rstr(input) {\r
- var i, l = input.length * 32, output = '';\r
- for (i = 0; i < l; i += 8) {\r
- output += String.fromCharCode((input[i>>5] >>> (24 - i % 32)) & 0xFF);\r
- }\r
- return output;\r
- }\r
-\r
- /**\r
- * Convert an array of little-endian words to a string\r
- */\r
- function binl2rstr(input) {\r
- var i, l = input.length * 32, output = '';\r
- for (i = 0;i < l; i += 8) {\r
- output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);\r
- }\r
- return output;\r
- }\r
-\r
- /**\r
- * Convert a raw string to an array of little-endian words\r
- * Characters >255 have their high-byte silently ignored.\r
- */\r
- function rstr2binl(input) {\r
- var i, l = input.length * 8, output = Array(input.length >> 2), lo = output.length;\r
- for (i = 0; i < lo; i+=1) {\r
- output[i] = 0;\r
- }\r
- for (i = 0; i < l; i += 8) {\r
- output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);\r
- }\r
- return output;\r
- }\r
- \r
- /**\r
- * Convert a raw string to an array of big-endian words \r
- * Characters >255 have their high-byte silently ignored.\r
- */\r
- function rstr2binb(input) {\r
- var i, l = input.length * 8, output = Array(input.length >> 2), lo = output.length;\r
- for (i = 0; i < lo; i+=1) {\r
- output[i] = 0;\r
- }\r
- for (i = 0; i < l; i += 8) {\r
- output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);\r
- }\r
- return output;\r
- }\r
-\r
- /**\r
- * Convert a raw string to an arbitrary string encoding\r
- */\r
- function rstr2any(input, encoding) {\r
- var divisor = encoding.length,\r
- remainders = Array(),\r
- i, q, x, ld, quotient, dividend, output, full_length;\r
- \r
- /* Convert to an array of 16-bit big-endian values, forming the dividend */\r
- dividend = Array(Math.ceil(input.length / 2));\r
- ld = dividend.length;\r
- for (i = 0; i < ld; i+=1) {\r
- dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);\r
- }\r
- \r
- /**\r
- * Repeatedly perform a long division. The binary array forms the dividend,\r
- * the length of the encoding is the divisor. Once computed, the quotient\r
- * forms the dividend for the next step. We stop when the dividend is zerHashes.\r
- * All remainders are stored for later use.\r
- */\r
- while(dividend.length > 0) {\r
- quotient = Array();\r
- x = 0;\r
- for (i = 0; i < dividend.length; i+=1) {\r
- x = (x << 16) + dividend[i];\r
- q = Math.floor(x / divisor);\r
- x -= q * divisor;\r
- if (quotient.length > 0 || q > 0) {\r
- quotient[quotient.length] = q;\r
- }\r
- }\r
- remainders[remainders.length] = x;\r
- dividend = quotient;\r
- }\r
- \r
- /* Convert the remainders to the output string */\r
- output = '';\r
- for (i = remainders.length - 1; i >= 0; i--) {\r
- output += encoding.charAt(remainders[i]);\r
- }\r
- \r
- /* Append leading zero equivalents */\r
- full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));\r
- for (i = output.length; i < full_length; i+=1) {\r
- output = encoding[0] + output;\r
- }\r
- return output;\r
- }\r
-\r
- /**\r
- * Convert a raw string to a base-64 string\r
- */\r
- function rstr2b64(input, b64pad) {\r
- var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\r
- output = '',\r
- len = input.length, i, j, triplet;\r
- b64pad= b64pad || '=';\r
- for (i = 0; i < len; i += 3) {\r
- triplet = (input.charCodeAt(i) << 16)\r
- | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)\r
- | (i + 2 < len ? input.charCodeAt(i+2) : 0);\r
- for (j = 0; j < 4; j+=1) {\r
- if (i * 8 + j * 6 > input.length * 8) { \r
- output += b64pad; \r
- } else { \r
- output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F); \r
- }\r
- }\r
- }\r
- return output;\r
- }\r
-\r
- Hashes = {\r
- /** \r
- * @property {String} version\r
- * @readonly\r
- */\r
- VERSION : '1.0.3',\r
- /**\r
- * @member Hashes\r
- * @class Base64\r
- * @constructor\r
- */\r
- Base64 : function () {\r
- // private properties\r
- var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\r
- pad = '=', // default pad according with the RFC standard\r
- url = false, // URL encoding support @todo\r
- utf8 = true; // by default enable UTF-8 support encoding\r
-\r
- // public method for encoding\r
- this.encode = function (input) {\r
- var i, j, triplet,\r
- output = '', \r
- len = input.length;\r
-\r
- pad = pad || '=';\r
- input = (utf8) ? utf8Encode(input) : input;\r
-\r
- for (i = 0; i < len; i += 3) {\r
- triplet = (input.charCodeAt(i) << 16)\r
- | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)\r
- | (i + 2 < len ? input.charCodeAt(i+2) : 0);\r
- for (j = 0; j < 4; j+=1) {\r
- if (i * 8 + j * 6 > len * 8) {\r
- output += pad;\r
- } else {\r
- output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);\r
- }\r
- }\r
- }\r
- return output; \r
- };\r
-\r
- // public method for decoding\r
- this.decode = function (input) {\r
- // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\r
- var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,\r
- dec = '',\r
- arr = [];\r
- if (!input) { return input; }\r
-\r
- i = ac = 0;\r
- input = input.replace(new RegExp('\\'+pad,'gi'),''); // use '='\r
- //input += '';\r
-\r
- do { // unpack four hexets into three octets using index points in b64\r
- h1 = tab.indexOf(input.charAt(i+=1));\r
- h2 = tab.indexOf(input.charAt(i+=1));\r
- h3 = tab.indexOf(input.charAt(i+=1));\r
- h4 = tab.indexOf(input.charAt(i+=1));\r
-\r
- bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;\r
-\r
- o1 = bits >> 16 & 0xff;\r
- o2 = bits >> 8 & 0xff;\r
- o3 = bits & 0xff;\r
- ac += 1;\r
-\r
- if (h3 === 64) {\r
- arr[ac] = String.fromCharCode(o1);\r
- } else if (h4 === 64) {\r
- arr[ac] = String.fromCharCode(o1, o2);\r
- } else {\r
- arr[ac] = String.fromCharCode(o1, o2, o3);\r
- }\r
- } while (i < input.length);\r
-\r
- dec = arr.join('');\r
- dec = (utf8) ? utf8Decode(dec) : dec;\r
-\r
- return dec;\r
- };\r
-\r
- // set custom pad string\r
- this.setPad = function (str) {\r
- pad = str || pad;\r
- return this;\r
- };\r
- // set custom tab string characters\r
- this.setTab = function (str) {\r
- tab = str || tab;\r
- return this;\r
- };\r
- this.setUTF8 = function (bool) {\r
- if (typeof bool === 'boolean') {\r
- utf8 = bool;\r
- }\r
- return this;\r
- };\r
- },\r
-\r
- /**\r
- * CRC-32 calculation\r
- * @member Hashes\r
- * @method CRC32\r
- * @static\r
- * @param {String} str Input String\r
- * @return {String}\r
- */\r
- CRC32 : function (str) {\r
- var crc = 0, x = 0, y = 0, table, i, iTop;\r
- str = utf8Encode(str);\r
- \r
- table = [ \r
- '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',\r
- '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',\r
- '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',\r
- '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',\r
- 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',\r
- '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',\r
- 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',\r
- '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',\r
- 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',\r
- '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',\r
- 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',\r
- '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',\r
- 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',\r
- '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',\r
- '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',\r
- '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',\r
- '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',\r
- 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ', \r
- '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',\r
- 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',\r
- '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',\r
- 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',\r
- '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',\r
- 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',\r
- '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',\r
- 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'\r
- ].join('');\r
-\r
- crc = crc ^ (-1);\r
- for (i = 0, iTop = str.length; i < iTop; i+=1 ) {\r
- y = ( crc ^ str.charCodeAt( i ) ) & 0xFF;\r
- x = '0x' + table.substr( y * 9, 8 );\r
- crc = ( crc >>> 8 ) ^ x;\r
- }\r
- // always return a positive number (that's what >>> 0 does)\r
- return (crc ^ (-1)) >>> 0;\r
- },\r
- /**\r
- * @member Hashes\r
- * @class MD5\r
- * @constructor\r
- * @param {Object} [config]\r
- * \r
- * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\r
- * Digest Algorithm, as defined in RFC 1321.\r
- * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\r
- * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\r
- * See <http://pajhome.org.uk/crypt/md5> for more infHashes.\r
- */\r
- MD5 : function (options) { \r
- /**\r
- * Private config properties. You may need to tweak these to be compatible with\r
- * the server-side, but the defaults work in most cases.\r
- * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}\r
- */\r
- var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase\r
- b64pad = (options && typeof options.pad === 'string') ? options.pda : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance\r
- utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding\r
-\r
- // privileged (public) methods \r
- this.hex = function (s) { \r
- return rstr2hex(rstr(s, utf8), hexcase);\r
- };\r
- this.b64 = function (s) { \r
- return rstr2b64(rstr(s), b64pad);\r
- };\r
- this.any = function(s, e) { \r
- return rstr2any(rstr(s, utf8), e); \r
- };\r
- this.hex_hmac = function (k, d) { \r
- return rstr2hex(rstr_hmac(k, d), hexcase); \r
- };\r
- this.b64_hmac = function (k, d) { \r
- return rstr2b64(rstr_hmac(k,d), b64pad); \r
- };\r
- this.any_hmac = function (k, d, e) { \r
- return rstr2any(rstr_hmac(k, d), e); \r
- };\r
- /**\r
- * Perform a simple self-test to see if the VM is working\r
- * @return {String} Hexadecimal hash sample\r
- */\r
- this.vm_test = function () {\r
- return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';\r
- };\r
- /** \r
- * Enable/disable uppercase hexadecimal returned string \r
- * @param {Boolean} \r
- * @return {Object} this\r
- */ \r
- this.setUpperCase = function (a) {\r
- if (typeof a === 'boolean' ) {\r
- hexcase = a;\r
- }\r
- return this;\r
- };\r
- /** \r
- * Defines a base64 pad string \r
- * @param {String} Pad\r
- * @return {Object} this\r
- */ \r
- this.setPad = function (a) {\r
- b64pad = a || b64pad;\r
- return this;\r
- };\r
- /** \r
- * Defines a base64 pad string \r
- * @param {Boolean} \r
- * @return {Object} [this]\r
- */ \r
- this.setUTF8 = function (a) {\r
- if (typeof a === 'boolean') { \r
- utf8 = a;\r
- }\r
- return this;\r
- };\r
-\r
- // private methods\r
-\r
- /**\r
- * Calculate the MD5 of a raw string\r
- */\r
- function rstr(s) {\r
- s = (utf8) ? utf8Encode(s): s;\r
- return binl2rstr(binl(rstr2binl(s), s.length * 8));\r
- }\r
- \r
- /**\r
- * Calculate the HMAC-MD5, of a key and some data (raw strings)\r
- */\r
- function rstr_hmac(key, data) {\r
- var bkey, ipad, opad, hash, i;\r
-\r
- key = (utf8) ? utf8Encode(key) : key;\r
- data = (utf8) ? utf8Encode(data) : data;\r
- bkey = rstr2binl(key);\r
- if (bkey.length > 16) { \r
- bkey = binl(bkey, key.length * 8); \r
- }\r
-\r
- ipad = Array(16), opad = Array(16); \r
- for (i = 0; i < 16; i+=1) {\r
- ipad[i] = bkey[i] ^ 0x36363636;\r
- opad[i] = bkey[i] ^ 0x5C5C5C5C;\r
- }\r
- hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\r
- return binl2rstr(binl(opad.concat(hash), 512 + 128));\r
- }\r
-\r
- /**\r
- * Calculate the MD5 of an array of little-endian words, and a bit length.\r
- */\r
- function binl(x, len) {\r
- var i, olda, oldb, oldc, oldd,\r
- a = 1732584193,\r
- b = -271733879,\r
- c = -1732584194,\r
- d = 271733878;\r
- \r
- /* append padding */\r
- x[len >> 5] |= 0x80 << ((len) % 32);\r
- x[(((len + 64) >>> 9) << 4) + 14] = len;\r
-\r
- for (i = 0; i < x.length; i += 16) {\r
- olda = a;\r
- oldb = b;\r
- oldc = c;\r
- oldd = d;\r
-\r
- a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);\r
- d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);\r
- c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);\r
- b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);\r
- a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);\r
- d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);\r
- c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);\r
- b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);\r
- a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);\r
- d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);\r
- c = md5_ff(c, d, a, b, x[i+10], 17, -42063);\r
- b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);\r
- a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);\r
- d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);\r
- c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);\r
- b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);\r
-\r
- a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);\r
- d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);\r
- c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);\r
- b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);\r
- a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);\r
- d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);\r
- c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);\r
- b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);\r
- a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);\r
- d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);\r
- c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);\r
- b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);\r
- a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);\r
- d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);\r
- c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);\r
- b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);\r
-\r
- a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);\r
- d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);\r
- c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);\r
- b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);\r
- a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);\r
- d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);\r
- c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);\r
- b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);\r
- a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);\r
- d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);\r
- c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);\r
- b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);\r
- a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);\r
- d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);\r
- c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);\r
- b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);\r
-\r
- a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);\r
- d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);\r
- c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);\r
- b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);\r
- a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);\r
- d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);\r
- c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);\r
- b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);\r
- a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);\r
- d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);\r
- c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);\r
- b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);\r
- a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);\r
- d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);\r
- c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);\r
- b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);\r
-\r
- a = safe_add(a, olda);\r
- b = safe_add(b, oldb);\r
- c = safe_add(c, oldc);\r
- d = safe_add(d, oldd);\r
- }\r
- return Array(a, b, c, d);\r
- }\r
-\r
- /**\r
- * These functions implement the four basic operations the algorithm uses.\r
- */\r
- function md5_cmn(q, a, b, x, s, t) {\r
- return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);\r
- }\r
- function md5_ff(a, b, c, d, x, s, t) {\r
- return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);\r
- }\r
- function md5_gg(a, b, c, d, x, s, t) {\r
- return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);\r
- }\r
- function md5_hh(a, b, c, d, x, s, t) {\r
- return md5_cmn(b ^ c ^ d, a, b, x, s, t);\r
- }\r
- function md5_ii(a, b, c, d, x, s, t) {\r
- return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);\r
- }\r
- },\r
- /**\r
- * @member Hashes\r
- * @class Hashes.SHA1\r
- * @param {Object} [config]\r
- * @constructor\r
- * \r
- * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1\r
- * Version 2.2 Copyright Paul Johnston 2000 - 2009.\r
- * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\r
- * See http://pajhome.org.uk/crypt/md5 for details.\r
- */\r
- SHA1 : function (options) {\r
- /**\r
- * Private config properties. You may need to tweak these to be compatible with\r
- * the server-side, but the defaults work in most cases.\r
- * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}\r
- */\r
- var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase\r
- b64pad = (options && typeof options.pad === 'string') ? options.pda : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance\r
- utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding\r
-\r
- // public methods\r
- this.hex = function (s) { \r
- return rstr2hex(rstr(s, utf8), hexcase); \r
- };\r
- this.b64 = function (s) { \r
- return rstr2b64(rstr(s, utf8), b64pad);\r
- };\r
- this.any = function (s, e) { \r
- return rstr2any(rstr(s, utf8), e);\r
- };\r
- this.hex_hmac = function (k, d) {\r
- return rstr2hex(rstr_hmac(k, d));\r
- };\r
- this.b64_hmac = function (k, d) { \r
- return rstr2b64(rstr_hmac(k, d), b64pad); \r
- };\r
- this.any_hmac = function (k, d, e) { \r
- return rstr2any(rstr_hmac(k, d), e);\r
- };\r
- /**\r
- * Perform a simple self-test to see if the VM is working\r
- * @return {String} Hexadecimal hash sample\r
- * @public\r
- */\r
- this.vm_test = function () {\r
- return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';\r
- };\r
- /** \r
- * @description Enable/disable uppercase hexadecimal returned string \r
- * @param {boolean} \r
- * @return {Object} this\r
- * @public\r
- */ \r
- this.setUpperCase = function (a) {\r
- if (typeof a === 'boolean') {\r
- hexcase = a;\r
- }\r
- return this;\r
- };\r
- /** \r
- * @description Defines a base64 pad string \r
- * @param {string} Pad\r
- * @return {Object} this\r
- * @public\r
- */ \r
- this.setPad = function (a) {\r
- b64pad = a || b64pad;\r
- return this;\r
- };\r
- /** \r
- * @description Defines a base64 pad string \r
- * @param {boolean} \r
- * @return {Object} this\r
- * @public\r
- */ \r
- this.setUTF8 = function (a) {\r
- if (typeof a === 'boolean') {\r
- utf8 = a;\r
- }\r
- return this;\r
- };\r
-\r
- // private methods\r
-\r
- /**\r
- * Calculate the SHA-512 of a raw string\r
- */\r
- function rstr(s) {\r
- s = (utf8) ? utf8Encode(s) : s;\r
- return binb2rstr(binb(rstr2binb(s), s.length * 8));\r
- }\r
-\r
- /**\r
- * Calculate the HMAC-SHA1 of a key and some data (raw strings)\r
- */\r
- function rstr_hmac(key, data) {\r
- var bkey, ipad, opad, i, hash;\r
- key = (utf8) ? utf8Encode(key) : key;\r
- data = (utf8) ? utf8Encode(data) : data;\r
- bkey = rstr2binb(key);\r
-\r
- if (bkey.length > 16) {\r
- bkey = binb(bkey, key.length * 8);\r
- }\r
- ipad = Array(16), opad = Array(16);\r
- for (i = 0; i < 16; i+=1) {\r
- ipad[i] = bkey[i] ^ 0x36363636;\r
- opad[i] = bkey[i] ^ 0x5C5C5C5C;\r
- }\r
- hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);\r
- return binb2rstr(binb(opad.concat(hash), 512 + 160));\r
- }\r
-\r
- /**\r
- * Calculate the SHA-1 of an array of big-endian words, and a bit length\r
- */\r
- function binb(x, len) {\r
- var i, j, t, olda, oldb, oldc, oldd, olde,\r
- w = Array(80),\r
- a = 1732584193,\r
- b = -271733879,\r
- c = -1732584194,\r
- d = 271733878,\r
- e = -1009589776;\r
-\r
- /* append padding */\r
- x[len >> 5] |= 0x80 << (24 - len % 32);\r
- x[((len + 64 >> 9) << 4) + 15] = len;\r
-\r
- for (i = 0; i < x.length; i += 16) {\r
- olda = a,\r
- oldb = b;\r
- oldc = c;\r
- oldd = d;\r
- olde = e;\r
- \r
- for (j = 0; j < 80; j+=1) {\r
- if (j < 16) { \r
- w[j] = x[i + j]; \r
- } else { \r
- w[j] = bit_rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); \r
- }\r
- t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),\r
- safe_add(safe_add(e, w[j]), sha1_kt(j)));\r
- e = d;\r
- d = c;\r
- c = bit_rol(b, 30);\r
- b = a;\r
- a = t;\r
- }\r
-\r
- a = safe_add(a, olda);\r
- b = safe_add(b, oldb);\r
- c = safe_add(c, oldc);\r
- d = safe_add(d, oldd);\r
- e = safe_add(e, olde);\r
- }\r
- return Array(a, b, c, d, e);\r
- }\r
-\r
- /**\r
- * Perform the appropriate triplet combination function for the current\r
- * iteration\r
- */\r
- function sha1_ft(t, b, c, d) {\r
- if (t < 20) { return (b & c) | ((~b) & d); }\r
- if (t < 40) { return b ^ c ^ d; }\r
- if (t < 60) { return (b & c) | (b & d) | (c & d); }\r
- return b ^ c ^ d;\r
- }\r
-\r
- /**\r
- * Determine the appropriate additive constant for the current iteration\r
- */\r
- function sha1_kt(t) {\r
- return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :\r
- (t < 60) ? -1894007588 : -899497514;\r
- }\r
- },\r
- /**\r
- * @class Hashes.SHA256\r
- * @param {config}\r
- * \r
- * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2\r
- * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.\r
- * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\r
- * See http://pajhome.org.uk/crypt/md5 for details.\r
- * Also http://anmar.eu.org/projects/jssha2/\r
- */\r
- SHA256 : function (options) {\r
- /**\r
- * Private properties configuration variables. You may need to tweak these to be compatible with\r
- * the server-side, but the defaults work in most cases.\r
- * @see this.setUpperCase() method\r
- * @see this.setPad() method\r
- */\r
- var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase */\r
- b64pad = (options && typeof options.pad === 'string') ? options.pda : '=', /* base-64 pad character. Default '=' for strict RFC compliance */\r
- utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true, /* enable/disable utf8 encoding */\r
- sha256_K;\r
-\r
- /* privileged (public) methods */\r
- this.hex = function (s) { \r
- return rstr2hex(rstr(s, utf8)); \r
- };\r
- this.b64 = function (s) { \r
- return rstr2b64(rstr(s, utf8), b64pad);\r
- };\r
- this.any = function (s, e) { \r
- return rstr2any(rstr(s, utf8), e); \r
- };\r
- this.hex_hmac = function (k, d) { \r
- return rstr2hex(rstr_hmac(k, d)); \r
- };\r
- this.b64_hmac = function (k, d) { \r
- return rstr2b64(rstr_hmac(k, d), b64pad);\r
- };\r
- this.any_hmac = function (k, d, e) { \r
- return rstr2any(rstr_hmac(k, d), e); \r
- };\r
- /**\r
- * Perform a simple self-test to see if the VM is working\r
- * @return {String} Hexadecimal hash sample\r
- * @public\r
- */\r
- this.vm_test = function () {\r
- return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';\r
- };\r
- /** \r
- * Enable/disable uppercase hexadecimal returned string \r
- * @param {boolean} \r
- * @return {Object} this\r
- * @public\r
- */ \r
- this.setUpperCase = function (a) {\r
- if (typeof a === 'boolean') { \r
- hexcase = a;\r
- }\r
- return this;\r
- };\r
- /** \r
- * @description Defines a base64 pad string \r
- * @param {string} Pad\r
- * @return {Object} this\r
- * @public\r
- */ \r
- this.setPad = function (a) {\r
- b64pad = a || b64pad;\r
- return this;\r
- };\r
- /** \r
- * Defines a base64 pad string \r
- * @param {boolean} \r
- * @return {Object} this\r
- * @public\r
- */ \r
- this.setUTF8 = function (a) {\r
- if (typeof a === 'boolean') {\r
- utf8 = a;\r
- }\r
- return this;\r
- };\r
- \r
- // private methods\r
-\r
- /**\r
- * Calculate the SHA-512 of a raw string\r
- */\r
- function rstr(s, utf8) {\r
- s = (utf8) ? utf8Encode(s) : s;\r
- return binb2rstr(binb(rstr2binb(s), s.length * 8));\r
- }\r
-\r
- /**\r
- * Calculate the HMAC-sha256 of a key and some data (raw strings)\r
- */\r
- function rstr_hmac(key, data) {\r
- key = (utf8) ? utf8Encode(key) : key;\r
- data = (utf8) ? utf8Encode(data) : data;\r
- var hash, i = 0,\r
- bkey = rstr2binb(key), \r
- ipad = Array(16), \r
- opad = Array(16);\r
-\r
- if (bkey.length > 16) { bkey = binb(bkey, key.length * 8); }\r
- \r
- for (; i < 16; i+=1) {\r
- ipad[i] = bkey[i] ^ 0x36363636;\r
- opad[i] = bkey[i] ^ 0x5C5C5C5C;\r
- }\r
- \r
- hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);\r
- return binb2rstr(binb(opad.concat(hash), 512 + 256));\r
- }\r
- \r
- /*\r
- * Main sha256 function, with its support functions\r
- */\r
- function sha256_S (X, n) {return ( X >>> n ) | (X << (32 - n));}\r
- function sha256_R (X, n) {return ( X >>> n );}\r
- function sha256_Ch(x, y, z) {return ((x & y) ^ ((~x) & z));}\r
- function sha256_Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));}\r
- function sha256_Sigma0256(x) {return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));}\r
- function sha256_Sigma1256(x) {return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));}\r
- function sha256_Gamma0256(x) {return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));}\r
- function sha256_Gamma1256(x) {return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));}\r
- function sha256_Sigma0512(x) {return (sha256_S(x, 28) ^ sha256_S(x, 34) ^ sha256_S(x, 39));}\r
- function sha256_Sigma1512(x) {return (sha256_S(x, 14) ^ sha256_S(x, 18) ^ sha256_S(x, 41));}\r
- function sha256_Gamma0512(x) {return (sha256_S(x, 1) ^ sha256_S(x, 8) ^ sha256_R(x, 7));}\r
- function sha256_Gamma1512(x) {return (sha256_S(x, 19) ^ sha256_S(x, 61) ^ sha256_R(x, 6));}\r
- \r
- sha256_K = [\r
- 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993,\r
- -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,\r
- 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,\r
- 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986,\r
- -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,\r
- 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,\r
- 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885,\r
- -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,\r
- 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,\r
- 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872,\r
- -1866530822, -1538233109, -1090935817, -965641998\r
- ];\r
- \r
- function binb(m, l) {\r
- var HASH = [1779033703, -1150833019, 1013904242, -1521486534,\r
- 1359893119, -1694144372, 528734635, 1541459225];\r
- var W = new Array(64);\r
- var a, b, c, d, e, f, g, h;\r
- var i, j, T1, T2;\r
- \r
- /* append padding */\r
- m[l >> 5] |= 0x80 << (24 - l % 32);\r
- m[((l + 64 >> 9) << 4) + 15] = l;\r
- \r
- for (i = 0; i < m.length; i += 16)\r
- {\r
- a = HASH[0];\r
- b = HASH[1];\r
- c = HASH[2];\r
- d = HASH[3];\r
- e = HASH[4];\r
- f = HASH[5];\r
- g = HASH[6];\r
- h = HASH[7];\r
- \r
- for (j = 0; j < 64; j+=1)\r
- {\r
- if (j < 16) { \r
- W[j] = m[j + i];\r
- } else { \r
- W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),\r
- sha256_Gamma0256(W[j - 15])), W[j - 16]);\r
- }\r
- \r
- T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),\r
- sha256_K[j]), W[j]);\r
- T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));\r
- h = g;\r
- g = f;\r
- f = e;\r
- e = safe_add(d, T1);\r
- d = c;\r
- c = b;\r
- b = a;\r
- a = safe_add(T1, T2);\r
- }\r
- \r
- HASH[0] = safe_add(a, HASH[0]);\r
- HASH[1] = safe_add(b, HASH[1]);\r
- HASH[2] = safe_add(c, HASH[2]);\r
- HASH[3] = safe_add(d, HASH[3]);\r
- HASH[4] = safe_add(e, HASH[4]);\r
- HASH[5] = safe_add(f, HASH[5]);\r
- HASH[6] = safe_add(g, HASH[6]);\r
- HASH[7] = safe_add(h, HASH[7]);\r
- }\r
- return HASH;\r
- }\r
-\r
- },\r
-\r
- /**\r
- * @class Hashes.SHA512\r
- * @param {config}\r
- * \r
- * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2\r
- * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.\r
- * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\r
- * See http://pajhome.org.uk/crypt/md5 for details. \r
- */\r
- SHA512 : function (options) {\r
- /**\r
- * Private properties configuration variables. You may need to tweak these to be compatible with\r
- * the server-side, but the defaults work in most cases.\r
- * @see this.setUpperCase() method\r
- * @see this.setPad() method\r
- */\r
- var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false , /* hexadecimal output case format. false - lowercase; true - uppercase */\r
- b64pad = (options && typeof options.pad === 'string') ? options.pda : '=', /* base-64 pad character. Default '=' for strict RFC compliance */\r
- utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true, /* enable/disable utf8 encoding */\r
- sha512_k;\r
-\r
- /* privileged (public) methods */\r
- this.hex = function (s) { \r
- return rstr2hex(rstr(s)); \r
- };\r
- this.b64 = function (s) { \r
- return rstr2b64(rstr(s), b64pad); \r
- };\r
- this.any = function (s, e) { \r
- return rstr2any(rstr(s), e);\r
- };\r
- this.hex_hmac = function (k, d) {\r
- return rstr2hex(rstr_hmac(k, d));\r
- };\r
- this.b64_hmac = function (k, d) { \r
- return rstr2b64(rstr_hmac(k, d), b64pad);\r
- };\r
- this.any_hmac = function (k, d, e) { \r
- return rstr2any(rstr_hmac(k, d), e);\r
- };\r
- /**\r
- * Perform a simple self-test to see if the VM is working\r
- * @return {String} Hexadecimal hash sample\r
- * @public\r
- */\r
- this.vm_test = function () {\r
- return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';\r
- };\r
- /** \r
- * @description Enable/disable uppercase hexadecimal returned string \r
- * @param {boolean} \r
- * @return {Object} this\r
- * @public\r
- */ \r
- this.setUpperCase = function (a) {\r
- if (typeof a === 'boolean') {\r
- hexcase = a;\r
- }\r
- return this;\r
- };\r
- /** \r
- * @description Defines a base64 pad string \r
- * @param {string} Pad\r
- * @return {Object} this\r
- * @public\r
- */ \r
- this.setPad = function (a) {\r
- b64pad = a || b64pad;\r
- return this;\r
- };\r
- /** \r
- * @description Defines a base64 pad string \r
- * @param {boolean} \r
- * @return {Object} this\r
- * @public\r
- */ \r
- this.setUTF8 = function (a) {\r
- if (typeof a === 'boolean') {\r
- utf8 = a;\r
- }\r
- return this;\r
- };\r
-\r
- /* private methods */\r
- \r
- /**\r
- * Calculate the SHA-512 of a raw string\r
- */\r
- function rstr(s) {\r
- s = (utf8) ? utf8Encode(s) : s;\r
- return binb2rstr(binb(rstr2binb(s), s.length * 8));\r
- }\r
- /*\r
- * Calculate the HMAC-SHA-512 of a key and some data (raw strings)\r
- */\r
- function rstr_hmac(key, data) {\r
- key = (utf8) ? utf8Encode(key) : key;\r
- data = (utf8) ? utf8Encode(data) : data;\r
- \r
- var hash, i = 0, \r
- bkey = rstr2binb(key),\r
- ipad = Array(32), opad = Array(32);\r
-\r
- if (bkey.length > 32) { bkey = binb(bkey, key.length * 8); }\r
- \r
- for (; i < 32; i+=1) {\r
- ipad[i] = bkey[i] ^ 0x36363636;\r
- opad[i] = bkey[i] ^ 0x5C5C5C5C;\r
- }\r
- \r
- hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);\r
- return binb2rstr(binb(opad.concat(hash), 1024 + 512));\r
- }\r
- \r
- /**\r
- * Calculate the SHA-512 of an array of big-endian dwords, and a bit length\r
- */\r
- function binb(x, len) {\r
- var j, i, l,\r
- W = new Array(80),\r
- hash = new Array(16),\r
- //Initial hash values\r
- H = [\r
- new int64(0x6a09e667, -205731576),\r
- new int64(-1150833019, -2067093701),\r
- new int64(0x3c6ef372, -23791573),\r
- new int64(-1521486534, 0x5f1d36f1),\r
- new int64(0x510e527f, -1377402159),\r
- new int64(-1694144372, 0x2b3e6c1f),\r
- new int64(0x1f83d9ab, -79577749),\r
- new int64(0x5be0cd19, 0x137e2179)\r
- ],\r
- T1 = new int64(0, 0),\r
- T2 = new int64(0, 0),\r
- a = new int64(0,0),\r
- b = new int64(0,0),\r
- c = new int64(0,0),\r
- d = new int64(0,0),\r
- e = new int64(0,0),\r
- f = new int64(0,0),\r
- g = new int64(0,0),\r
- h = new int64(0,0),\r
- //Temporary variables not specified by the document\r
- s0 = new int64(0, 0),\r
- s1 = new int64(0, 0),\r
- Ch = new int64(0, 0),\r
- Maj = new int64(0, 0),\r
- r1 = new int64(0, 0),\r
- r2 = new int64(0, 0),\r
- r3 = new int64(0, 0);\r
-\r
- if (sha512_k === undefined) {\r
- //SHA512 constants\r
- sha512_k = [\r
- new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),\r
- new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),\r
- new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),\r
- new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),\r
- new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),\r
- new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),\r
- new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),\r
- new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),\r
- new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),\r
- new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),\r
- new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),\r
- new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),\r
- new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),\r
- new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),\r
- new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),\r
- new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),\r
- new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),\r
- new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),\r
- new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),\r
- new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),\r
- new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),\r
- new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),\r
- new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),\r
- new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),\r
- new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),\r
- new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),\r
- new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),\r
- new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),\r
- new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),\r
- new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),\r
- new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),\r
- new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),\r
- new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),\r
- new int64(-354779690, -840897762), new int64(-176337025, -294727304),\r
- new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),\r
- new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),\r
- new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),\r
- new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),\r
- new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),\r
- new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)\r
- ];\r
- }\r
- \r
- for (i=0; i<80; i+=1) {\r
- W[i] = new int64(0, 0);\r
- }\r
- \r
- // append padding to the source string. The format is described in the FIPS.\r
- x[len >> 5] |= 0x80 << (24 - (len & 0x1f));\r
- x[((len + 128 >> 10)<< 5) + 31] = len;\r
- l = x.length;\r
- for (i = 0; i<l; i+=32) { //32 dwords is the block size\r
- int64copy(a, H[0]);\r
- int64copy(b, H[1]);\r
- int64copy(c, H[2]);\r
- int64copy(d, H[3]);\r
- int64copy(e, H[4]);\r
- int64copy(f, H[5]);\r
- int64copy(g, H[6]);\r
- int64copy(h, H[7]);\r
- \r
- for (j=0; j<16; j+=1) {\r
- W[j].h = x[i + 2*j];\r
- W[j].l = x[i + 2*j + 1];\r
- }\r
- \r
- for (j=16; j<80; j+=1) {\r
- //sigma1\r
- int64rrot(r1, W[j-2], 19);\r
- int64revrrot(r2, W[j-2], 29);\r
- int64shr(r3, W[j-2], 6);\r
- s1.l = r1.l ^ r2.l ^ r3.l;\r
- s1.h = r1.h ^ r2.h ^ r3.h;\r
- //sigma0\r
- int64rrot(r1, W[j-15], 1);\r
- int64rrot(r2, W[j-15], 8);\r
- int64shr(r3, W[j-15], 7);\r
- s0.l = r1.l ^ r2.l ^ r3.l;\r
- s0.h = r1.h ^ r2.h ^ r3.h;\r
- \r
- int64add4(W[j], s1, W[j-7], s0, W[j-16]);\r
- }\r
- \r
- for (j = 0; j < 80; j+=1) {\r
- //Ch\r
- Ch.l = (e.l & f.l) ^ (~e.l & g.l);\r
- Ch.h = (e.h & f.h) ^ (~e.h & g.h);\r
- \r
- //Sigma1\r
- int64rrot(r1, e, 14);\r
- int64rrot(r2, e, 18);\r
- int64revrrot(r3, e, 9);\r
- s1.l = r1.l ^ r2.l ^ r3.l;\r
- s1.h = r1.h ^ r2.h ^ r3.h;\r
- \r
- //Sigma0\r
- int64rrot(r1, a, 28);\r
- int64revrrot(r2, a, 2);\r
- int64revrrot(r3, a, 7);\r
- s0.l = r1.l ^ r2.l ^ r3.l;\r
- s0.h = r1.h ^ r2.h ^ r3.h;\r
- \r
- //Maj\r
- Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);\r
- Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);\r
- \r
- int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);\r
- int64add(T2, s0, Maj);\r
- \r
- int64copy(h, g);\r
- int64copy(g, f);\r
- int64copy(f, e);\r
- int64add(e, d, T1);\r
- int64copy(d, c);\r
- int64copy(c, b);\r
- int64copy(b, a);\r
- int64add(a, T1, T2);\r
- }\r
- int64add(H[0], H[0], a);\r
- int64add(H[1], H[1], b);\r
- int64add(H[2], H[2], c);\r
- int64add(H[3], H[3], d);\r
- int64add(H[4], H[4], e);\r
- int64add(H[5], H[5], f);\r
- int64add(H[6], H[6], g);\r
- int64add(H[7], H[7], h);\r
- }\r
- \r
- //represent the hash as an array of 32-bit dwords\r
- for (i=0; i<8; i+=1) {\r
- hash[2*i] = H[i].h;\r
- hash[2*i + 1] = H[i].l;\r
- }\r
- return hash;\r
- }\r
- \r
- //A constructor for 64-bit numbers\r
- function int64(h, l) {\r
- this.h = h;\r
- this.l = l;\r
- //this.toString = int64toString;\r
- }\r
- \r
- //Copies src into dst, assuming both are 64-bit numbers\r
- function int64copy(dst, src) {\r
- dst.h = src.h;\r
- dst.l = src.l;\r
- }\r
- \r
- //Right-rotates a 64-bit number by shift\r
- //Won't handle cases of shift>=32\r
- //The function revrrot() is for that\r
- function int64rrot(dst, x, shift) {\r
- dst.l = (x.l >>> shift) | (x.h << (32-shift));\r
- dst.h = (x.h >>> shift) | (x.l << (32-shift));\r
- }\r
- \r
- //Reverses the dwords of the source and then rotates right by shift.\r
- //This is equivalent to rotation by 32+shift\r
- function int64revrrot(dst, x, shift) {\r
- dst.l = (x.h >>> shift) | (x.l << (32-shift));\r
- dst.h = (x.l >>> shift) | (x.h << (32-shift));\r
- }\r
- \r
- //Bitwise-shifts right a 64-bit number by shift\r
- //Won't handle shift>=32, but it's never needed in SHA512\r
- function int64shr(dst, x, shift) {\r
- dst.l = (x.l >>> shift) | (x.h << (32-shift));\r
- dst.h = (x.h >>> shift);\r
- }\r
- \r
- //Adds two 64-bit numbers\r
- //Like the original implementation, does not rely on 32-bit operations\r
- function int64add(dst, x, y) {\r
- var w0 = (x.l & 0xffff) + (y.l & 0xffff);\r
- var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);\r
- var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);\r
- var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);\r
- dst.l = (w0 & 0xffff) | (w1 << 16);\r
- dst.h = (w2 & 0xffff) | (w3 << 16);\r
- }\r
- \r
- //Same, except with 4 addends. Works faster than adding them one by one.\r
- function int64add4(dst, a, b, c, d) {\r
- var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);\r
- var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);\r
- var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);\r
- var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);\r
- dst.l = (w0 & 0xffff) | (w1 << 16);\r
- dst.h = (w2 & 0xffff) | (w3 << 16);\r
- }\r
- \r
- //Same, except with 5 addends\r
- function int64add5(dst, a, b, c, d, e) {\r
- var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),\r
- w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),\r
- w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),\r
- w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);\r
- dst.l = (w0 & 0xffff) | (w1 << 16);\r
- dst.h = (w2 & 0xffff) | (w3 << 16);\r
- }\r
- },\r
- /**\r
- * @class Hashes.RMD160\r
- * @constructor\r
- * @param {Object} [config]\r
- * \r
- * A JavaScript implementation of the RIPEMD-160 Algorithm\r
- * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.\r
- * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\r
- * See http://pajhome.org.uk/crypt/md5 for details.\r
- * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/\r
- */\r
- RMD160 : function (options) {\r
- /**\r
- * Private properties configuration variables. You may need to tweak these to be compatible with\r
- * the server-side, but the defaults work in most cases.\r
- * @see this.setUpperCase() method\r
- * @see this.setPad() method\r
- */\r
- var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, /* hexadecimal output case format. false - lowercase; true - uppercase */\r
- b64pad = (options && typeof options.pad === 'string') ? options.pda : '=', /* base-64 pad character. Default '=' for strict RFC compliance */\r
- utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true, /* enable/disable utf8 encoding */\r
- rmd160_r1 = [\r
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\r
- 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\r
- 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,\r
- 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,\r
- 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13\r
- ],\r
- rmd160_r2 = [\r
- 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,\r
- 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,\r
- 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,\r
- 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,\r
- 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11\r
- ],\r
- rmd160_s1 = [\r
- 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,\r
- 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,\r
- 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,\r
- 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,\r
- 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6\r
- ],\r
- rmd160_s2 = [\r
- 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,\r
- 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,\r
- 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,\r
- 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,\r
- 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11\r
- ];\r
-\r
- /* privileged (public) methods */\r
- this.hex = function (s) {\r
- return rstr2hex(rstr(s, utf8)); \r
- };\r
- this.b64 = function (s) {\r
- return rstr2b64(rstr(s, utf8), b64pad);\r
- };\r
- this.any = function (s, e) { \r
- return rstr2any(rstr(s, utf8), e);\r
- };\r
- this.hex_hmac = function (k, d) { \r
- return rstr2hex(rstr_hmac(k, d));\r
- };\r
- this.b64_hmac = function (k, d) { \r
- return rstr2b64(rstr_hmac(k, d), b64pad);\r
- };\r
- this.any_hmac = function (k, d, e) { \r
- return rstr2any(rstr_hmac(k, d), e); \r
- };\r
- /**\r
- * Perform a simple self-test to see if the VM is working\r
- * @return {String} Hexadecimal hash sample\r
- * @public\r
- */\r
- this.vm_test = function () {\r
- return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';\r
- };\r
- /** \r
- * @description Enable/disable uppercase hexadecimal returned string \r
- * @param {boolean} \r
- * @return {Object} this\r
- * @public\r
- */ \r
- this.setUpperCase = function (a) {\r
- if (typeof a === 'boolean' ) { hexcase = a; }\r
- return this;\r
- };\r
- /** \r
- * @description Defines a base64 pad string \r
- * @param {string} Pad\r
- * @return {Object} this\r
- * @public\r
- */ \r
- this.setPad = function (a) {\r
- if (typeof a !== 'undefined' ) { b64pad = a; }\r
- return this;\r
- };\r
- /** \r
- * @description Defines a base64 pad string \r
- * @param {boolean} \r
- * @return {Object} this\r
- * @public\r
- */ \r
- this.setUTF8 = function (a) {\r
- if (typeof a === 'boolean') { utf8 = a; }\r
- return this;\r
- };\r
-\r
- /* private methods */\r
-\r
- /**\r
- * Calculate the rmd160 of a raw string\r
- */\r
- function rstr(s) {\r
- s = (utf8) ? utf8Encode(s) : s;\r
- return binl2rstr(binl(rstr2binl(s), s.length * 8));\r
- }\r
-\r
- /**\r
- * Calculate the HMAC-rmd160 of a key and some data (raw strings)\r
- */\r
- function rstr_hmac(key, data) {\r
- key = (utf8) ? utf8Encode(key) : key;\r
- data = (utf8) ? utf8Encode(data) : data;\r
- var i, hash,\r
- bkey = rstr2binl(key),\r
- ipad = Array(16), opad = Array(16);\r
-\r
- if (bkey.length > 16) { \r
- bkey = binl(bkey, key.length * 8); \r
- }\r
- \r
- for (i = 0; i < 16; i+=1) {\r
- ipad[i] = bkey[i] ^ 0x36363636;\r
- opad[i] = bkey[i] ^ 0x5C5C5C5C;\r
- }\r
- hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\r
- return binl2rstr(binl(opad.concat(hash), 512 + 160));\r
- }\r
-\r
- /**\r
- * Convert an array of little-endian words to a string\r
- */\r
- function binl2rstr(input) {\r
- var i, output = '', l = input.length * 32;\r
- for (i = 0; i < l; i += 8) {\r
- output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);\r
- }\r
- return output;\r
- }\r
-\r
- /**\r
- * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.\r
- */\r
- function binl(x, len) {\r
- var T, j, i, l,\r
- h0 = 0x67452301,\r
- h1 = 0xefcdab89,\r
- h2 = 0x98badcfe,\r
- h3 = 0x10325476,\r
- h4 = 0xc3d2e1f0,\r
- A1, B1, C1, D1, E1,\r
- A2, B2, C2, D2, E2;\r
-\r
- /* append padding */\r
- x[len >> 5] |= 0x80 << (len % 32);\r
- x[(((len + 64) >>> 9) << 4) + 14] = len;\r
- l = x.length;\r
- \r
- for (i = 0; i < l; i+=16) {\r
- A1 = A2 = h0; B1 = B2 = h1; C1 = C2 = h2; D1 = D2 = h3; E1 = E2 = h4;\r
- for (j = 0; j <= 79; j+=1) {\r
- T = safe_add(A1, rmd160_f(j, B1, C1, D1));\r
- T = safe_add(T, x[i + rmd160_r1[j]]);\r
- T = safe_add(T, rmd160_K1(j));\r
- T = safe_add(bit_rol(T, rmd160_s1[j]), E1);\r
- A1 = E1; E1 = D1; D1 = bit_rol(C1, 10); C1 = B1; B1 = T;\r
- T = safe_add(A2, rmd160_f(79-j, B2, C2, D2));\r
- T = safe_add(T, x[i + rmd160_r2[j]]);\r
- T = safe_add(T, rmd160_K2(j));\r
- T = safe_add(bit_rol(T, rmd160_s2[j]), E2);\r
- A2 = E2; E2 = D2; D2 = bit_rol(C2, 10); C2 = B2; B2 = T;\r
- }\r
-\r
- T = safe_add(h1, safe_add(C1, D2));\r
- h1 = safe_add(h2, safe_add(D1, E2));\r
- h2 = safe_add(h3, safe_add(E1, A2));\r
- h3 = safe_add(h4, safe_add(A1, B2));\r
- h4 = safe_add(h0, safe_add(B1, C2));\r
- h0 = T;\r
- }\r
- return [h0, h1, h2, h3, h4];\r
- }\r
-\r
- // specific algorithm methods \r
- function rmd160_f(j, x, y, z) {\r
- return ( 0 <= j && j <= 15) ? (x ^ y ^ z) :\r
- (16 <= j && j <= 31) ? (x & y) | (~x & z) :\r
- (32 <= j && j <= 47) ? (x | ~y) ^ z :\r
- (48 <= j && j <= 63) ? (x & z) | (y & ~z) :\r
- (64 <= j && j <= 79) ? x ^ (y | ~z) :\r
- 'rmd160_f: j out of range';\r
- }\r
-\r
- function rmd160_K1(j) {\r
- return ( 0 <= j && j <= 15) ? 0x00000000 :\r
- (16 <= j && j <= 31) ? 0x5a827999 :\r
- (32 <= j && j <= 47) ? 0x6ed9eba1 :\r
- (48 <= j && j <= 63) ? 0x8f1bbcdc :\r
- (64 <= j && j <= 79) ? 0xa953fd4e :\r
- 'rmd160_K1: j out of range';\r
- }\r
-\r
- function rmd160_K2(j){\r
- return ( 0 <= j && j <= 15) ? 0x50a28be6 :\r
- (16 <= j && j <= 31) ? 0x5c4dd124 :\r
- (32 <= j && j <= 47) ? 0x6d703ef3 :\r
- (48 <= j && j <= 63) ? 0x7a6d76e9 :\r
- (64 <= j && j <= 79) ? 0x00000000 :\r
- 'rmd160_K2: j out of range';\r
- }\r
- }\r
-};\r
-\r
- // exposes Hashes\r
- (function( window, undefined ) {\r
- var freeExports = false;\r
- if (typeof exports === 'object' ) {\r
- freeExports = exports;\r
- if (exports && typeof global === 'object' && global && global === global.global ) { window = global; }\r
- }\r
-\r
- if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\r
- // define as an anonymous module, so, through path mapping, it can be aliased\r
- define(function () { return Hashes; });\r
- }\r
- else if ( freeExports ) {\r
- // in Node.js or RingoJS v0.8.0+\r
- if ( typeof module === 'object' && module && module.exports === freeExports ) {\r
- module.exports = Hashes;\r
- }\r
- // in Narwhal or RingoJS v0.7.0-\r
- else {\r
- freeExports.Hashes = Hashes;\r
- }\r
- }\r
- else {\r
- // in a browser or Rhino\r
- window.Hashes = Hashes;\r
- }\r
- }( this ));\r
-}()); // IIFE
-})(window)
-},{}]},{},[1])(1)
-});
-;/******************************************************************************
- rtree.js - General-Purpose Non-Recursive Javascript R-Tree Library
- Version 0.6.2, December 5st 2009
-
-@license Copyright (c) 2009 Jon-Carlos Rivera
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
- Jon-Carlos Rivera - imbcmdth@hotmail.com
-******************************************************************************/
-
-/**
- * RTree - A simple r-tree structure for great results.
- * @constructor
- */
-var RTree = function(width){
- // Variables to control tree-dimensions
- var _Min_Width = 3; // Minimum width of any node before a merge
- var _Max_Width = 6; // Maximum width of any node before a split
- if(!isNaN(width)){ _Min_Width = Math.floor(width/2.0); _Max_Width = width;}
- // Start with an empty root-tree
- var _T = {x:0, y:0, w:0, h:0, id:"root", nodes:[] };
-
- var isArray = function(o) {
- return Object.prototype.toString.call(o) === '[object Array]';
- };
-
- /**@function
- * @description Function to generate unique strings for element IDs
- * @param {String} n The prefix to use for the IDs generated.
- * @return {String} A guarenteed unique ID.
- */
- var _name_to_id = (function() {
- // hide our idCache inside this closure
- var idCache = {};
-
- // return the api: our function that returns a unique string with incrementing number appended to given idPrefix
- return function(idPrefix) {
- var idVal = 0;
- if(idPrefix in idCache) {
- idVal = idCache[idPrefix]++;
- } else {
- idCache[idPrefix] = 0;
- }
- return idPrefix + "_" + idVal;
- }
- })();
-
- // This is my special addition to the world of r-trees
- // every other (simple) method I found produced crap trees
- // this skews insertions to prefering squarer and emptier nodes
- RTree.Rectangle.squarified_ratio = function(l, w, fill) {
- // Area of new enlarged rectangle
- var lperi = (l + w) / 2.0; // Average size of a side of the new rectangle
- var larea = l * w; // Area of new rectangle
- // return the ratio of the perimeter to the area - the closer to 1 we are,
- // the more "square" a rectangle is. conversly, when approaching zero the
- // more elongated a rectangle is
- var lgeo = larea / (lperi*lperi);
- return(larea * fill / lgeo);
- };
-
- /**find the best specific node(s) for object to be deleted from
- * [ leaf node parent ] = _remove_subtree(rectangle, object, root)
- * @private
- */
- var _remove_subtree = function(rect, obj, root) {
- var hit_stack = []; // Contains the elements that overlap
- var count_stack = []; // Contains the elements that overlap
- var ret_array = [];
- var current_depth = 1;
-
- if(!rect || !RTree.Rectangle.overlap_rectangle(rect, root))
- return ret_array;
-
- var ret_obj = {x:rect.x, y:rect.y, w:rect.w, h:rect.h, target:obj};
-
- count_stack.push(root.nodes.length);
- hit_stack.push(root);
-
- do {
- var tree = hit_stack.pop();
- var i = count_stack.pop()-1;
-
- if("target" in ret_obj) { // We are searching for a target
- while(i >= 0) {
- var ltree = tree.nodes[i];
- if(RTree.Rectangle.overlap_rectangle(ret_obj, ltree)) {
- if( (ret_obj.target && "leaf" in ltree && ltree.leaf === ret_obj.target)
- ||(!ret_obj.target && ("leaf" in ltree || RTree.Rectangle.contains_rectangle(ltree, ret_obj)))) { // A Match !!
- // Yup we found a match...
- // we can cancel search and start walking up the list
- if("nodes" in ltree) {// If we are deleting a node not a leaf...
- ret_array = _search_subtree(ltree, true, [], ltree);
- tree.nodes.splice(i, 1);
- } else {
- ret_array = tree.nodes.splice(i, 1);
- }
- // Resize MBR down...
- RTree.Rectangle.make_MBR(tree.nodes, tree);
- delete ret_obj.target;
- if(tree.nodes.length < _Min_Width) { // Underflow
- ret_obj.nodes = _search_subtree(tree, true, [], tree);
- }
- break;
- }/* else if("load" in ltree) { // A load
- }*/ else if("nodes" in ltree) { // Not a Leaf
- current_depth += 1;
- count_stack.push(i);
- hit_stack.push(tree);
- tree = ltree;
- i = ltree.nodes.length;
- }
- }
- i -= 1;
- }
- } else if("nodes" in ret_obj) { // We are unsplitting
- tree.nodes.splice(i+1, 1); // Remove unsplit node
- // ret_obj.nodes contains a list of elements removed from the tree so far
- if(tree.nodes.length > 0)
- RTree.Rectangle.make_MBR(tree.nodes, tree);
- for(var t = 0;t<ret_obj.nodes.length;t++)
- _insert_subtree(ret_obj.nodes[t], tree);
- ret_obj.nodes.length = 0;
- if(hit_stack.length == 0 && tree.nodes.length <= 1) { // Underflow..on root!
- ret_obj.nodes = _search_subtree(tree, true, ret_obj.nodes, tree);
- tree.nodes.length = 0;
- hit_stack.push(tree);
- count_stack.push(1);
- } else if(hit_stack.length > 0 && tree.nodes.length < _Min_Width) { // Underflow..AGAIN!
- ret_obj.nodes = _search_subtree(tree, true, ret_obj.nodes, tree);
- tree.nodes.length = 0;
- }else {
- delete ret_obj.nodes; // Just start resizing
- }
- } else { // we are just resizing
- RTree.Rectangle.make_MBR(tree.nodes, tree);
- }
- current_depth -= 1;
- }while(hit_stack.length > 0);
-
- return(ret_array);
- };
-
- /**choose the best damn node for rectangle to be inserted into
- * [ leaf node parent ] = _choose_leaf_subtree(rectangle, root to start search at)
- * @private
- */
- var _choose_leaf_subtree = function(rect, root) {
- var best_choice_index = -1;
- var best_choice_stack = [];
- var best_choice_area;
-
- var load_callback = function(local_tree, local_node){
- return(function(data) {
- local_tree._attach_data(local_node, data);
- });
- };
-
- best_choice_stack.push(root);
- var nodes = root.nodes;
-
- do {
- if(best_choice_index != -1) {
- best_choice_stack.push(nodes[best_choice_index]);
- nodes = nodes[best_choice_index].nodes;
- best_choice_index = -1;
- }
-
- for(var i = nodes.length-1; i >= 0; i--) {
- var ltree = nodes[i];
- if("leaf" in ltree) {
- // Bail out of everything and start inserting
- best_choice_index = -1;
- break;
- } /*else if(ltree.load) {
- throw( "Can't insert into partially loaded tree ... yet!");
- //jQuery.getJSON(ltree.load, load_callback(this, ltree));
- //delete ltree.load;
- }*/
- // Area of new enlarged rectangle
- var old_lratio = RTree.Rectangle.squarified_ratio(ltree.w, ltree.h, ltree.nodes.length+1);
-
- // Enlarge rectangle to fit new rectangle
- var nw = Math.max(ltree.x+ltree.w, rect.x+rect.w) - Math.min(ltree.x, rect.x);
- var nh = Math.max(ltree.y+ltree.h, rect.y+rect.h) - Math.min(ltree.y, rect.y);
-
- // Area of new enlarged rectangle
- var lratio = RTree.Rectangle.squarified_ratio(nw, nh, ltree.nodes.length+2);
-
- if(best_choice_index < 0 || Math.abs(lratio - old_lratio) < best_choice_area) {
- best_choice_area = Math.abs(lratio - old_lratio); best_choice_index = i;
- }
- }
- }while(best_choice_index != -1);
-
- return(best_choice_stack);
- };
-
- /**split a set of nodes into two roughly equally-filled nodes
- * [ an array of two new arrays of nodes ] = linear_split(array of nodes)
- * @private
- */
- var _linear_split = function(nodes) {
- var n = _pick_linear(nodes);
- while(nodes.length > 0) {
- _pick_next(nodes, n[0], n[1]);
- }
- return(n);
- };
-
- /**insert the best source rectangle into the best fitting parent node: a or b
- * [] = pick_next(array of source nodes, target node array a, target node array b)
- * @private
- */
- var _pick_next = function(nodes, a, b) {
- // Area of new enlarged rectangle
- var area_a = RTree.Rectangle.squarified_ratio(a.w, a.h, a.nodes.length+1);
- var area_b = RTree.Rectangle.squarified_ratio(b.w, b.h, b.nodes.length+1);
- var high_area_delta;
- var high_area_node;
- var lowest_growth_group;
-
- for(var i = nodes.length-1; i>=0;i--) {
- var l = nodes[i];
- var new_area_a = {};
- new_area_a.x = Math.min(a.x, l.x); new_area_a.y = Math.min(a.y, l.y);
- new_area_a.w = Math.max(a.x+a.w, l.x+l.w) - new_area_a.x; new_area_a.h = Math.max(a.y+a.h, l.y+l.h) - new_area_a.y;
- var change_new_area_a = Math.abs(RTree.Rectangle.squarified_ratio(new_area_a.w, new_area_a.h, a.nodes.length+2) - area_a);
-
- var new_area_b = {};
- new_area_b.x = Math.min(b.x, l.x); new_area_b.y = Math.min(b.y, l.y);
- new_area_b.w = Math.max(b.x+b.w, l.x+l.w) - new_area_b.x; new_area_b.h = Math.max(b.y+b.h, l.y+l.h) - new_area_b.y;
- var change_new_area_b = Math.abs(RTree.Rectangle.squarified_ratio(new_area_b.w, new_area_b.h, b.nodes.length+2) - area_b);
-
- if( !high_area_node || !high_area_delta || Math.abs( change_new_area_b - change_new_area_a ) < high_area_delta ) {
- high_area_node = i;
- high_area_delta = Math.abs(change_new_area_b-change_new_area_a);
- lowest_growth_group = change_new_area_b < change_new_area_a ? b : a;
- }
- }
- var temp_node = nodes.splice(high_area_node, 1)[0];
- if(a.nodes.length + nodes.length + 1 <= _Min_Width) {
- a.nodes.push(temp_node);
- RTree.Rectangle.expand_rectangle(a, temp_node);
- } else if(b.nodes.length + nodes.length + 1 <= _Min_Width) {
- b.nodes.push(temp_node);
- RTree.Rectangle.expand_rectangle(b, temp_node);
- }
- else {
- lowest_growth_group.nodes.push(temp_node);
- RTree.Rectangle.expand_rectangle(lowest_growth_group, temp_node);
- }
- };
-
- /**pick the "best" two starter nodes to use as seeds using the "linear" criteria
- * [ an array of two new arrays of nodes ] = pick_linear(array of source nodes)
- * @private
- */
- var _pick_linear = function(nodes) {
- var lowest_high_x = nodes.length-1;
- var highest_low_x = 0;
- var lowest_high_y = nodes.length-1;
- var highest_low_y = 0;
- var t1, t2;
-
- for(var i = nodes.length-2; i>=0;i--) {
- var l = nodes[i];
- if(l.x > nodes[highest_low_x].x ) highest_low_x = i;
- else if(l.x+l.w < nodes[lowest_high_x].x+nodes[lowest_high_x].w) lowest_high_x = i;
- if(l.y > nodes[highest_low_y].y ) highest_low_y = i;
- else if(l.y+l.h < nodes[lowest_high_y].y+nodes[lowest_high_y].h) lowest_high_y = i;
- }
- var dx = Math.abs((nodes[lowest_high_x].x+nodes[lowest_high_x].w) - nodes[highest_low_x].x);
- var dy = Math.abs((nodes[lowest_high_y].y+nodes[lowest_high_y].h) - nodes[highest_low_y].y);
- if( dx > dy ) {
- if(lowest_high_x > highest_low_x) {
- t1 = nodes.splice(lowest_high_x, 1)[0];
- t2 = nodes.splice(highest_low_x, 1)[0];
- } else {
- t2 = nodes.splice(highest_low_x, 1)[0];
- t1 = nodes.splice(lowest_high_x, 1)[0];
- }
- } else {
- if(lowest_high_y > highest_low_y) {
- t1 = nodes.splice(lowest_high_y, 1)[0];
- t2 = nodes.splice(highest_low_y, 1)[0];
- } else {
- t2 = nodes.splice(highest_low_y, 1)[0];
- t1 = nodes.splice(lowest_high_y, 1)[0];
- }
- }
- return([{x:t1.x, y:t1.y, w:t1.w, h:t1.h, nodes:[t1]},
- {x:t2.x, y:t2.y, w:t2.w, h:t2.h, nodes:[t2]} ]);
- };
-
- var _attach_data = function(node, more_tree){
- node.nodes = more_tree.nodes;
- node.x = more_tree.x; node.y = more_tree.y;
- node.w = more_tree.w; node.h = more_tree.h;
- return(node);
- };
-
- /**non-recursive internal search function
- * [ nodes | objects ] = _search_subtree(rectangle, [return node data], [array to fill], root to begin search at)
- * @private
- */
- var _search_subtree = function(rect, return_node, return_array, root) {
- var hit_stack = []; // Contains the elements that overlap
-
- if(!RTree.Rectangle.overlap_rectangle(rect, root))
- return(return_array);
-
- var load_callback = function(local_tree, local_node){
- return(function(data) {
- local_tree._attach_data(local_node, data);
- });
- };
-
- hit_stack.push(root.nodes);
-
- do {
- var nodes = hit_stack.pop();
-
- for(var i = nodes.length-1; i >= 0; i--) {
- var ltree = nodes[i];
- if(RTree.Rectangle.overlap_rectangle(rect, ltree)) {
- if("nodes" in ltree) { // Not a Leaf
- hit_stack.push(ltree.nodes);
- } else if("leaf" in ltree) { // A Leaf !!
- if(!return_node)
- return_array.push(ltree.leaf);
- else
- return_array.push(ltree);
- }/* else if("load" in ltree) { // We need to fetch a URL for some more tree data
- jQuery.getJSON(ltree.load, load_callback(this, ltree));
- delete ltree.load;
- // i++; // Replay this entry
- }*/
- }
- }
- }while(hit_stack.length > 0);
-
- return(return_array);
- };
-
- /**non-recursive internal insert function
- * [] = _insert_subtree(rectangle, object to insert, root to begin insertion at)
- * @private
- */
- var _insert_subtree = function(node, root) {
- var bc; // Best Current node
- // Initial insertion is special because we resize the Tree and we don't
- // care about any overflow (seriously, how can the first object overflow?)
- if(root.nodes.length == 0) {
- root.x = node.x; root.y = node.y;
- root.w = node.w; root.h = node.h;
- root.nodes.push(node);
- return;
- }
-
- // Find the best fitting leaf node
- // choose_leaf returns an array of all tree levels (including root)
- // that were traversed while trying to find the leaf
- var tree_stack = _choose_leaf_subtree(node, root);
- var ret_obj = node;//{x:rect.x,y:rect.y,w:rect.w,h:rect.h, leaf:obj};
-
- // Walk back up the tree resizing and inserting as needed
- do {
- //handle the case of an empty node (from a split)
- if(bc && "nodes" in bc && bc.nodes.length == 0) {
- var pbc = bc; // Past bc
- bc = tree_stack.pop();
- for(var t=0;t<bc.nodes.length;t++)
- if(bc.nodes[t] === pbc || bc.nodes[t].nodes.length == 0) {
- bc.nodes.splice(t, 1);
- break;
- }
- } else {
- bc = tree_stack.pop();
- }
-
- // If there is data attached to this ret_obj
- if("leaf" in ret_obj || "nodes" in ret_obj || isArray(ret_obj)) {
- // Do Insert
- if(isArray(ret_obj)) {
- for(var ai = 0; ai < ret_obj.length; ai++) {
- RTree.Rectangle.expand_rectangle(bc, ret_obj[ai]);
- }
- bc.nodes = bc.nodes.concat(ret_obj);
- } else {
- RTree.Rectangle.expand_rectangle(bc, ret_obj);
- bc.nodes.push(ret_obj); // Do Insert
- }
-
- if(bc.nodes.length <= _Max_Width) { // Start Resizeing Up the Tree
- ret_obj = {x:bc.x,y:bc.y,w:bc.w,h:bc.h};
- } else { // Otherwise Split this Node
- // linear_split() returns an array containing two new nodes
- // formed from the split of the previous node's overflow
- var a = _linear_split(bc.nodes);
- ret_obj = a;//[1];
-
- if(tree_stack.length < 1) { // If are splitting the root..
- bc.nodes.push(a[0]);
- tree_stack.push(bc); // Reconsider the root element
- ret_obj = a[1];
- } /*else {
- delete bc;
- }*/
- }
- } else { // Otherwise Do Resize
- //Just keep applying the new bounding rectangle to the parents..
- RTree.Rectangle.expand_rectangle(bc, ret_obj);
- ret_obj = {x:bc.x,y:bc.y,w:bc.w,h:bc.h};
- }
- } while(tree_stack.length > 0);
- };
-
- /**quick 'n' dirty function for plugins or manually drawing the tree
- * [ tree ] = RTree.get_tree(): returns the raw tree data. useful for adding
- * @public
- * !! DEPRECATED !!
- */
- this.get_tree = function() {
- return _T;
- };
-
- /**quick 'n' dirty function for plugins or manually loading the tree
- * [ tree ] = RTree.set_tree(sub-tree, where to attach): returns the raw tree data. useful for adding
- * @public
- * !! DEPRECATED !!
- */
- this.set_tree = function(new_tree, where) {
- if(!where)
- where = _T;
- return(_attach_data(where, new_tree));
- };
-
- /**non-recursive search function
- * [ nodes | objects ] = RTree.search(rectangle, [return node data], [array to fill])
- * @public
- */
- this.search = function(rect, return_node, return_array) {
- if(arguments.length < 1)
- throw "Wrong number of arguments. RT.Search requires at least a bounding rectangle."
-
- switch(arguments.length) {
- case 1:
- arguments[1] = false;// Add an "return node" flag - may be removed in future
- case 2:
- arguments[2] = []; // Add an empty array to contain results
- case 3:
- arguments[3] = _T; // Add root node to end of argument list
- default:
- arguments.length = 4;
- }
- return(_search_subtree.apply(this, arguments));
- };
-
- /**partially-recursive toJSON function
- * [ string ] = RTree.toJSON([rectangle], [tree])
- * @public
- */
- this.toJSON = function(rect, tree) {
- var hit_stack = []; // Contains the elements that overlap
- var count_stack = []; // Contains the elements that overlap
- var return_stack = {}; // Contains the elements that overlap
- var max_depth = 3; // This triggers recursion and tree-splitting
- var current_depth = 1;
- var return_string = "";
-
- if(rect && !RTree.Rectangle.overlap_rectangle(rect, _T))
- return "";
-
- if(!tree) {
- count_stack.push(_T.nodes.length);
- hit_stack.push(_T.nodes);
- return_string += "var main_tree = {x:"+_T.x.toFixed()+",y:"+_T.y.toFixed()+",w:"+_T.w.toFixed()+",h:"+_T.h.toFixed()+",nodes:[";
- } else {
- max_depth += 4;
- count_stack.push(tree.nodes.length);
- hit_stack.push(tree.nodes);
- return_string += "var main_tree = {x:"+tree.x.toFixed()+",y:"+tree.y.toFixed()+",w:"+tree.w.toFixed()+",h:"+tree.h.toFixed()+",nodes:[";
- }
-
- do {
- var nodes = hit_stack.pop();
- var i = count_stack.pop()-1;
-
- if(i >= 0 && i < nodes.length-1)
- return_string += ",";
-
- while(i >= 0) {
- var ltree = nodes[i];
- if(!rect || RTree.Rectangle.overlap_rectangle(rect, ltree)) {
- if(ltree.nodes) { // Not a Leaf
- if(current_depth >= max_depth) {
- var len = return_stack.length;
- var nam = _name_to_id("saved_subtree");
- return_string += "{x:"+ltree.x.toFixed()+",y:"+ltree.y.toFixed()+",w:"+ltree.w.toFixed()+",h:"+ltree.h.toFixed()+",load:'"+nam+".js'}";
- return_stack[nam] = this.toJSON(rect, ltree);
- if(i > 0)
- return_string += ","
- } else {
- return_string += "{x:"+ltree.x.toFixed()+",y:"+ltree.y.toFixed()+",w:"+ltree.w.toFixed()+",h:"+ltree.h.toFixed()+",nodes:[";
- current_depth += 1;
- count_stack.push(i);
- hit_stack.push(nodes);
- nodes = ltree.nodes;
- i = ltree.nodes.length;
- }
- } else if(ltree.leaf) { // A Leaf !!
- var data = ltree.leaf.toJSON ? ltree.leaf.toJSON() : JSON.stringify(ltree.leaf);
- return_string += "{x:"+ltree.x.toFixed()+",y:"+ltree.y.toFixed()+",w:"+ltree.w.toFixed()+",h:"+ltree.h.toFixed()+",leaf:" + data + "}";
- if(i > 0)
- return_string += ","
- } else if(ltree.load) { // A load
- return_string += "{x:"+ltree.x.toFixed()+",y:"+ltree.y.toFixed()+",w:"+ltree.w.toFixed()+",h:"+ltree.h.toFixed()+",load:'" + ltree.load + "'}";
- if(i > 0)
- return_string += ","
- }
- }
- i -= 1;
- }
- if(i < 0) {
- return_string += "]}"; current_depth -= 1;
- }
- }while(hit_stack.length > 0);
-
- return_string+=";";
-
- for(var my_key in return_stack) {
- return_string += "\nvar " + my_key + " = function(){" + return_stack[my_key] + " return(main_tree);};";
- }
- return(return_string);
- };
-
- /**non-recursive function that deletes a specific
- * [ number ] = RTree.remove(rectangle, obj)
- */
- this.remove = function(rect, obj) {
- if(arguments.length < 1)
- throw "Wrong number of arguments. RT.remove requires at least a bounding rectangle."
-
- switch(arguments.length) {
- case 1:
- arguments[1] = false; // obj == false for conditionals
- case 2:
- arguments[2] = _T; // Add root node to end of argument list
- default:
- arguments.length = 3;
- }
- if(arguments[1] === false) { // Do area-wide delete
- var numberdeleted = 0;
- var ret_array = [];
- do {
- numberdeleted=ret_array.length;
- ret_array = ret_array.concat(_remove_subtree.apply(this, arguments));
- }while( numberdeleted != ret_array.length);
- return ret_array;
- }
- else { // Delete a specific item
- return(_remove_subtree.apply(this, arguments));
- }
- };
-
- /**non-recursive insert function
- * [] = RTree.insert(rectangle, object to insert)
- */
- this.insert = function(rect, obj) {
-/* if(arguments.length < 2)
- throw "Wrong number of arguments. RT.Insert requires at least a bounding rectangle and an object."*/
-
- return(_insert_subtree({x:rect.x,y:rect.y,w:rect.w,h:rect.h,leaf:obj}, _T));
- };
-
- /**non-recursive delete function
- * [deleted object] = RTree.remove(rectangle, [object to delete])
- */
-
-//End of RTree
-};
-
-/**Rectangle - Generic rectangle object - Not yet used */
-
-RTree.Rectangle = function(ix, iy, iw, ih) { // new Rectangle(bounds) or new Rectangle(x, y, w, h)
- var x, x2, y, y2, w, h;
-
- if(ix.x) {
- x = ix.x; y = ix.y;
- if(ix.w !== 0 && !ix.w && ix.x2){
- w = ix.x2-ix.x; h = ix.y2-ix.y;
- } else {
- w = ix.w; h = ix.h;
- }
- x2 = x + w; y2 = y + h; // For extra fastitude
- } else {
- x = ix; y = iy; w = iw; h = ih;
- x2 = x + w; y2 = y + h; // For extra fastitude
- }
-
- this.x1 = this.x = x;
- this.y1 = this.y = y;
- this.x2 = x2;
- this.y2 = y2;
- this.w = w;
- this.h = h;
-
- this.toJSON = function() {
- return('{"x":'+x.toString()+', "y":'+y.toString()+', "w":'+w.toString()+', "h":'+h.toString()+'}');
- };
-
- this.overlap = function(a) {
- return(this.x() < a.x2() && this.x2() > a.x() && this.y() < a.y2() && this.y2() > a.y());
- };
-
- this.expand = function(a) {
- var nx = Math.min(this.x(), a.x());
- var ny = Math.min(this.y(), a.y());
- w = Math.max(this.x2(), a.x2()) - nx;
- h = Math.max(this.y2(), a.y2()) - ny;
- x = nx; y = ny;
- return(this);
- };
-
- this.setRect = function(ix, iy, iw, ih) {
- var x, x2, y, y2, w, h;
- if(ix.x) {
- x = ix.x; y = ix.y;
- if(ix.w !== 0 && !ix.w && ix.x2) {
- w = ix.x2-ix.x; h = ix.y2-ix.y;
- } else {
- w = ix.w; h = ix.h;
- }
- x2 = x + w; y2 = y + h; // For extra fastitude
- } else {
- x = ix; y = iy; w = iw; h = ih;
- x2 = x + w; y2 = y + h; // For extra fastitude
- }
- };
-//End of RTree.Rectangle
-};
-
-
-/**returns true if rectangle 1 overlaps rectangle 2
- * [ boolean ] = overlap_rectangle(rectangle a, rectangle b)
- * @static function
- */
-RTree.Rectangle.overlap_rectangle = function(a, b) {
- return(a.x < (b.x+b.w) && (a.x+a.w) > b.x && a.y < (b.y+b.h) && (a.y+a.h) > b.y);
-};
-
-/**returns true if rectangle a is contained in rectangle b
- * [ boolean ] = contains_rectangle(rectangle a, rectangle b)
- * @static function
- */
-RTree.Rectangle.contains_rectangle = function(a, b) {
- return((a.x+a.w) <= (b.x+b.w) && a.x >= b.x && (a.y+a.h) <= (b.y+b.h) && a.y >= b.y);
-};
-
-/**expands rectangle A to include rectangle B, rectangle B is untouched
- * [ rectangle a ] = expand_rectangle(rectangle a, rectangle b)
- * @static function
- */
-RTree.Rectangle.expand_rectangle = function(a, b) {
- var nx = Math.min(a.x, b.x);
- var ny = Math.min(a.y, b.y);
- a.w = Math.max(a.x+a.w, b.x+b.w) - nx;
- a.h = Math.max(a.y+a.h, b.y+b.h) - ny;
- a.x = nx; a.y = ny;
- return(a);
-};
-
-/**generates a minimally bounding rectangle for all rectangles in
- * array "nodes". If rect is set, it is modified into the MBR. Otherwise,
- * a new rectangle is generated and returned.
- * [ rectangle a ] = make_MBR(rectangle array nodes, rectangle rect)
- * @static function
- */
-RTree.Rectangle.make_MBR = function(nodes, rect) {
- if(nodes.length < 1)
- return({x:0, y:0, w:0, h:0});
- //throw "make_MBR: nodes must contain at least one rectangle!";
- if(!rect)
- rect = {x:nodes[0].x, y:nodes[0].y, w:nodes[0].w, h:nodes[0].h};
- else
- rect.x = nodes[0].x; rect.y = nodes[0].y; rect.w = nodes[0].w; rect.h = nodes[0].h;
-
- for(var i = nodes.length-1; i>0; i--)
- RTree.Rectangle.expand_rectangle(rect, nodes[i]);
-
- return(rect);
-};
-toGeoJSON = (function() {
- var removeSpace = (/\s*/g), trimSpace = (/^\s*|\s*$/g), splitSpace = (/\s+/);
- function okhash(x) {
- if (!x || !x.length) return 0;
- for (var i = 0, h = 0; i < x.length; i++) {
- h = ((h << 5) - h) + x.charCodeAt(i) | 0;
- } return h;
- }
- function get(x, y) { return x.getElementsByTagName(y); }
- function attr(x, y) { return x.getAttribute(y); }
- function attrf(x, y) { return parseFloat(attr(x, y)); }
- function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
- function numarray(x) {
- for (var j = 0, o = []; j < x.length; j++) o[j] = parseFloat(x[j]);
- return o;
- }
- function nodeVal(x) { return x && x.firstChild && x.firstChild.nodeValue; }
- function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
- function coord(v) {
- var coords = v.replace(trimSpace, '').split(splitSpace), o = [];
- for (var i = 0; i < coords.length; i++) o.push(coord1(coords[i]));
- return o;
- }
- function fc() { return { type: 'FeatureCollection', features: [] }; }
- var t = {
- kml: function(doc, o) {
- o = o || {};
- var gj = fc(), styleIndex = {},
- geotypes = ['Polygon', 'LineString', 'Point'],
- placemarks = get(doc, 'Placemark'), styles = get(doc, 'Style');
-
- if (o.styles) for (var k = 0; k < styles.length; k++) {
- styleIndex['#' + styles[k].id] = okhash(styles[k].innerHTML).toString(16);
- }
- for (var j = 0; j < placemarks.length; j++) {
- gj.features = gj.features.concat(getPlacemark(placemarks[j]));
- }
- function getGeometry(root) {
- var geomNode, geomNodes, i, j, k, geoms = [];
- if (get1(root, 'MultiGeometry')) return getGeometry(get1(root, 'MultiGeometry'));
- for (i = 0; i < geotypes.length; i++) {
- geomNodes = get(root, geotypes[i]);
- if (geomNodes) {
- for (j = 0; j < geomNodes.length; j++) {
- geomNode = geomNodes[j];
- if (geotypes[i] == 'Point') {
- geoms.push({ type: 'Point',
- coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
- });
- } else if (geotypes[i] == 'LineString') {
- geoms.push({ type: 'LineString',
- coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
- });
- } else if (geotypes[i] == 'Polygon') {
- var rings = get(geomNode, 'LinearRing'), coords = [];
- for (k = 0; k < rings.length; k++) {
- coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
- }
- geoms.push({ type: 'Polygon', coordinates: coords });
- }
- }
- }
- }
- return geoms;
- }
- function getPlacemark(root) {
- var geoms = getGeometry(root), i, properties = {},
- name = nodeVal(get1(root, 'name')),
- styleUrl = nodeVal(get1(root, 'styleUrl')),
- description = nodeVal(get1(root, 'description')),
- extendedData = get1(root, 'ExtendedData');
-
- if (!geoms.length) return false;
- if (name) properties.name = name;
- if (styleUrl && styleIndex[styleUrl]) {
- properties.styleUrl = styleUrl;
- properties.styleHash = styleIndex[styleUrl];
- }
- if (description) properties.description = description;
- if (extendedData) {
- var datas = get(extendedData, 'Data'),
- simpleDatas = get(extendedData, 'SimpleData');
-
- for (i = 0; i < datas.length; i++) {
- properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
- }
- for (i = 0; i < simpleDatas.length; i++) {
- properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
- }
- }
- return [{ type: 'Feature', geometry: (geoms.length === 1) ? geoms[0] : {
- type: 'GeometryCollection',
- geometries: geoms }, properties: properties }];
- }
- return gj;
- },
- gpx: function(doc, o) {
- var i, j, tracks = get(doc, 'trk'), track, pt, gj = fc();
- for (i = 0; i < tracks.length; i++) {
- track = tracks[i];
- var name = nodeVal(get1(track, 'name'));
- var pts = get(track, 'trkpt'), line = [];
- for (j = 0; j < pts.length; j++) {
- line.push([attrf(pts[j], 'lon'), attrf(pts[j], 'lat')]);
- }
- gj.features.push({
- type: 'Feature',
- properties: {
- name: name || ''
- },
- geometry: { type: 'LineString', coordinates: line }
- });
- }
- return gj;
- }
- };
- return t;
-})();
-
-if (typeof module !== 'undefined') module.exports = toGeoJSON;
-/**
- * marked - a markdown parser
- * Copyright (c) 2011-2013, Christopher Jeffrey. (MIT Licensed)
- * https://github.com/chjj/marked
- */
-
-;(function() {
-
-/**
- * Block-Level Grammar
- */
-
-var block = {
- newline: /^\n+/,
- code: /^( {4}[^\n]+\n*)+/,
- fences: noop,
- hr: /^( *[-*_]){3,} *(?:\n+|$)/,
- heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
- nptable: noop,
- lheading: /^([^\n]+)\n *(=|-){3,} *\n*/,
- blockquote: /^( *>[^\n]+(\n[^\n]+)*\n*)+/,
- list: /^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
- html: /^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,
- def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,
- table: noop,
- paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
- text: /^[^\n]+/
-};
-
-block.bullet = /(?:[*+-]|\d+\.)/;
-block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
-block.item = replace(block.item, 'gm')
- (/bull/g, block.bullet)
- ();
-
-block.list = replace(block.list)
- (/bull/g, block.bullet)
- ('hr', /\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)
- ();
-
-block._tag = '(?!(?:'
- + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
- + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
- + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b';
-
-block.html = replace(block.html)
- ('comment', /<!--[\s\S]*?-->/)
- ('closed', /<(tag)[\s\S]+?<\/\1>/)
- ('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)
- (/tag/g, block._tag)
- ();
-
-block.paragraph = replace(block.paragraph)
- ('hr', block.hr)
- ('heading', block.heading)
- ('lheading', block.lheading)
- ('blockquote', block.blockquote)
- ('tag', '<' + block._tag)
- ('def', block.def)
- ();
-
-/**
- * Normal Block Grammar
- */
-
-block.normal = merge({}, block);
-
-/**
- * GFM Block Grammar
- */
-
-block.gfm = merge({}, block.normal, {
- fences: /^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,
- paragraph: /^/
-});
-
-block.gfm.paragraph = replace(block.paragraph)
- ('(?!', '(?!' + block.gfm.fences.source.replace('\\1', '\\2') + '|')
- ();
-
-/**
- * GFM + Tables Block Grammar
- */
-
-block.tables = merge({}, block.gfm, {
- nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
- table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
-});
-
-/**
- * Block Lexer
- */
-
-function Lexer(options) {
- this.tokens = [];
- this.tokens.links = {};
- this.options = options || marked.defaults;
- this.rules = block.normal;
-
- if (this.options.gfm) {
- if (this.options.tables) {
- this.rules = block.tables;
- } else {
- this.rules = block.gfm;
- }
- }
-}
-
-/**
- * Expose Block Rules
- */
-
-Lexer.rules = block;
-
-/**
- * Static Lex Method
- */
-
-Lexer.lex = function(src, options) {
- var lexer = new Lexer(options);
- return lexer.lex(src);
-};
-
-/**
- * Preprocessing
- */
-
-Lexer.prototype.lex = function(src) {
- src = src
- .replace(/\r\n|\r/g, '\n')
- .replace(/\t/g, ' ')
- .replace(/\u00a0/g, ' ')
- .replace(/\u2424/g, '\n');
-
- return this.token(src, true);
-};
-
-/**
- * Lexing
- */
-
-Lexer.prototype.token = function(src, top) {
- var src = src.replace(/^ +$/gm, '')
- , next
- , loose
- , cap
- , bull
- , b
- , item
- , space
- , i
- , l;
-
- while (src) {
- // newline
- if (cap = this.rules.newline.exec(src)) {
- src = src.substring(cap[0].length);
- if (cap[0].length > 1) {
- this.tokens.push({
- type: 'space'
- });
- }
- }
-
- // code
- if (cap = this.rules.code.exec(src)) {
- src = src.substring(cap[0].length);
- cap = cap[0].replace(/^ {4}/gm, '');
- this.tokens.push({
- type: 'code',
- text: !this.options.pedantic
- ? cap.replace(/\n+$/, '')
- : cap
- });
- continue;
- }
-
- // fences (gfm)
- if (cap = this.rules.fences.exec(src)) {
- src = src.substring(cap[0].length);
- this.tokens.push({
- type: 'code',
- lang: cap[2],
- text: cap[3]
- });
- continue;
- }
-
- // heading
- if (cap = this.rules.heading.exec(src)) {
- src = src.substring(cap[0].length);
- this.tokens.push({
- type: 'heading',
- depth: cap[1].length,
- text: cap[2]
- });
- continue;
- }
-
- // table no leading pipe (gfm)
- if (top && (cap = this.rules.nptable.exec(src))) {
- src = src.substring(cap[0].length);
-
- item = {
- type: 'table',
- header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
- align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
- cells: cap[3].replace(/\n$/, '').split('\n')
- };
-
- for (i = 0; i < item.align.length; i++) {
- if (/^ *-+: *$/.test(item.align[i])) {
- item.align[i] = 'right';
- } else if (/^ *:-+: *$/.test(item.align[i])) {
- item.align[i] = 'center';
- } else if (/^ *:-+ *$/.test(item.align[i])) {
- item.align[i] = 'left';
- } else {
- item.align[i] = null;
- }
- }
-
- for (i = 0; i < item.cells.length; i++) {
- item.cells[i] = item.cells[i].split(/ *\| */);
- }
-
- this.tokens.push(item);
-
- continue;
- }
-
- // lheading
- if (cap = this.rules.lheading.exec(src)) {
- src = src.substring(cap[0].length);
- this.tokens.push({
- type: 'heading',
- depth: cap[2] === '=' ? 1 : 2,
- text: cap[1]
- });
- continue;
- }
-
- // hr
- if (cap = this.rules.hr.exec(src)) {
- src = src.substring(cap[0].length);
- this.tokens.push({
- type: 'hr'
- });
- continue;
- }
-
- // blockquote
- if (cap = this.rules.blockquote.exec(src)) {
- src = src.substring(cap[0].length);
-
- this.tokens.push({
- type: 'blockquote_start'
- });
-
- cap = cap[0].replace(/^ *> ?/gm, '');
-
- // Pass `top` to keep the current
- // "toplevel" state. This is exactly
- // how markdown.pl works.
- this.token(cap, top);
-
- this.tokens.push({
- type: 'blockquote_end'
- });
-
- continue;
- }
-
- // list
- if (cap = this.rules.list.exec(src)) {
- src = src.substring(cap[0].length);
- bull = cap[2];
-
- this.tokens.push({
- type: 'list_start',
- ordered: bull.length > 1
- });
-
- // Get each top-level item.
- cap = cap[0].match(this.rules.item);
-
- next = false;
- l = cap.length;
- i = 0;
-
- for (; i < l; i++) {
- item = cap[i];
-
- // Remove the list item's bullet
- // so it is seen as the next token.
- space = item.length;
- item = item.replace(/^ *([*+-]|\d+\.) +/, '');
-
- // Outdent whatever the
- // list item contains. Hacky.
- if (~item.indexOf('\n ')) {
- space -= item.length;
- item = !this.options.pedantic
- ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
- : item.replace(/^ {1,4}/gm, '');
- }
-
- // Determine whether the next list item belongs here.
- // Backpedal if it does not belong in this list.
- if (this.options.smartLists && i !== l - 1) {
- b = block.bullet.exec(cap[i+1])[0];
- if (bull !== b && !(bull.length > 1 && b.length > 1)) {
- src = cap.slice(i + 1).join('\n') + src;
- i = l - 1;
- }
- }
-
- // Determine whether item is loose or not.
- // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
- // for discount behavior.
- loose = next || /\n\n(?!\s*$)/.test(item);
- if (i !== l - 1) {
- next = item[item.length-1] === '\n';
- if (!loose) loose = next;
- }
-
- this.tokens.push({
- type: loose
- ? 'loose_item_start'
- : 'list_item_start'
- });
-
- // Recurse.
- this.token(item, false);
-
- this.tokens.push({
- type: 'list_item_end'
- });
- }
-
- this.tokens.push({
- type: 'list_end'
- });
-
- continue;
- }
-
- // html
- if (cap = this.rules.html.exec(src)) {
- src = src.substring(cap[0].length);
- this.tokens.push({
- type: this.options.sanitize
- ? 'paragraph'
- : 'html',
- pre: cap[1] === 'pre' || cap[1] === 'script',
- text: cap[0]
- });
- continue;
- }
-
- // def
- if (top && (cap = this.rules.def.exec(src))) {
- src = src.substring(cap[0].length);
- this.tokens.links[cap[1].toLowerCase()] = {
- href: cap[2],
- title: cap[3]
- };
- continue;
- }
-
- // table (gfm)
- if (top && (cap = this.rules.table.exec(src))) {
- src = src.substring(cap[0].length);
-
- item = {
- type: 'table',
- header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
- align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
- cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
- };
-
- for (i = 0; i < item.align.length; i++) {
- if (/^ *-+: *$/.test(item.align[i])) {
- item.align[i] = 'right';
- } else if (/^ *:-+: *$/.test(item.align[i])) {
- item.align[i] = 'center';
- } else if (/^ *:-+ *$/.test(item.align[i])) {
- item.align[i] = 'left';
- } else {
- item.align[i] = null;
- }
- }
-
- for (i = 0; i < item.cells.length; i++) {
- item.cells[i] = item.cells[i]
- .replace(/^ *\| *| *\| *$/g, '')
- .split(/ *\| */);
- }
-
- this.tokens.push(item);
-
- continue;
- }
-
- // top-level paragraph
- if (top && (cap = this.rules.paragraph.exec(src))) {
- src = src.substring(cap[0].length);
- this.tokens.push({
- type: 'paragraph',
- text: cap[1][cap[1].length-1] === '\n'
- ? cap[1].slice(0, -1)
- : cap[1]
- });
- continue;
- }
-
- // text
- if (cap = this.rules.text.exec(src)) {
- // Top-level should never reach here.
- src = src.substring(cap[0].length);
- this.tokens.push({
- type: 'text',
- text: cap[0]
- });
- continue;
- }
-
- if (src) {
- throw new
- Error('Infinite loop on byte: ' + src.charCodeAt(0));
- }
- }
-
- return this.tokens;
-};
-
-/**
- * Inline-Level Grammar
- */
-
-var inline = {
- escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
- autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
- url: noop,
- tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
- link: /^!?\[(inside)\]\(href\)/,
- reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
- nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
- strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
- em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
- code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,
- br: /^ {2,}\n(?!\s*$)/,
- del: noop,
- text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/
-};
-
-inline._inside = /(?:\[[^\]]*\]|[^\]]|\](?=[^\[]*\]))*/;
-inline._href = /\s*<?([^\s]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
-
-inline.link = replace(inline.link)
- ('inside', inline._inside)
- ('href', inline._href)
- ();
-
-inline.reflink = replace(inline.reflink)
- ('inside', inline._inside)
- ();
-
-/**
- * Normal Inline Grammar
- */
-
-inline.normal = merge({}, inline);
-
-/**
- * Pedantic Inline Grammar
- */
-
-inline.pedantic = merge({}, inline.normal, {
- strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
- em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
-});
-
-/**
- * GFM Inline Grammar
- */
-
-inline.gfm = merge({}, inline.normal, {
- escape: replace(inline.escape)('])', '~|])')(),
- url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,
- del: /^~~(?=\S)([\s\S]*?\S)~~/,
- text: replace(inline.text)
- (']|', '~]|')
- ('|', '|https?://|')
- ()
-});
-
-/**
- * GFM + Line Breaks Inline Grammar
- */
-
-inline.breaks = merge({}, inline.gfm, {
- br: replace(inline.br)('{2,}', '*')(),
- text: replace(inline.gfm.text)('{2,}', '*')()
-});
-
-/**
- * Inline Lexer & Compiler
- */
-
-function InlineLexer(links, options) {
- this.options = options || marked.defaults;
- this.links = links;
- this.rules = inline.normal;
-
- if (!this.links) {
- throw new
- Error('Tokens array requires a `links` property.');
- }
-
- if (this.options.gfm) {
- if (this.options.breaks) {
- this.rules = inline.breaks;
- } else {
- this.rules = inline.gfm;
- }
- } else if (this.options.pedantic) {
- this.rules = inline.pedantic;
- }
-}
-
-/**
- * Expose Inline Rules
- */
-
-InlineLexer.rules = inline;
-
-/**
- * Static Lexing/Compiling Method
- */
-
-InlineLexer.output = function(src, links, options) {
- var inline = new InlineLexer(links, options);
- return inline.output(src);
-};
-
-/**
- * Lexing/Compiling
- */
-
-InlineLexer.prototype.output = function(src) {
- var out = ''
- , link
- , text
- , href
- , cap;
-
- while (src) {
- // escape
- if (cap = this.rules.escape.exec(src)) {
- src = src.substring(cap[0].length);
- out += cap[1];
- continue;
- }
-
- // autolink
- if (cap = this.rules.autolink.exec(src)) {
- src = src.substring(cap[0].length);
- if (cap[2] === '@') {
- text = cap[1][6] === ':'
- ? this.mangle(cap[1].substring(7))
- : this.mangle(cap[1]);
- href = this.mangle('mailto:') + text;
- } else {
- text = escape(cap[1]);
- href = text;
- }
- out += '<a href="'
- + href
- + '">'
- + text
- + '</a>';
- continue;
- }
-
- // url (gfm)
- if (cap = this.rules.url.exec(src)) {
- src = src.substring(cap[0].length);
- text = escape(cap[1]);
- href = text;
- out += '<a href="'
- + href
- + '">'
- + text
- + '</a>';
- continue;
- }
-
- // tag
- if (cap = this.rules.tag.exec(src)) {
- src = src.substring(cap[0].length);
- out += this.options.sanitize
- ? escape(cap[0])
- : cap[0];
- continue;
- }
-
- // link
- if (cap = this.rules.link.exec(src)) {
- src = src.substring(cap[0].length);
- out += this.outputLink(cap, {
- href: cap[2],
- title: cap[3]
- });
- continue;
- }
-
- // reflink, nolink
- if ((cap = this.rules.reflink.exec(src))
- || (cap = this.rules.nolink.exec(src))) {
- src = src.substring(cap[0].length);
- link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
- link = this.links[link.toLowerCase()];
- if (!link || !link.href) {
- out += cap[0][0];
- src = cap[0].substring(1) + src;
- continue;
- }
- out += this.outputLink(cap, link);
- continue;
- }
-
- // strong
- if (cap = this.rules.strong.exec(src)) {
- src = src.substring(cap[0].length);
- out += '<strong>'
- + this.output(cap[2] || cap[1])
- + '</strong>';
- continue;
- }
-
- // em
- if (cap = this.rules.em.exec(src)) {
- src = src.substring(cap[0].length);
- out += '<em>'
- + this.output(cap[2] || cap[1])
- + '</em>';
- continue;
- }
-
- // code
- if (cap = this.rules.code.exec(src)) {
- src = src.substring(cap[0].length);
- out += '<code>'
- + escape(cap[2], true)
- + '</code>';
- continue;
- }
-
- // br
- if (cap = this.rules.br.exec(src)) {
- src = src.substring(cap[0].length);
- out += '<br>';
- continue;
- }
-
- // del (gfm)
- if (cap = this.rules.del.exec(src)) {
- src = src.substring(cap[0].length);
- out += '<del>'
- + this.output(cap[1])
- + '</del>';
- continue;
- }
-
- // text
- if (cap = this.rules.text.exec(src)) {
- src = src.substring(cap[0].length);
- out += escape(cap[0]);
- continue;
- }
-
- if (src) {
- throw new
- Error('Infinite loop on byte: ' + src.charCodeAt(0));
- }
- }
-
- return out;
-};
-
-/**
- * Compile Link
- */
-
-InlineLexer.prototype.outputLink = function(cap, link) {
- if (cap[0][0] !== '!') {
- return '<a href="'
- + escape(link.href)
- + '"'
- + (link.title
- ? ' title="'
- + escape(link.title)
- + '"'
- : '')
- + '>'
- + this.output(cap[1])
- + '</a>';
- } else {
- return '<img src="'
- + escape(link.href)
- + '" alt="'
- + escape(cap[1])
- + '"'
- + (link.title
- ? ' title="'
- + escape(link.title)
- + '"'
- : '')
- + '>';
- }
-};
-
-/**
- * Smartypants Transformations
- */
-
-InlineLexer.prototype.smartypants = function(text) {
- if (!this.options.smartypants) return text;
- return text
- .replace(/--/g, '—')
- .replace(/'([^']*)'/g, '‘$1’')
- .replace(/"([^"]*)"/g, '“$1”')
- .replace(/\.{3}/g, '…');
-};
-
-/**
- * Mangle Links
- */
-
-InlineLexer.prototype.mangle = function(text) {
- var out = ''
- , l = text.length
- , i = 0
- , ch;
-
- for (; i < l; i++) {
- ch = text.charCodeAt(i);
- if (Math.random() > 0.5) {
- ch = 'x' + ch.toString(16);
- }
- out += '&#' + ch + ';';
- }
-
- return out;
-};
-
-/**
- * Parsing & Compiling
- */
-
-function Parser(options) {
- this.tokens = [];
- this.token = null;
- this.options = options || marked.defaults;
-}
-
-/**
- * Static Parse Method
- */
-
-Parser.parse = function(src, options) {
- var parser = new Parser(options);
- return parser.parse(src);
-};
-
-/**
- * Parse Loop
- */
-
-Parser.prototype.parse = function(src) {
- this.inline = new InlineLexer(src.links, this.options);
- this.tokens = src.reverse();
-
- var out = '';
- while (this.next()) {
- out += this.tok();
- }
-
- return out;
-};
-
-/**
- * Next Token
- */
-
-Parser.prototype.next = function() {
- return this.token = this.tokens.pop();
-};
-
-/**
- * Preview Next Token
- */
-
-Parser.prototype.peek = function() {
- return this.tokens[this.tokens.length-1] || 0;
-};
-
-/**
- * Parse Text Tokens
- */
-
-Parser.prototype.parseText = function() {
- var body = this.token.text;
-
- while (this.peek().type === 'text') {
- body += '\n' + this.next().text;
- }
-
- return this.inline.output(body);
-};
-
-/**
- * Parse Current Token
- */
-
-Parser.prototype.tok = function() {
- switch (this.token.type) {
- case 'space': {
- return '';
- }
- case 'hr': {
- return '<hr>\n';
- }
- case 'heading': {
- return '<h'
- + this.token.depth
- + '>'
- + this.inline.output(this.token.text)
- + '</h'
- + this.token.depth
- + '>\n';
- }
- case 'code': {
- if (this.options.highlight) {
- var code = this.options.highlight(this.token.text, this.token.lang);
- if (code != null && code !== this.token.text) {
- this.token.escaped = true;
- this.token.text = code;
- }
- }
-
- if (!this.token.escaped) {
- this.token.text = escape(this.token.text, true);
- }
-
- return '<pre><code'
- + (this.token.lang
- ? ' class="'
- + this.options.langPrefix
- + this.token.lang
- + '"'
- : '')
- + '>'
- + this.token.text
- + '</code></pre>\n';
- }
- case 'table': {
- var body = ''
- , heading
- , i
- , row
- , cell
- , j;
-
- // header
- body += '<thead>\n<tr>\n';
- for (i = 0; i < this.token.header.length; i++) {
- heading = this.inline.output(this.token.header[i]);
- body += this.token.align[i]
- ? '<th align="' + this.token.align[i] + '">' + heading + '</th>\n'
- : '<th>' + heading + '</th>\n';
- }
- body += '</tr>\n</thead>\n';
-
- // body
- body += '<tbody>\n'
- for (i = 0; i < this.token.cells.length; i++) {
- row = this.token.cells[i];
- body += '<tr>\n';
- for (j = 0; j < row.length; j++) {
- cell = this.inline.output(row[j]);
- body += this.token.align[j]
- ? '<td align="' + this.token.align[j] + '">' + cell + '</td>\n'
- : '<td>' + cell + '</td>\n';
- }
- body += '</tr>\n';
- }
- body += '</tbody>\n';
-
- return '<table>\n'
- + body
- + '</table>\n';
- }
- case 'blockquote_start': {
- var body = '';
-
- while (this.next().type !== 'blockquote_end') {
- body += this.tok();
- }
-
- return '<blockquote>\n'
- + body
- + '</blockquote>\n';
- }
- case 'list_start': {
- var type = this.token.ordered ? 'ol' : 'ul'
- , body = '';
-
- while (this.next().type !== 'list_end') {
- body += this.tok();
- }
-
- return '<'
- + type
- + '>\n'
- + body
- + '</'
- + type
- + '>\n';
- }
- case 'list_item_start': {
- var body = '';
-
- while (this.next().type !== 'list_item_end') {
- body += this.token.type === 'text'
- ? this.parseText()
- : this.tok();
- }
-
- return '<li>'
- + body
- + '</li>\n';
- }
- case 'loose_item_start': {
- var body = '';
-
- while (this.next().type !== 'list_item_end') {
- body += this.tok();
- }
-
- return '<li>'
- + body
- + '</li>\n';
- }
- case 'html': {
- return !this.token.pre && !this.options.pedantic
- ? this.inline.output(this.token.text)
- : this.token.text;
- }
- case 'paragraph': {
- return '<p>'
- + this.inline.output(this.token.text)
- + '</p>\n';
- }
- case 'text': {
- return '<p>'
- + this.parseText()
- + '</p>\n';
- }
- }
-};
-
-/**
- * Helpers
- */
-
-function escape(html, encode) {
- return html
- .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&')
- .replace(/</g, '<')
- .replace(/>/g, '>')
- .replace(/"/g, '"')
- .replace(/'/g, ''');
-}
-
-function replace(regex, opt) {
- regex = regex.source;
- opt = opt || '';
- return function self(name, val) {
- if (!name) return new RegExp(regex, opt);
- val = val.source || val;
- val = val.replace(/(^|[^\[])\^/g, '$1');
- regex = regex.replace(name, val);
- return self;
- };
-}
-
-function noop() {}
-noop.exec = noop;
-
-function merge(obj) {
- var i = 1
- , target
- , key;
-
- for (; i < arguments.length; i++) {
- target = arguments[i];
- for (key in target) {
- if (Object.prototype.hasOwnProperty.call(target, key)) {
- obj[key] = target[key];
- }
- }
- }
-
- return obj;
-}
-
-/**
- * Marked
- */
-
-function marked(src, opt, callback) {
- if (callback || typeof opt === 'function') {
- if (!callback) {
- callback = opt;
- opt = null;
- }
-
- if (opt) opt = merge({}, marked.defaults, opt);
-
- var tokens = Lexer.lex(tokens, opt)
- , highlight = opt.highlight
- , pending = 0
- , l = tokens.length
- , i = 0;
-
- if (!highlight || highlight.length < 3) {
- return callback(null, Parser.parse(tokens, opt));
- }
-
- var done = function() {
- delete opt.highlight;
- var out = Parser.parse(tokens, opt);
- opt.highlight = highlight;
- return callback(null, out);
- };
-
- for (; i < l; i++) {
- (function(token) {
- if (token.type !== 'code') return;
- pending++;
- return highlight(token.text, token.lang, function(err, code) {
- if (code == null || code === token.text) {
- return --pending || done();
- }
- token.text = code;
- token.escaped = true;
- --pending || done();
- });
- })(tokens[i]);
- }
-
- return;
- }
- try {
- if (opt) opt = merge({}, marked.defaults, opt);
- return Parser.parse(Lexer.lex(src, opt), opt);
- } catch (e) {
- e.message += '\nPlease report this to https://github.com/chjj/marked.';
- if ((opt || marked.defaults).silent) {
- return '<p>An error occured:</p><pre>'
- + escape(e.message + '', true)
- + '</pre>';
- }
- throw e;
- }
-}
-
-/**
- * Options
- */
-
-marked.options =
-marked.setOptions = function(opt) {
- merge(marked.defaults, opt);
- return marked;
-};
-
-marked.defaults = {
- gfm: true,
- tables: true,
- breaks: false,
- pedantic: false,
- sanitize: false,
- smartLists: false,
- silent: false,
- highlight: null,
- langPrefix: 'lang-'
-};
-
-/**
- * Expose
- */
-
-marked.Parser = Parser;
-marked.parser = Parser.parse;
-
-marked.Lexer = Lexer;
-marked.lexer = Lexer.lex;
-
-marked.InlineLexer = InlineLexer;
-marked.inlineLexer = InlineLexer.output;
-
-marked.parse = marked;
-
-if (typeof exports === 'object') {
- module.exports = marked;
-} else if (typeof define === 'function' && define.amd) {
- define(function() { return marked; });
-} else {
- this.marked = marked;
-}
-
-}).call(function() {
- return this || (typeof window !== 'undefined' ? window : global);
-}());
-(function () {
-'use strict';
-window.iD = function () {
- window.locale.en = iD.data.en;
- window.locale.current('en');
-
- var context = {},
- storage;
-
- // https://github.com/systemed/iD/issues/772
- // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
- try { storage = localStorage; } catch (e) {}
- storage = storage || {};
-
- context.storage = function(k, v) {
- if (arguments.length === 1) return storage[k];
- else if (v === null) delete storage[k];
- else storage[k] = v;
- };
-
- var history = iD.History(context),
- dispatch = d3.dispatch('enter', 'exit', 'select', 'toggleFullscreen'),
- mode,
- container,
- ui = iD.ui(context),
- map = iD.Map(context),
- connection = iD.Connection(),
- locale = iD.detect().locale,
- localePath;
-
- if (locale && iD.data.locales.indexOf(locale) === -1) {
- locale = locale.split('-')[0];
- }
-
- connection.on('load.context', function loadContext(err, result) {
- history.merge(result);
- });
-
- context.preauth = function(options) {
- connection.switch(options);
- return context;
- };
-
- context.locale = function(_, path) {
- locale = _;
- localePath = path;
- return context;
- };
-
- context.ui = function() {
- return function(container) {
- context.container(container);
-
- if (locale && locale !== 'en' && iD.data.locales.indexOf(locale) !== -1) {
- localePath = localePath || context.assetPath() + 'locales/' + locale + '.json';
- d3.json(localePath, function(err, result) {
- window.locale[locale] = result;
- window.locale.current(locale);
- container.call(ui);
- });
- } else {
- container.call(ui);
- }
-
- return ui;
- }
- };
-
- /* Straight accessors. Avoid using these if you can. */
- context.connection = function() { return connection; };
- context.history = function() { return history; };
- context.map = function() { return map; };
-
- /* History */
- context.graph = history.graph;
- context.perform = history.perform;
- context.replace = history.replace;
- context.pop = history.pop;
- context.undo = history.undo;
- context.redo = history.redo;
- context.changes = history.changes;
- context.intersects = history.intersects;
-
- /* Graph */
- context.hasEntity = function(id) {
- return history.graph().hasEntity(id);
- };
-
- context.entity = function(id) {
- return history.graph().entity(id);
- };
-
- context.geometry = function(id) {
- return context.entity(id).geometry(history.graph());
- };
-
- /* Modes */
- context.enter = function(newMode) {
- var s0 = context.selection();
-
- if (mode) {
- mode.exit();
- dispatch.exit(mode);
- }
-
- mode = newMode;
- mode.enter();
- dispatch.enter(mode);
-
- var s1 = context.selection();
- dispatch.select(s1, s0);
- };
-
- context.mode = function() {
- return mode;
- };
-
- context.selection = function() {
- if (mode && mode.selection) {
- return mode.selection();
- } else {
- return [];
- }
- };
-
- /* Behaviors */
- context.install = function(behavior) {
- context.surface().call(behavior);
- };
-
- context.uninstall = function(behavior) {
- context.surface().call(behavior.off);
- };
-
- /* Map */
- context.layers = function() { return map.layers; };
- context.background = function() { return map.layers[0]; };
- context.surface = function() { return map.surface; };
- context.projection = map.projection;
- context.tail = map.tail;
- context.redraw = map.redraw;
- context.pan = map.pan;
- context.zoomIn = map.zoomIn;
- context.zoomOut = map.zoomOut;
-
- /* Background */
- var backgroundSources = iD.data.imagery.map(function(source) {
- if (source.sourcetag === 'Bing') {
- return iD.BackgroundSource.Bing(source, context.background().dispatch);
- } else {
- return iD.BackgroundSource.template(source);
- }
- });
- backgroundSources.push(iD.BackgroundSource.Custom);
-
- context.backgroundSources = function() {
- return backgroundSources;
- };
-
- /* Presets */
- var presets = iD.presets(context)
- .load(iD.data.presets);
-
- context.presets = function() {
- return presets;
- };
-
- context.container = function(_) {
- if (!arguments.length) return container;
- container = _;
- container.classed('id-container', true);
- return context;
- };
-
- var q = iD.util.stringQs(location.hash.substring(1)), detected = false;
- if (q.layer && q.layer.indexOf('custom:') === 0) {
- context.layers()[0]
- .source(iD.BackgroundSource.template({
- template: q.layer.replace(/^custom:/, ''),
- name: 'Custom'
- }));
- detected = true;
- } else if (q.layer) {
- context.layers()[0]
- .source(_.find(backgroundSources, function(l) {
- if (l.data.sourcetag === q.layer) {
- detected = true;
- return true;
- }
- }));
- }
-
- if (!detected) {
- context.background()
- .source(_.find(backgroundSources, function(l) {
- return l.data.name === 'Bing aerial imagery';
- }));
- }
-
- var embed = false;
- context.embed = function(_) {
- if (!arguments.length) return embed;
- embed = _;
- return context;
- };
-
- var assetPath = '';
- context.assetPath = function(_) {
- if (!arguments.length) return assetPath;
- assetPath = _;
- return context;
- };
-
- context.imagePath = function(_) {
- return assetPath + 'img/' + _;
- };
-
- context.toggleFullscreen = function() {
- dispatch.toggleFullscreen();
- };
-
- return d3.rebind(context, dispatch, 'on');
-};
-
-iD.version = '0.0.0-beta1';
-
-iD.detect = function() {
- var browser = {};
-
- var ua = navigator.userAgent,
- msie = new RegExp("MSIE ([0-9]{1,}[\\.0-9]{0,})");
-
- if (msie.exec(ua) !== null) {
- var rv = parseFloat(RegExp.$1);
- browser.support = !(rv && rv < 9);
- } else {
- browser.support = true;
- }
-
- // Added due to incomplete svg style support. See #715
- browser.opera = ua.indexOf('Opera') >= 0;
-
- browser.locale = navigator.language || navigator.userLanguage;
-
- browser.filedrop = (window.FileReader && 'ondrop' in window);
-
- function nav(x) {
- return navigator.userAgent.indexOf(x) !== -1;
- }
-
- if (nav('Win')) browser.os = 'win';
- else if (nav('Mac')) browser.os = 'mac';
- else if (nav('X11')) browser.os = 'linux';
- else if (nav('Linux')) browser.os = 'linux';
- else browser.os = 'win';
-
- return browser;
-};
-iD.taginfo = function() {
- var taginfo = {},
- endpoint = 'http://taginfo.openstreetmap.org/api/4/',
- tag_sorts = {
- point: 'count_nodes',
- vertex: 'count_nodes',
- area: 'count_ways',
- line: 'count_ways'
- },
- tag_filters = {
- point: 'nodes',
- vertex: 'nodes',
- area: 'ways',
- line: 'ways'
- };
-
- var cache = this.cache = {};
-
- function sets(parameters, n, o) {
- if (parameters.geometry && o[parameters.geometry]) {
- parameters[n] = o[parameters.geometry];
- }
- return parameters;
- }
-
- function setFilter(parameters) {
- return sets(parameters, 'filter', tag_filters);
- }
-
- function setSort(parameters) {
- return sets(parameters, 'sortname', tag_sorts);
- }
-
- function clean(parameters) {
- return _.omit(parameters, 'geometry', 'debounce');
- }
-
- function shorten(parameters) {
- if (!parameters.query) {
- delete parameters.query;
- } else {
- parameters.query = parameters.query.slice(0, 3);
- }
- return parameters;
- }
-
- function popularKeys(parameters) {
- var pop_field = 'count_all';
- if (parameters.filter) pop_field = 'count_' + parameters.filter;
- return function(d) { return parseFloat(d[pop_field]) > 10000; };
- }
-
- function popularValues() {
- return function(d) { return parseFloat(d.fraction) > 0.01; };
- }
-
- function valKey(d) { return { value: d.key }; }
-
- function valKeyDescription(d) {
- return {
- value: d.value,
- title: d.description
- };
- }
-
- var debounced = _.debounce(d3.json, 100, true);
-
- function request(url, debounce, callback) {
- if (cache[url]) {
- callback(null, cache[url]);
- } else if (debounce) {
- debounced(url, done);
- } else {
- d3.json(url, done);
- }
-
- function done(err, data) {
- if (!err) cache[url] = data;
- callback(err, data);
- }
- }
-
- taginfo.keys = function(parameters, callback) {
- var debounce = parameters.debounce;
- parameters = clean(shorten(setSort(setFilter(parameters))));
- request(endpoint + 'keys/all?' +
- iD.util.qsString(_.extend({
- rp: 10,
- sortname: 'count_all',
- sortorder: 'desc',
- page: 1
- }, parameters)), debounce, function(err, d) {
- if (err) return callback(err);
- callback(null, d.data.filter(popularKeys(parameters)).map(valKey));
- });
- };
-
- taginfo.values = function(parameters, callback) {
- var debounce = parameters.debounce;
- parameters = clean(shorten(setSort(setFilter(parameters))));
- request(endpoint + 'key/values?' +
- iD.util.qsString(_.extend({
- rp: 20,
- sortname: 'count_all',
- sortorder: 'desc',
- page: 1
- }, parameters)), debounce, function(err, d) {
- if (err) return callback(err);
- callback(null, d.data.filter(popularValues()).map(valKeyDescription), parameters);
- });
- };
-
- taginfo.docs = function(parameters, callback) {
- var debounce = parameters.debounce;
- parameters = clean(setSort(parameters));
- request(endpoint + (parameters.value ? 'tag/wiki_pages?' : 'key/wiki_pages?') +
- iD.util.qsString(parameters), debounce, callback);
- };
-
- taginfo.endpoint = function(_) {
- if (!arguments.length) return endpoint;
- endpoint = _;
- return taginfo;
- };
-
- return taginfo;
-};
-iD.wikipedia = function() {
- var wiki = {},
- endpoint = 'http://en.wikipedia.org/w/api.php?';
-
- wiki.search = function(lang, query, callback) {
- lang = lang || 'en';
- d3.jsonp(endpoint.replace('en', lang) +
- iD.util.qsString({
- action: 'query',
- list: 'search',
- srlimit: '10',
- srinfo: 'suggestion',
- format: 'json',
- callback: '{callback}',
- srsearch: query
- }), function(data) {
- if (!data.query) return;
- callback(query, data.query.search.map(function(d) {
- return d.title;
- }));
- });
- };
-
- wiki.suggestions = function(lang, query, callback) {
- lang = lang || 'en';
- d3.jsonp(endpoint.replace('en', lang) +
- iD.util.qsString({
- action: 'opensearch',
- namespace: 0,
- suggest: '',
- format: 'json',
- callback: '{callback}',
- search: query
- }), function(d) {
- callback(d[0], d[1]);
- });
- };
-
- wiki.translations = function(lang, title, callback) {
- d3.jsonp(endpoint.replace('en', lang) +
- iD.util.qsString({
- action: 'query',
- prop: 'langlinks',
- format: 'json',
- callback: '{callback}',
- lllimit: 500,
- titles: title
- }), function(d) {
- var list = d.query.pages[Object.keys(d.query.pages)[0]],
- translations = {};
- if (list) {
- list.langlinks.forEach(function(d) {
- translations[d.lang] = d['*'];
- });
- callback(translations);
- }
- });
- };
-
- return wiki;
-};
-iD.util = {};
-
-iD.util.tagText = function(entity) {
- return d3.entries(entity.tags).map(function(e) {
- return e.key + '=' + e.value;
- }).join(', ');
-};
-
-iD.util.stringQs = function(str) {
- return str.split('&').reduce(function(obj, pair){
- var parts = pair.split('=');
- if (parts.length === 2) {
- obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
- }
- return obj;
- }, {});
-};
-
-iD.util.qsString = function(obj, noencode) {
- function softEncode(s) { return s.replace('&', '%26'); }
- return Object.keys(obj).sort().map(function(key) {
- return encodeURIComponent(key) + '=' + (
- noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
- }).join('&');
-};
-
-iD.util.prefixDOMProperty = function(property) {
- var prefixes = ['webkit', 'ms', 'moz', 'o'],
- i = -1,
- n = prefixes.length,
- s = document.body;
-
- if (property in s)
- return property;
-
- property = property.substr(0, 1).toUpperCase() + property.substr(1);
-
- while (++i < n)
- if (prefixes[i] + property in s)
- return prefixes[i] + property;
-
- return false;
-};
-
-iD.util.prefixCSSProperty = function(property) {
- var prefixes = ['webkit', 'ms', 'Moz', 'O'],
- i = -1,
- n = prefixes.length,
- s = document.body.style;
-
- if (property.toLowerCase() in s)
- return property.toLowerCase();
-
- while (++i < n)
- if (prefixes[i] + property in s)
- return '-' + prefixes[i].toLowerCase() + '-' + property.toLowerCase();
-
- return false;
-};
-
-iD.util.getStyle = function(selector) {
- for (var i = 0; i < document.styleSheets.length; i++) {
- var rules = document.styleSheets[i].rules || document.styleSheets[i].cssRules || [];
- for (var k = 0; k < rules.length; k++) {
- var selectorText = rules[k].selectorText && rules[k].selectorText.split(', ');
- if (_.contains(selectorText, selector)) {
- return rules[k];
- }
- }
- }
-};
-
-iD.util.editDistance = function(a, b) {
- if (a.length === 0) return b.length;
- if (b.length === 0) return a.length;
- var matrix = [];
- for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
- for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
- for (i = 1; i <= b.length; i++) {
- for (j = 1; j <= a.length; j++) {
- if (b.charAt(i-1) == a.charAt(j-1)) {
- matrix[i][j] = matrix[i-1][j-1];
- } else {
- matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
- Math.min(matrix[i][j-1] + 1, // insertion
- matrix[i-1][j] + 1)); // deletion
- }
- }
- }
- return matrix[b.length][a.length];
-};
-
-// a d3.mouse-alike which
-// 1. Only works on HTML elements, not SVG
-// 2. Does not cause style recalculation
-iD.util.fastMouse = function(container) {
- var rect = _.clone(container.getBoundingClientRect()),
- rectLeft = rect.left,
- rectTop = rect.top,
- clientLeft = +container.clientLeft,
- clientTop = +container.clientTop;
- return function(e) {
- return [
- e.clientX - rectLeft - clientLeft,
- e.clientY - rectTop - clientTop];
- };
-};
-
-iD.util.getPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
-
-iD.util.asyncMap = function(inputs, func, callback) {
- var remaining = inputs.length,
- results = [],
- errors = [];
-
- inputs.forEach(function(d, i) {
- func(d, function done(err, data) {
- errors[i] = err;
- results[i] = data;
- remaining --;
- if (!remaining) callback(errors, results);
- });
- });
-};
-iD.geo = {};
-
-iD.geo.roundCoords = function(c) {
- return [Math.floor(c[0]), Math.floor(c[1])];
-};
-
-iD.geo.interp = function(p1, p2, t) {
- return [p1[0] + (p2[0] - p1[0]) * t,
- p1[1] + (p2[1] - p1[1]) * t];
-};
-
-// http://jsperf.com/id-dist-optimization
-iD.geo.dist = function(a, b) {
- var x = a[0] - b[0], y = a[1] - b[1];
- return Math.sqrt((x * x) + (y * y));
-};
-
-iD.geo.chooseIndex = function(way, point, context) {
- var dist = iD.geo.dist,
- graph = context.graph(),
- nodes = graph.childNodes(way),
- projNodes = nodes.map(function(n) { return context.projection(n.loc); });
-
- for (var i = 0, changes = []; i < projNodes.length - 1; i++) {
- changes[i] =
- (dist(projNodes[i], point) + dist(point, projNodes[i + 1])) /
- dist(projNodes[i], projNodes[i + 1]);
- }
-
- var idx = _.indexOf(changes, _.min(changes)),
- ratio = dist(projNodes[idx], point) / dist(projNodes[idx], projNodes[idx + 1]),
- loc = iD.geo.interp(nodes[idx].loc, nodes[idx + 1].loc, ratio);
-
- return {
- index: idx + 1,
- loc: loc
- };
-};
-
-// Return whether point is contained in polygon.
-//
-// `point` should be a 2-item array of coordinates.
-// `polygon` should be an array of 2-item arrays of coordinates.
-//
-// From https://github.com/substack/point-in-polygon.
-// ray-casting algorithm based on
-// http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
-//
-iD.geo.pointInPolygon = function(point, polygon) {
- var x = point[0],
- y = point[1],
- inside = false;
-
- for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
- var xi = polygon[i][0], yi = polygon[i][1];
- var xj = polygon[j][0], yj = polygon[j][1];
-
- var intersect = ((yi > y) != (yj > y)) &&
- (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
- if (intersect) inside = !inside;
- }
-
- return inside;
-};
-
-iD.geo.polygonContainsPolygon = function(outer, inner) {
- return _.every(inner, function(point) {
- return iD.geo.pointInPolygon(point, outer);
- });
-};
-
-iD.geo.polygonIntersectsPolygon = function(outer, inner) {
- return _.some(inner, function(point) {
- return iD.geo.pointInPolygon(point, outer);
- });
-};
-
-iD.geo.pathLength = function(path) {
- var length = 0,
- dx, dy;
- for (var i = 0; i < path.length - 1; i++) {
- dx = path[i][0] - path[i + 1][0];
- dy = path[i][1] - path[i + 1][1];
- length += Math.sqrt(dx * dx + dy * dy);
- }
- return length;
-};
-iD.geo.Extent = function geoExtent(min, max) {
- if (!(this instanceof iD.geo.Extent)) return new iD.geo.Extent(min, max);
- if (min instanceof iD.geo.Extent) {
- return min;
- } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
- this[0] = min[0];
- this[1] = min[1];
- } else {
- this[0] = min || [ Infinity, Infinity];
- this[1] = max || min || [-Infinity, -Infinity];
- }
-};
-
-iD.geo.Extent.prototype = [[], []];
-
-_.extend(iD.geo.Extent.prototype, {
- extend: function(obj) {
- if (!(obj instanceof iD.geo.Extent)) obj = new iD.geo.Extent(obj);
- return iD.geo.Extent([Math.min(obj[0][0], this[0][0]),
- Math.min(obj[0][1], this[0][1])],
- [Math.max(obj[1][0], this[1][0]),
- Math.max(obj[1][1], this[1][1])]);
- },
-
- center: function() {
- return [(this[0][0] + this[1][0]) / 2,
- (this[0][1] + this[1][1]) / 2];
- },
-
- intersects: function(obj) {
- if (!(obj instanceof iD.geo.Extent)) obj = new iD.geo.Extent(obj);
- return obj[0][0] <= this[1][0] &&
- obj[0][1] <= this[1][1] &&
- obj[1][0] >= this[0][0] &&
- obj[1][1] >= this[0][1];
- },
-
- padByMeters: function(meters) {
- var dLat = meters / 111200,
- dLon = meters / 111200 / Math.abs(Math.cos(this.center()[1]));
- return iD.geo.Extent(
- [this[0][0] - dLon, this[0][1] - dLat],
- [this[1][0] + dLon, this[1][1] + dLat]);
- }
-});
-// For fixing up rendering of multipolygons with tags on the outer member.
-// https://github.com/systemed/iD/issues/613
-iD.geo.isSimpleMultipolygonOuterMember = function(entity, graph) {
- if (entity.type !== 'way')
- return false;
-
- var parents = graph.parentRelations(entity);
- if (parents.length !== 1)
- return false;
-
- var parent = parents[0];
- if (!parent.isMultipolygon() || Object.keys(parent.tags).length > 1)
- return false;
-
- var members = parent.members, member;
- for (var i = 0; i < members.length; i++) {
- member = members[i];
- if (member.id === entity.id && member.role && member.role !== 'outer')
- return false; // Not outer member
- if (member.id !== entity.id && (!member.role || member.role === 'outer'))
- return false; // Not a simple multipolygon
- }
-
- return parent;
-};
-
-iD.geo.simpleMultipolygonOuterMember = function(entity, graph) {
- if (entity.type !== 'way')
- return false;
-
- var parents = graph.parentRelations(entity);
- if (parents.length !== 1)
- return false;
-
- var parent = parents[0];
- if (!parent.isMultipolygon() || Object.keys(parent.tags).length > 1)
- return false;
-
- var members = parent.members, member, outerMember;
- for (var i = 0; i < members.length; i++) {
- member = members[i];
- if (!member.role || member.role === 'outer') {
- if (outerMember)
- return false; // Not a simple multipolygon
- outerMember = member;
- }
- }
-
- return outerMember && graph.hasEntity(outerMember.id);
-};
-iD.actions = {};
-iD.actions.AddEntity = function(way) {
- return function(graph) {
- return graph.replace(way);
- };
-};
-iD.actions.AddMidpoint = function(midpoint, node) {
- return function(graph) {
- graph = graph.replace(node.move(midpoint.loc));
-
- var parents = _.intersection(
- graph.parentWays(graph.entity(midpoint.edge[0])),
- graph.parentWays(graph.entity(midpoint.edge[1])));
-
- parents.forEach(function(way) {
- for (var i = 0; i < way.nodes.length - 1; i++) {
- if ((way.nodes[i] === midpoint.edge[0] &&
- way.nodes[i + 1] === midpoint.edge[1]) ||
- (way.nodes[i] === midpoint.edge[1] &&
- way.nodes[i + 1] === midpoint.edge[0])) {
- graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
- }
- }
- });
-
- return graph;
- };
-};
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
-iD.actions.AddVertex = function(wayId, nodeId, index) {
- return function(graph) {
- return graph.replace(graph.entity(wayId).addNode(nodeId, index));
- };
-};
-iD.actions.ChangeTags = function(entityId, tags) {
- return function(graph) {
- var entity = graph.entity(entityId);
- return graph.replace(entity.update({tags: tags}));
- };
-};
-iD.actions.Circularize = function(wayId, projection, count) {
- count = count || 12;
-
- function closestIndex(nodes, loc) {
- var idx, min = Infinity, dist;
- for (var i = 0; i < nodes.length; i++) {
- dist = iD.geo.dist(nodes[i].loc, loc);
- if (dist < min) {
- min = dist;
- idx = i;
- }
- }
- return idx;
- }
-
- var action = function(graph) {
- var way = graph.entity(wayId),
- nodes = _.uniq(graph.childNodes(way)),
- points = nodes.map(function(n) { return projection(n.loc); }),
- centroid = d3.geom.polygon(points).centroid(),
- radius = d3.median(points, function(p) {
- return iD.geo.dist(centroid, p);
- }),
- ids = [],
- sign = d3.geom.polygon(points).area() > 0 ? -1 : 1;
-
- for (var i = 0; i < count; i++) {
- var node,
- loc = projection.invert([
- centroid[0] + Math.cos(sign * (i / 12) * Math.PI * 2) * radius,
- centroid[1] + Math.sin(sign * (i / 12) * Math.PI * 2) * radius]);
-
- if (nodes.length) {
- var idx = closestIndex(nodes, loc);
- node = nodes[idx];
- nodes.splice(idx, 1);
- } else {
- node = iD.Node();
- }
-
- ids.push(node.id);
- graph = graph.replace(node.move(loc));
- }
-
- ids.push(ids[0]);
- way = way.update({nodes: ids});
- graph = graph.replace(way);
-
- for (i = 0; i < nodes.length; i++) {
- graph.parentWays(nodes[i]).forEach(function(parent) {
- graph = graph.replace(parent.replaceNode(nodes[i].id,
- ids[closestIndex(graph.childNodes(way), nodes[i].loc)]));
- });
-
- graph = iD.actions.DeleteNode(nodes[i].id)(graph);
- }
-
- return graph;
- };
-
- action.disabled = function(graph) {
- if (!graph.entity(wayId).isClosed())
- return 'not_closed';
- };
-
- return action;
-};
-// Connect the ways at the given nodes.
-//
-// The last node will survive. All other nodes will be replaced with
-// the surviving node in parent ways, and then removed.
-//
-// Tags and relation memberships of of non-surviving nodes are merged
-// to the survivor.
-//
-// This is the inverse of `iD.actions.Disconnect`.
-//
-// Reference:
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
-// https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
-//
-iD.actions.Connect = function(nodeIds) {
- return function(graph) {
- var survivor = graph.entity(_.last(nodeIds));
-
- for (var i = 0; i < nodeIds.length - 1; i++) {
- var node = graph.entity(nodeIds[i]);
-
- graph.parentWays(node).forEach(function(parent) {
- if (!parent.areAdjacent(node.id, survivor.id)) {
- graph = graph.replace(parent.replaceNode(node.id, survivor.id));
- }
- });
-
- graph.parentRelations(node).forEach(function(parent) {
- graph = graph.replace(parent.replaceMember(node, survivor));
- });
-
- survivor = survivor.mergeTags(node.tags);
- graph = iD.actions.DeleteNode(node.id)(graph);
- }
-
- graph = graph.replace(survivor);
-
- return graph;
- };
-};
-iD.actions.DeleteMultiple = function(ids) {
- return function(graph) {
- var actions = {
- way: iD.actions.DeleteWay,
- node: iD.actions.DeleteNode,
- relation: iD.actions.DeleteRelation
- };
-
- ids.forEach(function(id) {
- if (graph.hasEntity(id)) { // It may have been deleted aready.
- graph = actions[graph.entity(id).type](id)(graph);
- }
- });
-
- return graph;
- };
-};
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
-iD.actions.DeleteNode = function(nodeId) {
- return function(graph) {
- var node = graph.entity(nodeId);
-
- graph.parentWays(node)
- .forEach(function(parent) {
- parent = parent.removeNode(nodeId);
- graph = graph.replace(parent);
-
- if (parent.isDegenerate()) {
- graph = iD.actions.DeleteWay(parent.id)(graph);
- }
- });
-
- graph.parentRelations(node)
- .forEach(function(parent) {
- graph = graph.replace(parent.removeMember(nodeId));
- });
-
- return graph.remove(node);
- };
-};
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
-iD.actions.DeleteRelation = function(relationId) {
- function deleteEntity(entity, graph) {
- return !graph.parentWays(entity).length &&
- !graph.parentRelations(entity).length &&
- !entity.hasInterestingTags();
- }
-
- return function(graph) {
- var relation = graph.entity(relationId);
-
- graph.parentRelations(relation)
- .forEach(function(parent) {
- graph = graph.replace(parent.removeMember(relationId));
- });
-
- _.uniq(_.pluck(relation.members, 'id')).forEach(function(memberId) {
- graph = graph.replace(relation.removeMember(memberId));
-
- var entity = graph.entity(memberId);
- if (deleteEntity(entity, graph)) {
- graph = iD.actions.DeleteMultiple([memberId])(graph);
- }
- });
-
- return graph.remove(relation);
- };
-};
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
-iD.actions.DeleteWay = function(wayId) {
- function deleteNode(node, graph) {
- return !graph.parentWays(node).length &&
- !graph.parentRelations(node).length &&
- !node.hasInterestingTags();
- }
-
- return function(graph) {
- var way = graph.entity(wayId);
-
- graph.parentRelations(way)
- .forEach(function(parent) {
- graph = graph.replace(parent.removeMember(wayId));
- });
-
- _.uniq(way.nodes).forEach(function(nodeId) {
- graph = graph.replace(way.removeNode(nodeId));
-
- var node = graph.entity(nodeId);
- if (deleteNode(node, graph)) {
- graph = graph.remove(node);
- }
- });
-
- return graph.remove(way);
- };
-};
-iD.actions.DeprecateTags = function(entityId) {
- return function(graph) {
- var entity = graph.entity(entityId),
- newtags = _.clone(entity.tags),
- change = false,
- rule;
-
- // This handles deprecated tags with a single condition
- for (var i = 0; i < iD.data.deprecated.length; i++) {
-
- rule = iD.data.deprecated[i];
- var match = _.pairs(rule.old)[0],
- replacements = rule.replace ? _.pairs(rule.replace) : null;
-
- if (entity.tags[match[0]] && match[1] === '*') {
-
- var value = entity.tags[match[0]];
- if (replacements && !newtags[replacements[0][0]]) {
- newtags[replacements[0][0]] = value;
- }
- delete newtags[match[0]];
- change = true;
-
- } else if (entity.tags[match[0]] === match[1]) {
- newtags = _.assign({}, rule.replace || {}, _.omit(newtags, match[0]));
- change = true;
- }
- }
-
- if (change) {
- return graph.replace(entity.update({tags: newtags}));
- } else {
- return graph;
- }
- };
-};
-// Disconect the ways at the given node.
-//
-// Optionally, disconnect only the given ways.
-//
-// For testing convenience, accepts an ID to assign to the (first) new node.
-// Normally, this will be undefined and the way will automatically
-// be assigned a new ID.
-//
-// This is the inverse of `iD.actions.Connect`.
-//
-// Reference:
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
-// https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
-//
-iD.actions.Disconnect = function(nodeId, newNodeId) {
- var wayIds;
-
- var action = function(graph) {
- var node = graph.entity(nodeId),
- replacements = action.replacements(graph);
-
- replacements.forEach(function(replacement) {
- var newNode = iD.Node({id: newNodeId, loc: node.loc, tags: node.tags});
- graph = graph.replace(newNode);
- graph = graph.replace(replacement.way.updateNode(newNode.id, replacement.index));
- });
-
- return graph;
- };
-
- action.replacements = function(graph) {
- var candidates = [],
- keeping = false,
- parents = graph.parentWays(graph.entity(nodeId));
-
- parents.forEach(function(parent) {
- if (wayIds && wayIds.indexOf(parent.id) === -1) {
- keeping = true;
- return;
- }
-
- parent.nodes.forEach(function(waynode, index) {
- if (waynode === nodeId) {
- candidates.push({way: parent, index: index});
- }
- });
- });
-
- return keeping ? candidates : candidates.slice(1);
- };
-
- action.disabled = function(graph) {
- var replacements = action.replacements(graph);
- if (replacements.length === 0 || (wayIds && wayIds.length !== replacements.length))
- return 'not_connected';
- };
-
- action.limitWays = function(_) {
- if (!arguments.length) return wayIds;
- wayIds = _;
- return action;
- };
-
- return action;
-};
-// Join ways at the end node they share.
-//
-// This is the inverse of `iD.actions.Split`.
-//
-// Reference:
-// https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
-// https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
-//
-iD.actions.Join = function(ids) {
- var idA = ids[0],
- idB = ids[1];
-
- function groupEntitiesByGeometry(graph) {
- var entities = ids.map(function(id) { return graph.entity(id); });
- return _.extend({line: []}, _.groupBy(entities, function(entity) { return entity.geometry(graph); }));
- }
-
- var action = function(graph) {
- var a = graph.entity(idA),
- b = graph.entity(idB),
- nodes;
-
- if (a.first() === b.first()) {
- // a <-- b ==> c
- // Expected result:
- // a <-- b <-- c
- b = iD.actions.Reverse(idB)(graph).entity(idB);
- nodes = b.nodes.slice().concat(a.nodes.slice(1));
-
- } else if (a.first() === b.last()) {
- // a <-- b <== c
- // Expected result:
- // a <-- b <-- c
- nodes = b.nodes.concat(a.nodes.slice(1));
-
- } else if (a.last() === b.first()) {
- // a --> b ==> c
- // Expected result:
- // a --> b --> c
- nodes = a.nodes.concat(b.nodes.slice(1));
-
- } else if (a.last() === b.last()) {
- // a --> b <== c
- // Expected result:
- // a --> b --> c
- b = iD.actions.Reverse(idB)(graph).entity(idB);
- nodes = a.nodes.concat(b.nodes.slice().slice(1));
- }
-
- graph.parentRelations(b).forEach(function(parent) {
- graph = graph.replace(parent.replaceMember(b, a));
- });
-
- graph = graph.replace(a.mergeTags(b.tags).update({ nodes: nodes }));
- graph = iD.actions.DeleteWay(idB)(graph);
-
- return graph;
- };
-
- action.disabled = function(graph) {
- var geometries = groupEntitiesByGeometry(graph);
-
- if (ids.length !== 2 || ids.length !== geometries.line.length)
- return 'not_eligible';
-
- var a = graph.entity(idA),
- b = graph.entity(idB);
-
- if (a.first() !== b.first() &&
- a.first() !== b.last() &&
- a.last() !== b.first() &&
- a.last() !== b.last())
- return 'not_adjacent';
- };
-
- return action;
-};
-iD.actions.Merge = function(ids) {
- function groupEntitiesByGeometry(graph) {
- var entities = ids.map(function(id) { return graph.entity(id); });
- return _.extend({point: [], area: [], line: [], relation: []},
- _.groupBy(entities, function(entity) { return entity.geometry(graph); }));
- }
-
- var action = function(graph) {
- var geometries = groupEntitiesByGeometry(graph),
- target = geometries.area[0] || geometries.line[0],
- points = geometries.point;
-
- points.forEach(function(point) {
- target = target.mergeTags(point.tags);
-
- graph.parentRelations(point).forEach(function(parent) {
- graph = graph.replace(parent.replaceMember(point, target));
- });
-
- graph = graph.remove(point);
- });
-
- graph = graph.replace(target);
-
- return graph;
- };
-
- action.disabled = function(graph) {
- var geometries = groupEntitiesByGeometry(graph);
- if (geometries.point.length === 0 ||
- (geometries.area.length + geometries.line.length) !== 1 ||
- geometries.relation.length !== 0)
- return 'not_eligible';
- };
-
- return action;
-};
-// https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
-iD.actions.Move = function(ids, delta, projection) {
- function addNodes(ids, nodes, graph) {
- ids.forEach(function(id) {
- var entity = graph.entity(id);
- if (entity.type === 'node') {
- nodes.push(id);
- } else if (entity.type === 'way') {
- nodes.push.apply(nodes, entity.nodes);
- } else {
- addNodes(_.pluck(entity.members, 'id'), nodes, graph);
- }
- });
- }
-
- var action = function(graph) {
- var nodes = [];
-
- addNodes(ids, nodes, graph);
-
- _.uniq(nodes).forEach(function(id) {
- var node = graph.entity(id),
- start = projection(node.loc),
- end = projection.invert([start[0] + delta[0], start[1] + delta[1]]);
- graph = graph.replace(node.move(end));
- });
-
- return graph;
- };
-
- action.disabled = function(graph) {
- function incompleteRelation(id) {
- var entity = graph.entity(id);
- return entity.type === 'relation' && !entity.isComplete(graph);
- }
-
- if (_.any(ids, incompleteRelation))
- return 'incomplete_relation';
- };
-
- return action;
-};
-// https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
-iD.actions.MoveNode = function(nodeId, loc) {
- return function(graph) {
- return graph.replace(graph.entity(nodeId).move(loc));
- };
-};
-iD.actions.Noop = function() {
- return function(graph) {
- return graph;
- };
-};
-/*
- * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
- */
-
-iD.actions.Orthogonalize = function(wayId, projection) {
- var action = function(graph) {
- var way = graph.entity(wayId),
- nodes = graph.childNodes(way),
- corner = {i: 0, dotp: 1},
- points, i, j, score, motions;
-
- if (nodes.length === 4) {
- points = _.uniq(nodes).map(function(n) { return projection(n.loc); });
-
- for (i = 0; i < 1000; i++) {
- motions = points.map(calcMotion);
- points[corner.i] = addPoints(points[corner.i],motions[corner.i]);
- score = corner.dotp;
- if (score < 1.0e-8) {
- break;
- }
- }
-
- graph = graph.replace(graph.entity(nodes[corner.i].id)
- .move(projection.invert(points[corner.i])));
- } else {
- var best;
- points = nodes.map(function(n) { return projection(n.loc); });
- score = squareness();
-
- for (i = 0; i < 1000; i++) {
- motions = points.map(calcMotion);
- for (j = 0; j < motions.length; j++) {
- points[j] = addPoints(points[j],motions[j]);
- }
- var newScore = squareness();
- if (newScore < score) {
- best = _.clone(points);
- score = newScore;
- }
- if (score < 1.0e-8) {
- break;
- }
- }
-
- points = best;
-
- for (i = 0; i < points.length - 1; i++) {
- graph = graph.replace(graph.entity(nodes[i].id)
- .move(projection.invert(points[i])));
- }
- }
-
- return graph;
-
- function calcMotion(b, i, array) {
- var a = array[(i - 1 + array.length) % array.length],
- c = array[(i + 1) % array.length],
- p = subtractPoints(a, b),
- q = subtractPoints(c, b);
-
- var scale = iD.geo.dist(p, [0, 0]) + iD.geo.dist(q, [0, 0]);
- p = normalizePoint(p, 1.0);
- q = normalizePoint(q, 1.0);
-
- var dotp = p[0] * q[0] + p[1] * q[1];
-
- // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
- if (array.length > 3) {
- if (dotp < -0.707106781186547) {
- dotp += 1.0;
- }
- } else if (Math.abs(dotp) < corner.dotp) {
- corner.i = i;
- corner.dotp = Math.abs(dotp);
- }
-
- return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
- }
-
- function squareness() {
- var g = 0.0;
- for (var i = 1; i < points.length - 1; i++) {
- var score = scoreOfPoints(points[i - 1], points[i], points[i + 1]);
- g += score;
- }
- var startScore = scoreOfPoints(points[points.length - 1], points[0], points[1]);
- var endScore = scoreOfPoints(points[points.length - 2], points[points.length - 1], points[0]);
- g += startScore;
- g += endScore;
- return g;
- }
-
- function scoreOfPoints(a, b, c) {
- var p = subtractPoints(a, b),
- q = subtractPoints(c, b);
-
- p = normalizePoint(p, 1.0);
- q = normalizePoint(q, 1.0);
-
- var dotp = p[0] * q[0] + p[1] * q[1];
- // score is constructed so that +1, -1 and 0 are all scored 0, any other angle
- // is scored higher.
- return 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
- }
-
- function subtractPoints(a, b) {
- return [a[0] - b[0], a[1] - b[1]];
- }
-
- function addPoints(a, b) {
- return [a[0] + b[0], a[1] + b[1]];
- }
-
- function normalizePoint(point, scale) {
- var vector = [0, 0];
- var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
- if (length !== 0) {
- vector[0] = point[0] / length;
- vector[1] = point[1] / length;
- }
-
- vector[0] *= scale;
- vector[1] *= scale;
-
- return vector;
- }
- };
-
- action.disabled = function(graph) {
- if (!graph.entity(wayId).isClosed())
- return 'not_closed';
- };
-
- return action;
-};
-/*
- Order the nodes of a way in reverse order and reverse any direction dependent tags
- other than `oneway`. (We assume that correcting a backwards oneway is the primary
- reason for reversing a way.)
-
- The following transforms are performed:
-
- Keys:
- *:right=* ⟺ *:left=*
- *:forward=* ⟺ *:backward=*
- direction=up ⟺ direction=down
- incline=up ⟺ incline=down
- *=right ⟺ *=left
-
- Relation members:
- role=forward ⟺ role=backward
-
- In addition, numeric-valued `incline` tags are negated.
-
- The JOSM implementation was used as a guide, but transformations that were of unclear benefit
- or adjusted tags that don't seem to be used in practice were omitted.
-
- References:
- http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
- http://wiki.openstreetmap.org/wiki/Key:direction#Steps
- http://wiki.openstreetmap.org/wiki/Key:incline
- http://wiki.openstreetmap.org/wiki/Route#Members
- http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
- */
-iD.actions.Reverse = function(wayId) {
- var replacements = [
- [/:right$/, ':left'], [/:left$/, ':right'],
- [/:forward$/, ':backward'], [/:backward$/, ':forward']
- ], numeric = /^([+\-]?)(?=[\d.])/;
-
- function reverseKey(key) {
- for (var i = 0; i < replacements.length; ++i) {
- var replacement = replacements[i];
- if (replacement[0].test(key)) {
- return key.replace(replacement[0], replacement[1]);
- }
- }
- return key;
- }
-
- function reverseValue(key, value) {
- if (key === "incline" && numeric.test(value)) {
- return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
- } else if (key === "incline" || key === "direction") {
- return {up: 'down', down: 'up'}[value] || value;
- } else {
- return {left: 'right', right: 'left'}[value] || value;
- }
- }
-
- return function(graph) {
- var way = graph.entity(wayId),
- nodes = way.nodes.slice().reverse(),
- tags = {}, key, role;
-
- for (key in way.tags) {
- tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
- }
-
- graph.parentRelations(way).forEach(function(relation) {
- relation.members.forEach(function(member, index) {
- if (member.id === way.id && (role = {forward: 'backward', backward: 'forward'}[member.role])) {
- relation = relation.updateMember({role: role}, index);
- graph = graph.replace(relation);
- }
- });
- });
-
- return graph.replace(way.update({nodes: nodes, tags: tags}));
- };
-};
-iD.actions.RotateWay = function(wayId, pivot, angle, projection) {
- return function(graph) {
- return graph.update(function(graph) {
- var way = graph.entity(wayId);
-
- _.unique(way.nodes).forEach(function(id) {
-
- var node = graph.entity(id),
- point = projection(node.loc),
- radial = [0,0];
-
- radial[0] = point[0] - pivot[0];
- radial[1] = point[1] - pivot[1];
-
- point = [
- radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + pivot[0],
- radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + pivot[1]
- ];
-
- graph = graph.replace(node.move(projection.invert(point)));
-
- });
-
- });
- };
-};
-// Split a way at the given node.
-//
-// Optionally, split only the given ways, if multiple ways share
-// the given node.
-//
-// This is the inverse of `iD.actions.Join`.
-//
-// For testing convenience, accepts an ID to assign to the new way.
-// Normally, this will be undefined and the way will automatically
-// be assigned a new ID.
-//
-// Reference:
-// https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
-//
-iD.actions.Split = function(nodeId, newWayIds) {
- var wayIds;
-
- function split(graph, wayA, newWayId) {
- var wayB = iD.Way({id: newWayId, tags: wayA.tags}),
- nodesA,
- nodesB,
- isArea = wayA.isArea();
-
- if (wayA.isClosed()) {
- var nodes = wayA.nodes.slice(0, -1),
- idxA = _.indexOf(nodes, nodeId),
- idxB = idxA + Math.floor(nodes.length / 2);
-
- if (idxB >= nodes.length) {
- idxB %= nodes.length;
- nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
- nodesB = nodes.slice(idxB, idxA + 1);
- } else {
- nodesA = nodes.slice(idxA, idxB + 1);
- nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
- }
- } else {
- var idx = _.indexOf(wayA.nodes, nodeId, 1);
- nodesA = wayA.nodes.slice(0, idx + 1);
- nodesB = wayA.nodes.slice(idx);
- }
-
- wayA = wayA.update({nodes: nodesA});
- wayB = wayB.update({nodes: nodesB});
-
- graph = graph.replace(wayA);
- graph = graph.replace(wayB);
-
- graph.parentRelations(wayA).forEach(function(relation) {
- if (relation.isRestriction()) {
- var via = relation.memberByRole('via');
- if (via && wayB.contains(via.id)) {
- relation = relation.updateMember({id: wayB.id}, relation.memberById(wayA.id).index);
- graph = graph.replace(relation);
- }
- } else {
- var role = relation.memberById(wayA.id).role,
- last = wayB.last(),
- i = relation.memberById(wayA.id).index,
- j;
-
- for (j = 0; j < relation.members.length; j++) {
- var entity = graph.hasEntity(relation.members[j].id);
- if (entity && entity.type === 'way' && entity.contains(last)) {
- break;
- }
- }
-
- relation = relation.addMember({id: wayB.id, type: 'way', role: role}, i <= j ? i + 1 : i);
- graph = graph.replace(relation);
- }
- });
-
- if (isArea) {
- var multipolygon = iD.Relation({
- tags: _.extend({}, wayA.tags, {type: 'multipolygon'}),
- members: [
- {id: wayA.id, role: 'outer', type: 'way'},
- {id: wayB.id, role: 'outer', type: 'way'}
- ]});
-
- graph = graph.replace(multipolygon);
- graph = graph.replace(wayA.update({tags: {}}));
- graph = graph.replace(wayB.update({tags: {}}));
- }
-
- return graph;
- }
-
- var action = function(graph) {
- var candidates = action.ways(graph);
- for (var i = 0; i < candidates.length; i++) {
- graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
- }
- return graph;
- };
-
- action.ways = function(graph) {
- var node = graph.entity(nodeId),
- parents = graph.parentWays(node);
-
- return parents.filter(function(parent) {
- if (wayIds && wayIds.indexOf(parent.id) === -1)
- return false;
-
- if (parent.isClosed()) {
- return true;
- }
-
- for (var i = 1; i < parent.nodes.length - 1; i++) {
- if (parent.nodes[i] === nodeId) {
- return true;
- }
- }
-
- return false;
- });
- };
-
- action.disabled = function(graph) {
- var candidates = action.ways(graph);
- if (candidates.length === 0 || (wayIds && wayIds.length !== candidates.length))
- return 'not_eligible';
- };
-
- action.limitWays = function(_) {
- if (!arguments.length) return wayIds;
- wayIds = _;
- return action;
- };
-
- return action;
-};
-iD.behavior = {};
-iD.behavior.accept = function() {
- var event = d3.dispatch('accept'),
- keybinding = d3.keybinding('accept');
-
- function accept(selection) {
- keybinding.on('↩', function() {
- event.accept();
- })(selection);
- }
-
- return d3.rebind(accept, event, "on");
-};
-iD.behavior.AddWay = function(context) {
- var event = d3.dispatch('start', 'startFromWay', 'startFromNode'),
- draw = iD.behavior.Draw(context);
-
- var addWay = function(surface) {
- draw.on('click', event.start)
- .on('clickWay', event.startFromWay)
- .on('clickNode', event.startFromNode)
- .on('cancel', addWay.cancel)
- .on('finish', addWay.cancel);
-
- context.map()
- .minzoom(16)
- .dblclickEnable(false);
-
- surface.call(draw);
- };
-
- addWay.off = function(surface) {
- context.map()
- .minzoom(0)
- .tail(false);
-
- surface.call(draw.off);
- };
-
- addWay.cancel = function() {
-
- window.setTimeout(function() {
- context.map().dblclickEnable(true);
- }, 1000);
-
- context.enter(iD.modes.Browse(context));
- };
-
- return d3.rebind(addWay, event, 'on');
-};
-/*
- `iD.behavior.drag` is like `d3.behavior.drag`, with the following differences:
-
- * The `origin` function is expected to return an [x, y] tuple rather than an
- {x, y} object.
- * The events are `start`, `move`, and `end`.
- (https://github.com/mbostock/d3/issues/563)
- * The `start` event is not dispatched until the first cursor movement occurs.
- (https://github.com/mbostock/d3/pull/368)
- * The `move` event has a `point` and `delta` [x, y] tuple properties rather
- than `x`, `y`, `dx`, and `dy` properties.
- * The `end` event is not dispatched if no movement occurs.
- * An `off` function is available that unbinds the drag's internal event handlers.
- * Delegation is supported via the `delegate` function.
-
- */
-iD.behavior.drag = function() {
- function d3_eventCancel() {
- d3.event.stopPropagation();
- d3.event.preventDefault();
- }
-
- var event = d3.dispatch("start", "move", "end"),
- origin = null,
- selector = '',
- filter = null,
- event_, target, surface;
-
- event.of = function(thiz, argumentz) {
- return function(e1) {
- try {
- var e0 = e1.sourceEvent = d3.event;
- e1.target = drag;
- d3.event = e1;
- event[e1.type].apply(thiz, argumentz);
- } finally {
- d3.event = e0;
- }
- };
- };
-
- function mousedown() {
- target = this;
- event_ = event.of(target, arguments);
- var eventTarget = d3.event.target,
- touchId = d3.event.touches ? d3.event.changedTouches[0].identifier : null,
- offset,
- origin_ = point(),
- moved = 0;
-
- var w = d3.select(window)
- .on(touchId !== null ? "touchmove.drag-" + touchId : "mousemove.drag", dragmove)
- .on(touchId !== null ? "touchend.drag-" + touchId : "mouseup.drag", dragend, true);
-
- if (origin) {
- offset = origin.apply(target, arguments);
- offset = [offset[0] - origin_[0], offset[1] - origin_[1]];
- } else {
- offset = [0, 0];
- }
-
- if (touchId === null) d3_eventCancel();
-
- function point() {
- var p = target.parentNode || surface;
- return touchId !== null ? d3.touches(p).filter(function(p) {
- return p.identifier === touchId;
- })[0] : d3.mouse(p);
- }
-
- function dragmove() {
-
- var p = point(),
- dx = p[0] - origin_[0],
- dy = p[1] - origin_[1];
-
- if (!moved) {
- event_({
- type: "start"
- });
- }
-
- moved |= dx | dy;
- origin_ = p;
- d3_eventCancel();
-
- event_({
- type: "move",
- point: [p[0] + offset[0], p[1] + offset[1]],
- delta: [dx, dy]
- });
- }
-
- function dragend() {
- if (moved) {
- event_({
- type: "end"
- });
-
- d3_eventCancel();
- if (d3.event.target === eventTarget) w.on("click.drag", click, true);
- }
-
- w.on(touchId !== null ? "touchmove.drag-" + touchId : "mousemove.drag", null)
- .on(touchId !== null ? "touchend.drag-" + touchId : "mouseup.drag", null);
- }
-
- function click() {
- d3_eventCancel();
- w.on("click.drag", null);
- }
- }
-
- var lastPos = [[0, 0], [0, 0]],
- lastTimes = [0, 0];
-
- function move() {
- lastPos.push([d3.event.clientX, d3.event.clientY]);
- lastTimes.push((new Date()).getTime());
- lastTimes.shift();
- lastPos.shift();
- }
-
- function drag(selection) {
- var matchesSelector = iD.util.prefixDOMProperty('matchesSelector'),
- delegate = mousedown;
-
- if (selector) {
- delegate = function() {
-
- var velocity = Math.sqrt(
- Math.pow(lastPos[0][0] - d3.event.clientX, 2),
- Math.pow(lastPos[0][1] - d3.event.clientY, 2)) /
- ((new Date()).getTime() - lastTimes[0]);
-
- if (velocity > 0.05) return;
-
- var root = this,
- target = d3.event.target;
- for (; target && target !== root; target = target.parentNode) {
- if (target[matchesSelector](selector) &&
- (!filter || filter(target.__data__))) {
- return mousedown.call(target, target.__data__);
- }
- }
- };
- }
-
- selection
- .on("mousemove.drag" + selector, move)
- .on("mousedown.drag" + selector, delegate)
- .on("touchstart.drag" + selector, delegate);
- }
-
- drag.off = function(selection) {
- selection
- .on("mousemove.drag" + selector, null)
- .on("mousedown.drag" + selector, null)
- .on("touchstart.drag" + selector, null);
- };
-
- drag.delegate = function(_) {
- if (!arguments.length) return selector;
- selector = _;
- return drag;
- };
-
- drag.filter = function(_) {
- if (!arguments.length) return origin;
- filter = _;
- return drag;
- };
-
- drag.origin = function (_) {
- if (!arguments.length) return origin;
- origin = _;
- return drag;
- };
-
- drag.cancel = function() {
- d3.select(window)
- .on("mousemove.drag", null)
- .on("mouseup.drag", null);
- return drag;
- };
-
- drag.target = function() {
- if (!arguments.length) return target;
- target = arguments[0];
- event_ = event.of(target, Array.prototype.slice.call(arguments, 1));
- return drag;
- };
-
- drag.surface = function() {
- if (!arguments.length) return surface;
- surface = arguments[0];
- return drag;
- };
-
- return d3.rebind(drag, event, "on");
-};
-iD.behavior.Draw = function(context) {
- var event = d3.dispatch('move', 'click', 'clickWay',
- 'clickNode', 'undo', 'cancel', 'finish'),
- keybinding = d3.keybinding('draw'),
- hover = iD.behavior.Hover().altDisables(true),
- closeTolerance = 4,
- tolerance = 12;
-
- function datum() {
- if (d3.event.altKey) return {};
- else return d3.event.target.__data__ || {};
- }
-
- function mousedown() {
-
- function point() {
- var p = element.node().parentNode;
- return touchId !== null ? d3.touches(p).filter(function(p) {
- return p.identifier === touchId;
- })[0] : d3.mouse(p);
- }
-
- var eventTarget = d3.event.target,
- element = d3.select(this),
- touchId = d3.event.touches ? d3.event.changedTouches[0].identifier : null,
- time = +new Date(),
- pos = point();
-
- element.on('mousemove.draw', null);
-
- d3.select(window).on('mouseup.draw', function() {
- element.on('mousemove.draw', mousemove);
- if (iD.geo.dist(pos, point()) < closeTolerance ||
- (iD.geo.dist(pos, point()) < tolerance &&
- (+new Date() - time) < 500)) {
-
- // Prevent a quick second click
- d3.select(window).on('click.draw-block', function() {
- d3.event.stopPropagation();
- }, true);
-
- context.map().dblclickEnable(false);
-
- window.setTimeout(function() {
- context.map().dblclickEnable(true);
- d3.select(window).on('click.draw-block', null);
- }, 500);
-
- click();
- }
- });
- }
-
- function mousemove() {
- event.move(datum());
- }
-
- function click() {
- var d = datum();
- if (d.type === 'way') {
- var choice = iD.geo.chooseIndex(d, d3.mouse(context.surface().node()), context),
- edge = [d.nodes[choice.index - 1], d.nodes[choice.index]];
- event.clickWay(choice.loc, edge);
-
- } else if (d.type === 'node') {
- event.clickNode(d);
-
- } else {
- event.click(context.map().mouseCoordinates());
- }
- }
-
- function backspace() {
- d3.event.preventDefault();
- event.undo();
- }
-
- function del() {
- d3.event.preventDefault();
- event.cancel();
- }
-
- function ret() {
- d3.event.preventDefault();
- event.finish();
- }
-
- function draw(selection) {
- context.install(hover);
-
- keybinding
- .on('⌫', backspace)
- .on('⌦', del)
- .on('⎋', ret)
- .on('↩', ret);
-
- selection
- .on('mousedown.draw', mousedown)
- .on('mousemove.draw', mousemove);
-
- d3.select(document)
- .call(keybinding);
-
- return draw;
- }
-
- draw.off = function(selection) {
- context.uninstall(hover);
-
- selection
- .on('mousedown.draw', null)
- .on('mousemove.draw', null);
-
- d3.select(window)
- .on('mouseup.draw', null);
-
- d3.select(document)
- .call(keybinding.off);
- };
-
- return d3.rebind(draw, event, 'on');
-};
-iD.behavior.DrawWay = function(context, wayId, index, mode, baseGraph) {
- var way = context.entity(wayId),
- isArea = way.geometry() === 'area',
- finished = false,
- annotation = t((way.isDegenerate() ?
- 'operations.start.annotation.' :
- 'operations.continue.annotation.') + context.geometry(wayId)),
- draw = iD.behavior.Draw(context);
-
- var startIndex = typeof index === 'undefined' ? way.nodes.length - 1 : 0,
- start = iD.Node({loc: context.graph().entity(way.nodes[startIndex]).loc}),
- end = iD.Node({loc: context.map().mouseCoordinates()}),
- segment = iD.Way({
- nodes: [start.id, end.id],
- tags: _.clone(way.tags)
- });
-
- var f = context[way.isDegenerate() ? 'replace' : 'perform'];
- if (isArea) {
- f(iD.actions.AddEntity(end),
- iD.actions.AddVertex(wayId, end.id, index));
- } else {
- f(iD.actions.AddEntity(start),
- iD.actions.AddEntity(end),
- iD.actions.AddEntity(segment));
- }
-
- function move(datum) {
- var loc = context.map().mouseCoordinates();
-
- if (datum.id === end.id || datum.id === segment.id) {
- context.surface().selectAll('.way, .node')
- .filter(function(d) {
- return d.id === end.id || d.id === segment.id;
- })
- .classed('active', true);
- } else if (datum.type === 'node') {
- loc = datum.loc;
- } else if (datum.type === 'way') {
- loc = iD.geo.chooseIndex(datum, d3.mouse(context.surface().node()), context).loc;
- }
-
- context.replace(iD.actions.MoveNode(end.id, loc));
- }
-
- function undone() {
- finished = true;
- context.enter(iD.modes.Browse(context));
- }
-
- function lineActives(d) {
- return d.id === segment.id || d.id === start.id || d.id === end.id;
- }
-
- function areaActives(d) {
- return d.id === wayId || d.id === end.id;
- }
-
- var drawWay = function(surface) {
- draw.on('move', move)
- .on('click', drawWay.add)
- .on('clickWay', drawWay.addWay)
- .on('clickNode', drawWay.addNode)
- .on('undo', context.undo)
- .on('cancel', drawWay.cancel)
- .on('finish', drawWay.finish);
-
- context.map()
- .minzoom(16)
- .dblclickEnable(false);
-
- surface.call(draw)
- .selectAll('.way, .node')
- .filter(isArea ? areaActives : lineActives)
- .classed('active', true);
-
- context.history()
- .on('undone.draw', undone);
- };
-
- drawWay.off = function(surface) {
- if (!finished)
- context.pop();
-
- context.map()
- .minzoom(0)
- .tail(false);
-
- surface.call(draw.off)
- .selectAll('.way, .node')
- .classed('active', false);
-
- context.history()
- .on('undone.draw', null);
- };
-
- function ReplaceTemporaryNode(newNode) {
- return function(graph) {
- if (isArea) {
- return graph
- .replace(way.addNode(newNode.id, index))
- .remove(end);
-
- } else {
- return graph
- .replace(graph.entity(wayId).addNode(newNode.id, index))
- .remove(end)
- .remove(segment)
- .remove(start);
- }
- };
- }
-
- // Accept the current position of the temporary node and continue drawing.
- drawWay.add = function(loc) {
-
- // prevent duplicate nodes
- var last = context.hasEntity(way.nodes[way.nodes.length - (isArea ? 2 : 1)]);
- if (last && last.loc[0] === loc[0] && last.loc[1] === loc[1]) return;
-
- var newNode = iD.Node({loc: loc});
-
- context.replace(
- iD.actions.AddEntity(newNode),
- ReplaceTemporaryNode(newNode),
- annotation);
-
- finished = true;
- context.enter(mode);
- };
-
- // Connect the way to an existing way.
- drawWay.addWay = function(loc, edge) {
-
- // Avoid creating duplicate segments
- if (!isArea) {
- if (edge[0] === way.nodes[way.nodes.length - 1] ||
- edge[1] === way.nodes[way.nodes.length - 1]) return;
- }
-
- var newNode = iD.Node({ loc: loc });
-
- context.perform(
- iD.actions.AddMidpoint({ loc: loc, edge: edge}, newNode),
- ReplaceTemporaryNode(newNode),
- annotation);
-
- finished = true;
- context.enter(mode);
- };
-
- // Connect the way to an existing node and continue drawing.
- drawWay.addNode = function(node) {
-
- // Avoid creating duplicate segments
- if (way.areAdjacent(node.id, way.nodes[way.nodes.length - 1])) return;
-
- context.perform(
- ReplaceTemporaryNode(node),
- annotation);
-
- finished = true;
- context.enter(mode);
- };
-
- // Finish the draw operation, removing the temporary node. If the way has enough
- // nodes to be valid, it's selected. Otherwise, return to browse mode.
- drawWay.finish = function() {
- context.pop();
- finished = true;
-
- window.setTimeout(function() {
- context.map().dblclickEnable(true);
- }, 1000);
-
- if (context.hasEntity(wayId)) {
- context.enter(
- iD.modes.Select(context, [wayId])
- .suppressMenu(true)
- .newFeature(true));
- } else {
- context.enter(iD.modes.Browse(context));
- }
- };
-
- // Cancel the draw operation and return to browse, deleting everything drawn.
- drawWay.cancel = function() {
- context.perform(
- d3.functor(baseGraph),
- t('operations.cancel_draw.annotation'));
-
- window.setTimeout(function() {
- context.map().dblclickEnable(true);
- }, 1000);
-
- finished = true;
- context.enter(iD.modes.Browse(context));
- };
-
- return drawWay;
-};
-iD.behavior.Hash = function(context) {
- var s0 = null, // cached location.hash
- lat = 90 - 1e-8; // allowable latitude range
-
- var parser = function(map, s) {
- var q = iD.util.stringQs(s);
- var args = (q.map || '').split("/").map(Number);
- if (args.length < 3 || args.some(isNaN)) {
- return true; // replace bogus hash
- } else if (s !== formatter(map).slice(1)) {
- map.centerZoom([args[1],
- Math.min(lat, Math.max(-lat, args[2]))], args[0]);
- }
- };
-
- var formatter = function(map) {
- var center = map.center(),
- zoom = map.zoom(),
- precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
- var q = iD.util.stringQs(location.hash.substring(1));
- return '#' + iD.util.qsString(_.assign(q, {
- map: zoom.toFixed(2) +
- '/' + center[0].toFixed(precision) +
- '/' + center[1].toFixed(precision)
- }), true);
- };
-
- var move = _.throttle(function() {
- var s1 = formatter(context.map());
- if (s0 !== s1) location.replace(s0 = s1); // don't recenter the map!
- }, 500);
-
- function hashchange() {
- if (location.hash === s0) return; // ignore spurious hashchange events
- if (parser(context.map(), (s0 = location.hash).substring(1))) {
- move(); // replace bogus hash
- }
- }
-
- // the hash can declare that the map should select a feature, but it can
- // do so before any features are loaded. thus wait for the feature to
- // be loaded and then select
- function willselect(id) {
- context.connection().loadEntity(id, function(error, entity) {
- if (entity) {
- context.map().zoomTo(entity);
- }
- });
-
- context.map().on('drawn.hash', function() {
- if (!context.hasEntity(id)) return;
- selectoff();
- context.enter(iD.modes.Select(context, [id]));
- });
-
- context.on('enter.hash', function() {
- if (context.mode().id !== 'browse') selectoff();
- });
- }
-
- function selectoff() {
- context.map().on('drawn.hash', null);
- }
-
- function hash() {
- context.map()
- .on('move.hash', move);
-
- d3.select(window)
- .on('hashchange.hash', hashchange);
-
- if (location.hash) {
- var q = iD.util.stringQs(location.hash.substring(1));
- if (q.id) willselect(q.id);
- hashchange();
- if (q.map) hash.hadHash = true;
- }
- }
-
- hash.off = function() {
- context.map()
- .on('move.hash', null);
-
- d3.select(window)
- .on('hashchange.hash', null);
-
- location.hash = "";
- };
-
- return hash;
-};
-/*
- The hover behavior adds the `.hover` class on mouseover to all elements to which
- the identical datum is bound, and removes it on mouseout.
-
- The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
- representation may consist of several elements scattered throughout the DOM hierarchy.
- Only one of these elements can have the :hover pseudo-class, but all of them will
- have the .hover class.
- */
-iD.behavior.Hover = function() {
- var selection,
- altDisables;
-
- function keydown() {
- if (altDisables && d3.event.keyCode === d3.keybinding.modifierCodes.alt) {
- selection.classed('behavior-hover', false);
- }
- }
-
- function keyup() {
- if (altDisables && d3.event.keyCode === d3.keybinding.modifierCodes.alt) {
- selection.classed('behavior-hover', true);
- }
- }
-
- var hover = function(__) {
- selection = __;
-
- if (!altDisables || !d3.event || !d3.event.altKey) {
- selection.classed('behavior-hover', true);
- }
-
- function mouseover() {
- var datum = d3.event.target.__data__;
-
- if (datum) {
- var hovered = [datum.id];
-
- if (datum.type === 'relation') {
- hovered = hovered.concat(_.pluck(datum.members, 'id'));
- }
-
- hovered = d3.set(hovered);
-
- selection.selectAll('*')
- .filter(function(d) { return d && hovered.has(d.id); })
- .classed('hover', true);
- }
- }
-
- selection.on('mouseover.hover', mouseover);
-
- selection.on('mouseout.hover', function() {
- selection.selectAll('.hover')
- .classed('hover', false);
- });
-
- d3.select(document)
- .on('keydown.hover', keydown)
- .on('keyup.hover', keyup);
- };
-
- hover.off = function(selection) {
- selection.classed('behavior-hover', false)
- .on('mouseover.hover', null)
- .on('mouseout.hover', null);
-
- selection.selectAll('.hover')
- .classed('hover', false);
-
- d3.select(document)
- .on('keydown.hover', null)
- .on('keyup.hover', null);
- };
-
- hover.altDisables = function(_) {
- if (!arguments.length) return altDisables;
- altDisables = _;
- return hover;
- };
-
- return hover;
-};
-iD.behavior.Lasso = function(context) {
-
- var behavior = function(selection) {
-
- var mouse = null,
- lasso;
-
- function mousedown() {
- if (d3.event.shiftKey === true) {
-
- mouse = d3.mouse(context.surface().node());
- lasso = null;
-
- selection
- .on('mousemove.lasso', mousemove)
- .on('mouseup.lasso', mouseup);
-
- d3.event.stopPropagation();
- d3.event.preventDefault();
-
- }
- }
-
- function mousemove() {
- if (!lasso) {
- lasso = iD.ui.Lasso(context).a(mouse);
- context.surface().call(lasso);
- }
-
- lasso.b(d3.mouse(context.surface().node()));
- }
-
- function normalize(a, b) {
- return [
- [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
- [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
- }
-
- function mouseup() {
-
- selection
- .on('mousemove.lasso', null)
- .on('mouseup.lasso', null);
-
- if (!lasso) return;
-
- var extent = iD.geo.Extent(
- normalize(context.projection.invert(lasso.a()),
- context.projection.invert(lasso.b())));
-
- lasso.close();
-
- var selected = context.intersects(extent).filter(function (entity) {
- return entity.type === 'node';
- });
-
- if (selected.length) {
- context.enter(iD.modes.Select(context, _.pluck(selected, 'id')));
- }
- }
-
- selection
- .on('mousedown.lasso', mousedown);
- };
-
- behavior.off = function(selection) {
- selection.on('mousedown.lasso', null);
- };
-
- return behavior;
-};
-iD.behavior.Select = function(context) {
- function keydown() {
- if (d3.event && d3.event.shiftKey) {
- context.surface()
- .classed('behavior-multiselect', true);
- }
- }
-
- function keyup() {
- if (!d3.event || !d3.event.shiftKey) {
- context.surface()
- .classed('behavior-multiselect', false);
- }
- }
-
- function click() {
- var datum = d3.event.target.__data__;
- var lasso = d3.select('#surface .lasso').node();
- if (!(datum instanceof iD.Entity)) {
- if (!d3.event.shiftKey && !lasso)
- context.enter(iD.modes.Browse(context));
-
- } else if (!d3.event.shiftKey && !lasso) {
- // Avoid re-entering Select mode with same entity.
- if (context.selection().length !== 1 || context.selection()[0] !== datum.id) {
- context.enter(iD.modes.Select(context, [datum.id]));
- } else {
- context.mode().reselect();
- }
- } else if (context.selection().indexOf(datum.id) >= 0) {
- var selection = _.without(context.selection(), datum.id);
- context.enter(selection.length ?
- iD.modes.Select(context, selection) :
- iD.modes.Browse(context));
-
- } else {
- context.enter(iD.modes.Select(context, context.selection().concat([datum.id])));
- }
- }
-
- var behavior = function(selection) {
- d3.select(window)
- .on('keydown.select', keydown)
- .on('keyup.select', keyup);
-
- selection.on('click.select', click);
-
- keydown();
- };
-
- behavior.off = function(selection) {
- d3.select(window)
- .on('keydown.select', null)
- .on('keyup.select', null);
-
- selection.on('click.select', null);
-
- keyup();
- };
-
- return behavior;
-};
-iD.modes = {};
-iD.modes.AddArea = function(context) {
- var mode = {
- id: 'add-area',
- button: 'area',
- title: t('modes.add_area.title'),
- description: t('modes.add_area.description'),
- key: '3'
- };
-
- var behavior = iD.behavior.AddWay(context)
- .on('start', start)
- .on('startFromWay', startFromWay)
- .on('startFromNode', startFromNode),
- defaultTags = {area: 'yes'};
-
- function start(loc) {
- var graph = context.graph(),
- node = iD.Node({loc: loc}),
- way = iD.Way({tags: defaultTags});
-
- context.perform(
- iD.actions.AddEntity(node),
- iD.actions.AddEntity(way),
- iD.actions.AddVertex(way.id, node.id),
- iD.actions.AddVertex(way.id, node.id));
-
- context.enter(iD.modes.DrawArea(context, way.id, graph));
- }
-
- function startFromWay(loc, edge) {
- var graph = context.graph(),
- node = iD.Node({loc: loc}),
- way = iD.Way({tags: defaultTags});
-
- context.perform(
- iD.actions.AddEntity(node),
- iD.actions.AddEntity(way),
- iD.actions.AddVertex(way.id, node.id),
- iD.actions.AddVertex(way.id, node.id),
- iD.actions.AddMidpoint({ loc: loc, edge: edge }, node));
-
- context.enter(iD.modes.DrawArea(context, way.id, graph));
- }
-
- function startFromNode(node) {
- var graph = context.graph(),
- way = iD.Way({tags: defaultTags});
-
- context.perform(
- iD.actions.AddEntity(way),
- iD.actions.AddVertex(way.id, node.id),
- iD.actions.AddVertex(way.id, node.id));
-
- context.enter(iD.modes.DrawArea(context, way.id, graph));
- }
-
- mode.enter = function() {
- context.install(behavior);
- context.tail(t('modes.add_area.tail'));
- };
-
- mode.exit = function() {
- context.uninstall(behavior);
- };
-
- return mode;
-};
-iD.modes.AddLine = function(context) {
- var mode = {
- id: 'add-line',
- button: 'line',
- title: t('modes.add_line.title'),
- description: t('modes.add_line.description'),
- key: '2'
- };
-
- var behavior = iD.behavior.AddWay(context)
- .on('start', start)
- .on('startFromWay', startFromWay)
- .on('startFromNode', startFromNode);
-
- function start(loc) {
- var graph = context.graph(),
- node = iD.Node({loc: loc}),
- way = iD.Way();
-
- context.perform(
- iD.actions.AddEntity(node),
- iD.actions.AddEntity(way),
- iD.actions.AddVertex(way.id, node.id));
-
- context.enter(iD.modes.DrawLine(context, way.id, 'forward', graph));
- }
-
- function startFromWay(loc, edge) {
- var graph = context.graph(),
- node = iD.Node({loc: loc}),
- way = iD.Way();
-
- context.perform(
- iD.actions.AddEntity(node),
- iD.actions.AddEntity(way),
- iD.actions.AddVertex(way.id, node.id),
- iD.actions.AddMidpoint({ loc: loc, edge: edge }, node));
-
- context.enter(iD.modes.DrawLine(context, way.id, 'forward', graph));
- }
-
- function startFromNode(node) {
- var graph = context.graph(),
- parent = graph.parentWays(node)[0],
- isLine = parent && parent.geometry(graph) === 'line';
-
- if (isLine && parent.first() === node.id) {
- context.enter(iD.modes.DrawLine(context, parent.id, 'backward', graph));
-
- } else if (isLine && parent.last() === node.id) {
- context.enter(iD.modes.DrawLine(context, parent.id, 'forward', graph));
-
- } else {
- var way = iD.Way();
-
- context.perform(
- iD.actions.AddEntity(way),
- iD.actions.AddVertex(way.id, node.id));
-
- context.enter(iD.modes.DrawLine(context, way.id, 'forward', graph));
- }
- }
-
- mode.enter = function() {
- context.install(behavior);
- context.tail(t('modes.add_line.tail'));
- };
-
- mode.exit = function() {
- context.uninstall(behavior);
- };
-
- return mode;
-};
-iD.modes.AddPoint = function(context) {
- var mode = {
- id: 'add-point',
- title: t('modes.add_point.title'),
- description: t('modes.add_point.description'),
- key: '1'
- };
-
- var behavior = iD.behavior.Draw(context)
- .on('click', add)
- .on('clickWay', addWay)
- .on('clickNode', addNode)
- .on('cancel', cancel)
- .on('finish', cancel);
-
- function add(loc) {
- var node = iD.Node({loc: loc});
-
- context.perform(
- iD.actions.AddEntity(node),
- t('operations.add.annotation.point'));
-
- context.enter(
- iD.modes.Select(context, [node.id])
- .suppressMenu(true)
- .newFeature(true));
- }
-
- function addWay(loc, edge) {
- add(loc);
- }
-
- function addNode(node) {
- add(node.loc);
- }
-
- function cancel() {
- context.enter(iD.modes.Browse(context));
- }
-
- mode.enter = function() {
- context.install(behavior);
- context.tail(t('modes.add_point.tail'));
- };
-
- mode.exit = function() {
- context.uninstall(behavior);
- context.tail(false);
- };
-
- return mode;
-};
-iD.modes.Browse = function(context) {
- var mode = {
- button: 'browse',
- id: 'browse',
- title: t('modes.browse.title'),
- description: t('modes.browse.description'),
- key: '1'
- };
-
- var behaviors = [
- iD.behavior.Hover(),
- iD.behavior.Select(context),
- iD.behavior.Lasso(context),
- iD.modes.DragNode(context).behavior];
-
- mode.enter = function() {
- behaviors.forEach(function(behavior) {
- context.install(behavior);
- });
- };
-
- mode.exit = function() {
- behaviors.forEach(function(behavior) {
- context.uninstall(behavior);
- });
- };
-
- return mode;
-};
-iD.modes.DragNode = function(context) {
- var mode = {
- id: 'drag-node',
- button: 'browse'
- };
-
- var nudgeInterval,
- activeIDs,
- wasMidpoint,
- cancelled,
- hover = iD.behavior.Hover().altDisables(true);
-
- function edge(point, size) {
- var pad = [30, 100, 30, 100];
- if (point[0] > size[0] - pad[0]) return [-10, 0];
- else if (point[0] < pad[2]) return [10, 0];
- else if (point[1] > size[1] - pad[1]) return [0, -10];
- else if (point[1] < pad[3]) return [0, 10];
- return null;
- }
-
- function startNudge(nudge) {
- if (nudgeInterval) window.clearInterval(nudgeInterval);
- nudgeInterval = window.setInterval(function() {
- context.pan(nudge);
- }, 50);
- }
-
- function stopNudge() {
- if (nudgeInterval) window.clearInterval(nudgeInterval);
- nudgeInterval = null;
- }
-
- function moveAnnotation(entity) {
- return t('operations.move.annotation.' + entity.geometry(context.graph()));
- }
-
- function connectAnnotation(datum) {
- return t('operations.connect.annotation.' + datum.geometry(context.graph()));
- }
-
- function origin(entity) {
- return context.projection(entity.loc);
- }
-
- function start(entity) {
- cancelled = d3.event.sourceEvent.shiftKey;
- if (cancelled) return behavior.cancel();
-
- wasMidpoint = entity.type === 'midpoint';
- if (wasMidpoint) {
- var midpoint = entity;
- entity = iD.Node();
- context.perform(iD.actions.AddMidpoint(midpoint, entity));
-
- var vertex = context.surface()
- .selectAll('.vertex')
- .filter(function(d) { return d.id === entity.id; });
- behavior.target(vertex.node(), entity);
-
- } else {
- context.perform(
- iD.actions.Noop());
- }
-
- activeIDs = _.pluck(context.graph().parentWays(entity), 'id');
- activeIDs.push(entity.id);
-
- context.enter(mode);
- }
-
- function datum() {
- if (d3.event.sourceEvent.altKey) {
- return {};
- }
-
- return d3.event.sourceEvent.target.__data__ || {};
- }
-
- // via https://gist.github.com/shawnbot/4166283
- function childOf(p, c) {
- if (p === c) return false;
- while (c && c !== p) c = c.parentNode;
- return c === p;
- }
-
- function move(entity) {
- if (cancelled) return;
- d3.event.sourceEvent.stopPropagation();
-
- var nudge = childOf(context.container().node(),
- d3.event.sourceEvent.toElement) &&
- edge(d3.event.point, context.map().size());
-
- if (nudge) startNudge(nudge);
- else stopNudge();
-
- var loc = context.map().mouseCoordinates();
-
- var d = datum();
- if (d.type === 'node' && d.id !== entity.id) {
- loc = d.loc;
- } else if (d.type === 'way') {
- loc = iD.geo.chooseIndex(d, d3.mouse(context.surface().node()), context).loc;
- }
-
- context.replace(
- iD.actions.MoveNode(entity.id, loc),
- t('operations.move.annotation.' + entity.geometry(context.graph())));
- }
-
- function end(entity) {
- if (cancelled) return;
-
- var d = datum();
-
- if (d.type === 'way') {
- var choice = iD.geo.chooseIndex(d, d3.mouse(context.surface().node()), context);
- context.replace(
- iD.actions.AddMidpoint({ loc: choice.loc, edge: [d.nodes[choice.index - 1], d.nodes[choice.index]] }, entity),
- connectAnnotation(d));
-
- } else if (d.type === 'node' && d.id !== entity.id) {
- // `entity` is last so it will survive and it's parent ways can be selected below.
- context.replace(
- iD.actions.Connect([d.id, entity.id]),
- connectAnnotation(d));
-
- } else if (wasMidpoint) {
- context.replace(
- iD.actions.Noop(),
- t('operations.add.annotation.vertex'));
-
- } else {
- context.replace(
- iD.actions.Noop(),
- moveAnnotation(entity));
- }
-
- var parentWays = _.pluck(context.graph().parentWays(entity), 'id');
-
- if (parentWays.length) {
- context.enter(
- iD.modes.Select(context, parentWays)
- .suppressMenu(true));
- } else {
- context.enter(iD.modes.Browse(context));
- }
- }
-
- function cancel() {
- behavior.cancel();
- context.enter(iD.modes.Browse(context));
- }
-
- var behavior = iD.behavior.drag()
- .delegate("g.node, g.point, g.midpoint")
- .surface(context.surface().node())
- .origin(origin)
- .on('start', start)
- .on('move', move)
- .on('end', end);
-
- mode.enter = function() {
- context.install(hover);
-
- context.history()
- .on('undone.drag-node', cancel);
-
- context.surface()
- .selectAll('.node, .way')
- .filter(function(d) { return activeIDs.indexOf(d.id) >= 0; })
- .classed('active', true);
- };
-
- mode.exit = function() {
- context.uninstall(hover);
-
- context.history()
- .on('undone.drag-node', null);
-
- context.surface()
- .selectAll('.active')
- .classed('active', false);
-
- stopNudge();
- };
-
- mode.behavior = behavior;
-
- return mode;
-};
-iD.modes.DrawArea = function(context, wayId, baseGraph) {
- var mode = {
- button: 'area',
- id: 'draw-area'
- };
-
- var behavior;
-
- mode.enter = function() {
- var way = context.entity(wayId),
- headId = way.nodes[way.nodes.length - 2],
- tailId = way.first();
-
- behavior = iD.behavior.DrawWay(context, wayId, -1, mode, baseGraph);
-
- var addNode = behavior.addNode;
-
- behavior.addNode = function(node) {
- if (node.id === headId || node.id === tailId) {
- behavior.finish();
- } else {
- addNode(node);
- }
- };
-
- context.install(behavior);
- context.tail(t('modes.draw_area.tail'));
- };
-
- mode.exit = function() {
- context.uninstall(behavior);
- };
-
- mode.selection = function() {
- return [wayId];
- };
-
- return mode;
-};
-iD.modes.DrawLine = function(context, wayId, direction, baseGraph) {
- var mode = {
- button: 'line',
- id: 'draw-line'
- };
-
- var behavior;
-
- mode.enter = function() {
- var way = context.entity(wayId),
- index = (direction === 'forward') ? undefined : 0,
- headId = (direction === 'forward') ? way.last() : way.first();
-
- behavior = iD.behavior.DrawWay(context, wayId, index, mode, baseGraph);
-
- var addNode = behavior.addNode;
-
- behavior.addNode = function(node) {
- if (node.id === headId) {
- behavior.finish();
- } else {
- addNode(node);
- }
- };
-
- context.install(behavior);
- context.tail(t('modes.draw_line.tail'));
- };
-
- mode.exit = function() {
- context.uninstall(behavior);
- };
-
- mode.selection = function() {
- return [wayId];
- };
-
- return mode;
-};
-iD.modes.Move = function(context, entityIDs) {
- var mode = {
- id: 'move',
- button: 'browse'
- };
-
- var keybinding = d3.keybinding('move');
-
- mode.enter = function() {
- var origin,
- nudgeInterval,
- annotation = entityIDs.length === 1 ?
- t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
- t('operations.move.annotation.multiple');
-
- context.perform(
- iD.actions.Noop(),
- annotation);
-
- function edge(point, size) {
- var pad = [30, 100, 30, 100];
- if (point[0] > size[0] - pad[0]) return [-10, 0];
- else if (point[0] < pad[2]) return [10, 0];
- else if (point[1] > size[1] - pad[1]) return [0, -10];
- else if (point[1] < pad[3]) return [0, 10];
- return null;
- }
-
- function startNudge(nudge) {
- if (nudgeInterval) window.clearInterval(nudgeInterval);
- nudgeInterval = window.setInterval(function() {
- context.pan(nudge);
- context.replace(
- iD.actions.Move(entityIDs, [-nudge[0], -nudge[1]], context.projection),
- annotation);
- var c = context.projection(origin);
- origin = context.projection.invert([c[0] - nudge[0], c[1] - nudge[1]]);
- }, 50);
- }
-
- function stopNudge() {
- if (nudgeInterval) window.clearInterval(nudgeInterval);
- nudgeInterval = null;
- }
-
- function point() {
- return d3.mouse(context.map().surface.node());
- }
-
- function move() {
- var p = point();
-
- var delta = origin ?
- [p[0] - context.projection(origin)[0],
- p[1] - context.projection(origin)[1]] :
- [0, 0];
-
- var nudge = edge(p, context.map().size());
- if (nudge) startNudge(nudge);
- else stopNudge();
-
- origin = context.map().mouseCoordinates();
-
- context.replace(
- iD.actions.Move(entityIDs, delta, context.projection),
- annotation);
- }
-
- function finish() {
- d3.event.stopPropagation();
- context.enter(iD.modes.Select(context, entityIDs));
- stopNudge();
- }
-
- function cancel() {
- context.pop();
- context.enter(iD.modes.Select(context, entityIDs));
- stopNudge();
- }
-
- function undone() {
- context.enter(iD.modes.Browse(context));
- }
-
- context.surface()
- .on('mousemove.move', move)
- .on('click.move', finish);
-
- context.history()
- .on('undone.move', undone);
-
- keybinding
- .on('⎋', cancel)
- .on('↩', finish);
-
- d3.select(document)
- .call(keybinding);
- };
-
- mode.exit = function() {
- context.surface()
- .on('mousemove.move', null)
- .on('click.move', null);
-
- context.history()
- .on('undone.move', null);
-
- keybinding.off();
- };
-
- return mode;
-};
-iD.modes.RotateWay = function(context, wayId) {
- var mode = {
- id: 'rotate-way',
- button: 'browse'
- };
-
- var keybinding = d3.keybinding('rotate-way');
-
- mode.enter = function() {
-
- var annotation = t('operations.rotate.annotation.' + context.geometry(wayId)),
- way = context.graph().entity(wayId),
- nodes = _.uniq(context.graph().childNodes(way)),
- points = nodes.map(function(n) { return context.projection(n.loc); }),
- pivot = d3.geom.polygon(points).centroid(),
- angle;
-
- context.perform(
- iD.actions.Noop(),
- annotation);
-
- function point() {
- return d3.mouse(context.map().surface.node());
- }
-
- function rotate() {
-
- var mousePoint = point(),
- newAngle = Math.atan2(mousePoint[1] - pivot[1], mousePoint[0] - pivot[0]);
-
- if (typeof angle === 'undefined') angle = newAngle;
-
- context.replace(
- iD.actions.RotateWay(wayId, pivot, newAngle - angle, context.projection),
- annotation);
-
- angle = newAngle;
- }
-
- function finish() {
- d3.event.stopPropagation();
- context.enter(iD.modes.Select(context, [wayId]));
- }
-
- function cancel() {
- context.pop();
- context.enter(iD.modes.Select(context, [wayId]));
- }
-
- function undone() {
- context.enter(iD.modes.Browse(context));
- }
-
- context.surface()
- .on('mousemove.rotate-way', rotate)
- .on('click.rotate-way', finish);
-
- context.history()
- .on('undone.rotate-way', undone);
-
- keybinding
- .on('⎋', cancel)
- .on('↩', finish);
-
- d3.select(document)
- .call(keybinding);
- };
-
- mode.exit = function() {
- context.surface()
- .on('mousemove.rotate-way', null)
- .on('click.rotate-way', null);
-
- context.history()
- .on('undone.rotate-way', null);
-
- keybinding.off();
- };
-
- return mode;
-};
-iD.modes.Select = function(context, selection) {
- var mode = {
- id: 'select',
- button: 'browse'
- };
-
- var keybinding = d3.keybinding('select'),
- timeout = null,
- behaviors = [
- iD.behavior.Hover(),
- iD.behavior.Select(context),
- iD.behavior.Lasso(context),
- iD.modes.DragNode(context).behavior],
- inspector,
- radialMenu,
- newFeature = false,
- suppressMenu = false;
-
- var wrap = context.container()
- .select('.inspector-wrap');
-
- function singular() {
- if (selection.length === 1) {
- return context.entity(selection[0]);
- }
- }
-
- function positionMenu() {
- var entity = singular();
-
- if (entity && entity.type === 'node') {
- radialMenu.center(context.projection(entity.loc));
- } else {
- radialMenu.center(d3.mouse(context.surface().node()));
- }
- }
-
- function showMenu() {
- context.surface()
- .call(radialMenu.close)
- .call(radialMenu);
- }
-
- mode.selection = function() {
- return selection;
- };
-
- mode.reselect = function() {
- var surfaceNode = context.surface().node();
- if (surfaceNode.focus) { // FF doesn't support it
- surfaceNode.focus();
- }
-
- positionMenu();
- showMenu();
- };
-
- mode.newFeature = function(_) {
- if (!arguments.length) return newFeature;
- newFeature = _;
- return mode;
- };
-
- mode.suppressMenu = function(_) {
- if (!arguments.length) return suppressMenu;
- suppressMenu = _;
- return mode;
- };
-
- mode.enter = function() {
- behaviors.forEach(function(behavior) {
- context.install(behavior);
- });
-
- var operations = _.without(d3.values(iD.operations), iD.operations.Delete)
- .map(function(o) { return o(selection, context); })
- .filter(function(o) { return o.available(); });
- operations.unshift(iD.operations.Delete(selection, context));
-
- keybinding.on('⎋', function() {
- context.enter(iD.modes.Browse(context));
- }, true);
-
- operations.forEach(function(operation) {
- operation.keys.forEach(function(key) {
- keybinding.on(key, function() {
- if (!operation.disabled()) {
- operation();
- }
- });
- });
- });
-
- var notNew = selection.filter(function(id) {
- return !context.entity(id).isNew();
- });
-
- if (notNew.length) {
- var q = iD.util.stringQs(location.hash.substring(1));
- location.replace('#' + iD.util.qsString(_.assign(q, {
- id: notNew.join(',')
- }), true));
- }
-
- if (singular()) {
- inspector = iD.ui.Inspector(context, singular())
- .newFeature(newFeature);
-
- wrap.call(inspector);
- }
-
- context.history()
- .on('undone.select', update)
- .on('redone.select', update);
-
- function update() {
- context.surface().call(radialMenu.close);
-
- if (_.any(selection, function(id) { return !context.hasEntity(id); })) {
- // Exit mode if selected entity gets undone
- context.enter(iD.modes.Browse(context));
- }
- }
-
- context.map().on('move.select', function() {
- context.surface().call(radialMenu.close);
- });
-
- function dblclick() {
- var target = d3.select(d3.event.target),
- datum = target.datum();
-
- if (datum instanceof iD.Way && !target.classed('fill')) {
- var choice = iD.geo.chooseIndex(datum,
- d3.mouse(context.surface().node()), context),
- node = iD.Node();
-
- var prev = datum.nodes[choice.index - 1],
- next = datum.nodes[choice.index];
-
- context.perform(
- iD.actions.AddMidpoint({loc: choice.loc, edge: [prev, next]}, node),
- t('operations.add.annotation.vertex'));
-
- d3.event.preventDefault();
- d3.event.stopPropagation();
- }
- }
-
- function selected(entity) {
- if (!entity) return false;
- if (selection.indexOf(entity.id) >= 0) return true;
- return _.any(context.graph().parentRelations(entity), function(parent) {
- return selection.indexOf(parent.id) >= 0;
- });
- }
-
- d3.select(document)
- .call(keybinding);
-
- function selectElements() {
- context.surface()
- .selectAll("*")
- .filter(selected)
- .classed('selected', true);
- }
-
- context.map().on('drawn.select', selectElements);
- selectElements();
-
- radialMenu = iD.ui.RadialMenu(operations);
- var show = d3.event && !suppressMenu;
-
- if (show) {
- positionMenu();
- }
-
- timeout = window.setTimeout(function() {
- if (show) {
- showMenu();
- }
-
- context.surface()
- .on('dblclick.select', dblclick);
- }, 200);
- };
-
- mode.exit = function() {
- if (timeout) window.clearTimeout(timeout);
-
- if (inspector) wrap.call(inspector.close);
-
- behaviors.forEach(function(behavior) {
- context.uninstall(behavior);
- });
-
- var q = iD.util.stringQs(location.hash.substring(1));
- location.replace('#' + iD.util.qsString(_.omit(q, 'id'), true));
-
- keybinding.off();
-
- context.history()
- .on('undone.select', null)
- .on('redone.select', null);
-
- context.surface()
- .call(radialMenu.close)
- .on('dblclick.select', null)
- .selectAll(".selected")
- .classed('selected', false);
-
- context.map().on('drawn.select', null);
- };
-
- return mode;
-};
-iD.operations = {};
-iD.operations.Circularize = function(selection, context) {
- var entityId = selection[0],
- geometry = context.geometry(entityId),
- action = iD.actions.Circularize(entityId, context.projection);
-
- var operation = function() {
- var annotation = t('operations.circularize.annotation.' + geometry);
- context.perform(action, annotation);
- };
-
- operation.available = function() {
- return selection.length === 1 &&
- context.entity(entityId).type === 'way';
- };
-
- operation.disabled = function() {
- return action.disabled(context.graph());
- };
-
- operation.tooltip = function() {
- var disable = operation.disabled();
- return disable ?
- t('operations.circularize.' + disable) :
- t('operations.circularize.description.' + geometry);
- };
-
- operation.id = "circularize";
- operation.keys = [t('operations.circularize.key')];
- operation.title = t('operations.circularize.title');
-
- return operation;
-};
-iD.operations.Delete = function(selection, context) {
- var operation = function() {
- var annotation;
-
- if (selection.length === 1) {
- annotation = t('operations.delete.annotation.' + context.geometry(selection[0]));
- } else {
- annotation = t('operations.delete.annotation.multiple', {n: selection.length});
- }
-
- context.perform(
- iD.actions.DeleteMultiple(selection),
- annotation);
-
- context.enter(iD.modes.Browse(context));
- };
-
- operation.available = function() {
- return true;
- };
-
- operation.disabled = function() {
- return false;
- };
-
- operation.tooltip = function() {
- return t('operations.delete.description');
- };
-
- operation.id = "delete";
- operation.keys = [iD.ui.cmd('⌫'), iD.ui.cmd('⌦')];
- operation.title = t('operations.delete.title');
-
- return operation;
-};
-iD.operations.Disconnect = function(selection, context) {
- var vertices = _.filter(selection, function vertex(entityId) {
- return context.geometry(entityId) === 'vertex';
- });
-
- var entityId = vertices[0],
- action = iD.actions.Disconnect(entityId);
-
- if (selection.length > 1) {
- action.limitWays(_.without(selection, entityId));
- }
-
- var operation = function() {
- context.perform(action, t('operations.disconnect.annotation'));
- };
-
- operation.available = function() {
- return vertices.length === 1;
- };
-
- operation.disabled = function() {
- return action.disabled(context.graph());
- };
-
- operation.tooltip = function() {
- var disable = operation.disabled();
- return disable ?
- t('operations.disconnect.' + disable) :
- t('operations.disconnect.description');
- };
-
- operation.id = "disconnect";
- operation.keys = [t('operations.disconnect.key')];
- operation.title = t('operations.disconnect.title');
-
- return operation;
-};
-iD.operations.Merge = function(selection, context) {
- var join = iD.actions.Join(selection),
- merge = iD.actions.Merge(selection);
-
- var operation = function() {
- var annotation = t('operations.merge.annotation', {n: selection.length}),
- action;
-
- if (!join.disabled(context.graph())) {
- action = join;
- } else {
- action = merge;
- }
-
- var difference = context.perform(action, annotation);
- context.enter(iD.modes.Select(context, difference.extantIDs()));
- };
-
- operation.available = function() {
- return selection.length >= 2;
- };
-
- operation.disabled = function() {
- return join.disabled(context.graph()) &&
- merge.disabled(context.graph());
- };
-
- operation.tooltip = function() {
- var j = join.disabled(context.graph()),
- m = merge.disabled(context.graph());
-
- if (j && m)
- return t('operations.merge.' + j);
-
- return t('operations.merge.description');
- };
-
- operation.id = "merge";
- operation.keys = [t('operations.merge.key')];
- operation.title = t('operations.merge.title');
-
- return operation;
-};
-iD.operations.Move = function(selection, context) {
- var operation = function() {
- context.enter(iD.modes.Move(context, selection));
- };
-
- operation.available = function() {
- return selection.length > 1 ||
- context.entity(selection[0]).type !== 'node';
- };
-
- operation.disabled = function() {
- return iD.actions.Move(selection)
- .disabled(context.graph());
- };
-
- operation.tooltip = function() {
- var disable = operation.disabled();
- return disable ?
- t('operations.move.' + disable) :
- t('operations.move.description');
- };
-
- operation.id = "move";
- operation.keys = [t('operations.move.key')];
- operation.title = t('operations.move.title');
-
- return operation;
-};
-iD.operations.Orthogonalize = function(selection, context) {
- var entityId = selection[0],
- action = iD.actions.Orthogonalize(entityId, context.projection);
-
- var operation = function() {
- var annotation = t('operations.orthogonalize.annotation.' + context.geometry(entityId));
- context.perform(action, annotation);
- };
-
- operation.available = function() {
- return selection.length === 1 &&
- context.entity(entityId).type === 'way' &&
- _.uniq(context.entity(entityId).nodes).length > 2;
- };
-
- operation.disabled = function() {
- return action.disabled(context.graph());
- };
-
- operation.tooltip = function() {
- var disable = operation.disabled();
- return disable ?
- t('operations.orthogonalize.' + disable) :
- t('operations.orthogonalize.description');
- };
-
- operation.id = "orthogonalize";
- operation.keys = [t('operations.orthogonalize.key')];
- operation.title = t('operations.orthogonalize.title');
- operation.description = t('operations.orthogonalize.description');
-
- return operation;
-};
-iD.operations.Reverse = function(selection, context) {
- var entityId = selection[0];
-
- var operation = function() {
- context.perform(
- iD.actions.Reverse(entityId),
- t('operations.reverse.annotation'));
- };
-
- operation.available = function() {
- return selection.length === 1 &&
- context.geometry(entityId) === 'line';
- };
-
- operation.disabled = function() {
- return false;
- };
-
- operation.tooltip = function() {
- return t('operations.reverse.description');
- };
-
- operation.id = "reverse";
- operation.keys = [t('operations.reverse.key')];
- operation.title = t('operations.reverse.title');
-
- return operation;
-};
-iD.operations.Rotate = function(selection, context) {
- var entityId = selection[0];
-
- var operation = function() {
- context.enter(iD.modes.RotateWay(context, entityId));
- };
-
- operation.available = function() {
- return selection.length === 1 &&
- context.entity(entityId).type === 'way' &&
- context.entity(entityId).geometry() === 'area';
- };
-
- operation.disabled = function() {
- return false;
- };
-
- operation.tooltip = function() {
- return t('operations.rotate.description');
- };
-
- operation.id = "rotate";
- operation.keys = [t('operations.rotate.key')];
- operation.title = t('operations.rotate.title');
-
- return operation;
-};
-iD.operations.Split = function(selection, context) {
- var vertices = _.filter(selection, function vertex(entityId) {
- return context.geometry(entityId) === 'vertex';
- });
-
- var entityId = vertices[0],
- action = iD.actions.Split(entityId);
-
- if (selection.length > 1) {
- action.limitWays(_.without(selection, entityId));
- }
-
- var operation = function() {
- var annotation;
-
- var ways = action.ways(context.graph());
- if (ways.length === 1) {
- annotation = t('operations.split.annotation.' + context.geometry(ways[0].id));
- } else {
- annotation = t('operations.split.annotation.multiple', {n: ways.length});
- }
-
- var difference = context.perform(action, annotation);
- context.enter(iD.modes.Select(context, difference.extantIDs()));
- };
-
- operation.available = function() {
- return vertices.length === 1;
- };
-
- operation.disabled = function() {
- return action.disabled(context.graph());
- };
-
- operation.tooltip = function() {
- var disable = operation.disabled();
- if (disable) {
- return t('operations.split.' + disable);
- }
-
- var ways = action.ways(context.graph());
- if (ways.length === 1) {
- return t('operations.split.description.' + context.geometry(ways[0].id));
- } else {
- return t('operations.split.description.multiple');
- }
- };
-
- operation.id = "split";
- operation.keys = [t('operations.split.key')];
- operation.title = t('operations.split.title');
-
- return operation;
-};
-iD.Connection = function() {
-
- var event = d3.dispatch('authenticating', 'authenticated', 'auth', 'loading', 'load', 'loaded'),
- url = 'http://www.openstreetmap.org',
- connection = {},
- user = {},
- inflight = {},
- loadedTiles = {},
- oauth = osmAuth({
- url: 'http://www.openstreetmap.org',
- oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
- oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
- loading: authenticating,
- done: authenticated
- }),
- ndStr = 'nd',
- tagStr = 'tag',
- memberStr = 'member',
- nodeStr = 'node',
- wayStr = 'way',
- relationStr = 'relation',
- off;
-
- connection.changesetURL = function(changesetId) {
- return url + '/browse/changeset/' + changesetId;
- };
-
- connection.entityURL = function(entity) {
- return url + '/browse/' + entity.type + '/' + entity.osmId();
- };
-
- connection.userURL = function(username) {
- return url + "/user/" + username;
- };
-
- connection.loadFromURL = function(url, callback) {
- function done(dom) {
- return callback(null, parse(dom));
- }
- return d3.xml(url).get().on('load', done);
- };
-
- connection.loadEntity = function(id, callback) {
- var type = iD.Entity.id.type(id),
- osmID = iD.Entity.id.toOSM(id);
-
- connection.loadFromURL(
- url + '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
- function(err, entities) {
- event.load(err, entities);
- if (callback) callback(err, entities && entities[id]);
- });
- };
-
- function authenticating() {
- event.authenticating();
- }
-
- function authenticated() {
- event.authenticated();
- }
-
- function getNodes(obj) {
- var elems = obj.getElementsByTagName(ndStr),
- nodes = new Array(elems.length);
- for (var i = 0, l = elems.length; i < l; i++) {
- nodes[i] = 'n' + elems[i].attributes.ref.nodeValue;
- }
- return nodes;
- }
-
- function getTags(obj) {
- var elems = obj.getElementsByTagName(tagStr),
- tags = {};
- for (var i = 0, l = elems.length; i < l; i++) {
- var attrs = elems[i].attributes;
- tags[attrs.k.nodeValue] = attrs.v.nodeValue;
- }
- return tags;
- }
-
- function getMembers(obj) {
- var elems = obj.getElementsByTagName(memberStr),
- members = new Array(elems.length);
- for (var i = 0, l = elems.length; i < l; i++) {
- var attrs = elems[i].attributes;
- members[i] = {
- id: attrs.type.nodeValue[0] + attrs.ref.nodeValue,
- type: attrs.type.nodeValue,
- role: attrs.role.nodeValue
- };
- }
- return members;
- }
-
- var parsers = {
- node: function nodeData(obj) {
- var attrs = obj.attributes;
- return new iD.Node({
- id: iD.Entity.id.fromOSM(nodeStr, attrs.id.nodeValue),
- loc: [parseFloat(attrs.lon.nodeValue), parseFloat(attrs.lat.nodeValue)],
- version: attrs.version.nodeValue,
- changeset: attrs.changeset.nodeValue,
- user: attrs.user && attrs.user.nodeValue,
- uid: attrs.uid && attrs.uid.nodeValue,
- visible: attrs.visible.nodeValue,
- timestamp: attrs.timestamp.nodeValue,
- tags: getTags(obj)
- });
- },
-
- way: function wayData(obj) {
- var attrs = obj.attributes;
- return new iD.Way({
- id: iD.Entity.id.fromOSM(wayStr, attrs.id.nodeValue),
- version: attrs.version.nodeValue,
- changeset: attrs.changeset.nodeValue,
- user: attrs.user && attrs.user.nodeValue,
- uid: attrs.uid && attrs.uid.nodeValue,
- visible: attrs.visible.nodeValue,
- timestamp: attrs.timestamp.nodeValue,
- tags: getTags(obj),
- nodes: getNodes(obj)
- });
- },
-
- relation: function relationData(obj) {
- var attrs = obj.attributes;
- return new iD.Relation({
- id: iD.Entity.id.fromOSM(relationStr, attrs.id.nodeValue),
- version: attrs.version.nodeValue,
- changeset: attrs.changeset.nodeValue,
- user: attrs.user && attrs.user.nodeValue,
- uid: attrs.uid && attrs.uid.nodeValue,
- visible: attrs.visible.nodeValue,
- timestamp: attrs.timestamp.nodeValue,
- tags: getTags(obj),
- members: getMembers(obj)
- });
- }
- };
-
- function parse(dom) {
- if (!dom || !dom.childNodes) return new Error('Bad request');
-
- var root = dom.childNodes[0],
- children = root.childNodes,
- entities = {};
-
- var i, o, l;
- for (i = 0, l = children.length; i < l; i++) {
- var child = children[i],
- parser = parsers[child.nodeName];
- if (parser) {
- o = parser(child);
- entities[o.id] = o;
- }
- }
-
- return entities;
- }
-
- connection.authenticated = function() {
- return oauth.authenticated();
- };
-
- // Generate Changeset XML. Returns a string.
- connection.changesetJXON = function(tags) {
- return {
- osm: {
- changeset: {
- tag: _.map(tags, function(value, key) {
- return { '@k': key, '@v': value };
- }),
- '@version': 0.3,
- '@generator': 'iD'
- }
- }
- };
- };
-
- // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
- // XML. Returns a string.
- connection.osmChangeJXON = function(userid, changeset_id, changes) {
- function nest(x, order) {
- var groups = {};
- for (var i = 0; i < x.length; i++) {
- var tagName = Object.keys(x[i])[0];
- if (!groups[tagName]) groups[tagName] = [];
- groups[tagName].push(x[i][tagName]);
- }
- var ordered = {};
- order.forEach(function(o) {
- if (groups[o]) ordered[o] = groups[o];
- });
- return ordered;
- }
-
- function rep(entity) {
- return entity.asJXON(changeset_id);
- }
-
- return {
- osmChange: {
- '@version': 0.3,
- '@generator': 'iD',
- 'create': nest(changes.created.map(rep), ['node', 'way', 'relation']),
- 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
- 'delete': _.extend(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), {'@if-unused': true})
- }
- };
- };
-
- connection.changesetTags = function(comment, imagery_used) {
- var tags = {
- imagery_used: imagery_used.join(';'),
- created_by: 'iD ' + iD.version
- };
-
- if (comment) {
- tags.comment = comment;
- }
-
- return tags;
- };
-
- connection.putChangeset = function(changes, comment, imagery_used, callback) {
- oauth.xhr({
- method: 'PUT',
- path: '/api/0.6/changeset/create',
- options: { header: { 'Content-Type': 'text/xml' } },
- content: JXON.stringify(connection.changesetJXON(connection.changesetTags(comment, imagery_used)))
- }, function(err, changeset_id) {
- if (err) return callback(err);
- oauth.xhr({
- method: 'POST',
- path: '/api/0.6/changeset/' + changeset_id + '/upload',
- options: { header: { 'Content-Type': 'text/xml' } },
- content: JXON.stringify(connection.osmChangeJXON(user.id, changeset_id, changes))
- }, function(err) {
- if (err) return callback(err);
- oauth.xhr({
- method: 'PUT',
- path: '/api/0.6/changeset/' + changeset_id + '/close'
- }, function(err) {
- callback(err, changeset_id);
- });
- });
- });
- };
-
- connection.userDetails = function(callback) {
- function done(err, user_details) {
- if (err) return callback(err);
- var u = user_details.getElementsByTagName('user')[0],
- img = u.getElementsByTagName('img'),
- image_url = '';
- if (img && img[0] && img[0].getAttribute('href')) {
- image_url = img[0].getAttribute('href');
- }
- callback(undefined, connection.user({
- display_name: u.attributes.display_name.nodeValue,
- image_url: image_url,
- id: u.attributes.id.nodeValue
- }).user());
- }
- oauth.xhr({ method: 'GET', path: '/api/0.6/user/details' }, done);
- };
-
- connection.status = function(callback) {
- function done(capabilities) {
- var apiStatus = capabilities.getElementsByTagName('status');
- callback(undefined, apiStatus[0].getAttribute('api'));
- }
- d3.xml(url + '/api/capabilities').get()
- .on('load', done)
- .on('error', callback);
- };
-
- function abortRequest(i) { i.abort(); }
-
- connection.loadTiles = function(projection, dimensions) {
-
- if (off) return;
-
- var scaleExtent = [16, 16],
- s = projection.scale() * 2 * Math.PI,
- tiles = d3.geo.tile()
- .scaleExtent(scaleExtent)
- .scale(s)
- .size(dimensions)
- .translate(projection.translate())(),
- z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
- rz = Math.max(scaleExtent[0], Math.min(scaleExtent[1], Math.floor(z))),
- ts = 256 * Math.pow(2, z - rz),
- tile_origin = [
- s / 2 - projection.translate()[0],
- s / 2 - projection.translate()[1]];
-
- function bboxUrl(tile) {
- var x = (tile[0] * ts) - tile_origin[0];
- var y = (tile[1] * ts) - tile_origin[1];
- var b = [
- projection.invert([x, y]),
- projection.invert([x + ts, y + ts])];
-
- return url + '/api/0.6/map?bbox=' + [b[0][0], b[1][1], b[1][0], b[0][1]];
- }
-
- _.filter(inflight, function(v, i) {
- var wanted = _.find(tiles, function(tile) {
- return i === tile.toString();
- });
- if (!wanted) delete inflight[i];
- return !wanted;
- }).map(abortRequest);
-
- tiles.forEach(function(tile) {
- var id = tile.toString();
-
- if (loadedTiles[id] || inflight[id]) return;
-
- if (_.isEmpty(inflight)) {
- event.loading();
- }
-
- inflight[id] = connection.loadFromURL(bboxUrl(tile), function(err, parsed) {
- loadedTiles[id] = true;
- delete inflight[id];
-
- event.load(err, parsed);
-
- if (_.isEmpty(inflight)) {
- event.loaded();
- }
- });
- });
- };
-
- connection.switch = function(options) {
- url = options.url;
- oauth.options(_.extend({
- loading: authenticating,
- done: authenticated
- }, options));
- event.auth();
- connection.flush();
- return connection;
- };
-
- connection.toggle = function(_) {
- off = !_;
- return connection;
- };
-
- connection.user = function(_) {
- if (!arguments.length) return user;
- user = _;
- return connection;
- };
-
- connection.flush = function() {
- _.forEach(inflight, abortRequest);
- loadedTiles = {};
- inflight = {};
- return connection;
- };
-
- connection.loadedTiles = function(_) {
- if (!arguments.length) return loadedTiles;
- loadedTiles = _;
- return connection;
- };
-
- connection.logout = function() {
- oauth.logout();
- event.auth();
- return connection;
- };
-
- connection.authenticate = function(callback) {
- function done(err, res) {
- event.auth();
- if (callback) callback(err, res);
- }
- return oauth.authenticate(done);
- };
-
- return d3.rebind(connection, event, 'on');
-};
-/*
- iD.Difference represents the difference between two graphs.
- It knows how to calculate the set of entities that were
- created, modified, or deleted, and also contains the logic
- for recursively extending a difference to the complete set
- of entities that will require a redraw, taking into account
- child and parent relationships.
- */
-iD.Difference = function(base, head) {
- var changes = {}, length = 0;
-
- _.each(head.entities, function(h, id) {
- var b = base.entities[id];
- if (!_.isEqual(h, b)) {
- changes[id] = {base: b, head: h};
- length++;
- }
- });
-
- _.each(base.entities, function(b, id) {
- var h = head.entities[id];
- if (!changes[id] && !_.isEqual(h, b)) {
- changes[id] = {base: b, head: h};
- length++;
- }
- });
-
- function addParents(parents, result) {
- for (var i = 0; i < parents.length; i++) {
- var parent = parents[i];
-
- if (parent.id in result)
- continue;
-
- result[parent.id] = parent;
- addParents(head.parentRelations(parent), result);
- }
- }
-
- var difference = {};
-
- difference.length = function() {
- return length;
- };
-
- difference.changes = function() {
- return changes;
- };
-
- difference.extantIDs = function() {
- var result = [];
- _.each(changes, function(change, id) {
- if (change.head) result.push(id);
- });
- return result;
- };
-
- difference.modified = function() {
- var result = [];
- _.each(changes, function(change) {
- if (change.base && change.head) result.push(change.head);
- });
- return result;
- };
-
- difference.created = function() {
- var result = [];
- _.each(changes, function(change) {
- if (!change.base && change.head) result.push(change.head);
- });
- return result;
- };
-
- difference.deleted = function() {
- var result = [];
- _.each(changes, function(change) {
- if (change.base && !change.head) result.push(change.base);
- });
- return result;
- };
-
- difference.addParents = function(entities) {
-
- for (var i in entities) {
- addParents(head.parentWays(entities[i]), entities);
- addParents(head.parentRelations(entities[i]), entities);
- }
- return entities;
- };
-
- difference.complete = function(extent) {
- var result = {}, id, change;
-
- for (id in changes) {
- change = changes[id];
-
- var h = change.head,
- b = change.base,
- entity = h || b;
-
- if (extent &&
- (!h || !h.intersects(extent, head)) &&
- (!b || !b.intersects(extent, base)))
- continue;
-
- result[id] = h;
-
- if (entity.type === 'way') {
- var nh = h ? h.nodes : [],
- nb = b ? b.nodes : [],
- diff, i;
-
- diff = _.difference(nh, nb);
- for (i = 0; i < diff.length; i++) {
- result[diff[i]] = head.hasEntity(diff[i]);
- }
-
- diff = _.difference(nb, nh);
- for (i = 0; i < diff.length; i++) {
- result[diff[i]] = head.hasEntity(diff[i]);
- }
- }
-
- addParents(head.parentWays(entity), result);
- addParents(head.parentRelations(entity), result);
- }
-
- return result;
- };
-
- return difference;
-};
-iD.Entity = function(attrs) {
- // For prototypal inheritance.
- if (this instanceof iD.Entity) return;
-
- // Create the appropriate subtype.
- if (attrs && attrs.type) {
- return iD.Entity[attrs.type].apply(this, arguments);
- }
-
- // Initialize a generic Entity (used only in tests).
- return (new iD.Entity()).initialize(arguments);
-};
-
-iD.Entity.id = function(type) {
- return iD.Entity.id.fromOSM(type, iD.Entity.id.next[type]--);
-};
-
-iD.Entity.id.next = {node: -1, way: -1, relation: -1};
-
-iD.Entity.id.fromOSM = function(type, id) {
- return type[0] + id;
-};
-
-iD.Entity.id.toOSM = function(id) {
- return id.slice(1);
-};
-
-iD.Entity.id.type = function(id) {
- return {'n': 'node', 'w': 'way', 'r': 'relation'}[id[0]];
-};
-
-// A function suitable for use as the second argument to d3.selection#data().
-iD.Entity.key = function(entity) {
- return entity.id;
-};
-
-iD.Entity.prototype = {
- tags: {},
-
- initialize: function(sources) {
- for (var i = 0; i < sources.length; ++i) {
- var source = sources[i];
- for (var prop in source) {
- if (Object.prototype.hasOwnProperty.call(source, prop)) {
- this[prop] = source[prop];
- }
- }
- }
-
- if (!this.id && this.type) {
- this.id = iD.Entity.id(this.type);
- }
-
- if (iD.debug) {
- Object.freeze(this);
- Object.freeze(this.tags);
-
- if (this.loc) Object.freeze(this.loc);
- if (this.nodes) Object.freeze(this.nodes);
- if (this.members) Object.freeze(this.members);
- }
-
- return this;
- },
-
- osmId: function() {
- return iD.Entity.id.toOSM(this.id);
- },
-
- isNew: function() {
- return this.osmId() < 0;
- },
-
- update: function(attrs) {
- return iD.Entity(this, attrs);
- },
-
- mergeTags: function(tags) {
- var merged = _.clone(this.tags), changed = false;
- for (var k in tags) {
- var t1 = merged[k],
- t2 = tags[k];
- if (!t1) {
- changed = true;
- merged[k] = t2;
- } else if (t1 !== t2) {
- changed = true;
- merged[k] = _.union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
- }
- }
- return changed ? this.update({tags: merged}) : this;
- },
-
- intersects: function(extent, resolver) {
- return this.extent(resolver).intersects(extent);
- },
-
- hasInterestingTags: function() {
- return _.keys(this.tags).some(function(key) {
- return key != 'attribution' &&
- key != 'created_by' &&
- key != 'source' &&
- key != 'odbl' &&
- key.indexOf('tiger:') !== 0;
- });
- },
-
- deprecatedTags: function() {
- var tags = _.pairs(this.tags);
- var deprecated = {};
-
- iD.data.deprecated.forEach(function(d) {
- var match = _.pairs(d.old)[0];
- tags.forEach(function(t) {
- if (t[0] == match[0] &&
- (t[1] == match[1] || match[1] == '*')) {
- deprecated[t[0]] = t[1];
- }
- });
- });
-
- return deprecated;
- }
-};
-iD.Graph = function(other, mutable) {
- if (!(this instanceof iD.Graph)) return new iD.Graph(other, mutable);
-
- if (other instanceof iD.Graph) {
- var base = other.base();
- this.entities = _.assign(Object.create(base.entities), other.entities);
- this._parentWays = _.assign(Object.create(base.parentWays), other._parentWays);
- this._parentRels = _.assign(Object.create(base.parentRels), other._parentRels);
- this.inherited = true;
-
- } else {
- if (Array.isArray(other)) {
- var entities = {};
- for (var i = 0; i < other.length; i++) {
- entities[other[i].id] = other[i];
- }
- other = entities;
- }
- this.entities = Object.create({});
- this._parentWays = Object.create({});
- this._parentRels = Object.create({});
- this.rebase(other || {});
- }
-
- this.transients = {};
- this._childNodes = {};
-
- if (!mutable) {
- this.freeze();
- }
-};
-
-iD.Graph.prototype = {
- hasEntity: function(id) {
- return this.entities[id];
- },
-
- entity: function(id) {
- var entity = this.entities[id];
- if (!entity) {
- throw new Error('entity ' + id + ' not found');
- }
- return entity;
- },
-
- transient: function(entity, key, fn) {
- var id = entity.id,
- transients = this.transients[id] ||
- (this.transients[id] = {});
-
- if (transients[key] !== undefined) {
- return transients[key];
- }
-
- transients[key] = fn.call(entity);
-
- return transients[key];
- },
-
- parentWays: function(entity) {
- return _.map(this._parentWays[entity.id], this.entity, this);
- },
-
- isPoi: function(entity) {
- var parentWays = this._parentWays[entity.id];
- return !parentWays || parentWays.length === 0;
- },
-
- isShared: function(entity) {
- var parentWays = this._parentWays[entity.id];
- return parentWays && parentWays.length > 1;
- },
-
- parentRelations: function(entity) {
- return _.map(this._parentRels[entity.id], this.entity, this);
- },
-
- childNodes: function(entity) {
- if (this._childNodes[entity.id])
- return this._childNodes[entity.id];
-
- var nodes = [];
- for (var i = 0, l = entity.nodes.length; i < l; i++) {
- nodes[i] = this.entity(entity.nodes[i]);
- }
-
- this._childNodes[entity.id] = nodes;
- return this._childNodes[entity.id];
- },
-
- base: function() {
- return {
- 'entities': iD.util.getPrototypeOf(this.entities),
- 'parentWays': iD.util.getPrototypeOf(this._parentWays),
- 'parentRels': iD.util.getPrototypeOf(this._parentRels)
- };
- },
-
- // Unlike other graph methods, rebase mutates in place. This is because it
- // is used only during the history operation that merges newly downloaded
- // data into each state. To external consumers, it should appear as if the
- // graph always contained the newly downloaded data.
- rebase: function(entities) {
- var base = this.base(),
- i, k, child, id, keys;
-
- // Merging of data only needed if graph is the base graph
- if (!this.inherited) {
- for (i in entities) {
- if (!base.entities[i]) {
- base.entities[i] = entities[i];
- this._updateCalculated(undefined, entities[i],
- base.parentWays, base.parentRels);
- }
- }
- }
-
- keys = Object.keys(this._parentWays);
- for (i = 0; i < keys.length; i++) {
- child = keys[i];
- if (base.parentWays[child]) {
- for (k = 0; k < base.parentWays[child].length; k++) {
- id = base.parentWays[child][k];
- if (!this.entities.hasOwnProperty(id) && !_.contains(this._parentWays[child], id)) {
- this._parentWays[child].push(id);
- }
- }
- }
- }
-
- keys = Object.keys(this._parentRels);
- for (i = 0; i < keys.length; i++) {
- child = keys[i];
- if (base.parentRels[child]) {
- for (k = 0; k < base.parentRels[child].length; k++) {
- id = base.parentRels[child][k];
- if (!this.entities.hasOwnProperty(id) && !_.contains(this._parentRels[child], id)) {
- this._parentRels[child].push(id);
- }
- }
- }
- }
- },
-
- // Updates calculated properties (parentWays, parentRels) for the specified change
- _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
-
- parentWays = parentWays || this._parentWays;
- parentRels = parentRels || this._parentRels;
-
- var type = entity && entity.type || oldentity && oldentity.type,
- removed, added, ways, rels, i;
-
-
- if (type === 'way') {
-
- // Update parentWays
- if (oldentity && entity) {
- removed = _.difference(oldentity.nodes, entity.nodes);
- added = _.difference(entity.nodes, oldentity.nodes);
- } else if (oldentity) {
- removed = oldentity.nodes;
- added = [];
- } else if (entity) {
- removed = [];
- added = entity.nodes;
- }
- for (i = 0; i < removed.length; i++) {
- parentWays[removed[i]] = _.without(parentWays[removed[i]], oldentity.id);
- }
- for (i = 0; i < added.length; i++) {
- ways = _.without(parentWays[added[i]], entity.id);
- ways.push(entity.id);
- parentWays[added[i]] = ways;
- }
- } else if (type === 'node') {
-
- } else if (type === 'relation') {
-
- // Update parentRels
- if (oldentity && entity) {
- removed = _.difference(oldentity.members, entity.members);
- added = _.difference(entity.members, oldentity);
- } else if (oldentity) {
- removed = oldentity.members;
- added = [];
- } else if (entity) {
- removed = [];
- added = entity.members;
- }
- for (i = 0; i < removed.length; i++) {
- parentRels[removed[i].id] = _.without(parentRels[removed[i].id], oldentity.id);
- }
- for (i = 0; i < added.length; i++) {
- rels = _.without(parentRels[added[i].id], entity.id);
- rels.push(entity.id);
- parentRels[added[i].id] = rels;
- }
- }
- },
-
- replace: function(entity) {
- if (this.entities[entity.id] === entity)
- return this;
-
- return this.update(function() {
- this._updateCalculated(this.entities[entity.id], entity);
- this.entities[entity.id] = entity;
- });
- },
-
- remove: function(entity) {
- return this.update(function() {
- this._updateCalculated(entity, undefined);
- this.entities[entity.id] = undefined;
- });
- },
-
- update: function() {
- var graph = this.frozen ? iD.Graph(this, true) : this;
-
- for (var i = 0; i < arguments.length; i++) {
- arguments[i].call(graph, graph);
- }
-
- return this.frozen ? graph.freeze() : this;
- },
-
- freeze: function() {
- this.frozen = true;
-
- if (iD.debug) {
- Object.freeze(this.entities);
- }
-
- return this;
- },
-
- hasAllChildren: function(entity) {
- // we're only checking changed entities, since we assume fetched data
- // must have all children present
- var i;
- if (this.entities.hasOwnProperty(entity.id)) {
- if (entity.type === 'way') {
- for (i = 0; i < entity.nodes.length; i++) {
- if (!this.entities[entity.nodes[i]]) return false;
- }
- } else if (entity.type === 'relation') {
- for (i = 0; i < entity.members.length; i++) {
- if (!this.entities[entity.members[i].id]) return false;
- }
- }
- }
- return true;
- },
-
- // Obliterates any existing entities
- load: function(entities) {
-
- var base = this.base(),
- i, entity, prefix;
- this.entities = Object.create(base.entities);
-
- for (i in entities) {
- entity = entities[i];
- prefix = i[0];
-
- if (entity === 'undefined') {
- this.entities[i] = undefined;
- } else if (prefix == 'n') {
- this.entities[i] = new iD.Node(entity);
-
- } else if (prefix == 'w') {
- this.entities[i] = new iD.Way(entity);
-
- } else if (prefix == 'r') {
- this.entities[i] = new iD.Relation(entity);
- }
- this._updateCalculated(base.entities[i], this.entities[i]);
- }
- return this;
- }
-};
-iD.History = function(context) {
- var stack, index, tree,
- imagery_used = 'Bing',
- dispatch = d3.dispatch('change', 'undone', 'redone'),
- lock = false;
-
- function perform(actions) {
- actions = Array.prototype.slice.call(actions);
-
- var annotation;
-
- if (!_.isFunction(_.last(actions))) {
- annotation = actions.pop();
- }
-
- var graph = stack[index].graph;
- for (var i = 0; i < actions.length; i++) {
- graph = actions[i](graph);
- }
-
- return {
- graph: graph,
- annotation: annotation,
- imagery_used: imagery_used
- };
- }
-
- function change(previous) {
- var difference = iD.Difference(previous, history.graph());
- dispatch.change(difference);
- return difference;
- }
-
- // iD uses namespaced keys so multiple installations do not conflict
- function getKey(n) {
- return 'iD_' + window.location.origin + '_' + n;
- }
-
- var history = {
- graph: function() {
- return stack[index].graph;
- },
-
- merge: function(entities) {
-
- var base = stack[0].graph.base(),
- newentities = Object.keys(entities).filter(function(i) {
- return !base.entities[i];
- });
-
- for (var i = 0; i < stack.length; i++) {
- stack[i].graph.rebase(entities);
- }
-
- tree.rebase(newentities);
-
- dispatch.change();
- },
-
- perform: function() {
- var previous = stack[index].graph;
-
- stack = stack.slice(0, index + 1);
- stack.push(perform(arguments));
- index++;
-
- return change(previous);
- },
-
- replace: function() {
- var previous = stack[index].graph;
-
- // assert(index == stack.length - 1)
- stack[index] = perform(arguments);
-
- return change(previous);
- },
-
- pop: function() {
- var previous = stack[index].graph;
-
- if (index > 0) {
- index--;
- stack.pop();
- return change(previous);
- }
- },
-
- undo: function() {
- var previous = stack[index].graph;
-
- // Pop to the next annotated state.
- while (index > 0) {
- index--;
- if (stack[index].annotation) break;
- }
-
- dispatch.undone();
- return change(previous);
- },
-
- redo: function() {
- var previous = stack[index].graph;
-
- while (index < stack.length - 1) {
- index++;
- if (stack[index].annotation) break;
- }
-
- dispatch.redone();
- return change(previous);
- },
-
- undoAnnotation: function() {
- var i = index;
- while (i >= 0) {
- if (stack[i].annotation) return stack[i].annotation;
- i--;
- }
- },
-
- redoAnnotation: function() {
- var i = index + 1;
- while (i <= stack.length - 1) {
- if (stack[i].annotation) return stack[i].annotation;
- i++;
- }
- },
-
- intersects: function(extent) {
- return tree.intersects(extent, stack[index].graph);
- },
-
- difference: function() {
- var base = stack[0].graph,
- head = stack[index].graph;
- return iD.Difference(base, head);
- },
-
- changes: function() {
- var difference = history.difference();
-
- function discardTags(entity) {
- if (_.isEmpty(entity.tags)) {
- return entity;
- } else {
- return entity.update({
- tags: _.omit(entity.tags, iD.data.discarded)
- });
- }
- }
-
- return {
- modified: difference.modified().map(discardTags),
- created: difference.created().map(discardTags),
- deleted: difference.deleted()
- };
- },
-
- hasChanges: function() {
- return this.difference().length() > 0;
- },
-
- numChanges: function() {
- return this.difference().length();
- },
-
- imagery_used: function(source) {
- if (source) imagery_used = source;
- else return _.without(
- _.unique(_.pluck(stack.slice(1, index + 1), 'imagery_used')),
- undefined, 'Custom');
- },
-
- reset: function() {
- stack = [{graph: iD.Graph()}];
- index = 0;
- tree = iD.Tree(stack[0].graph);
- dispatch.change();
- return history;
- },
-
- toJSON: function() {
- if (stack.length <= 1) return;
-
- var s = stack.map(function(i) {
- var x = { entities: i.graph.entities };
- if (i.imagery_used) x.imagery_used = i.imagery_used;
- if (i.annotation) x.annotation = i.annotation;
- return x;
- });
-
- return JSON.stringify({
- stack: s,
- nextIDs: iD.Entity.id.next,
- index: index
- }, function includeUndefined(key, value) {
- if (typeof value === 'undefined') return 'undefined';
- return value;
- });
- },
-
- fromJSON: function(json) {
-
- var h = JSON.parse(json);
-
- iD.Entity.id.next = h.nextIDs;
- index = h.index;
- stack = h.stack.map(function(d) {
- d.graph = iD.Graph(stack[0].graph).load(d.entities);
- return d;
- });
- stack[0].graph.inherited = false;
- dispatch.change();
-
- return history;
- },
-
- save: function() {
- if (!lock) return history;
- context.storage(getKey('lock'), null);
- context.storage(getKey('saved_history'), this.toJSON() || null);
- return history;
- },
-
- clearSaved: function() {
- if (!lock) return;
- context.storage(getKey('saved_history'), null);
- },
-
- lock: function() {
- if (context.storage(getKey('lock'))) return false;
- context.storage(getKey('lock'), true);
- lock = true;
- return lock;
- },
-
- // is iD not open in another window and it detects that
- // there's a history stored in localStorage that's recoverable?
- restorableChanges: function() {
- return lock && !!context.storage(getKey('saved_history'));
- },
-
- // load history from a version stored in localStorage
- restore: function() {
- if (!lock) return;
-
- var json = context.storage(getKey('saved_history'));
- if (json) this.fromJSON(json);
-
- context.storage(getKey('saved_history', null));
-
- },
-
- _getKey: getKey
-
- };
-
- history.reset();
-
- return d3.rebind(history, dispatch, 'on');
-};
-iD.Node = iD.Entity.node = function iD_Node() {
- if (!(this instanceof iD_Node)) {
- return (new iD_Node()).initialize(arguments);
- } else if (arguments.length) {
- this.initialize(arguments);
- }
-};
-
-iD.Node.prototype = Object.create(iD.Entity.prototype);
-
-_.extend(iD.Node.prototype, {
- type: "node",
-
- extent: function() {
- return new iD.geo.Extent(this.loc);
- },
-
- geometry: function(graph) {
- return graph.isPoi(this) ? 'point' : 'vertex';
- },
-
- move: function(loc) {
- return this.update({loc: loc});
- },
-
- asJXON: function(changeset_id) {
- var r = {
- node: {
- '@id': this.osmId(),
- '@lon': this.loc[0],
- '@lat': this.loc[1],
- '@version': (this.version || 0),
- tag: _.map(this.tags, function(v, k) {
- return { keyAttributes: { k: k, v: v } };
- })
- }
- };
- if (changeset_id) r.node['@changeset'] = changeset_id;
- return r;
- },
-
- asGeoJSON: function() {
- return {
- type: 'Feature',
- properties: this.tags,
- geometry: {
- type: 'Point',
- coordinates: this.loc
- }
- };
- }
-});
-iD.Relation = iD.Entity.relation = function iD_Relation() {
- if (!(this instanceof iD_Relation)) {
- return (new iD_Relation()).initialize(arguments);
- } else if (arguments.length) {
- this.initialize(arguments);
- }
-};
-
-iD.Relation.prototype = Object.create(iD.Entity.prototype);
-
-_.extend(iD.Relation.prototype, {
- type: "relation",
- members: [],
-
- extent: function(resolver) {
- return resolver.transient(this, 'extent', function() {
- return this.members.reduce(function(extent, member) {
- member = resolver.hasEntity(member.id);
- if (member) {
- return extent.extend(member.extent(resolver));
- } else {
- return extent;
- }
- }, iD.geo.Extent());
- });
- },
-
- geometry: function() {
- return this.isMultipolygon() ? 'area' : 'relation';
- },
-
- // Return the first member with the given role. A copy of the member object
- // is returned, extended with an 'index' property whose value is the member index.
- memberByRole: function(role) {
- for (var i = 0; i < this.members.length; i++) {
- if (this.members[i].role === role) {
- return _.extend({}, this.members[i], {index: i});
- }
- }
- },
-
- // Return the first member with the given id. A copy of the member object
- // is returned, extended with an 'index' property whose value is the member index.
- memberById: function(id) {
- for (var i = 0; i < this.members.length; i++) {
- if (this.members[i].id === id) {
- return _.extend({}, this.members[i], {index: i});
- }
- }
- },
-
- // Return the first member with the given id and role. A copy of the member object
- // is returned, extended with an 'index' property whose value is the member index.
- memberByIdAndRole: function(id, role) {
- for (var i = 0; i < this.members.length; i++) {
- if (this.members[i].id === id && this.members[i].role === role) {
- return _.extend({}, this.members[i], {index: i});
- }
- }
- },
-
- addMember: function(member, index) {
- var members = this.members.slice();
- members.splice(index === undefined ? members.length : index, 0, member);
- return this.update({members: members});
- },
-
- updateMember: function(member, index) {
- var members = this.members.slice();
- members.splice(index, 1, _.extend({}, members[index], member));
- return this.update({members: members});
- },
-
- removeMember: function(id) {
- var members = _.reject(this.members, function(m) { return m.id === id; });
- return this.update({members: members});
- },
-
- // Wherever a member appears with id `needle.id`, replace it with a member
- // with id `replacement.id`, type `replacement.type`, and the original role,
- // unless a member already exists with that id and role. Return an updated
- // relation.
- replaceMember: function(needle, replacement) {
- if (!this.memberById(needle.id))
- return this;
-
- var members = [];
-
- for (var i = 0; i < this.members.length; i++) {
- var member = this.members[i];
- if (member.id !== needle.id) {
- members.push(member);
- } else if (!this.memberByIdAndRole(replacement.id, member.role)) {
- members.push({id: replacement.id, type: replacement.type, role: member.role});
- }
- }
-
- return this.update({members: members});
- },
-
- asJXON: function(changeset_id) {
- var r = {
- relation: {
- '@id': this.osmId(),
- '@version': this.version || 0,
- member: _.map(this.members, function(member) {
- return { keyAttributes: { type: member.type, role: member.role, ref: iD.Entity.id.toOSM(member.id) } };
- }),
- tag: _.map(this.tags, function(v, k) {
- return { keyAttributes: { k: k, v: v } };
- })
- }
- };
- if (changeset_id) r.relation['@changeset'] = changeset_id;
- return r;
- },
-
- asGeoJSON: function(resolver) {
- if (this.isMultipolygon()) {
- return {
- type: 'Feature',
- properties: this.tags,
- geometry: {
- type: 'MultiPolygon',
- coordinates: this.multipolygon(resolver)
- }
- };
- } else {
- return {
- type: 'FeatureCollection',
- properties: this.tags,
- features: this.members.map(function(member) {
- return _.extend({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
- })
- };
- }
- },
-
- isMultipolygon: function() {
- return this.tags.type === 'multipolygon';
- },
-
- isComplete: function(resolver) {
- for (var i = 0; i < this.members.length; i++) {
- if (!resolver.hasEntity(this.members[i].id)) {
- return false;
- }
- }
- return true;
- },
-
- isRestriction: function() {
- return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
- },
-
- // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
- // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
- //
- // This corresponds to the structure needed for rendering a multipolygon path using a
- // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
- //
- // In the case of invalid geometries, this function will still return a result which
- // includes the nodes of all way members, but some Nds may be unclosed and some inner
- // rings not matched with the intended outer ring.
- //
- multipolygon: function(resolver) {
- var members = this.members
- .filter(function(m) { return m.type === 'way' && resolver.hasEntity(m.id); })
- .map(function(m) { return { role: m.role || 'outer', id: m.id, nodes: resolver.childNodes(resolver.entity(m.id)) }; });
-
- function join(ways) {
- var joined = [], current, first, last, i, how, what;
-
- while (ways.length) {
- current = ways.pop().nodes.slice();
- joined.push(current);
-
- while (ways.length && _.first(current) !== _.last(current)) {
- first = _.first(current);
- last = _.last(current);
-
- for (i = 0; i < ways.length; i++) {
- what = ways[i].nodes;
-
- if (last === _.first(what)) {
- how = current.push;
- what = what.slice(1);
- break;
- } else if (last === _.last(what)) {
- how = current.push;
- what = what.slice(0, -1).reverse();
- break;
- } else if (first == _.last(what)) {
- how = current.unshift;
- what = what.slice(0, -1);
- break;
- } else if (first == _.first(what)) {
- how = current.unshift;
- what = what.slice(1).reverse();
- break;
- } else {
- what = how = null;
- }
- }
-
- if (!what)
- break; // Invalid geometry (unclosed ring)
-
- ways.splice(i, 1);
- how.apply(current, what);
- }
- }
-
- return joined.map(function(nodes) { return _.pluck(nodes, 'loc'); });
- }
-
- function findOuter(inner) {
- var o, outer;
-
- for (o = 0; o < outers.length; o++) {
- outer = outers[o];
- if (iD.geo.polygonContainsPolygon(outer, inner))
- return o;
- }
-
- for (o = 0; o < outers.length; o++) {
- outer = outers[o];
- if (iD.geo.polygonIntersectsPolygon(outer, inner))
- return o;
- }
- }
-
- var outers = join(members.filter(function(m) { return m.role === 'outer'; })),
- inners = join(members.filter(function(m) { return m.role === 'inner'; })),
- result = outers.map(function(o) { return [o]; });
-
- for (var i = 0; i < inners.length; i++) {
- var o = findOuter(inners[i]);
- if (o !== undefined)
- result[o].push(inners[i]);
- else
- result.push([inners[i]]); // Invalid geometry
- }
-
- return result;
- }
-});
-iD.Tree = function(graph) {
-
- var rtree = new RTree(),
- m = 1000 * 1000 * 100,
- head = graph,
- queuedCreated = [],
- queuedModified = [],
- x, y, dx, dy, rebased;
-
- function extentRectangle(extent) {
- x = m * extent[0][0],
- y = m * extent[0][1],
- dx = Math.max(m * extent[1][0] - x, 1),
- dy = Math.max(m * extent[1][1] - y, 1);
- return new RTree.Rectangle(~~x, ~~y, ~~dx, ~~dy);
- }
-
- function insert(entity) {
- rtree.insert(extentRectangle(entity.extent(head)), entity.id);
- }
-
- function remove(entity) {
- rtree.remove(extentRectangle(entity.extent(graph)), entity.id);
- }
-
- function reinsert(entity) {
- remove(graph.entities[entity.id]);
- insert(entity);
- }
-
- var tree = {
-
- rebase: function(entities) {
- for (var i = 0; i < entities.length; i++) {
- if (!graph.entities.hasOwnProperty(entities[i])) {
- insert(graph.entity(entities[i]), true);
- }
- }
- rebased = true;
- return tree;
- },
-
- intersects: function(extent, g) {
-
- head = g;
-
- if (graph !== head || rebased) {
- var diff = iD.Difference(graph, head),
- modified = {};
-
- diff.modified().forEach(function(d) {
- var loc = graph.entities[d.id].loc;
- if (!loc || loc[0] !== d.loc[0] || loc[1] !== d.loc[1]) {
- modified[d.id] = d;
- }
- });
-
- var created = diff.created().concat(queuedCreated);
- modified = d3.values(diff.addParents(modified))
- // some parents might be created, not modified
- .filter(function(d) { return !!graph.hasEntity(d.id); })
- .concat(queuedModified);
- queuedCreated = [];
- queuedModified = [];
-
- modified.forEach(function(d) {
- if (head.hasAllChildren(d)) reinsert(d);
- else queuedModified.push(d);
- });
-
- created.forEach(function(d) {
- if (head.hasAllChildren(d)) insert(d);
- else queuedCreated.push(d);
- });
-
- diff.deleted().forEach(remove);
-
- graph = head;
- rebased = false;
- }
-
- return rtree.search(extentRectangle(extent))
- .map(function(id) { return graph.entity(id); });
- },
-
- graph: function() {
- return graph;
- }
-
- };
-
- return tree;
-};
-iD.Way = iD.Entity.way = function iD_Way() {
- if (!(this instanceof iD_Way)) {
- return (new iD_Way()).initialize(arguments);
- } else if (arguments.length) {
- this.initialize(arguments);
- }
-};
-
-iD.Way.prototype = Object.create(iD.Entity.prototype);
-
-_.extend(iD.Way.prototype, {
- type: "way",
- nodes: [],
-
- extent: function(resolver) {
- return resolver.transient(this, 'extent', function() {
- return this.nodes.reduce(function(extent, id) {
- return extent.extend(resolver.entity(id).extent(resolver));
- }, iD.geo.Extent());
- });
- },
-
- first: function() {
- return this.nodes[0];
- },
-
- last: function() {
- return this.nodes[this.nodes.length - 1];
- },
-
- contains: function(node) {
- return this.nodes.indexOf(node) >= 0;
- },
-
- isOneWay: function() {
- return this.tags.oneway === 'yes' ||
- this.tags.oneway === '1' ||
- this.tags.oneway === '-1' ||
- this.tags.waterway === 'river' ||
- this.tags.waterway === 'stream' ||
- this.tags.junction === 'roundabout';
- },
-
- isClosed: function() {
- return this.nodes.length > 0 && this.first() === this.last();
- },
-
- isArea: function() {
- if (this.tags.area === 'yes')
- return true;
- if (!this.isClosed() || this.tags.area === 'no')
- return false;
- for (var key in this.tags)
- if (key in iD.Way.areaKeys && !(this.tags[key] in iD.Way.areaKeys[key]))
- return true;
- return false;
- },
-
- isDegenerate: function() {
- return _.uniq(this.nodes).length < (this.isArea() ? 3 : 2);
- },
-
- areAdjacent: function(n1, n2) {
- for (var i = 0; i < this.nodes.length; i++) {
- if (this.nodes[i] === n1) {
- if (this.nodes[i - 1] === n2) return true;
- if (this.nodes[i + 1] === n2) return true;
- }
- }
- return false;
- },
-
- geometry: function() {
- return this.isArea() ? 'area' : 'line';
- },
-
- addNode: function(id, index) {
- var nodes = this.nodes.slice();
- nodes.splice(index === undefined ? nodes.length : index, 0, id);
- return this.update({nodes: nodes});
- },
-
- updateNode: function(id, index) {
- var nodes = this.nodes.slice();
- nodes.splice(index, 1, id);
- return this.update({nodes: nodes});
- },
-
- replaceNode: function(needle, replacement) {
- if (this.nodes.indexOf(needle) < 0)
- return this;
-
- var nodes = this.nodes.slice();
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i] === needle) {
- nodes[i] = replacement;
- }
- }
- return this.update({nodes: nodes});
- },
-
- removeNode: function(id) {
- var nodes = [];
-
- for (var i = 0; i < this.nodes.length; i++) {
- var node = this.nodes[i];
- if (node != id && nodes[nodes.length - 1] != node) {
- nodes.push(node);
- }
- }
-
- // Preserve circularity
- if (this.nodes.length > 1 && this.first() === id && this.last() === id && nodes[nodes.length - 1] != nodes[0]) {
- nodes.push(nodes[0]);
- }
-
- return this.update({nodes: nodes});
- },
-
- asJXON: function(changeset_id) {
- var r = {
- way: {
- '@id': this.osmId(),
- '@version': this.version || 0,
- nd: _.map(this.nodes, function(id) {
- return { keyAttributes: { ref: iD.Entity.id.toOSM(id) } };
- }),
- tag: _.map(this.tags, function(v, k) {
- return { keyAttributes: { k: k, v: v } };
- })
- }
- };
- if (changeset_id) r.way['@changeset'] = changeset_id;
- return r;
- },
-
- asGeoJSON: function(resolver, close) {
-
- var childnodes = resolver.childNodes(this);
-
- // Close unclosed way
- if (close && !this.isClosed() && childnodes.length) {
- childnodes = childnodes.concat([childnodes[0]]);
- }
-
- if (this.isArea() && (close || this.isClosed())) {
- return {
- type: 'Feature',
- properties: this.tags,
- geometry: {
- type: 'Polygon',
- coordinates: [_.pluck(childnodes, 'loc')]
- }
- };
- } else {
- return {
- type: 'Feature',
- properties: this.tags,
- geometry: {
- type: 'LineString',
- coordinates: _.pluck(childnodes, 'loc')
- }
- };
- }
- }
-});
-
-// A closed way is considered to be an area if it has a tag with one
-// of the following keys, and the value is _not_ one of the associated
-// values for the respective key.
-iD.Way.areaKeys = {
- area: {},
- building: {},
- leisure: {},
- tourism: {},
- ruins: {},
- historic: {},
- landuse: {},
- military: {},
- natural: { coastline: true },
- amenity: {},
- shop: {},
- man_made: {},
- public_transport: {},
- place: {},
- aeroway: {},
- waterway: {},
- power: {}
-};
-iD.Background = function(backgroundType) {
-
- backgroundType = backgroundType || 'layer';
-
- var tileSize = 256,
- tile = d3.geo.tile(),
- projection,
- cache = {},
- offset = [0, 0],
- offsets = {},
- tileOrigin,
- z,
- transformProp = iD.util.prefixCSSProperty('Transform'),
- source = d3.functor('');
-
- function tileSizeAtZoom(d, z) {
- return Math.ceil(tileSize * Math.pow(2, z - d[2])) / tileSize;
- }
-
- function atZoom(t, distance) {
- var power = Math.pow(2, distance);
- return [
- Math.floor(t[0] * power),
- Math.floor(t[1] * power),
- t[2] + distance];
- }
-
- function lookUp(d) {
- for (var up = -1; up > -d[2]; up--) {
- if (cache[atZoom(d, up)] !== false) return atZoom(d, up);
- }
- }
-
- function uniqueBy(a, n) {
- var o = [], seen = {};
- for (var i = 0; i < a.length; i++) {
- if (seen[a[i][n]] === undefined) {
- o.push(a[i]);
- seen[a[i][n]] = true;
- }
- }
- return o;
- }
-
- function addSource(d) {
- d.push(source(d));
- return d;
- }
-
- // Update tiles based on current state of `projection`.
- function background(selection) {
- tile.scale(projection.scale() * 2 * Math.PI)
- .translate(projection.translate());
-
- tileOrigin = [
- projection.scale() * Math.PI - projection.translate()[0],
- projection.scale() * Math.PI - projection.translate()[1]];
-
- z = Math.max(Math.log(projection.scale() * 2 * Math.PI) / Math.log(2) - 8, 0);
-
- render(selection);
- }
-
- // Derive the tiles onscreen, remove those offscreen and position them.
- // Important that this part not depend on `projection` because it's
- // rentered when tiles load/error (see #644).
- function render(selection) {
- var requests = [];
-
- tile().forEach(function(d) {
- addSource(d);
- requests.push(d);
- if (cache[d[3]] === false && lookUp(d)) {
- requests.push(addSource(lookUp(d)));
- }
- });
-
- requests = uniqueBy(requests, 3).filter(function(r) {
- // don't re-request tiles which have failed in the past
- return cache[r[3]] !== false;
- });
-
- var pixelOffset = [
- Math.round(offset[0] * Math.pow(2, z)),
- Math.round(offset[1] * Math.pow(2, z))
- ];
-
- function load(d) {
- cache[d[3]] = true;
- d3.select(this)
- .on('load', null)
- .classed('tile-loaded', true);
- render(selection);
- }
-
- function error(d) {
- cache[d[3]] = false;
- d3.select(this)
- .on('load', null)
- .remove();
- render(selection);
- }
-
- function imageTransform(d) {
- var _ts = tileSize * Math.pow(2, z - d[2]);
- var scale = tileSizeAtZoom(d, z);
- return 'translate(' +
- (Math.round((d[0] * _ts) - tileOrigin[0]) + pixelOffset[0]) + 'px,' +
- (Math.round((d[1] * _ts) - tileOrigin[1]) + pixelOffset[1]) + 'px)' +
- 'scale(' + scale + ',' + scale + ')';
- }
-
- var image = selection
- .selectAll('img')
- .data(requests, function(d) { return d[3]; });
-
- image.exit()
- .style(transformProp, imageTransform)
- .classed('tile-loaded', false)
- .each(function() {
- var tile = this;
- window.setTimeout(function() {
- // this tile may already be removed
- if (tile.parentNode) {
- tile.parentNode.removeChild(tile);
- }
- }, 300);
- });
-
- image.enter().append('img')
- .attr('class', 'tile')
- .attr('src', function(d) { return d[3]; })
- .on('error', error)
- .on('load', load);
-
- image.style(transformProp, imageTransform);
- }
-
- background.offset = function(_) {
- if (!arguments.length) return offset;
- offset = _;
- if (source.data) offsets[source.data.name] = offset;
- return background;
- };
-
- background.nudge = function(_, zoomlevel) {
- offset[0] += _[0] / Math.pow(2, zoomlevel);
- offset[1] += _[1] / Math.pow(2, zoomlevel);
- return background;
- };
-
- background.projection = function(_) {
- if (!arguments.length) return projection;
- projection = _;
- return background;
- };
-
- background.size = function(_) {
- if (!arguments.length) return tile.size();
- tile.size(_);
- return background;
- };
-
- function setHash(source) {
- var tag = source.data && source.data.sourcetag;
- if (!tag && source.data && source.data.name === 'Custom') {
- tag = 'custom:' + source.data.template;
- }
- var q = iD.util.stringQs(location.hash.substring(1));
- if (tag) {
- q[backgroundType] = tag;
- location.replace('#' + iD.util.qsString(q, true));
- } else {
- location.replace('#' + iD.util.qsString(_.omit(q, backgroundType), true));
- }
- }
-
- background.dispatch = d3.dispatch('change');
-
- background.source = function(_) {
- if (!arguments.length) return source;
- source = _;
- if (source.data) {
- offset = offsets[source.data.name] = offsets[source.data.name] || [0, 0];
- } else {
- offset = [0, 0];
- }
- cache = {};
- tile.scaleExtent((source.data && source.data.scaleExtent) || [1, 20]);
- setHash(source);
- background.dispatch.change();
- return background;
- };
-
- return d3.rebind(background, background.dispatch, 'on');
-};
-iD.BackgroundSource = {};
-
-// derive the url of a 'quadkey' style tile from a coordinate object
-iD.BackgroundSource.template = function(data) {
-
- function generator(coord) {
- var u = '';
- for (var zoom = coord[2]; zoom > 0; zoom--) {
- var b = 0;
- var mask = 1 << (zoom - 1);
- if ((coord[0] & mask) !== 0) b++;
- if ((coord[1] & mask) !== 0) b += 2;
- u += b.toString();
- }
-
- return data.template
- .replace('{t}', data.subdomains ?
- data.subdomains[coord[2] % data.subdomains.length] : '')
- .replace('{u}', u)
- .replace('{x}', coord[0])
- .replace('{y}', coord[1])
- .replace('{z}', coord[2])
- // JOSM style
- .replace('{zoom}', coord[2])
- .replace(/\{(switch\:[^\}]*)\}/, function(s, r) {
- var subdomains = r.split(':')[1].split(',');
- return subdomains[coord[2] % subdomains.length];
- });
- }
-
- generator.data = data;
- generator.copyrightNotices = function() {};
-
- return generator;
-};
-
-iD.BackgroundSource.Bing = function(data, dispatch) {
- // http://msdn.microsoft.com/en-us/library/ff701716.aspx
- // http://msdn.microsoft.com/en-us/library/ff701701.aspx
-
- var bing = iD.BackgroundSource.template(data),
- key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
- url = 'http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
- key + '&jsonp={callback}',
- providers = [];
-
- d3.jsonp(url, function(json) {
- providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
- return {
- attribution: provider.attribution,
- areas: provider.coverageAreas.map(function(area) {
- return {
- zoom: [area.zoomMin, area.zoomMax],
- extent: iD.geo.Extent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
- };
- })
- };
- });
- dispatch.change();
- });
-
- bing.copyrightNotices = function(zoom, extent) {
- zoom = Math.min(zoom, 21);
- return providers.filter(function(provider) {
- return _.any(provider.areas, function(area) {
- return extent.intersects(area.extent) &&
- area.zoom[0] <= zoom &&
- area.zoom[1] >= zoom;
- });
- }).map(function(provider) {
- return provider.attribution;
- }).join(', ');
- };
-
- return bing;
-};
-
-iD.BackgroundSource.Custom = function() {
- var template = window.prompt('Enter a tile template. ' +
- 'Valid tokens are {z}, {x}, {y} for Z/X/Y scheme and {u} for quadtile scheme.');
- if (!template) return null;
- return iD.BackgroundSource.template({
- template: template,
- name: 'Custom'
- });
-};
-
-iD.BackgroundSource.Custom.data = { 'name': 'Custom' };
-iD.LocalGpx = function(context) {
- var tileSize = 256,
- projection,
- gj = {},
- enable = true,
- size = [0, 0],
- transformProp = iD.util.prefixCSSProperty('Transform'),
- path = d3.geo.path().projection(projection),
- source = d3.functor('');
-
- function render(selection) {
-
- path.projection(projection);
-
- var surf = selection.selectAll('svg')
- .data(enable ? [gj] : []);
-
- surf.exit().remove();
-
- surf.enter()
- .append('svg')
- .style('position', 'absolute');
-
- var paths = surf
- .selectAll('path')
- .data(function(d) { return [d]; });
-
- paths
- .enter()
- .append('path')
- .attr('class', 'gpx');
-
- paths
- .attr('d', path);
- }
-
- function toDom(x) {
- return (new DOMParser()).parseFromString(x, 'text/xml');
- }
-
- render.projection = function(_) {
- if (!arguments.length) return projection;
- projection = _;
- return render;
- };
-
- render.enable = function(_) {
- if (!arguments.length) return enable;
- enable = _;
- return render;
- };
-
- render.geojson = function(_) {
- if (!arguments.length) return gj;
- gj = _;
- return render;
- };
-
- render.size = function(_) {
- if (!arguments.length) return size;
- size = _;
- return render;
- };
-
- render.id = 'layer-gpx';
-
- function over() {
- d3.event.stopPropagation();
- d3.event.preventDefault();
- d3.event.dataTransfer.dropEffect = 'copy';
- }
-
- d3.select('body')
- .attr('dropzone', 'copy')
- .on('drop.localgpx', function() {
- d3.event.stopPropagation();
- d3.event.preventDefault();
- if (!iD.detect().filedrop) return;
- var f = d3.event.dataTransfer.files[0],
- reader = new FileReader();
-
- reader.onload = function(e) {
- render.geojson(toGeoJSON.gpx(toDom(e.target.result)));
- context.redraw();
- context.map().pan([0, 0]);
- };
-
- reader.readAsText(f);
- })
- .on('dragenter.localgpx', over)
- .on('dragexit.localgpx', over)
- .on('dragover.localgpx', over);
-
- return render;
-};
-iD.Map = function(context) {
- var dimensions = [1, 1],
- dispatch = d3.dispatch('move', 'drawn'),
- projection = d3.geo.mercator().scale(512 / Math.PI),
- roundedProjection = iD.svg.RoundProjection(projection),
- zoom = d3.behavior.zoom()
- .translate(projection.translate())
- .scale(projection.scale() * 2 * Math.PI)
- .scaleExtent([1024, 256 * Math.pow(2, 24)])
- .on('zoom', zoomPan),
- dblclickEnabled = true,
- transformStart,
- transformed = false,
- minzoom = 0,
- layers = [
- iD.Background().projection(projection),
- iD.LocalGpx(context).projection(projection),
- iD.Background('overlay').projection(projection)
- ],
- transformProp = iD.util.prefixCSSProperty('Transform'),
- points = iD.svg.Points(roundedProjection, context),
- vertices = iD.svg.Vertices(roundedProjection, context),
- lines = iD.svg.Lines(projection),
- areas = iD.svg.Areas(roundedProjection),
- midpoints = iD.svg.Midpoints(roundedProjection, context),
- labels = iD.svg.Labels(roundedProjection, context),
- tail = iD.ui.Tail(),
- supersurface, surface, layergroup;
-
- function map(selection) {
- context.history()
- .on('change.map', redraw);
-
- context.on('select.map', function() {
- redraw();
- });
-
- selection.call(zoom);
-
- supersurface = selection.append('div')
- .attr('id', 'supersurface');
-
- layergroup = supersurface.append('div')
- .attr('id', 'layer-g');
-
- surface = supersurface.append('svg')
- .on('mousedown.zoom', function() {
- if (d3.event.button == 2) {
- d3.event.stopPropagation();
- }
- }, true)
- .on('mouseup.zoom', function() {
- if (resetTransform()) redraw();
- })
- .attr('id', 'surface')
- .call(iD.svg.Surface(context));
-
- surface.on('mouseover.vertices', function() {
- if (map.editable() && !transformed) {
- var hover = d3.event.target.__data__;
- surface.call(vertices.drawHover, context.graph(), hover, map.zoom());
- }
- });
-
- surface.on('mouseout.vertices', function() {
- if (map.editable() && !transformed) {
- var hover = d3.event.relatedTarget && d3.event.relatedTarget.__data__;
- surface.call(vertices.drawHover, context.graph(), hover, map.zoom());
- }
- });
-
- map.size(selection.size());
- map.surface = surface;
- map.layersurface = layergroup;
-
- labels.supersurface(supersurface);
-
- supersurface
- .call(tail);
- }
-
- function pxCenter() { return [dimensions[0] / 2, dimensions[1] / 2]; }
-
- function drawVector(difference) {
- var filter, all,
- extent = map.extent(),
- graph = context.graph();
-
- if (!difference) {
- all = context.intersects(extent);
- filter = d3.functor(true);
- } else {
- var complete = difference.complete(extent);
- all = _.compact(_.values(complete));
- filter = function(d) {
- if (d.type === 'midpoint') {
-
- var a = d.edge[0],
- b = d.edge[1];
-
- // redraw a midpoint if it needs to be
- // - moved (either edge node moved)
- // - deleted (edge nodes not consecutive in any parent way)
- if (a in complete || b in complete) return true;
-
- var parentsWays = graph.parentWays({ id: a });
- for (var i = 0; i < parentsWays.length; i++) {
- var nodes = parentsWays[i].nodes;
- for (var n = 0; n < nodes.length; n++) {
- if (nodes[n] === a && (nodes[n - 1] === b || nodes[n + 1] === b)) return false;
- }
- }
- return true;
-
- } else {
- return d.id in complete;
- }
- };
- }
-
- if (all.length > 100000) {
- editOff();
- } else {
- surface
- .call(points, graph, all, filter)
- .call(vertices, graph, all, filter, map.zoom())
- .call(lines, graph, all, filter)
- .call(areas, graph, all, filter)
- .call(midpoints, graph, all, filter, extent)
- .call(labels, graph, all, filter, dimensions, !difference);
- }
- dispatch.drawn(map);
- }
-
- function editOff() {
- surface.selectAll('.layer *').remove();
- }
-
- function zoomPan() {
- if (d3.event && d3.event.sourceEvent.type === 'dblclick') {
- if (!dblclickEnabled) {
- zoom.scale(projection.scale() * 2 * Math.PI)
- .translate(projection.translate());
- return d3.event.sourceEvent.preventDefault();
- }
- }
-
- if (Math.log(d3.event.scale / Math.LN2 - 8) < minzoom + 1) {
- iD.ui.flash(context.container())
- .select('.content')
- .text(t('cannot_zoom'));
- return setZoom(16, true);
- }
-
- projection
- .translate(d3.event.translate)
- .scale(d3.event.scale / (2 * Math.PI));
-
- var ascale = d3.event.scale;
- var bscale = transformStart[0];
- var scale = (ascale / bscale);
-
- var tX = Math.round((d3.event.translate[0] / scale) - (transformStart[1][0]));
- var tY = Math.round((d3.event.translate[1] / scale) - (transformStart[1][1]));
-
- var transform =
- 'scale(' + scale + ')' +
- (iD.detect().opera ?
- 'translate(' + tX + 'px,' + tY + 'px)' :
- 'translate3d(' + tX + 'px,' + tY + 'px, 0)');
-
- transformed = true;
- supersurface.style(transformProp, transform);
- queueRedraw();
-
- dispatch.move(map);
- }
-
- function resetTransform() {
- if (!transformed) return false;
- supersurface.style(transformProp, '');
- transformed = false;
- return true;
- }
-
- function redraw(difference) {
-
- if (!surface) return;
-
- clearTimeout(timeoutId);
-
- // If we are in the middle of a zoom/pan, we can't do differenced redraws.
- // It would result in artifacts where differenced entities are redrawn with
- // one transform and unchanged entities with another.
- if (resetTransform()) {
- difference = undefined;
- }
-
- var zoom = String(~~map.zoom());
- if (surface.attr('data-zoom') !== zoom) {
- surface.attr('data-zoom', zoom);
- }
-
- if (!difference) {
- var sel = layergroup
- .selectAll('.layer-layer')
- .data(layers);
-
- sel.exit().remove();
-
- sel.enter().append('div')
- .attr('class', 'layer-layer');
-
- sel.each(function(layer) {
- d3.select(this).call(layer);
- });
- }
-
- if (map.editable()) {
- context.connection().loadTiles(projection, dimensions);
- drawVector(difference);
- } else {
- editOff();
- }
-
- transformStart = [
- projection.scale() * 2 * Math.PI,
- projection.translate().slice()];
-
- return map;
- }
-
- var timeoutId;
- function queueRedraw() {
- clearTimeout(timeoutId);
- timeoutId = setTimeout(function() { redraw(); }, 300);
- }
-
- function pointLocation(p) {
- var translate = projection.translate(),
- scale = projection.scale() * 2 * Math.PI;
- return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
- }
-
- function locationPoint(l) {
- var translate = projection.translate(),
- scale = projection.scale() * 2 * Math.PI;
- return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
- }
-
- map.mouseCoordinates = function() {
- try {
- return projection.invert(d3.mouse(surface.node()));
- } catch(e) {
- // when called with hidden elements, d3.mouse() will throw
- return [NaN, NaN];
- }
- };
-
- map.dblclickEnable = function(_) {
- if (!arguments.length) return dblclickEnabled;
- dblclickEnabled = _;
- return map;
- };
-
- function setZoom(z, force) {
- if (z === map.zoom() && !force)
- return false;
- var scale = 256 * Math.pow(2, z),
- center = pxCenter(),
- l = pointLocation(center);
- scale = Math.max(1024, Math.min(256 * Math.pow(2, 24), scale));
- projection.scale(scale / (2 * Math.PI));
- zoom.scale(scale);
- var t = projection.translate();
- l = locationPoint(l);
- t[0] += center[0] - l[0];
- t[1] += center[1] - l[1];
- projection.translate(t);
- zoom.translate(projection.translate());
- return true;
- }
-
- function setCenter(loc) {
- var t = projection.translate(),
- c = pxCenter(),
- ll = projection(loc);
- if (ll[0] === c[0] && ll[1] === c[1])
- return false;
- projection.translate([
- t[0] - ll[0] + c[0],
- t[1] - ll[1] + c[1]]);
- zoom.translate(projection.translate());
- return true;
- }
-
- map.pan = function(d) {
- var t = projection.translate();
- t[0] += d[0];
- t[1] += d[1];
- projection.translate(t);
- zoom.translate(projection.translate());
- dispatch.move(map);
- return redraw();
- };
-
- map.size = function(_) {
- if (!arguments.length) return dimensions;
- var center = map.center();
- dimensions = _;
- surface.size(dimensions);
- layers.map(function(l) {
- l.size(dimensions);
- });
- projection.clipExtent([[0, 0], dimensions]);
- setCenter(center);
- return redraw();
- };
-
- map.zoomIn = function() { return map.zoom(Math.ceil(map.zoom() + 1)); };
- map.zoomOut = function() { return map.zoom(Math.floor(map.zoom() - 1)); };
-
- map.center = function(loc) {
- if (!arguments.length) {
- return projection.invert(pxCenter());
- }
-
- if (setCenter(loc)) {
- dispatch.move(map);
- }
-
- return redraw();
- };
-
- map.zoom = function(z) {
- if (!arguments.length) {
- return Math.max(Math.log(projection.scale() * 2 * Math.PI) / Math.LN2 - 8, 0);
- }
-
- if (setZoom(z)) {
- dispatch.move(map);
- }
-
- return redraw();
- };
-
- map.zoomTo = function(entity) {
- var extent = entity.extent(context.graph()),
- zoom = map.extentZoom(extent);
- map.centerZoom(extent.center(), zoom);
- };
-
- map.centerZoom = function(loc, z) {
- var centered = setCenter(loc),
- zoomed = setZoom(z);
-
- if (centered || zoomed) {
- dispatch.move(map);
- }
-
- return redraw();
- };
-
- map.centerEase = function(loc) {
- var from = map.center().slice(),
- t = 0,
- stop;
-
- surface.one('mousedown.ease', function() {
- stop = true;
- });
-
- d3.timer(function() {
- if (stop) return true;
- map.center(iD.geo.interp(from, loc, (t += 1) / 10));
- return t == 10;
- }, 20);
- return map;
- };
-
- map.extent = function(_) {
- if (!arguments.length) {
- return new iD.geo.Extent(projection.invert([0, dimensions[1]]),
- projection.invert([dimensions[0], 0]));
- } else {
- var extent = iD.geo.Extent(_);
- map.centerZoom(extent.center(), map.extentZoom(extent));
- }
- };
-
- map.extentZoom = function(_) {
- var extent = iD.geo.Extent(_),
- tl = projection([extent[0][0], extent[1][1]]),
- br = projection([extent[1][0], extent[0][1]]);
-
- // Calculate maximum zoom that fits extent
- var hFactor = (br[0] - tl[0]) / dimensions[0],
- vFactor = (br[1] - tl[1]) / dimensions[1],
- hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2,
- vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2,
- newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
-
- return newZoom;
- };
-
- map.flush = function() {
- context.connection().flush();
- context.history().reset();
- return map;
- };
-
- var usedTails = {};
- map.tail = function(_) {
- if (!_ || usedTails[_] === undefined) {
- tail.text(_);
- usedTails[_] = true;
- }
- return map;
- };
-
- map.editable = function() {
- return map.zoom() >= 16;
- };
-
- map.minzoom = function(_) {
- if (!arguments.length) return minzoom;
- minzoom = _;
- return map;
- };
-
- map.layers = layers;
- map.projection = projection;
- map.redraw = redraw;
-
- return d3.rebind(map, dispatch, 'on');
-};
-iD.svg = {
- RoundProjection: function(projection) {
- return function(d) {
- return iD.geo.roundCoords(projection(d));
- };
- },
-
- PointTransform: function(projection) {
- return function(entity) {
- // http://jsperf.com/short-array-join
- var pt = projection(entity.loc);
- return 'translate(' + pt[0] + ',' + pt[1] + ')';
- };
- },
-
- LineString: function(projection, graph) {
- var cache = {},
- path = d3.geo.path().projection(projection);
-
- return function(entity) {
- if (entity.id in cache) return cache[entity.id];
- return cache[entity.id] = path(entity.asGeoJSON(graph));
- };
- },
-
- OneWaySegments: function(projection, graph, dt) {
- return function(entity) {
- var a,
- b,
- i = 0,
- offset = dt,
- segments = [],
- coordinates = graph.childNodes(entity).map(function(n) {
- return n.loc;
- });
-
- if (entity.tags.oneway === '-1') coordinates.reverse();
-
- d3.geo.stream({
- type: 'LineString',
- coordinates: coordinates
- }, projection.stream({
- lineStart: function() {},
- lineEnd: function() {},
- point: function(x, y) {
- b = [x, y];
-
- if (a) {
- var segment = 'M' + a[0] + ',' + a[1];
-
- var span = iD.geo.dist(a, b),
- angle = Math.atan2(b[1] - a[1], b[0] - a[0]),
- dx = dt * Math.cos(angle),
- dy = dt * Math.sin(angle),
- p;
-
- if (offset < span) {
- p = [a[0] + offset * Math.cos(angle),
- a[1] + offset * Math.sin(angle)];
-
- segment += 'L' + p[0] + ',' + p[1];
- }
-
- while ((offset + dt) < span) {
- offset += dt;
- p[0] += dx;
- p[1] += dy;
- segment += 'L' + p[0] + ',' + p[1];
- }
-
- offset = dt - (span - offset);
-
- segment += 'L' + b[0] + ',' + b[1];
- segments.push({id: entity.id, index: i, d: segment});
- i++;
- }
-
- a = b;
- }
- }));
-
- return segments;
- };
- },
-
- MultipolygonMemberTags: function(graph) {
- return function(entity) {
- var tags = entity.tags;
- graph.parentRelations(entity).forEach(function(relation) {
- if (relation.isMultipolygon()) {
- tags = _.extend({}, relation.tags, tags);
- }
- });
- return tags;
- };
- }
-};
-iD.svg.Areas = function(projection) {
- // Patterns only work in Firefox when set directly on element
- var patterns = {
- wetland: 'wetland',
- beach: 'beach',
- scrub: 'scrub',
- construction: 'construction',
- cemetery: 'cemetery',
- grave_yard: 'cemetery',
- meadow: 'meadow',
- farm: 'farmland',
- farmland: 'farmland',
- orchard: 'orchard'
- };
-
- var patternKeys = ['landuse', 'natural', 'amenity'];
-
- function setPattern(selection) {
- selection.each(function(d) {
- for (var i = 0; i < patternKeys.length; i++) {
- if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
- this.style.fill = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
- return;
- }
- }
- this.style.fill = '';
- });
- }
-
- return function drawAreas(surface, graph, entities, filter) {
- var path = d3.geo.path().projection(projection),
- areas = {},
- multipolygon;
-
- for (var i = 0; i < entities.length; i++) {
- var entity = entities[i];
- if (entity.geometry(graph) !== 'area') continue;
-
- if (multipolygon = iD.geo.isSimpleMultipolygonOuterMember(entity, graph)) {
- areas[multipolygon.id] = {
- entity: multipolygon.mergeTags(entity.tags),
- area: Math.abs(path.area(entity.asGeoJSON(graph, true)))
- };
- } else if (!areas[entity.id]) {
- areas[entity.id] = {
- entity: entity,
- area: Math.abs(path.area(entity.asGeoJSON(graph, true)))
- };
- }
- }
-
- areas = d3.values(areas);
- areas.sort(function(a, b) { return b.area - a.area; });
-
- function drawPaths(group, areas, filter, klass, closeWay) {
- var tagClasses = iD.svg.TagClasses();
-
- if (klass === 'stroke') {
- tagClasses.tags(iD.svg.MultipolygonMemberTags(graph));
- }
-
- var paths = group.selectAll('path.area')
- .filter(filter)
- .data(areas, iD.Entity.key);
-
- paths.enter()
- .append('path')
- .attr('class', function(d) { return d.type + ' area ' + klass; });
-
- paths
- .order()
- .attr('d', function(entity) { return path(entity.asGeoJSON(graph, closeWay)); })
- .call(tagClasses)
- .call(iD.svg.MemberClasses(graph));
-
- if (klass === 'fill') paths.call(setPattern);
-
- paths.exit()
- .remove();
-
- return paths;
- }
-
- areas = _.pluck(areas, 'entity');
-
- var strokes = areas.filter(function(area) {
- return area.type === 'way';
- });
-
- var shadow = surface.select('.layer-shadow'),
- fill = surface.select('.layer-fill'),
- stroke = surface.select('.layer-stroke');
-
- drawPaths(shadow, strokes, filter, 'shadow');
- drawPaths(fill, areas, filter, 'fill', true);
- drawPaths(stroke, strokes, filter, 'stroke');
- };
-};
-iD.svg.Labels = function(projection, context) {
-
- // Replace with dict and iterate over entities tags instead?
- var label_stack = [
- ['line', 'aeroway'],
- ['line', 'highway'],
- ['line', 'railway'],
- ['line', 'waterway'],
- ['area', 'aeroway'],
- ['area', 'amenity'],
- ['area', 'building'],
- ['area', 'historic'],
- ['area', 'leisure'],
- ['area', 'man_made'],
- ['area', 'natural'],
- ['area', 'shop'],
- ['area', 'tourism'],
- ['point', 'aeroway'],
- ['point', 'amenity'],
- ['point', 'building'],
- ['point', 'historic'],
- ['point', 'leisure'],
- ['point', 'man_made'],
- ['point', 'natural'],
- ['point', 'shop'],
- ['point', 'tourism'],
- ['line', 'name'],
- ['area', 'name'],
- ['point', 'name']
- ];
-
- var default_size = 12;
-
- var font_sizes = label_stack.map(function(d) {
- var style = iD.util.getStyle('text.' + d[0] + '.tag-' + d[1]),
- m = style && style.cssText.match("font-size: ([0-9]{1,2})px;");
- if (m) return parseInt(m[1], 10);
-
- style = iD.util.getStyle('text.' + d[0]);
- m = style && style.cssText.match("font-size: ([0-9]{1,2})px;");
- if (m) return parseInt(m[1], 10);
-
- return default_size;
- });
-
- var iconSize = 18;
-
- var pointOffsets = [
- [15, -11, 'start'], // right
- [10, -11, 'start'], // unused right now
- [-15, -11, 'end']
- ];
-
- var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70, 25,
- 75, 20, 80, 15, 95, 10, 90, 5, 95];
-
-
- var noIcons = ['building', 'landuse', 'natural'];
- function blacklisted(preset) {
- return _.any(noIcons, function(s) {
- return preset.id.indexOf(s) >= 0;
- });
- }
-
- function get(array, prop) {
- return function(d, i) { return array[i][prop]; };
- }
-
- var textWidthCache = {};
-
- function textWidth(text, size, elem) {
- var c = textWidthCache[size];
- if (!c) c = textWidthCache[size] = {};
-
- if (c[text]) {
- return c[text];
-
- } else if (elem) {
- c[text] = elem.getComputedTextLength();
- return c[text];
-
- } else {
- return size / 3 * 2 * text.length;
- }
- }
-
- function drawLineLabels(group, entities, filter, classes, labels) {
-
- var texts = group.selectAll('text.' + classes)
- .filter(filter)
- .data(entities, iD.Entity.key);
-
- var tp = texts.enter()
- .append('text')
- .attr('class', function(d, i) { return classes + ' ' + labels[i].classes;})
- .append('textPath')
- .attr('class', 'textpath');
-
-
- var tps = texts.selectAll('.textpath')
- .filter(filter)
- .data(entities, iD.Entity.key)
- .attr({
- 'startOffset': '50%',
- 'xlink:href': function(d) { return '#labelpath-' + d.id; }
- })
- .text(function(d) { return name(d); });
-
- texts.exit().remove();
-
- }
-
- function drawLinePaths(group, entities, filter, classes, labels) {
-
- var halos = group.selectAll('path')
- .filter(filter)
- .data(entities, iD.Entity.key);
-
- halos.enter()
- .append('path')
- .style('stroke-width', get(labels, 'font-size'))
- .attr('id', function(d) { return 'labelpath-' + d.id; })
- .attr('class', classes);
-
- halos.attr('d', get(labels, 'lineString'));
-
- halos.exit().remove();
- }
-
- function drawPointLabels(group, entities, filter, classes, labels) {
-
- var texts = group.selectAll('text.' + classes)
- .filter(filter)
- .data(entities, iD.Entity.key);
-
- texts.enter()
- .append('text')
- .attr('class', function(d, i) { return classes + ' ' + labels[i].classes; });
-
- texts.attr('x', get(labels, 'x'))
- .attr('y', get(labels, 'y'))
- .style('text-anchor', get(labels, 'textAnchor'))
- .text(function(d) { return name(d); })
- .each(function(d, i) { textWidth(name(d), labels[i].height, this); });
-
- texts.exit().remove();
- return texts;
- }
-
- function drawAreaHalos(group, entities, filter, classes, labels) {
- entities = entities.filter(hasText);
- labels = labels.filter(hasText);
- return drawPointHalos(group, entities, filter, classes, labels);
-
- function hasText(d, i) {
- return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
- }
- }
-
- function drawAreaLabels(group, entities, filter, classes, labels) {
- entities = entities.filter(hasText);
- labels = labels.filter(hasText);
- return drawPointLabels(group, entities, filter, classes, labels);
-
- function hasText(d, i) {
- return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
- }
- }
-
- function drawAreaIcons(group, entities, filter, classes, labels) {
-
- var icons = group.selectAll('use')
- .filter(filter)
- .data(entities, iD.Entity.key);
-
- icons.enter()
- .append('use')
- .attr('clip-path', 'url(#clip-square-18)')
- .attr('class', 'icon');
-
- icons.attr('transform', get(labels, 'transform'))
- .attr('xlink:href', function(d) {
- return '#maki-' + context.presets().match(d, context.graph()).icon + '-18';
- });
-
-
- icons.exit().remove();
- }
-
- function reverse(p) {
- var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
- return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > - Math.PI/2);
- }
-
- function lineString(nodes) {
- return 'M' + nodes.join('L');
- }
-
- function subpath(nodes, from, to) {
- function segmentLength(i) {
- var dx = nodes[i][0] - nodes[i + 1][0];
- var dy = nodes[i][1] - nodes[i + 1][1];
- return Math.sqrt(dx * dx + dy * dy);
- }
-
- var sofar = 0,
- start, end, i0, i1;
- for (var i = 0; i < nodes.length - 1; i++) {
- var current = segmentLength(i);
- var portion;
- if (!start && sofar + current >= from) {
- portion = (from - sofar) / current;
- start = [
- nodes[i][0] + portion * (nodes[i + 1][0] - nodes[i][0]),
- nodes[i][1] + portion * (nodes[i + 1][1] - nodes[i][1])
- ];
- i0 = i + 1;
- }
- if (!end && sofar + current >= to) {
- portion = (to - sofar) / current;
- end = [
- nodes[i][0] + portion * (nodes[i + 1][0] - nodes[i][0]),
- nodes[i][1] + portion * (nodes[i + 1][1] - nodes[i][1])
- ];
- i1 = i + 1;
- }
- sofar += current;
-
- }
- var ret = nodes.slice(i0, i1);
- ret.unshift(start);
- ret.push(end);
- return ret;
-
- }
-
-
- function hideOnMouseover() {
-
- if (!mousePosition) return;
-
- var mouse = mousePosition(d3.event),
- pad = 50,
- rect = new RTree.Rectangle(mouse[0] - pad, mouse[1] - pad, 2*pad, 2*pad),
- labels = _.pluck(rtree.search(rect, this), 'leaf'),
- containsLabel = d3.set(labels),
- selection = d3.select(this);
-
- // ensures that simply resetting opacity
- // does not force style recalculation
- function resetOpacity() {
- if (this._opacity !== '') {
- this.style.opacity = '';
- this._opacity = '';
- }
- }
-
- selection.selectAll('.layer-label text, .layer-halo path, .layer-halo text')
- .each(resetOpacity);
-
- if (!labels.length) return;
- selection.selectAll('.layer-label text, .layer-halo path, .layer-halo text')
- .filter(function(d) {
- return containsLabel.has(d.id);
- })
- .style('opacity', 0)
- .property('_opacity', 0);
- }
-
- function name(d) {
- return d.tags[lang] || d.tags.name;
- }
-
- var rtree = new RTree(),
- rectangles = {},
- lang = 'name:' + iD.detect().locale.toLowerCase().split('-')[0],
- mousePosition, cacheDimensions;
-
- function labels(surface, graph, entities, filter, dimensions, fullRedraw) {
-
- if (!mousePosition || dimensions.join(',') !== cacheDimensions) {
- mousePosition = iD.util.fastMouse(surface.node().parentNode);
- cacheDimensions = dimensions.join(',');
- }
-
- var hidePoints = !surface.select('.node.point').node();
-
- var labelable = [], i, k, entity;
- for (i = 0; i < label_stack.length; i++) labelable.push([]);
-
- if (fullRedraw) {
- rtree = new RTree();
- rectangles = {};
- } else {
- for (i = 0; i < entities.length; i++) {
- rtree.remove(rectangles[entities[i].id], entities[i].id);
- }
- }
-
- // Split entities into groups specified by label_stack
- for (i = 0; i < entities.length; i++) {
- entity = entities[i];
- var geometry = entity.geometry(graph),
- preset = geometry === 'area' && context.presets().match(entity, graph),
- icon = preset && !blacklisted(preset) && preset.icon;
-
- if ((name(entity) || icon) && !(hidePoints && geometry === 'point')) {
-
- for (k = 0; k < label_stack.length; k ++) {
- if (entity.geometry(graph) === label_stack[k][0] &&
- entity.tags[label_stack[k][1]]) {
- labelable[k].push(entity);
- break;
- }
- }
- }
- }
-
- var positions = {
- point: [],
- line: [],
- area: []
- };
-
- var labelled = {
- point: [],
- line: [],
- area: []
- };
-
- // Try and find a valid label for labellable entities
- for (k = 0; k < labelable.length; k++) {
- var font_size = font_sizes[k];
- for (i = 0; i < labelable[k].length; i ++) {
- entity = labelable[k][i];
- var width = name(entity) && textWidth(name(entity), font_size),
- p;
- if (entity.geometry(graph) === 'point') {
- p = getPointLabel(entity, width, font_size);
- } else if (entity.geometry(graph) === 'line') {
- p = getLineLabel(entity, width, font_size);
- } else if (entity.geometry(graph) === 'area') {
- p = getAreaLabel(entity, width, font_size);
- }
- if (p) {
- p.classes = entity.geometry(graph) + ' tag-' + label_stack[k][1];
- positions[entity.geometry(graph)].push(p);
- labelled[entity.geometry(graph)].push(entity);
- }
- }
- }
-
- function getPointLabel(entity, width, height) {
- var coord = projection(entity.loc),
- m = 5, // margin
- offset = pointOffsets[0],
- p = {
- height: height,
- width: width,
- x: coord[0] + offset[0],
- y: coord[1] + offset[1],
- textAnchor: offset[2]
- };
- var rect = new RTree.Rectangle(p.x - m, p.y - m, width + 2*m, height + 2*m);
- if (tryInsert(rect, entity.id)) return p;
- }
-
-
- function getLineLabel(entity, width, height) {
- var nodes = _.pluck(graph.childNodes(entity), 'loc').map(projection),
- length = iD.geo.pathLength(nodes);
- if (length < width + 20) return;
-
- for (var i = 0; i < lineOffsets.length; i ++) {
- var offset = lineOffsets[i],
- middle = offset / 100 * length,
- start = middle - width/2;
- if (start < 0 || start + width > length) continue;
- var sub = subpath(nodes, start, start + width),
- rev = reverse(sub),
- rect = new RTree.Rectangle(
- Math.min(sub[0][0], sub[sub.length - 1][0]) - 10,
- Math.min(sub[0][1], sub[sub.length - 1][1]) - 10,
- Math.abs(sub[0][0] - sub[sub.length - 1][0]) + 20,
- Math.abs(sub[0][1] - sub[sub.length - 1][1]) + 30
- );
- if (rev) sub = sub.reverse();
- if (tryInsert(rect, entity.id)) return {
- 'font-size': height + 2,
- lineString: lineString(sub),
- startOffset: offset + '%'
- };
- }
- }
-
- function getAreaLabel(entity, width, height) {
- var path = d3.geo.path().projection(projection),
- centroid = path.centroid(entity.asGeoJSON(graph, true)),
- extent = entity.extent(graph),
- entitywidth = projection(extent[1])[0] - projection(extent[0])[0],
- rect;
-
- if (!centroid || entitywidth < 20) return;
-
- var iconX = centroid[0] - (iconSize/2),
- iconY = centroid[1] - (iconSize/2),
- textOffset = iconSize + 5;
-
- var p = {
- transform: 'translate(' + iconX + ',' + iconY + ')'
- };
-
- if (width && entitywidth >= width + 20) {
- p.x = centroid[0];
- p.y = centroid[1] + textOffset;
- p.textAnchor = 'middle';
- p.height = height;
- rect = new RTree.Rectangle(p.x - width/2, p.y, width, height + textOffset);
- } else {
- rect = new RTree.Rectangle(iconX, iconY, iconSize, iconSize);
- }
-
- if (tryInsert(rect, entity.id)) return p;
-
- }
-
- function tryInsert(rect, id) {
- // Check that label is visible
- if (rect.x1 < 0 || rect.y1 < 0 || rect.x2 > dimensions[0] ||
- rect.y2 > dimensions[1]) return false;
- var v = rtree.search(rect, true).length === 0;
- if (v) {
- rtree.insert(rect, id);
- rectangles[id] = rect;
- }
- return v;
- }
-
- var label = surface.select('.layer-label'),
- halo = surface.select('.layer-halo'),
- // points
- points = drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point),
- pointHalos = drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point),
- // lines
- linesPaths = drawLinePaths(halo, labelled.line, filter, '', positions.line),
- lines = drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line),
- linesHalos = drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line),
- // areas
- areas = drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area),
- areaHalos = drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area),
- areaIcons = drawAreaIcons(label, labelled.area, filter, 'arealabel-icon', positions.area);
- }
-
- labels.supersurface = function(supersurface) {
- supersurface
- .on('mousemove.hidelabels', hideOnMouseover)
- .on('mousedown.hidelabels', function () {
- supersurface.on('mousemove.hidelabels', null);
- })
- .on('mouseup.hidelabels', function () {
- supersurface.on('mousemove.hidelabels', hideOnMouseover);
- });
- };
-
- return labels;
-};
-iD.svg.Lines = function(projection) {
-
- var highway_stack = {
- motorway: 0,
- motorway_link: 1,
- trunk: 2,
- trunk_link: 3,
- primary: 4,
- primary_link: 5,
- secondary: 6,
- tertiary: 7,
- unclassified: 8,
- residential: 9,
- service: 10,
- footway: 11
- };
-
- function waystack(a, b) {
- if (!a || !b || !a.tags || !b.tags) return 0;
- if (a.tags.layer !== undefined && b.tags.layer !== undefined) {
- return a.tags.layer - b.tags.layer;
- }
- if (a.tags.bridge) return 1;
- if (b.tags.bridge) return -1;
- if (a.tags.tunnel) return -1;
- if (b.tags.tunnel) return 1;
- var as = 0, bs = 0;
- if (a.tags.highway && b.tags.highway) {
- as -= highway_stack[a.tags.highway];
- bs -= highway_stack[b.tags.highway];
- }
- return as - bs;
- }
-
- return function drawLines(surface, graph, entities, filter) {
- function drawPaths(group, lines, filter, klass, lineString) {
- lines = lines.filter(function(line) {
- return lineString(line);
- });
-
- var tagClasses = iD.svg.TagClasses();
-
- if (klass === 'stroke') {
- tagClasses.tags(iD.svg.MultipolygonMemberTags(graph));
- }
-
- var paths = group.selectAll('path.line')
- .filter(filter)
- .data(lines, iD.Entity.key);
-
- paths.enter()
- .append('path')
- .attr('class', 'way line ' + klass);
-
- paths
- .order()
- .attr('d', lineString)
- .call(tagClasses)
- .call(iD.svg.MemberClasses(graph));
-
- paths.exit()
- .remove();
-
- return paths;
- }
-
- var lines = [];
-
- for (var i = 0; i < entities.length; i++) {
- var entity = entities[i],
- outer = iD.geo.simpleMultipolygonOuterMember(entity, graph);
- if (outer) {
- lines.push(entity.mergeTags(outer.tags));
- } else if (entity.geometry(graph) === 'line') {
- lines.push(entity);
- }
- }
-
- lines.sort(waystack);
-
- var lineString = iD.svg.LineString(projection, graph);
-
- var shadow = surface.select('.layer-shadow'),
- casing = surface.select('.layer-casing'),
- stroke = surface.select('.layer-stroke'),
- defs = surface.select('defs'),
- oneway = surface.select('.layer-oneway');
-
- drawPaths(shadow, lines, filter, 'shadow', lineString);
- drawPaths(casing, lines, filter, 'casing', lineString);
- drawPaths(stroke, lines, filter, 'stroke', lineString);
-
- var segments = _.flatten(lines
- .filter(function(d) { return d.isOneWay(); })
- .map(iD.svg.OneWaySegments(projection, graph, 35)));
-
- var oneways = oneway.selectAll('path.oneway')
- .filter(filter)
- .data(segments, function(d) { return [d.id, d.index]; });
-
- oneways.enter()
- .append('path')
- .attr('class', 'oneway')
- .attr('marker-mid', 'url(#oneway-marker)');
-
- oneways
- .order()
- .attr('d', function(d) { return d.d; });
-
- oneways.exit()
- .remove();
- };
-};
-iD.svg.MemberClasses = function(graph) {
- var tagClassRe = /^member-?/;
-
- return function memberClassesSelection(selection) {
- selection.each(function memberClassesEach(d) {
- var classes, value = this.className;
-
- if (value.baseVal !== undefined) value = value.baseVal;
-
- classes = value.trim().split(/\s+/).filter(function(name) {
- return name.length && !tagClassRe.test(name);
- }).join(' ');
-
- var relations = graph.parentRelations(d);
-
- if (relations.length) {
- classes += ' member';
- }
-
- relations.forEach(function(relation) {
- classes += ' member-type-' + relation.tags.type;
- classes += ' member-role-' + relation.memberById(d.id).role;
- });
-
- classes = classes.trim();
-
- if (classes !== value) {
- d3.select(this).attr('class', classes);
- }
- });
- };
-};
-iD.svg.Midpoints = function(projection, context) {
- return function drawMidpoints(surface, graph, entities, filter, extent) {
- var midpoints = {};
-
- for (var i = 0; i < entities.length; i++) {
- var entity = entities[i];
-
- if (entity.type !== 'way') continue;
- if (context.selection().indexOf(entity.id) < 0) continue;
-
- var nodes = graph.childNodes(entity);
-
- // skip the last node because it is always repeated
- for (var j = 0; j < nodes.length - 1; j++) {
-
- var a = nodes[j],
- b = nodes[j + 1],
- id = [a.id, b.id].sort().join('-');
-
- // If neither of the nodes changed, no need to redraw midpoint
- if (!midpoints[id] && (filter(a) || filter(b))) {
- var loc = iD.geo.interp(a.loc, b.loc, 0.5);
- if (extent.intersects(loc) && iD.geo.dist(projection(a.loc), projection(b.loc)) > 40) {
- midpoints[id] = {
- type: 'midpoint',
- id: id,
- loc: loc,
- edge: [a.id, b.id]
- };
- }
- }
- }
- }
-
- var groups = surface.select('.layer-hit').selectAll('g.midpoint')
- .filter(filter)
- .data(_.values(midpoints), function(d) { return d.id; });
-
- var group = groups.enter()
- .insert('g', ':first-child')
- .attr('class', 'midpoint');
-
- group.append('circle')
- .attr('r', 7)
- .attr('class', 'shadow');
-
- group.append('circle')
- .attr('r', 3)
- .attr('class', 'fill');
-
- groups.attr('transform', iD.svg.PointTransform(projection));
-
- // Propagate data bindings.
- groups.select('circle.shadow');
- groups.select('circle.fill');
-
- groups.exit()
- .remove();
- };
-};
-iD.svg.Points = function(projection, context) {
- function markerPath(selection, klass) {
- selection
- .attr('class', klass)
- .attr('transform', 'translate(-8, -23)')
- .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');
- }
-
- function sortY(a, b) {
- return b.loc[1] - a.loc[1];
- }
-
- return function drawPoints(surface, graph, entities, filter) {
- var points = [];
-
- for (var i = 0; i < entities.length; i++) {
- var entity = entities[i];
- if (entity.geometry(graph) === 'point') {
- points.push(entity);
- }
- }
-
- if (points.length > 100) {
- return surface.select('.layer-hit').selectAll('g.point').remove();
- }
-
- points.sort(sortY);
-
- var groups = surface.select('.layer-hit').selectAll('g.point')
- .filter(filter)
- .data(points, iD.Entity.key);
-
- var group = groups.enter()
- .append('g')
- .attr('class', 'node point')
- .order();
-
- group.append('path')
- .call(markerPath, 'shadow');
-
- group.append('path')
- .call(markerPath, 'stroke');
-
- group.append('use')
- .attr('class', 'icon')
- .attr('transform', 'translate(-6, -20)')
- .attr('clip-path', 'url(#clip-square-12)');
-
- groups.attr('transform', iD.svg.PointTransform(projection))
- .call(iD.svg.TagClasses())
- .call(iD.svg.MemberClasses(graph));
-
- // Selecting the following implicitly
- // sets the data (point entity) on the element
- groups.select('.shadow');
- groups.select('.stroke');
- groups.select('.icon')
- .attr('xlink:href', function(entity) {
- var preset = context.presets().match(entity, graph);
- return preset.icon ? '#maki-' + preset.icon + '-12' : '';
- });
-
- groups.exit()
- .remove();
- };
-};
-iD.svg.Surface = function(context) {
- function autosize(image) {
- var img = document.createElement('img');
- img.src = image.attr('xlink:href');
- img.onload = function() {
- image.attr({
- width: img.width,
- height: img.height
- });
- };
- }
-
- function SpriteDefinition(id, href, data) {
- return function(defs) {
- defs.append('image')
- .attr('id', id)
- .attr('xlink:href', href)
- .call(autosize);
-
- defs.selectAll()
- .data(data)
- .enter().append('use')
- .attr('id', function(d) { return d.key; })
- .attr('transform', function(d) { return "translate(-" + d.value[0] + ",-" + d.value[1] + ")"; })
- .attr('xlink:href', '#' + id);
- };
- }
-
- return function drawSurface(selection) {
- var defs = selection.append('defs');
-
- defs.append('marker')
- .attr({
- id: 'oneway-marker',
- viewBox: '0 0 10 10',
- refY: 2.5,
- refX: 5,
- markerWidth: 2,
- markerHeight: 2,
- orient: 'auto'
- })
- .append('path')
- .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');
-
- var patterns = defs.selectAll('pattern')
- .data([
- // pattern name, pattern image name
- ['wetland', 'wetland'],
- ['construction', 'construction'],
- ['cemetery', 'cemetery'],
- ['orchard', 'orchard'],
- ['farmland', 'farmland'],
- ['beach', 'dots'],
- ['scrub', 'dots'],
- ['meadow', 'dots']])
- .enter()
- .append('pattern')
- .attr({
- id: function(d) { return 'pattern-' + d[0]; },
- width: 32,
- height: 32,
- patternUnits: 'userSpaceOnUse'
- });
-
- patterns.append('rect')
- .attr({
- x: 0,
- y: 0,
- width: 32,
- height: 32,
- 'class': function(d) { return 'pattern-color-' + d[0]; }
- });
-
- patterns.append('image')
- .attr({
- x: 0,
- y: 0,
- width: 32,
- height: 32
- })
- .attr('xlink:href', function(d) { return context.imagePath('pattern/' + d[1] + '.png'); });
-
- defs.selectAll()
- .data([12, 18, 20])
- .enter().append('clipPath')
- .attr('id', function(d) { return 'clip-square-' + d; })
- .append('rect')
- .attr('x', 0)
- .attr('y', 0)
- .attr('width', function(d) { return d; })
- .attr('height', function(d) { return d; });
-
- var maki = [];
- _.forEach(iD.data.featureIcons, function(dimensions, name) {
- if (dimensions['12'] && dimensions['18'] && dimensions['24']) {
- maki.push({key: 'maki-' + name + '-12', value: dimensions['12']});
- maki.push({key: 'maki-' + name + '-18', value: dimensions['18']});
- maki.push({key: 'maki-' + name + '-24', value: dimensions['24']});
- }
- });
-
- defs.call(SpriteDefinition(
- 'sprite',
- context.imagePath('sprite.svg'),
- d3.entries(iD.data.operations)));
-
- defs.call(SpriteDefinition(
- 'maki-sprite',
- context.imagePath('maki-sprite.png'),
- maki));
-
- var layers = selection.selectAll('.layer')
- .data(['fill', 'shadow', 'casing', 'stroke', 'oneway', 'hit', 'halo', 'label']);
-
- layers.enter().append('g')
- .attr('class', function(d) { return 'layer layer-' + d; });
- };
-};
-iD.svg.TagClasses = function() {
- var keys = d3.set([
- 'highway', 'railway', 'waterway', 'power', 'motorway', 'amenity',
- 'natural', 'landuse', 'building', 'oneway', 'bridge', 'boundary',
- 'tunnel', 'leisure', 'construction', 'place', 'aeroway'
- ]), tagClassRe = /^tag-/,
- tags = function(entity) { return entity.tags; };
-
- var tagClasses = function(selection) {
- selection.each(function tagClassesEach(entity) {
- var classes, value = this.className;
-
- if (value.baseVal !== undefined) value = value.baseVal;
-
- classes = value.trim().split(/\s+/).filter(function(name) {
- return name.length && !tagClassRe.test(name);
- }).join(' ');
-
- var t = tags(entity);
- for (var k in t) {
- if (!keys.has(k)) continue;
- classes += ' tag-' + k + ' ' + 'tag-' + k + '-' + t[k];
- }
-
- classes = classes.trim();
-
- if (classes !== value) {
- d3.select(this).attr('class', classes);
- }
- });
- };
-
- tagClasses.tags = function(_) {
- if (!arguments.length) return tags;
- tags = _;
- return tagClasses;
- };
-
- return tagClasses;
-};
-iD.svg.Vertices = function(projection, context) {
- var radiuses = {
- // z16-, z17, z18+, tagged
- shadow: [6, 7.5, 7.5, 11.5],
- stroke: [2.5, 3.5, 3.5, 7],
- fill: [1, 1.5, 1.5, 1.5]
- };
-
- var hover;
-
- function siblingAndChildVertices(ids, graph) {
- var vertices = {};
-
- function addChildVertices(entity) {
- var i;
- if (entity.type === 'way') {
- for (i = 0; i < entity.nodes.length; i++) {
- vertices[entity.nodes[i]] = graph.entity(entity.nodes[i]);
- }
- } else if (entity.type === 'relation') {
- for (i = 0; i < entity.members.length; i++) {
- var member = context.hasEntity(entity.members[i].id);
- if (member) {
- addChildVertices(member);
- }
- }
- } else {
- vertices[entity.id] = entity;
- }
- }
-
- function addSiblingAndChildVertices(id) {
- var entity = context.hasEntity(id);
- if (entity && entity.type === 'node') {
- vertices[entity.id] = entity;
- context.graph().parentWays(entity).forEach(function(entity) {
- addChildVertices(entity);
- });
- } else if (entity) {
- addChildVertices(entity);
- }
- }
-
- ids.forEach(function(id) {
- addSiblingAndChildVertices(id, 'vertex-selected');
- });
-
- return vertices;
- }
-
- function isIntersection(entity, graph) {
- return graph.parentWays(entity).filter(function (parent) {
- return parent.geometry(graph) === 'line';
- }).length > 1;
- }
-
- function draw(groups, graph, zoom) {
- var group = groups.enter()
- .insert('g', ':first-child')
- .attr('class', 'node vertex');
-
- if (zoom < 17) {
- zoom = 0;
- } else if (zoom < 18) {
- zoom = 1;
- } else {
- zoom = 2;
- }
-
- group.append('circle')
- .attr('class', 'node vertex shadow');
-
- group.append('circle')
- .attr('class', 'node vertex stroke');
-
- groups.attr('transform', iD.svg.PointTransform(projection))
- .call(iD.svg.TagClasses())
- .call(iD.svg.MemberClasses(graph))
- .classed('tagged', function(entity) { return entity.hasInterestingTags(); })
- .classed('shared', function(entity) { return graph.isShared(entity); });
-
- function icon(entity) {
- return zoom !== 0 &&
- entity.hasInterestingTags() &&
- context.presets().match(entity, graph).icon;
- }
-
- function center(entity) {
- if (icon(entity)) {
- d3.select(this)
- .attr('cx', 0.5)
- .attr('cy', -0.5);
- } else {
- d3.select(this)
- .attr('cy', 0)
- .attr('cx', 0);
- }
- }
-
- groups.select('circle.shadow')
- .each(center)
- .attr('r', function(entity) {
- return radiuses.shadow[icon(entity) ? 3 : zoom];
- });
-
- groups.select('circle.stroke')
- .each(center)
- .attr('r', function(entity) {
- return radiuses.stroke[icon(entity) ? 3 : zoom];
- });
-
- // Each vertex gets either a circle or a use, depending
- // on if it has a icon or not.
-
- var fill = groups.selectAll('circle.fill')
- .data(function(entity) {
- return icon(entity) ? [] : [entity];
- }, iD.Entity.key);
-
- fill.enter().append('circle')
- .attr('class', 'node vertex fill')
- .each(center)
- .attr('r', radiuses.fill[zoom]);
-
- fill.exit()
- .remove();
-
- var use = groups.selectAll('use')
- .data(function(entity) {
- var i = icon(entity);
- return i ? [i] : [];
- }, function(d) {
- return d;
- });
-
- use.enter().append('use')
- .attr('transform', 'translate(-6, -6)')
- .attr('clip-path', 'url(#clip-square-12)')
- .attr('xlink:href', function(icon) { return '#maki-' + icon + '-12'; });
-
- use.exit()
- .remove();
-
- groups.exit()
- .remove();
- }
-
- function drawVertices(surface, graph, entities, filter, zoom) {
- var selected = siblingAndChildVertices(context.selection(), graph),
- vertices = [];
-
- for (var i = 0; i < entities.length; i++) {
- var entity = entities[i];
-
- if (entity.geometry(graph) !== 'vertex')
- continue;
-
- if (entity.id in selected ||
- entity.hasInterestingTags() ||
- isIntersection(entity, graph)) {
- vertices.push(entity)
- }
- }
-
- surface.select('.layer-hit').selectAll('g.vertex.vertex-persistent')
- .filter(filter)
- .data(vertices, iD.Entity.key)
- .call(draw, graph, zoom)
- .classed('vertex-persistent', true);
-
- drawHover(surface, graph, zoom);
- }
-
- function drawHover(surface, graph, zoom) {
- var hovered = hover ? siblingAndChildVertices([hover.id], graph) : {};
-
- surface.select('.layer-hit').selectAll('g.vertex.vertex-hover')
- .data(d3.values(hovered), iD.Entity.key)
- .call(draw, graph, zoom)
- .classed('vertex-hover', true);
- }
-
- drawVertices.drawHover = function(surface, graph, _, zoom) {
- if (hover !== _) {
- hover = _;
- drawHover(surface, graph, zoom);
- }
- };
-
- return drawVertices;
-};
-iD.ui = function(context) {
- return function(container) {
- var history = context.history(),
- map = context.map();
-
- if (iD.detect().opera) container.classed('opera', true);
-
- var hash = iD.behavior.Hash(context);
-
- hash();
-
- if (!hash.hadHash) {
- map.centerZoom([-77.02271, 38.90085], 20);
- }
-
- var m = container.append('div')
- .attr('id', 'map')
- .call(map);
-
- var bar = container.append('div')
- .attr('id', 'bar')
- .attr('class','fillD');
-
- var limiter = bar.append('div')
- .attr('class', 'limiter');
-
- limiter.append('div')
- .attr('class', 'button-wrap joined col3')
- .call(iD.ui.Modes(context), limiter);
-
- limiter.append('div')
- .attr('class', 'button-wrap joined col1')
- .call(iD.ui.UndoRedo(context));
-
- limiter.append('div')
- .attr('class', 'button-wrap col1')
- .call(iD.ui.Save(context));
-
- bar.append('div')
- .attr('class', 'spinner')
- .call(iD.ui.Spinner(context));
-
- container.append('idv')
- .attr('class', 'attribution')
- .attr('tabindex', -1)
- .call(iD.ui.Attribution(context));
-
- container.append('div')
- .style('display', 'none')
- .attr('class', 'help-wrap fillL col5 content');
-
- var controls = bar.append('div')
- .attr('class', 'map-controls');
-
- controls.append('div')
- .attr('class', 'map-control background-control')
- .call(iD.ui.Background(context));
-
- controls.append('div')
- .attr('class', 'map-control help-control')
- .call(iD.ui.Help(context));
-
- controls.append('div')
- .attr('class', 'map-control zoombuttons')
- .call(iD.ui.Zoom(context));
-
- if (!context.embed()) {
- controls.append('div')
- .attr('class', 'map-control geocode-control')
- .call(iD.ui.Geocoder(context));
- }
-
- controls.append('div')
- .attr('class', 'map-control geolocate-control')
- .call(iD.ui.Geolocate(map));
-
- container.append('div')
- .style('display', 'none')
- .attr('class', 'inspector-wrap fr content col4');
-
- var about = container.append('div')
- .attr('class','col12 about-block fillD');
-
- about.append('div')
- .attr('class', 'api-status')
- .call(iD.ui.Status(context));
-
- if (!context.embed()) {
- about.append('div')
- .attr('class', 'account')
- .call(iD.ui.Account(context));
- }
-
- var linkList = about.append('ul')
- .attr('id', 'about')
- .attr('class', 'link-list');
-
- linkList.append('li')
- .append('a')
- .attr('target', '_blank')
- .attr('tabindex', -1)
- .attr('href', 'http://github.com/systemed/iD')
- .text(iD.version);
-
- linkList.append('li')
- .append('a')
- .attr('target', '_blank')
- .attr('tabindex', -1)
- .attr('href', 'https://github.com/systemed/iD/issues')
- .text(t('report_a_bug'));
-
- linkList.append('li')
- .attr('class', 'user-list')
- .attr('tabindex', -1)
- .call(iD.ui.Contributors(context));
-
- window.onbeforeunload = function() {
- history.save();
- if (history.hasChanges()) return t('save.unsaved_changes');
- };
-
- d3.select(window).on('resize.editor', function() {
- map.size(m.size());
- });
-
- function pan(d) {
- return function() {
- context.pan(d);
- };
- }
-
- // pan amount
- var pa = 5;
-
- var keybinding = d3.keybinding('main')
- .on('⌫', function() { d3.event.preventDefault(); })
- .on('←', pan([pa, 0]))
- .on('↑', pan([0, pa]))
- .on('→', pan([-pa, 0]))
- .on('↓', pan([0, -pa]))
- .on('M', function() { context.toggleFullscreen(); });
-
- d3.select(document)
- .call(keybinding);
-
- context.enter(iD.modes.Browse(context));
-
- context.container()
- .call(iD.ui.Splash(context))
- .call(iD.ui.Restore(context));
-
- var authenticating = iD.ui.Loading(context)
- .message(t('loading_auth'));
-
- context.connection()
- .on('authenticating.ui', function() {
- context.container()
- .call(authenticating);
- })
- .on('authenticated.ui', function() {
- authenticating.close();
- });
- };
-};
-
-iD.ui.tooltipHtml = function(text, key) {
- return '<span>' + text + '</span>' + '<div class="keyhint-wrap"><span class="keyhint"> ' + key + '</span></div>';
-};
-iD.ui.Account = function(context) {
- var connection = context.connection();
-
- function update(selection) {
- if (!connection.authenticated()) {
- selection.html('')
- .style('display', 'none');
- return;
- }
-
- selection.style('display', 'block');
-
- connection.userDetails(function(err, details) {
- selection.html('');
-
- if (err) return;
-
- // Link
- var userLink = selection.append('a')
- .attr('href', connection.userURL(details.display_name))
- .attr('target', '_blank');
-
- // Add thumbnail or dont
- if (details.image_url) {
- userLink.append('img')
- .attr('class', 'icon icon-pre-text user-icon')
- .attr('src', details.image_url);
- } else {
- userLink.append('span')
- .attr('class', 'icon avatar light icon-pre-text');
- }
-
- // Add user name
- userLink.append('span')
- .attr('class', 'label')
- .text(details.display_name);
-
- selection.append('a')
- .attr('class', 'logout')
- .attr('href', '#')
- .text(t('logout'))
- .on('click.logout', function() {
- d3.event.preventDefault();
- connection.logout();
- });
- });
- }
-
- return function(selection) {
- connection.on('auth', function() { update(selection); });
- update(selection);
- };
-};
-iD.ui.Attribution = function(context) {
- var selection;
-
- function update() {
- if (!context.background().source()) {
- selection.html('');
- return;
- }
-
- var attribution = selection.selectAll('.provided-by')
- .data([context.background().source()], function(d) { return d.data.name; });
-
- attribution.enter()
- .append('span')
- .attr('class', 'provided-by')
- .each(function(d) {
- var source = d.data.sourcetag || d.data.name;
-
- if (d.data.logo) {
- source = '<img class="source-image" src="' + context.imagePath(d.data.logo) + '">';
- }
-
- if (d.data.terms_url) {
- d3.select(this)
- .append('a')
- .attr('href', d.data.terms_url)
- .attr('target', '_blank')
- .html(source);
- } else {
- d3.select(this)
- .text(source);
- }
- });
-
- attribution.exit()
- .remove();
-
- var copyright = attribution.selectAll('.copyright-notice')
- .data(function(d) {
- var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
- return notice ? [notice] : [];
- });
-
- copyright.enter()
- .append('span')
- .attr('class', 'copyright-notice');
-
- copyright.text(String);
-
- copyright.exit()
- .remove();
- }
-
- return function(select) {
- selection = select;
-
- context.background()
- .on('change.attribution', update);
-
- context.map()
- .on('move.attribution', _.throttle(update, 400));
-
- update();
- };
-};
-iD.ui.Background = function(context) {
- var key = 'b',
- opacities = [1, 0.5, 0],
- directions = [
- ['left', [1, 0]],
- ['top', [0, -1]],
- ['right', [-1, 0]],
- ['bottom', [0, 1]]],
- layers = context.backgroundSources();
-
- function getSources() {
- var ext = context.map().extent();
- return layers.filter(function(layer) {
- return !layer.data.extent ||
- iD.geo.Extent(layer.data.extent).intersects(ext);
- });
- }
-
- function background(selection) {
-
- function setOpacity(d) {
- context.map().layersurface.selectAll('.layer-layer')
- .filter(function(d) { return d == context.map().layers[0]; })
- .transition()
- .style('opacity', d)
- .attr('data-opacity', d);
-
- opacityList.selectAll('li')
- .classed('selected', false);
-
- if (d3.event) {
- d3.select(this)
- .classed('selected', true);
- }
- }
-
- function selectLayer() {
- content.selectAll('a.layer')
- .classed('selected', function(d) {
- var overlay = context.map().layers[2].source();
- return d.data.name === context.background().source().data.name ||
- (overlay.data && overlay.data.name === d.data.name);
- });
- }
-
- function clickSetSource(d) {
- d3.event.preventDefault();
- if (d.data.name === 'Custom') {
- var configured = d();
- if (!configured) return;
- d = configured;
- }
- context.background().source(d);
- if (d.data.name === 'Custom (customized)') {
- context.history()
- .imagery_used('Custom (' + d.data.template + ')');
- } else {
- context.history()
- .imagery_used(d.data.sourcetag || d.data.name);
- }
- context.redraw();
- selectLayer();
- }
-
- function clickSetOverlay(d) {
- d3.event.preventDefault();
- var overlay = context.map().layers[2];
- if (overlay.source() === d) {
- overlay.source(d3.functor(''));
- } else {
- overlay.source(d);
- }
- context.redraw();
- selectLayer();
- }
-
- function clickGpx(d) {
- d3.event.preventDefault();
- if (!_.isEmpty(context.map().layers[1].geojson())) {
- context.map().layers[1]
- .enable(!context.map().layers[1].enable());
- d3.select(this)
- .classed('selected', context.map().layers[1].enable());
- context.redraw();
- }
- }
-
- function drawList(layerList, click, filter) {
-
- var layerLinks = layerList.selectAll('a.layer')
- .data(getSources().filter(filter), function(d) {
- return d.data.name;
- });
-
- var layerInner = layerLinks.enter()
- .append('li')
- .append('a');
-
- layerInner
- .attr('href', '#')
- .attr('class', 'layer')
- .on('click.set-source', click);
-
- // only set tooltips for layers with tooltips
- layerInner
- .filter(function(d) { return d.data.description; })
- .call(bootstrap.tooltip()
- .title(function(d) { return d.data.description; })
- .placement('right')
- );
-
- layerInner.insert('span').text(function(d) {
- return d.data.name;
- });
-
- layerLinks.exit()
- .remove();
-
- layerList.style('display', layerList.selectAll('a.layer').data().length > 0 ? 'block' : 'none');
- }
-
- function update() {
-
- backgroundList.call(drawList, clickSetSource, function(d) {
- return !d.data.overlay;
- });
-
- overlayList.call(drawList, clickSetOverlay, function(d) {
- return d.data.overlay;
- });
-
- gpxLayerItem
- .classed('selected', function() {
- var gpxLayer = context.map().layers[1];
- return !_.isEmpty(gpxLayer.geojson()) &&
- gpxLayer.enable();
- });
-
- selectLayer();
- }
-
- function clickNudge(d) {
-
- var timeout = window.setTimeout(function() {
- interval = window.setInterval(nudge, 100);
- }, 500),
- interval;
-
- d3.select(this).on('mouseup', function() {
- window.clearInterval(interval);
- window.clearTimeout(timeout);
- nudge();
- });
-
- function nudge() {
- context.background().nudge(d[1], context.map().zoom());
- var offset = context.background().offset();
- resetButton.classed('disabled', offset[0] === 0 && offset[1] === 0);
- context.redraw();
- }
- }
-
- var content = selection.append('div')
- .attr('class', 'fillL map-overlay content hide'),
- tooltip = bootstrap.tooltip()
- .placement('right')
- .html(true)
- .title(iD.ui.tooltipHtml(t('background.description'), key));
-
- function hide() { setVisible(false); }
- function toggle() {
- if (d3.event) d3.event.preventDefault();
- tooltip.hide(button);
- setVisible(!button.classed('active'));
- content.selectAll('.toggle-list li:first-child a').node().focus();
- }
-
- function setVisible(show) {
- if (show !== shown) {
- button.classed('active', show);
- shown = show;
-
- if (show) {
- selection.on('mousedown.background-inside', function() {
- return d3.event.stopPropagation();
- });
- content.style('display', 'block')
- .style('left', '-500px')
- .transition()
- .duration(200)
- .style('left', '30px');
- } else {
- content.style('display', 'block')
- .style('left', '30px')
- .transition()
- .duration(200)
- .style('left', '-500px')
- .each('end', function() {
- d3.select(this).style('display', 'none');
- });
- selection.on('mousedown.background-inside', null);
- }
- }
- }
-
- var button = selection.append('button')
- .attr('tabindex', -1)
- .on('click', toggle)
- .call(tooltip),
- opa = content
- .append('div')
- .attr('class', 'opacity-options-wrapper'),
- shown = false;
-
- button.append('span')
- .attr('class', 'layers icon');
-
- opa.append('h4')
- .text(t('background.title'));
-
- var opacityList = opa.append('ul')
- .attr('class', 'opacity-options');
-
- opacityList.selectAll('div.opacity')
- .data(opacities)
- .enter()
- .append('li')
- .attr('data-original-title', function(d) {
- return t('background.percent_brightness', { opacity: (d * 100) });
- })
- .on('click.set-opacity', setOpacity)
- .html("<div class='select-box'></div>")
- .call(bootstrap.tooltip()
- .placement('top'))
- .append('div')
- .attr('class', 'opacity')
- .style('opacity', String);
-
- // Make sure there is an active selection by default
- opa.select('.opacity-options li:nth-child(2)')
- .classed('selected', true);
-
- var backgroundList = content
- .append('ul')
- .attr('class', 'toggle-list');
-
- var overlayList = content
- .append('ul')
- .attr('class', 'toggle-list');
-
- var gpxLayerItem = content
- .append('ul')
- .style('display', iD.detect().filedrop ? 'block' : 'none')
- .attr('class', 'toggle-list')
- .append('li')
- .append('a')
- .classed('layer-toggle-gpx', true)
- .on('click.set-gpx', clickGpx);
-
- gpxLayerItem.call(bootstrap.tooltip()
- .title(t('gpx.drag_drop'))
- .placement('right'));
-
- gpxLayerItem.append('span')
- .text(t('gpx.local_layer'));
-
- gpxLayerItem
- .append('button')
- .attr('class', 'minor layer-extent')
- .on('click', function() {
- d3.event.preventDefault();
- d3.event.stopPropagation();
- if (context.map().layers[1].geojson().type) {
- context.map()
- .extent(d3.geo.bounds(context
- .map()
- .layers[1]
- .geojson()));
- }
- })
- .append('span')
- .attr('class', 'icon geocode' );
-
- var adjustments = content
- .append('div')
- .attr('class', 'adjustments');
-
- adjustments.append('a')
- .text(t('background.fix_misalignment'))
- .attr('href', '#')
- .classed('hide-toggle', true)
- .classed('expanded', false)
- .on('click', function() {
- var exp = d3.select(this).classed('expanded');
- nudgeContainer.style('display', exp ? 'none' : 'block');
- d3.select(this).classed('expanded', !exp);
- d3.event.preventDefault();
- });
-
- var nudgeContainer = adjustments
- .append('div')
- .attr('class', 'nudge-container cf')
- .style('display', 'none');
-
- nudgeContainer.selectAll('button')
- .data(directions).enter()
- .append('button')
- .attr('class', function(d) { return d[0] + ' nudge'; })
- .on('mousedown', clickNudge);
-
- var resetButton = nudgeContainer.append('button')
- .attr('class', 'reset disabled')
- .on('click', function () {
- context.background().offset([0, 0]);
- resetButton.classed('disabled', true);
- context.redraw();
- });
-
- resetButton.append('div')
- .attr('class', 'icon undo');
-
- resetButton.call(bootstrap.tooltip()
- .title(t('background.reset'))
- .placement('right'));
-
- context.map()
- .on('move.background-update', _.debounce(update, 1000));
- update();
- setOpacity(0.5);
-
- var keybinding = d3.keybinding('background');
- keybinding.on(key, toggle);
-
- d3.select(document)
- .call(keybinding);
-
- context.surface().on('mousedown.background-outside', hide);
- context.container().on('mousedown.background-outside', hide);
-
- }
-
- return background;
-};
-// Translate a MacOS key command into the appropriate Windows/Linux equivalent.
-// For example, ⌘Z -> Ctrl+Z
-iD.ui.cmd = function(code) {
- if (iD.detect().os === 'mac')
- return code;
-
- var replacements = {
- '⌘': 'Ctrl',
- '⇧': 'Shift',
- '⌥': 'Alt',
- '⌫': 'Backspace',
- '⌦': 'Delete'
- }, keys = [];
-
- if (iD.detect().os === 'win') {
- if (code === '⌘⇧Z') return 'Ctrl+Y';
- }
-
- for (var i = 0; i < code.length; i++) {
- if (code[i] in replacements) {
- keys.push(replacements[code[i]]);
- } else {
- keys.push(code[i]);
- }
- }
-
- return keys.join('+');
-};
-iD.ui.Commit = function(context) {
- var event = d3.dispatch('cancel', 'save', 'fix'),
- presets = context.presets();
-
- function zipSame(d) {
- var c = [], n = -1;
- for (var i = 0; i < d.length; i++) {
- var desc = {
- name: d[i].tags.name || presets.match(d[i], context.graph()).name(),
- geometry: d[i].geometry(context.graph()),
- count: 1,
- tagText: iD.util.tagText(d[i])
- };
- if (c[n] &&
- c[n].name == desc.name &&
- c[n].tagText == desc.tagText) {
- c[n].count++;
- } else {
- c[++n] = desc;
- }
- }
- return c;
- }
-
- function commit(selection) {
-
- function changesLength(d) { return changes[d].length; }
-
- var changes = selection.datum(),
- connection = changes.connection,
- user = connection.user(),
- header = selection.append('div').attr('class', 'header modal-section'),
- body = selection.append('div').attr('class', 'body');
-
- header.append('h3')
- .text(t('commit.title'));
-
- // Comment Section
- var commentSection = body.append('div')
- .attr('class', 'modal-section form-field');
-
- commentSection.append('label')
- .attr('class','form-label')
- .text(t('commit.message_label'));
-
- var commentField = commentSection
- .append('textarea')
- .attr('placeholder', t('commit.description_placeholder'))
- .property('value', context.storage('comment') || '');
-
- commentField.node().select();
-
- // Save Section
- var saveSection = body.append('div').attr('class','modal-section cf');
-
- var userLink = d3.select(document.createElement('div'));
-
- if (user.image_url) {
- userLink.append('img')
- .attr('src', user.image_url)
- .attr('class', 'icon icon-pre-text user-icon');
- }
-
- userLink.append('a')
- .attr('class','user-info')
- .text(user.display_name)
- .attr('href', connection.userURL(user.display_name))
- .attr('tabindex', -1)
- .attr('target', '_blank');
-
- saveSection.append('p')
- .attr('class', 'commit-info')
- .html(t('commit.upload_explanation', {user: userLink.html()}));
-
- // Confirm Button
- var saveButton = saveSection.append('button')
- .attr('class', 'action col2 button')
- .on('click.save', function() {
- var comment = commentField.node().value;
- localStorage.comment = comment;
- event.save({
- comment: comment
- });
- });
-
- saveButton.append('span')
- .attr('class', 'label')
- .text(t('commit.save'));
-
- var warnings = body.selectAll('div.warning-section')
- .data(iD.validate(changes, context.graph()))
- .enter()
- .append('div')
- .attr('class', 'modal-section warning-section fillL2');
-
- warnings.append('h3')
- .text(t('commit.warnings'));
-
- var warningLi = warnings.append('ul')
- .attr('class', 'changeset-list')
- .selectAll('li')
- .data(function(d) { return d; })
- .enter()
- .append('li');
-
- // only show the fix icon when an entity is given
- warningLi.filter(function(d) { return d.entity; })
- .append('button')
- .attr('class', 'minor')
- .on('click', event.fix)
- .append('span')
- .attr('class', 'icon warning');
-
- warningLi.append('strong').text(function(d) {
- return d.message;
- });
-
- var section = body.selectAll('div.commit-section')
- .data(['modified', 'deleted', 'created'].filter(changesLength))
- .enter()
- .append('div')
- .attr('class', 'commit-section modal-section fillL2');
-
- section.append('h3')
- .text(function(d) { return t('commit.' + d); })
- .append('small')
- .attr('class', 'count')
- .text(changesLength);
-
- var li = section.append('ul')
- .attr('class', 'changeset-list')
- .selectAll('li')
- .data(function(d) { return zipSame(changes[d]); })
- .enter()
- .append('li');
-
- li.append('strong')
- .text(function(d) {
- return d.geometry + ' ';
- });
-
- li.append('span')
- .text(function(d) { return d.name; })
- .attr('title', function(d) { return d.tagText; });
-
- li.filter(function(d) { return d.count > 1; })
- .append('span')
- .attr('class', 'count')
- .text(function(d) { return d.count; });
- }
-
- return d3.rebind(commit, event, 'on');
-};
-iD.ui.confirm = function(selection) {
- var modal = iD.ui.modal(selection);
-
- modal.select('.modal')
- .classed('modal-alert', true);
-
- var section = modal.select('.content');
-
- var modalHeader = section.append('div')
- .attr('class', 'modal-section header');
-
- var description = section.append('div')
- .attr('class', 'modal-section message-text');
-
- var buttonwrap = section.append('div')
- .attr('class', 'modal-section buttons cf');
-
- var okbutton = buttonwrap.append('button')
- .attr('class', 'col2 action')
- .on('click.confirm', function() {
- modal.remove();
- })
- .text('Okay');
-
- return modal;
-};
-iD.ui.Contributors = function(context) {
- function update(selection) {
- var users = {},
- limit = 4,
- entities = context.intersects(context.map().extent());
-
- entities.forEach(function(entity) {
- if (entity && entity.user) users[entity.user] = true;
- });
-
- var u = Object.keys(users),
- subset = u.slice(0, u.length > limit ? limit - 1 : limit);
-
- selection.html('')
- .append('span')
- .attr('class', 'icon nearby light icon-pre-text');
-
- var userList = d3.select(document.createElement('span'));
-
- userList.selectAll()
- .data(subset)
- .enter()
- .append('a')
- .attr('class', 'user-link')
- .attr('href', function(d) { return context.connection().userURL(d); })
- .attr('target', '_blank')
- .attr('tabindex', -1)
- .text(String);
-
- if (u.length > limit) {
- var count = d3.select(document.createElement('span'));
-
- count.append('a')
- .attr('target', '_blank')
- .attr('tabindex', -1)
- .attr('href', function() {
- var ext = context.map().extent();
- return 'http://www.openstreetmap.org/browse/changesets?bbox=' + [
- ext[0][0], ext[0][1],
- ext[1][0], ext[1][1]];
- })
- .text(u.length - limit + 1);
-
- selection.append('span')
- .html(t('contributors.truncated_list', {users: userList.html(), count: count.html()}));
- } else {
- selection.append('span')
- .html(t('contributors.list', {users: userList.html()}));
- }
-
- if (!u.length) {
- selection.transition().style('opacity', 0);
- } else if (selection.style('opacity') === '0') {
- selection.transition().style('opacity', 1);
- }
- }
-
- return function(selection) {
- update(selection);
-
- context.connection().on('load.contributors', function() {
- update(selection);
- });
-
- context.map().on('move.contributors', _.debounce(function() {
- update(selection);
- }, 500));
- };
-};
-iD.ui.flash = function(selection) {
- var modal = iD.ui.modal(selection);
-
- modal.select('.modal').classed('modal-flash', true);
-
- modal.select('.content')
- .classed('modal-section', true)
- .append('div')
- .attr('class', 'description');
-
- modal.on('click.flash', function() { modal.remove(); });
-
- setTimeout(function() {
- modal.remove();
- return true;
- }, 1500);
-
- return modal;
-};
-iD.ui.Geocoder = function(context) {
-
- var key = 'f';
-
- function resultExtent(bounds) {
- return new iD.geo.Extent(
- [parseFloat(bounds[3]), parseFloat(bounds[0])],
- [parseFloat(bounds[2]), parseFloat(bounds[1])]);
- }
-
- function truncate(d) {
- if (d.display_name.length > 80) {
- return d.display_name.substr(0, 80) + '…';
- } else {
- return d.display_name;
- }
- }
-
- function geocoder(selection) {
-
- var shown = false;
-
- function keydown() {
- if (d3.event.keyCode !== 13) return;
- d3.event.preventDefault();
- var searchVal = this.value;
- inputNode.classed('loading', true);
- d3.json('http://nominatim.openstreetmap.org/search/' +
- encodeURIComponent(searchVal) + '?limit=10&format=json', function(err, resp) {
- inputNode.classed('loading', false);
- if (err) return hide();
- if (!resp.length) {
- resultsList.html('')
- .call(iD.ui.Toggle(true))
- .append('span')
- .attr('class', 'not-found')
- .text(t('geocoder.no_results', { name: searchVal }));
- } else if (resp.length > 1) {
- var spans = resultsList.html('').selectAll('span')
- .data(resp, function(d) { return d.place_id; });
-
- spans.enter()
- .append('span')
- .text(function(d) {
- return d.type.charAt(0).toUpperCase() + d.type.slice(1) + ': ';
- })
- .append('a')
- .attr('tabindex', 1)
- .text(truncate)
- .on('click', clickResult)
- .on('keydown', function(d) {
- // support tabbing to and accepting this
- // entry
- if (d3.event.keyCode == 13) clickResult(d);
- });
- spans.exit().remove();
- resultsList.call(iD.ui.Toggle(true));
- } else {
- hide();
- applyBounds(resultExtent(resp[0].boundingbox));
- selectId(resp[0].osm_type, resp[0].osm_id);
- }
- });
- }
-
- function clickResult(d) {
- selectId(d.osm_type, d.osm_id);
- applyBounds(resultExtent(d.boundingbox));
- }
-
- function applyBounds(extent) {
- var map = context.map();
- map.extent(extent);
- if (map.zoom() > 19) map.zoom(19);
- }
-
- function selectId(type, id) {
- id = type[0] + id;
-
- if (context.hasEntity(id)) {
- context.enter(iD.modes.Select(context, [id]));
- } else {
- context.map().on('drawn.geocoder', function() {
- if (!context.hasEntity(id)) return;
- context.enter(iD.modes.Select(context, [id]));
- });
-
- context.on('enter.geocoder', function() {
- if (context.mode().id !== 'browse') {
- context.on('enter.geocoder', null)
- .map().on('drawn.geocoder', null);
- }
- });
- }
- }
-
- var tooltip = bootstrap.tooltip()
- .placement('right')
- .html(true)
- .title(iD.ui.tooltipHtml(t('geocoder.title'), key));
-
- var gcForm = selection.append('form');
-
- var inputNode = gcForm.attr('class', 'fillL map-overlay content hide')
- .append('input')
- .attr({ type: 'text', placeholder: t('geocoder.placeholder') })
- .attr('tabindex', 1)
- .on('keydown', keydown);
-
- var resultsList = selection.append('div')
- .attr('class', 'fillL map-overlay hide');
-
- var keybinding = d3.keybinding('geocoder');
-
- function hide() { setVisible(false); }
- function toggle() {
- if (d3.event) d3.event.preventDefault();
- tooltip.hide(button);
- setVisible(!button.classed('active'));
- }
-
- function setVisible(show) {
- if (show !== shown) {
- button.classed('active', show);
- shown = show;
-
- if (!show && !resultsList.classed('hide')) {
- resultsList.call(iD.ui.Toggle(show));
- // remove results so that they lose focus. if the user has
- // tabbed into the list, then they will have focus still,
- // even if they're hidden.
- resultsList.selectAll('span').remove();
- }
-
- if (show) {
- selection.on('mousedown.geocoder-inside', function() {
- return d3.event.stopPropagation();
- });
- gcForm.style('display', 'block')
- .style('left', '-500px')
- .transition()
- .duration(200)
- .style('left', '30px');
- inputNode.node().focus();
- } else {
- selection.on('mousedown.geocoder-inside', null);
- gcForm.style('display', 'block')
- .style('left', '30px')
- .transition()
- .duration(200)
- .style('left', '-500px')
- .each('end', function() {
- d3.select(this).style('display', 'none');
- });
- inputNode.node().blur();
- }
- }
- }
- var button = selection.append('button')
- .attr('tabindex', -1)
- .on('click', toggle)
- .call(tooltip);
-
- button.append('span')
- .attr('class', 'icon geocode light');
-
- keybinding.on(key, toggle);
-
- d3.select(document)
- .call(keybinding);
-
- context.surface().on('mousedown.geocoder-outside', hide);
- context.container().on('mousedown.b.geocoder-outside', hide);
-
- }
- return geocoder;
-};
-iD.ui.Geolocate = function(map) {
- function click() {
- navigator.geolocation.getCurrentPosition(
- success, error);
- }
-
- function success(position) {
- var extent = iD.geo.Extent([position.coords.longitude, position.coords.latitude])
- .padByMeters(position.coords.accuracy);
-
- map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
- }
-
- function error() { }
-
- return function(selection) {
- if (!navigator.geolocation) return;
-
- var button = selection.append('button')
- .attr('tabindex', -1)
- .attr('title', t('geolocate.title'))
- .on('click', click)
- .call(bootstrap.tooltip()
- .placement('right'));
-
- button.append('span')
- .attr('class', 'icon geolocate');
- };
-};
-iD.ui.Help = function(context) {
-
- var key = 'h';
-
- function help(selection) {
-
- var shown = false, pane;
-
- function setup() {
- pane = context.container()
- .select('.help-wrap')
- .html('');
-
- var toc = pane.append('ul')
- .attr('class', 'toc');
-
- function clickHelp(d, i) {
- pane.property('scrollTop', 0);
- doctitle.text(d.title);
- body.html(d.html);
- body.selectAll('a')
- .attr('target', '_blank');
- menuItems.classed('selected', function(m) {
- return m.title === d.title;
- });
-
- nav.html('');
-
- if (i > 0) {
- var prevLink = nav.append('a')
- .attr('class', 'previous')
- .on('click', function() {
- clickHelp(docs[i - 1], i - 1);
- });
- prevLink.append('span').attr('class', 'icon back blue');
- prevLink.append('span').text(docs[i - 1].title);
- }
- if (i < docs.length - 1) {
- var nextLink = nav.append('a')
- .attr('class', 'next')
- .on('click', function() {
- clickHelp(docs[i + 1], i + 1);
- });
- nextLink.append('span').text(docs[i + 1].title);
- nextLink.append('span').attr('class', 'icon forward blue');
- }
- }
-
- var docKeys = [
- 'help.help',
- 'help.editing_saving',
- 'help.roads',
- 'help.gps',
- 'help.imagery',
- 'help.addresses',
- 'help.inspector',
- 'help.buildings'];
-
- function one(f) { return function(x) { return f(x); }; }
- var docs = docKeys.map(one(t)).map(function(text) {
- return {
- title: text.split('\n')[0].replace('#', '').trim(),
- html: marked(text.split('\n').slice(1).join('\n'))
- };
- });
-
- var menuItems = toc.selectAll('li')
- .data(docs)
- .enter()
- .append('li')
- .append('a')
- .text(function(d) { return d.title; })
- .on('click', clickHelp);
-
- toc.append('li')
- .attr('class','walkthrough')
- .append('a')
- .text(t('splash.walkthrough'))
- .on('click', function() {
- d3.select(document.body).call(iD.ui.intro(context));
- setVisible(false);
- });
-
- var content = pane.append('div')
- .attr('class', 'left-content'),
- doctitle = content.append('h2')
- .text(t('help.title')),
- body = content.append('div')
- .attr('class', 'body'),
- nav = content.append('div')
- .attr('class', 'nav');
-
- clickHelp(docs[0], 0);
- }
-
- function hide() { setVisible(false); }
- function toggle() {
- if (d3.event) d3.event.preventDefault();
- tooltip.hide(button);
- setVisible(!button.classed('active'));
- }
-
- function blockClick() {
- pane.on('mousedown.help-inside', function() {
- return d3.event.stopPropagation();
- });
- selection.on('mousedown.help-inside', function() {
- return d3.event.stopPropagation();
- });
- }
-
- function setVisible(show) {
- if (show !== shown) {
- button.classed('active', show);
- shown = show;
- if (show) {
- pane.style('display', 'block')
- .style('left', '-500px')
- .transition()
- .duration(200)
- .style('left', '0px')
- .each('end', blockClick);
- } else {
- pane.style('left', '0px')
- .transition()
- .duration(200)
- .style('left', '-500px')
- .each('end', function() {
- d3.select(this).style('display', 'none');
- });
- pane.on('mousedown.help-inside', null);
- }
- }
- }
-
- var tooltip = bootstrap.tooltip()
- .placement('right')
- .html(true)
- .title(iD.ui.tooltipHtml(t('help.title'), key));
-
- var button = selection.append('button')
- .attr('tabindex', -1)
- .on('click', toggle)
- .call(tooltip);
-
- button.append('span')
- .attr('class', 'icon help light');
-
- context.surface().on('mousedown.help-outside', hide);
- context.container().on('mousedown.b.help-outside', hide);
-
- setup();
-
- var keybinding = d3.keybinding('help');
- keybinding.on(key, toggle);
- d3.select(document).call(keybinding);
- }
-
- return help;
-};
-iD.ui.Inspector = function(context, entity) {
- var tagEditor,
- id = entity.id,
- newFeature = false;
-
- function changeTags(tags) {
- var entity = context.hasEntity(id);
- if (entity && !_.isEqual(entity.tags, tags)) {
- context.perform(
- iD.actions.ChangeTags(entity.id, tags),
- t('operations.change_tags.annotation'));
- }
- }
-
- function browse() {
- context.enter(iD.modes.Browse(context));
- }
-
- function inspector(selection) {
-
- var reselect = selection.html();
-
- selection
- .html('')
- .style('display', 'block')
- .style('right', '-500px')
- .style('opacity', 1)
- .transition()
- .duration(reselect ? 0 : 200)
- .style('right', '0px');
-
- var panewrap = selection
- .append('div')
- .classed('panewrap', true);
-
- var presetLayer = panewrap
- .append('div')
- .classed('pane grid-pane', true);
-
- var tagLayer = panewrap
- .append('div')
- .classed('pane tag-pane', true);
-
- var presetGrid = iD.ui.PresetGrid(context, entity)
- .autofocus(newFeature)
- .on('close', browse)
- .on('choose', function(preset) {
- var right = panewrap.style('right').indexOf('%') > 0 ? '0%' : '0px';
- panewrap
- .transition()
- .style('right', right);
-
- tagLayer.call(tagEditor, preset);
- });
-
- tagEditor = iD.ui.TagEditor(context, entity)
- .on('changeTags', changeTags)
- .on('close', browse)
- .on('choose', function(preset) {
- var right = panewrap.style('right').indexOf('%') > 0 ?
- '-100%' :
- '-' + selection.style('width');
- panewrap
- .transition()
- .style('right', right);
-
- presetGrid.autofocus(true);
- presetLayer.call(presetGrid, preset);
- });
-
- var tagless = _.without(Object.keys(entity.tags), 'area').length === 0;
-
- if (tagless) {
- panewrap.style('right', '-100%');
- presetLayer.call(presetGrid);
- } else {
- panewrap.style('right', '-0%');
- tagLayer.call(tagEditor);
- }
-
- if (d3.event) {
- // Pan the map if the clicked feature intersects with the position
- // of the inspector
- var inspectorSize = selection.size(),
- mapSize = context.map().size(),
- offset = 50,
- shiftLeft = d3.event.clientX - mapSize[0] + inspectorSize[0] + offset,
- center = (mapSize[0] / 2) + shiftLeft + offset;
-
- if (shiftLeft > 0 && inspectorSize[1] > d3.event.clientY) {
- context.map().centerEase(context.projection.invert([center, mapSize[1]/2]));
- }
- }
- }
-
- inspector.close = function(selection) {
- tagEditor.close();
-
- selection.transition()
- .style('right', '-500px')
- .each('end', function() {
- d3.select(this)
- .style('display', 'none')
- .html('');
- });
- };
-
- inspector.newFeature = function(_) {
- if (!arguments.length) return newFeature;
- newFeature = _;
- return inspector;
- };
-
- return inspector;
-};
-iD.ui.intro = function(context) {
-
- var step;
-
- function intro(selection) {
-
- context.enter(iD.modes.Browse(context));
-
- // Save current map state
- var history = context.history().toJSON(),
- hash = window.location.hash,
- background = context.background().source(),
- opacity = d3.select('.layer-layer:first-child').style('opacity'),
- loadedTiles = context.connection().loadedTiles(),
- baseEntities = context.history().graph().base().entities;
-
- // Load semi-real data used in intro
- context.connection().toggle(false).flush();
- context.history().save().reset();
- context.history().merge(iD.Graph().load(JSON.parse(iD.introGraph)).entities);
-
- context.background().source(_.find(context.backgroundSources(), function(d) {
- return d.data.sourcetag === "Bing";
- }));
-
- // Block saving
- var savebutton = d3.select('#bar button.save'),
- save = savebutton.on('click');
- savebutton.on('click', null);
-
- var beforeunload = window.onbeforeunload;
- window.onbeforeunload = null;
-
- d3.select('.layer-layer:first-child').style('opacity', 1);
-
- var curtain = d3.curtain();
- selection.call(curtain);
-
- function reveal(box, textid, duration) {
- if (textid) curtain.reveal(box, t(textid), textid.replace(/\./g, '-'), duration);
- else curtain.reveal(box, '', '', duration);
- }
-
- var steps = ['navigation', 'point', 'area', 'line', 'startEditing'].map(function(step, i) {
- var s = iD.ui.intro[step](context, reveal)
- .on('done', function() {
- entered.filter(function(d) {
- return d.name === s.name;
- }).classed('finished', true);
- enter(steps[i + 1]);
- });
- return s;
- });
-
- steps[steps.length - 1].on('startEditing', function() {
- curtain.remove();
- navwrap.remove();
- d3.select('.layer-layer:first-child').style('opacity', opacity);
- context.connection().toggle(true).flush().loadedTiles(loadedTiles);
- context.history().reset().merge(baseEntities);
- context.background().source(background);
- if (history) context.history().fromJSON(history);
- window.location.replace(hash);
- window.onbeforeunload = beforeunload;
- d3.select('#bar button.save').on('click', save);
- });
-
- var navwrap = selection.append('div').attr('class', 'intro-nav-wrap fillD');
-
- var buttonwrap = navwrap.append('div')
- .attr('class', 'joined')
- .selectAll('button.step');
-
- var entered = buttonwrap.data(steps)
- .enter().append('button')
- .attr('class', 'step')
- .on('click', enter);
-
- entered.append('div').attr('class','icon icon-pre-text apply');
- entered.append('label').text(function(d) { return d.name; });
- enter(steps[0]);
-
- function enter (newStep) {
-
- if (step) {
- step.exit();
- }
-
- context.enter(iD.modes.Browse(context));
-
- step = newStep;
- step.enter();
-
- entered.classed('active', function(d) {
- return d.name === step.name;
- });
- }
-
- }
- return intro;
-};
-
-iD.ui.intro.pointBox = function(point) {
- return {
- left: point[0] - 30,
- top: point[1] - 50,
- width: 60,
- height: 70
- };
-};
-
-iD.ui.intro.pad = function(box, padding) {
- if (box instanceof Array) {
- box = {
- left: box[0],
- top: box[1]
- };
- }
- return {
- left: box.left - padding,
- top: box.top - padding,
- width: (box.width || 0) + 2 * padding,
- height: (box.width || 0) + 2 * padding
- };
-};
-iD.ui.Lasso = function(context) {
-
- var box, group,
- a = [0, 0],
- b = [0, 0];
-
- function lasso(selection) {
-
- context.container().classed('lasso', true);
-
- group = selection.append('g')
- .attr('class', 'lasso hide');
-
- box = group.append('rect')
- .attr('class', 'lasso-box');
-
- group.call(iD.ui.Toggle(true));
-
- }
-
- // top-left
- function topLeft(d) {
- return 'translate(' + Math.min(d[0][0], d[1][0]) + ',' + Math.min(d[0][1], d[1][1]) + ')';
- }
-
- function width(d) { return Math.abs(d[0][0] - d[1][0]); }
- function height(d) { return Math.abs(d[0][1] - d[1][1]); }
-
- function draw() {
- if (box) {
- box.data([[a, b]])
- .attr('transform', topLeft)
- .attr('width', width)
- .attr('height', height);
- }
- }
-
- lasso.a = function(_) {
- if (!arguments.length) return a;
- a = _;
- draw();
- return lasso;
- };
-
- lasso.b = function(_) {
- if (!arguments.length) return b;
- b = _;
- draw();
- return lasso;
- };
-
- lasso.close = function() {
- if (group) {
- group.call(iD.ui.Toggle(false, function() {
- d3.select(this).remove();
- }));
- }
- context.container().classed('lasso', false);
- };
-
- return lasso;
-};
-iD.ui.Loading = function(context) {
- var message = '',
- blocking = false,
- modal;
-
- var loading = function(selection) {
- modal = iD.ui.modal(selection, blocking);
-
- var loadertext = modal.select('.content')
- .classed('loading-modal', true)
- .append('div')
- .attr('class', 'modal-section fillL');
-
- loadertext.append('img')
- .attr('class', 'loader')
- .attr('src', context.imagePath('loader-white.gif'));
-
- loadertext.append('h3')
- .text(message);
-
- modal.select('button.close')
- .attr('class', 'hide');
-
- return loading;
- };
-
- loading.message = function(_) {
- if (!arguments.length) return message;
- message = _;
- return loading;
- };
-
- loading.blocking = function(_) {
- if (!arguments.length) return blocking;
- blocking = _;
- return loading;
- };
-
- loading.close = function() {
- modal.remove();
- };
-
- return loading;
-};
-iD.ui.modal = function(selection, blocking) {
-
- var previous = selection.select('div.modal');
- var animate = previous.empty();
-
- previous.transition()
- .duration(200)
- .style('opacity', 0)
- .remove();
-
- var shaded = selection
- .append('div')
- .attr('class', 'shaded')
- .style('opacity', 0);
-
- shaded.close = function() {
- shaded
- .transition()
- .duration(200)
- .style('opacity',0)
- .remove();
- modal
- .transition()
- .duration(200)
- .style('top','0px');
- keybinding.off();
- };
-
- var keybinding = d3.keybinding('modal')
- .on('⌫', shaded.close)
- .on('⎋', shaded.close);
-
- d3.select(document).call(keybinding);
-
- var modal = shaded.append('div')
- .attr('class', 'modal fillL col6');
-
- shaded.on('click.remove-modal', function() {
- if (d3.event.target == this && !blocking) shaded.close();
- });
-
- modal.append('button')
- .attr('class', 'close')
- .on('click', function() {
- if (!blocking) shaded.close();
- })
- .append('div')
- .attr('class','icon close');
-
- modal.append('div')
- .attr('class', 'content');
-
- if (animate) {
- shaded.transition().style('opacity', 1);
- modal
- .style('top','0px')
- .transition()
- .duration(200)
- .style('top','40px');
- } else {
- shaded.style('opacity', 1);
- }
-
-
- return shaded;
-};
-iD.ui.Modes = function(context) {
- var modes = [
- iD.modes.AddPoint(context),
- iD.modes.AddLine(context),
- iD.modes.AddArea(context)];
-
- return function(selection, limiter) {
- var buttons = selection.selectAll('button.add-button')
- .data(modes);
-
- buttons.enter().append('button')
- .attr('tabindex', -1)
- .attr('class', function(mode) { return mode.id + ' add-button col4'; })
- .on('click.mode-buttons', function(mode) {
- if (mode.id === context.mode().id) {
- context.enter(iD.modes.Browse(context));
- } else {
- context.enter(mode);
- }
- })
- .call(bootstrap.tooltip()
- .placement('bottom')
- .html(true)
- .title(function(mode) {
- return iD.ui.tooltipHtml(mode.description, mode.key);
- }));
-
- var notice = iD.ui.notice(limiter)
- .message(false)
- .on('zoom', function() { context.map().zoom(16); });
-
- function disableTooHigh() {
- if (context.map().editable()) {
- notice.message(false);
- buttons.attr('disabled', null);
- } else {
- buttons.attr('disabled', 'disabled');
- notice.message(true);
- context.enter(iD.modes.Browse(context));
- }
- }
-
- context.map()
- .on('move.mode-buttons', _.debounce(disableTooHigh, 500));
-
- disableTooHigh();
-
- buttons.append('span')
- .attr('class', function(mode) { return mode.id + ' icon icon-pre-text'; });
-
- buttons.append('span')
- .attr('class', 'label')
- .text(function(mode) { return mode.title; });
-
- context.on('enter.editor', function(entered) {
- buttons.classed('active', function(mode) { return entered.button === mode.button; });
- context.container()
- .classed("mode-" + entered.id, true);
- });
-
- context.on('exit.editor', function(exited) {
- context.container()
- .classed("mode-" + exited.id, false);
- });
-
- var keybinding = d3.keybinding('mode-buttons');
-
- modes.forEach(function(m) {
- keybinding.on(m.key, function() { if (context.map().editable()) context.enter(m); });
- });
-
- d3.select(document)
- .call(keybinding);
- };
-};
-iD.ui.notice = function(selection) {
- var event = d3.dispatch('zoom'),
- notice = {};
-
- var div = selection.append('div')
- .attr('class', 'notice');
-
- var button = div.append('button')
- .attr('class', 'zoom-to notice')
- .on('click', event.zoom);
-
- button.append('span')
- .attr('class', 'icon zoom-in-invert');
-
- button.append('span')
- .attr('class', 'label')
- .text(t('zoom_in_edit'));
-
- notice.message = function(_) {
- if (_) {
- selection.select('.button-wrap').style('display', 'none');
- div.style('display', 'block');
- } else {
- selection.select('.button-wrap').style('display', 'block');
- div.style('display', 'none');
- }
- return notice;
- };
-
- return d3.rebind(notice, event, 'on');
-};
-iD.ui.preset = function(context, entity, preset) {
- var original = context.graph().base().entities[entity.id],
- event = d3.dispatch('change', 'close'),
- fields = [],
- tags = {},
- formwrap,
- formbuttonwrap;
-
- function UIField(field, show) {
- field = _.clone(field);
-
- field.input = iD.ui.preset[field.type](field, context)
- .on('close', event.close)
- .on('change', event.change);
-
- field.reference = iD.ui.TagReference(entity, {key: field.key});
-
- if (field.type === 'address' ||
- field.type === 'wikipedia' ||
- field.type === 'maxspeed') {
- field.input.entity(entity);
- }
-
- field.keys = field.keys || [field.key];
-
- field.show = show;
-
- field.shown = function() {
- return field.id === 'name' || field.show || _.any(field.keys, function(key) { return !!tags[key]; });
- };
-
- field.modified = function() {
- return _.any(field.keys, function(key) {
- return original ? tags[key] !== original.tags[key] : tags[key];
- });
- };
-
- return field;
- }
-
- fields.push(UIField(context.presets().field('name')));
-
- var geometry = entity.geometry(context.graph());
- preset.fields.forEach(function(field) {
- if (field.matchGeometry(geometry)) {
- fields.push(UIField(field, true));
- }
- });
-
- context.presets().universal().forEach(function(field) {
- if (preset.fields.indexOf(field) < 0) {
- fields.push(UIField(field));
- }
- });
-
- function fieldKey(field) {
- return field.id;
- }
-
- function shown() {
- return fields.filter(function(field) { return field.shown(); });
- }
-
- function notShown() {
- return fields.filter(function(field) { return !field.shown(); });
- }
-
- function show(field) {
- field.show = true;
- render();
- field.input.focus();
- }
-
- function revert(field) {
- d3.event.stopPropagation();
- d3.event.preventDefault();
- var t = {};
- field.keys.forEach(function(key) {
- t[key] = original ? original.tags[key] || '' : '';
- });
- event.change(t);
- }
-
- function toggleReference(field) {
- d3.event.stopPropagation();
- d3.event.preventDefault();
-
- _.forEach(shown(), function(other) {
- if (other.id === field.id) {
- other.reference.toggle();
- } else {
- other.reference.hide();
- }
- });
-
- render();
- }
-
- function render() {
- var selection = formwrap.selectAll('.form-field')
- .data(shown(), fieldKey);
-
- var enter = selection.enter()
- .insert('div', '.more-buttons')
- .style('opacity', 0)
- .attr('class', function(field) {
- return 'form-field form-field-' + field.id + ' fillL col12';
- });
-
- enter.transition()
- .style('max-height', '0px')
- .style('padding-top', '0px')
- .style('opacity', '0')
- .transition()
- .duration(200)
- .style('padding-top', '20px')
- .style('max-height', '240px')
- .style('opacity', '1')
- .each('end', function(d) {
- d3.select(this).style('max-height', '');
- });
-
- var label = enter.append('label')
- .attr('class', 'form-label')
- .attr('for', function(field) { return 'preset-input-' + field.id; })
- .text(function(field) { return field.label(); });
-
- label.append('button')
- .attr('class', 'tag-reference-button minor')
- .attr('tabindex', -1)
- .on('click', toggleReference)
- .append('span')
- .attr('class', 'icon inspect');
-
- label.append('button')
- .attr('class', 'modified-icon minor')
- .attr('tabindex', -1)
- .on('click', revert)
- .append('div')
- .attr('class','icon undo');
-
- enter.each(function(field) {
- d3.select(this)
- .call(field.input)
- .call(field.reference);
- });
-
- selection
- .each(function(field) {
- field.input.tags(tags);
- })
- .classed('modified', function(field) {
- return field.modified();
- });
-
- selection.exit()
- .remove();
-
- var addFields = formbuttonwrap.selectAll('.preset-add-field')
- .data(notShown(), fieldKey);
-
- addFields.enter()
- .append('button')
- .attr('class', 'preset-add-field')
- .on('click', show)
- .call(bootstrap.tooltip()
- .placement('top')
- .title(function(d) { return d.label(); }))
- .append('span')
- .attr('class', function(d) { return 'icon ' + d.icon; });
-
- addFields.exit()
- .transition()
- .style('opacity', 0)
- .remove();
-
- return selection;
- }
-
- function presets(selection) {
- selection.html('');
-
- formwrap = selection;
-
- formbuttonwrap = selection.append('div')
- .attr('class', 'col12 more-buttons inspector-inner');
-
- render();
- }
-
- presets.rendered = function() {
- return _.flatten(shown().map(function(field) { return field.keys; }));
- };
-
- presets.preset = function(_) {
- if (!arguments.length) return preset;
- preset = _;
- return presets;
- };
-
- presets.change = function(_) {
- tags = _;
- render();
- return presets;
- };
-
- return d3.rebind(presets, event, 'on');
-};
-iD.ui.PresetGrid = function(context, entity) {
- var event = d3.dispatch('choose', 'close'),
- presets,
- autofocus = false;
-
- function presetgrid(selection, preset) {
-
- selection.html('');
-
- presets = context.presets().matchGeometry(entity.geometry(context.graph()));
-
- var messagewrap = selection.append('div')
- .attr('class', 'header fillL cf');
-
- var message = messagewrap.append('h3')
- .attr('class', 'inspector-inner')
- .text(t('inspector.choose'));
-
- if (preset) {
- messagewrap.append('button')
- .attr('class', 'preset-choose')
- .on('click', event.choose)
- .append('span')
- .attr('class', 'icon forward');
- } else {
- messagewrap.append('button')
- .attr('class', 'close')
- .on('click', event.close)
- .append('span')
- .attr('class', 'icon close');
- }
-
- var gridwrap = selection.append('div')
- .attr('class', 'fillL2 inspector-body inspector-body-' + entity.geometry(context.graph()));
-
- var grid = gridwrap.append('div')
- .attr('class', 'preset-grid fillL cf')
- .call(drawGrid, context.presets().defaults(entity, 36));
-
- function keydown() {
- // hack to let delete shortcut work when search is autofocused
- if (search.property('value').length === 0 &&
- (d3.event.keyCode === d3.keybinding.keyCodes['⌫'] ||
- d3.event.keyCode === d3.keybinding.keyCodes['⌦'])) {
- d3.event.preventDefault();
- d3.event.stopPropagation();
- iD.operations.Delete([entity.id], context)();
- } else if (search.property('value').length === 0 &&
- (d3.event.ctrlKey || d3.event.metaKey) &&
- d3.event.keyCode === d3.keybinding.keyCodes.z) {
- d3.event.preventDefault();
- d3.event.stopPropagation();
- context.undo();
- } else if (!d3.event.ctrlKey && !d3.event.metaKey) {
- d3.select(this).on('keydown', null);
- }
- }
-
- function keyup() {
- // enter
- var value = search.property('value');
- if (d3.event.keyCode === 13 && value.length) {
- choose(grid.selectAll('.grid-entry:first-child').datum());
- } else {
- grid.classed('filtered', value.length);
- if (value.length) {
- var results = presets.search(value);
- message.text(t('inspector.results', {
- n: results.collection.length,
- search: value
- }));
- grid.call(drawGrid, results);
- } else {
- grid.call(drawGrid, context.presets().defaults(entity, 36));
- }
- }
- }
-
- var searchwrap = selection.append('div')
- .attr('class', 'preset-grid-search-wrap');
-
- var search = searchwrap.append('input')
- .attr('class', 'major')
- .attr('placeholder', t('inspector.search'))
- .attr('type', 'search')
- .on('keydown', keydown)
- .on('keyup', keyup);
-
- searchwrap.append('span')
- .attr('class', 'icon search');
-
- if (autofocus) {
- search.node().focus();
- }
-
- function choose(d) {
- // Category
- if (d.members) {
- var subgrid = insertBox(grid, d, 'subgrid');
-
- if (subgrid) {
- subgrid.append('div')
- .attr('class', 'arrow');
-
- subgrid.append('div')
- .attr('class', 'preset-grid fillL3 cf fl')
- .call(drawGrid, d.members);
-
- subgrid.style('max-height', '0px')
- .style('padding-bottom', '0px')
- .transition()
- .duration(300)
- .style('padding-bottom', '20px')
- .style('max-height', (d.members.collection.length * 80) + 200 + 'px');
- }
-
- // Preset
- } else {
- context.presets().choose(d);
- event.choose(d);
- }
- }
-
- // Inserts a div inline after the entry for the provided entity
- // Used for preset descriptions, and for expanding categories
- function insertBox(grid, entity, klass) {
-
- var entries = grid.selectAll('button.grid-entry'),
- shown = grid.selectAll('.box-insert'),
- shownIndex = Infinity,
- index;
-
- if (shown.node()) {
- shown.transition()
- .duration(200)
- .style('opacity','0')
- .style('max-height', '0px')
- .style('padding-top', '0px')
- .style('padding-bottom', '0px')
- .remove();
-
- if (shown.datum() === entity && shown.classed(klass)) return;
- shownIndex = Array.prototype.indexOf.call(shown.node().parentNode.childNodes, shown.node());
- }
-
- entries.each(function(d, i) {
- if (d === entity) index = i;
- });
-
- if (index >= shownIndex) index++;
-
- var elem = document.createElement('div');
- grid.node().insertBefore(elem, grid.node().childNodes[index + 1]);
-
- var newbox = d3.select(elem)
- .attr('class', 'col12 box-insert ' + klass)
- .datum(entity);
-
- return newbox;
- }
-
- function drawGrid(grid, presets) {
-
- function helpClick(d) {
- d3.event.stopPropagation();
-
- var presetinspect = insertBox(grid, d, 'preset-inspect');
-
- if (!presetinspect) return;
-
- var tag = {key: Object.keys(d.tags)[0]};
-
- if (d.tags[tag.key] !== '*') {
- tag.value = d.tags[tag.key];
- }
-
- var tagReference = iD.ui.TagReference(entity, tag);
- presetinspect.style('max-height', '200px')
- .call(tagReference);
- tagReference.show();
- }
-
- grid.selectAll('.preset-inspect, .subgrid').remove();
-
- var entries = grid
- .selectAll('.grid-entry-wrap')
- .data(presets.collection, function(d) { return d.id; });
-
- entries.exit()
- .remove();
-
- var entered = entries.enter()
- .append('div')
- .attr('class','grid-button-wrap col12 grid-entry-wrap')
- .classed('category', function(d) { return !!d.members; })
- .classed('current', function(d) { return d === preset; });
-
- var buttonInner = entered.append('button')
- .attr('class', 'grid-entry')
- .on('click', choose);
-
- buttonInner
- .style('opacity', 0)
- .transition()
- .style('opacity', 1);
-
- buttonInner
- .call(iD.ui.PresetIcon(context.geometry(entity.id)));
-
- var label = buttonInner.append('div')
- .attr('class','label')
- .text(function(d) { return d.name(); });
-
- entered.filter(function(d) { return !d.members; })
- .append('button')
- .attr('tabindex', -1)
- .attr('class', 'tag-reference-button minor')
- .on('click', helpClick)
- .append('span')
- .attr('class', 'icon inspect');
-
- entries.order();
- }
- }
-
- presetgrid.autofocus = function(_) {
- if (!arguments.length) return autofocus;
- autofocus = _;
- return presetgrid;
- };
-
- return d3.rebind(presetgrid, event, 'on');
-};
-iD.ui.PresetIcon = function(geometry) {
- return function(selection) {
- selection.append('div')
- .attr('class', function(preset) {
- var s = 'preset-icon-fill icon-' + geometry;
- for (var i in preset.tags) {
- s += ' tag-' + i + ' tag-' + i + '-' + preset.tags[i];
- }
- return s;
- });
-
- var fallbackIcon = geometry === 'line' ? 'other-line' : 'marker-stroked';
-
- selection.append('div')
- .attr('class', function(preset) {
- var icon = preset.icon || fallbackIcon,
- klass = 'feature-' + icon + ' preset-icon';
-
- icon = iD.data.featureIcons[icon];
- if (geometry === 'line' && icon && icon.line) {
- klass += ' preset-icon-line';
- }
-
- return klass;
- });
- };
-};
-iD.ui.RadialMenu = function(operations) {
- var menu,
- center = [0, 0],
- tooltip;
-
- var radialMenu = function(selection) {
- if (!operations.length)
- return;
-
- selection.node().parentNode.focus();
-
- function click(operation) {
- d3.event.stopPropagation();
- if (operation.disabled())
- return;
- operation();
- radialMenu.close();
- }
-
- menu = selection.append('g')
- .attr('class', 'radial-menu')
- .attr('transform', "translate(" + center + ")")
- .attr('opacity', 0);
-
- menu.transition()
- .attr('opacity', 1);
-
- var r = 50,
- a = Math.PI / 4,
- a0 = -Math.PI / 4,
- a1 = a0 + (operations.length - 1) * a;
-
- menu.append('path')
- .attr('class', 'radial-menu-background')
- .attr('d', 'M' + r * Math.sin(a0) + ',' +
- r * Math.cos(a0) +
- ' A' + r + ',' + r + ' 0 0,0 ' +
- r * Math.sin(a1) + ',' +
- r * Math.cos(a1))
- .attr('stroke-width', 50)
- .attr('stroke-linecap', 'round');
-
- var button = menu.selectAll()
- .data(operations)
- .enter().append('g')
- .attr('transform', function(d, i) {
- return 'translate(' + r * Math.sin(a0 + i * a) + ',' +
- r * Math.cos(a0 + i * a) + ')';
- });
-
- button.append('circle')
- .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
- .attr('r', 15)
- .classed('disabled', function(d) { return d.disabled(); })
- .on('click', click)
- .on('mouseover', mouseover)
- .on('mouseout', mouseout);
-
- button.append('use')
- .attr('transform', 'translate(-10, -10)')
- .attr('clip-path', 'url(#clip-square-20)')
- .attr('xlink:href', function(d) { return '#icon-operation-' + (d.disabled() ? 'disabled-' : '') + d.id; });
-
- tooltip = d3.select(document.body)
- .append('div')
- .attr('class', 'tooltip-inner radial-menu-tooltip');
-
- function mouseover(d, i) {
- var angle = a0 + i * a,
- dx = angle < 0 ? -200 : 0,
- dy = 0;
-
- tooltip
- .style('left', (r + 25) * Math.sin(angle) + dx + center[0] + 'px')
- .style('top', (r + 25) * Math.cos(angle) + dy + center[1]+ 'px')
- .style('display', 'block')
- .html(iD.ui.tooltipHtml(d.tooltip(), d.keys[0]));
- }
-
- function mouseout() {
- tooltip.style('display', 'none');
- }
- };
-
- radialMenu.close = function() {
- if (menu) {
- menu.transition()
- .attr('opacity', 0)
- .remove();
- }
-
- if (tooltip) {
- tooltip.remove();
- }
- };
-
- radialMenu.center = function(_) {
- if (!arguments.length) return center;
- center = _;
- return radialMenu;
- };
-
- return radialMenu;
-};
-iD.ui.Restore = function(context) {
- return function(selection) {
- if (!context.history().lock() || !context.history().restorableChanges())
- return;
-
- var modal = iD.ui.modal(selection);
-
- modal.select('.modal')
- .attr('class', 'modal fillL col6');
-
- var introModal = modal.select('.content');
-
- introModal.attr('class','cf');
-
- introModal.append('div')
- .attr('class', 'modal-section header')
- .append('h3')
- .text(t('restore.heading'));
-
- introModal.append('div')
- .attr('class','modal-section')
- .append('p')
- .text(t('restore.description'));
-
- var buttonWrap = introModal.append('div')
- .attr('class', 'modal-actions cf');
-
- var restore = buttonWrap.append('button')
- .attr('class', 'restore col6')
- .text(t('restore.restore'))
- .on('click', function() {
- context.history().restore();
- modal.remove();
- });
-
- buttonWrap.append('button')
- .attr('class', 'reset col6')
- .text(t('restore.reset'))
- .on('click', function() {
- context.history().clearSaved();
- modal.remove();
- });
-
- restore.node().focus();
- };
- modal.select('button.close').attr('class','hide');
-
-};
-iD.ui.Save = function(context) {
- var map = context.map(),
- history = context.history(),
- connection = context.connection(),
- key = iD.ui.cmd('⌘S'),
- modal;
-
- function save() {
- d3.event.preventDefault();
-
- if (!history.hasChanges()) return;
-
- connection.authenticate(function(err) {
- modal = iD.ui.modal(context.container());
- var changes = history.changes();
- changes.connection = connection;
- modal.select('.content')
- .classed('commit-modal', true)
- .datum(changes)
- .call(iD.ui.Commit(context)
- .on('cancel', function() {
- modal.remove();
- })
- .on('fix', clickFix)
- .on('save', commit));
- });
- }
-
- function commit(e) {
- context.container().select('.shaded')
- .remove();
-
- var loading = iD.ui.Loading(context)
- .message(t('save.uploading'))
- .blocking(true);
-
- context.container()
- .call(loading);
-
- connection.putChangeset(
- history.changes(),
- e.comment,
- history.imagery_used(),
- function(err, changeset_id) {
- loading.close();
- if (err) {
- var confirm = iD.ui.confirm(context.container());
- confirm
- .select('.modal-section.header')
- .append('h3')
- .text(t('save.error'));
- confirm
- .select('.modal-section.message-text')
- .append('p')
- .text(err.responseText);
- } else {
- history.reset();
- map.flush().redraw();
- success(e, changeset_id);
- }
- });
- }
-
- function success(e, changeset_id) {
- modal = iD.ui.modal(context.container());
- modal.select('.content')
- .classed('success-modal', true)
- .datum({
- id: changeset_id,
- comment: e.comment
- })
- .call(iD.ui.Success(connection)
- .on('cancel', function() {
- modal.remove();
- }));
- }
-
- function clickFix(d) {
- var extent = d.entity.extent(context.graph());
- map.centerZoom(extent.center(), Math.min(19, map.extentZoom(extent)));
- context.enter(iD.modes.Select(context, [d.entity.id]));
- modal.remove();
- }
-
- return function(selection) {
- var button = selection.append('button')
- .attr('class', 'save col12 disabled')
- .attr('tabindex', -1)
- .on('click', save)
- .attr('data-original-title',
- iD.ui.tooltipHtml(t('save.no_changes'), key))
- .call(bootstrap.tooltip()
- .placement('bottom')
- .html(true));
-
- button.append('span')
- .attr('class', 'label')
- .text(t('save.title'));
-
- button.append('span')
- .attr('class', 'count')
- .text('0');
-
- var keybinding = d3.keybinding('undo-redo')
- .on(key, save);
-
- d3.select(document)
- .call(keybinding);
-
- var numChanges = 0;
-
- context.history().on('change.save', function() {
- var _ = history.numChanges();
- if (_ === numChanges)
- return;
- numChanges = _;
-
- button
- .attr('data-original-title',
- iD.ui.tooltipHtml(t(numChanges > 0 ?
- 'save.help' : 'save.no_changes'), key));
-
- button
- .classed('disabled', numChanges === 0)
- .classed('has-count', numChanges > 0);
-
- button.select('span.count')
- .text(numChanges);
- });
- };
-};
-iD.ui.SourceSwitch = function(context) {
- var keys;
-
- function click() {
- d3.event.preventDefault();
-
- if (context.history().hasChanges() &&
- !window.confirm(t('source_switch.lose_changes'))) return;
-
- var live = d3.select(this)
- .classed('live');
-
- context.connection()
- .switch(live ? keys[1] : keys[0]);
-
- context.map()
- .flush();
-
- d3.select(this)
- .text(live ? t('source_switch.dev') : t('source_switch.live'))
- .classed('live', !live);
- }
-
- var sourceSwitch = function(selection) {
- selection.append('a')
- .attr('href', '#')
- .text(t('source_switch.live'))
- .classed('live', true)
- .attr('tabindex', -1)
- .on('click', click);
- };
-
- sourceSwitch.keys = function(_) {
- if (!arguments.length) return keys;
- keys = _;
- return sourceSwitch;
- };
-
- return sourceSwitch;
-};
-iD.ui.Spinner = function(context) {
- var connection = context.connection();
-
- return function(selection) {
- var img = selection.append('img')
- .attr('src', context.imagePath('loader-black.gif'))
- .style('opacity', 0);
-
- connection.on('loading.spinner', function() {
- img.transition()
- .style('opacity', 1);
- });
-
- connection.on('loaded.spinner', function() {
- img.transition()
- .style('opacity', 0);
- });
- };
-};
-iD.ui.Splash = function(context) {
- return function(selection) {
- if (context.storage('sawSplash'))
- return;
-
- context.storage('sawSplash', true);
-
- var modal = iD.ui.modal(selection);
-
- modal.select('.modal')
- .attr('class', 'modal-splash modal col6');
-
- var introModal = modal.select('.content')
- .append('div')
- .attr('class', 'fillL');
-
- introModal.append('div')
- .attr('class','modal-section cf')
- .append('h3').text(t('splash.welcome'));
-
- introModal.append('div')
- .attr('class','modal-section')
- .append('p')
- .html(t('splash.text', {
- version: iD.version,
- website: '<a href="http://ideditor.com/">ideditor.com</a>',
- github: '<a href="https://github.com/systemed/iD">github.com</a>'
- }));
-
- var buttons = introModal.append('div').attr('class', 'modal-actions cf');
-
- buttons.append('button')
- .attr('class', 'col6 walkthrough')
- .text(t('splash.walkthrough'))
- .on('click', function() {
- d3.select(document.body).call(iD.ui.intro(context));
- modal.close();
- });
-
- buttons.append('button')
- .attr('class', 'col6 start')
- .text(t('splash.start'))
- .on('click', modal.close);
-
- modal.select('button.close').attr('class','hide');
-
- };
-};
-iD.ui.Status = function(context) {
- var connection = context.connection(),
- errCount = 0;
-
- return function(selection) {
-
- function update() {
-
- connection.status(function(err, apiStatus) {
-
- selection.html('');
-
- if (err && errCount++ < 2) return;
-
- if (err) {
- selection.text(t('status.error'));
-
- } else if (apiStatus === 'readonly') {
- selection.text(t('status.readonly'));
-
- } else if (apiStatus === 'offline') {
- selection.text(t('status.offline'));
- }
-
- selection.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
- if (!err) errCount = 0;
-
- });
- }
-
- connection.on('auth', function() { update(selection); });
- window.setInterval(update, 90000);
- update(selection);
- };
-};
-iD.ui.Success = function(connection) {
- var event = d3.dispatch('cancel', 'save');
-
- function success(selection) {
- var changeset = selection.datum(),
- header = selection.append('div').attr('class', 'header modal-section'),
- body = selection.append('div').attr('class', 'body');
-
- header.append('h3').text(t('just_edited'));
-
- var m = changeset.comment ?
- changeset.comment.substring(0, 130) : '';
-
- var message = (m || 'Edited OSM!') + ' ' +
- connection.changesetURL(changeset.id);
-
- var links = body.append('div').attr('class','modal-actions cf');
-
- links.append('a')
- .attr('class','col4 osm')
- .attr('target', '_blank')
- .attr('href', function() {
- return connection.changesetURL(changeset.id);
- })
- .text(t('view_on_osm'));
-
- links.append('a')
- .attr('class','col4 twitter')
- .attr('target', '_blank')
- .attr('href', function() {
- return 'https://twitter.com/intent/tweet?source=webclient&text=' +
- encodeURIComponent(message);
- })
- .text('Tweet');
-
- links.append('a')
- .attr('class','col4 facebook')
- .attr('target', '_blank')
- .attr('href', function() {
- return 'https://facebook.com/sharer/sharer.php?u=' + encodeURIComponent(message);
- })
- .text('Share on Facebook');
-
- var section = body.append('div').attr('class','modal-section cf');
-
- section.append('button')
- .attr('class', 'action col2')
- .on('click.save', function() {
- event.cancel();
- })
- .text('Okay')
- .node().focus();
- }
-
- return d3.rebind(success, event, 'on');
-};
-iD.ui.TagEditor = function(context, entity) {
- var event = d3.dispatch('changeTags', 'choose', 'close'),
- presets = context.presets(),
- id = entity.id,
- tags = _.clone(entity.tags),
- preset,
- selection_,
- presetUI,
- tagList;
-
- function update() {
- var entity = context.hasEntity(id);
- if (!entity) return;
-
- tags = _.clone(entity.tags);
-
- // change preset if necessary (undos/redos)
- var newmatch = presets.match(entity, context.graph());
- if (newmatch !== preset) {
- tageditor(selection_, newmatch);
- return;
- }
-
- presetUI.change(tags);
- tagList.tags(tags);
- }
-
- function tageditor(selection, newpreset) {
- selection_ = selection;
- var geometry = entity.geometry(context.graph());
-
- if (!preset) preset = presets.match(entity, context.graph());
-
- // preset was explicitly chosen
- if (newpreset) {
- tags = preset.removeTags(tags, geometry);
-
- newpreset.applyTags(tags, geometry);
- preset = newpreset;
- }
-
- selection
- .datum(preset)
- .html('');
-
- var messagewrap = selection.append('div')
- .attr('class', 'header fillL cf');
-
- messagewrap.append('button')
- .attr('class', 'preset-reset fl ')
- .on('click', function() {
- event.choose(preset);
- })
- .append('span')
- .attr('class', 'icon back');
-
- messagewrap.append('h3')
- .attr('class', 'inspector-inner')
- .text(t('inspector.editing_feature', { feature: preset.name() }));
-
- messagewrap.append('button')
- .attr('class', 'preset-close fr')
- .on('click', event.close)
- .append('span')
- .attr('class', 'icon close');
-
- var editorwrap = selection.append('div')
- .attr('class', 'tag-wrap inspector-body fillL2 inspector-body-' + geometry);
-
- editorwrap.append('div')
- .attr('class', 'col12 inspector-inner preset-icon-wrap')
- .append('div')
- .attr('class','fillL')
- .call(iD.ui.PresetIcon(context.geometry(entity.id)));
-
- presetUI = iD.ui.preset(context, entity, preset)
- .on('change', changeTags)
- .on('close', event.close);
-
- tagList = iD.ui.Taglist(context, entity)
- .on('change', changeTags);
-
- var tageditorpreset = editorwrap.append('div')
- .attr('class', 'inspector-preset cf fillL col12')
- .call(presetUI);
-
- editorwrap.append('div')
- .attr('class', 'inspector-inner col12 additional-tags')
- .call(tagList, preset.id === 'other');
-
- if (!entity.isNew()) {
- var osmLink = tageditorpreset.append('div')
- .attr('class', 'col12 inspector-inner')
- .append('a')
- .attr('href', context.connection().entityURL(entity))
- .attr('target', '_blank');
-
- osmLink.append('span')
- .attr('class','icon icon-pre-text out-link');
-
- osmLink.append('span').text(t('inspector.view_on_osm'));
- }
-
- presetUI.change(tags);
- tagList.tags(tags);
-
- changeTags();
-
- context.history()
- .on('change.tag-editor', update);
- }
-
- function clean(o) {
- var out = {};
- for (var k in o) {
- var v = o[k].trim();
- if (v) out[k] = v;
- }
- return out;
- }
-
- function changeTags(changed) {
- tags = clean(_.extend(tags, changed));
- event.changeTags(_.clone(tags));
- }
-
- tageditor.close = function() {
- // Blur focused element so that tag changes are dispatched
- // See #1295
- document.activeElement.blur();
-
- // Firefox incorrectly implements blur, so typeahead elements
- // are not correctly removed. Remove any stragglers manually.
- d3.selectAll('div.typeahead').remove();
-
- context.history()
- .on('change.tag-editor', null);
- };
-
- return d3.rebind(tageditor, event, 'on');
-};
-iD.ui.TagReference = function(entity, tag) {
- var taginfo = iD.taginfo(), wrap, showing = false;
-
- function findLocal(docs) {
- var locale = iD.detect().locale.toLowerCase(),
- localized;
-
- localized = _.find(docs, function(d) {
- return d.lang.toLowerCase() === locale;
- });
- if (localized) return localized;
-
- // try the non-regional version of a language, like
- // 'en' if the language is 'en-US'
- if (locale.indexOf('-') !== -1) {
- var first = locale.split('-')[0];
- localized = _.find(docs, function(d) {
- return d.lang.toLowerCase() === first;
- });
- if (localized) return localized;
- }
-
- // finally fall back to english
- return _.find(docs, function(d) {
- return d.lang.toLowerCase() === 'en';
- });
- }
-
- function tagReference(selection) {
- wrap = selection.append('div')
- .attr('class', 'tag-help cf');
- }
-
- tagReference.show = function() {
-
- var referenceBody = wrap.selectAll('.tag-reference-wrap')
- .data([this])
- .enter().append('div')
- .attr('class', 'tag-reference-wrap cf')
- .style('opacity', 0);
-
- function show() {
- referenceBody
- .transition()
- .style('opacity', 1);
- }
-
- taginfo.docs(tag, function(err, docs) {
-
- if (!err && docs) {
- docs = findLocal(docs);
- }
-
- if (!docs || !docs.description) {
- referenceBody.append('p').text(t('inspector.no_documentation_key'));
- show();
- return;
- }
-
- if (docs.image && docs.image.thumb_url_prefix) {
- referenceBody
- .append('img')
- .attr('class', 'wiki-image')
- .attr('src', docs.image.thumb_url_prefix + "100" + docs.image.thumb_url_suffix)
- .on('load', function() { show(); })
- .on('error', function() { d3.select(this).remove(); show(); });
- } else {
- show();
- }
-
- referenceBody
- .append('p')
- .text(docs.description);
-
- var wikiLink = referenceBody
- .append('a')
- .attr('target', '_blank')
- .attr('href', 'http://wiki.openstreetmap.org/wiki/' + docs.title);
-
- wikiLink.append('span')
- .attr('class','icon icon-pre-text out-link');
-
- wikiLink.append('span')
- .text(t('inspector.reference'));
- });
-
- wrap.style('max-height', '0px')
- .style('opacity', '0')
- .transition()
- .duration(200)
- .delay(100)
- .style('max-height', '200px')
- .style('opacity', '1');
-
- showing = true;
- };
-
- tagReference.hide = function() {
- wrap.transition()
- .duration(200)
- .style('max-height', '0px')
- .style('opacity', '0');
-
- showing = false;
- };
-
- tagReference.toggle = function() {
- showing ? tagReference.hide() : tagReference.show();
- };
-
- return tagReference;
-};iD.ui.Taglist = function(context, entity) {
- var event = d3.dispatch('change'),
- taginfo = iD.taginfo(),
- collapsebutton,
- list;
-
- function taglist(selection, other) {
-
- collapsebutton = selection.append('a')
- .attr('href','#')
- .attr('class','hide-toggle')
- .text(t('inspector.all_tags'))
- .on('click', function() {
- iD.ui.Taglist.expanded = wrap.classed('hide');
- collapsebutton.classed('expanded', iD.ui.Taglist.expanded);
- wrap.call(iD.ui.Toggle(iD.ui.Taglist.expanded));
- selection.node().parentNode.scrollTop += 200;
- })
- .classed('expanded', iD.ui.Taglist.expanded || other);
-
- var wrap = selection.append('div')
- .classed('hide', !iD.ui.Taglist.expanded && !other);
-
- list = wrap.append('ul')
- .attr('class', 'tag-list');
-
- var newTag = wrap.append('button')
- .attr('class', 'add-tag col6')
- .on('click', addTag);
-
- newTag.append('span')
- .attr('class', 'icon plus');
-
- newTag.append('span')
- .attr('class', 'label')
- .text(t('inspector.new_tag'));
- }
-
- function drawTags(tags) {
-
- var count = Object.keys(tags).filter(function(d) { return d; }).length;
- collapsebutton.text(t('inspector.all_tags') + ' (' + count + ')');
-
- tags = d3.entries(tags);
-
- if (!tags.length) {
- tags = [{key: '', value: ''}];
- }
-
- tags.forEach(function(tag) {
- tag.reference = iD.ui.TagReference(entity, {key: tag.key});
- });
-
- var li = list.html('')
- .selectAll('li')
- .data(tags, function(d) { return d.key; });
-
- li.exit().remove();
-
- var row = li.enter().append('li')
- .attr('class', 'tag-row');
-
- row.append('div')
- .attr('class', 'key-wrap col6')
- .append('input')
- .property('type', 'text')
- .attr('class', 'key')
- .attr('maxlength', 255)
- .property('value', function(d) { return d.key; })
- .on('blur', keyChange)
- .on('change', keyChange);
-
- function keyChange(d) {
- d.key = this.value;
- event.change(taglist.tags());
- }
-
- row.append('div')
- .attr('class', 'input-wrap-position col6')
- .append('input')
- .property('type', 'text')
- .attr('class', 'value')
- .attr('maxlength', 255)
- .property('value', function(d) { return d.value; })
- .on('blur', valueChange)
- .on('change', valueChange)
- .on('keydown.push-more', pushMore);
-
- function valueChange(d) {
- d.value = this.value;
- event.change(taglist.tags());
- }
-
- row.each(bindTypeahead);
-
- row.append('button')
- .attr('tabindex', -1)
- .attr('class','remove minor')
- .on('click', removeTag)
- .append('span')
- .attr('class', 'icon delete');
-
- row.append('button')
- .attr('tabindex', -1)
- .attr('class', 'tag-help-button minor')
- .on('click', function(tag) {
- tags.forEach(function(other) {
- if (other.key === tag.key) {
- other.reference.toggle();
- } else {
- other.reference.hide();
- }
- });
- })
- .append('span')
- .attr('class', 'icon inspect');
-
- row.each(function(tag) {
- d3.select(this).call(tag.reference);
- });
-
- return li;
- }
-
- function pushMore() {
- if (d3.event.keyCode === 9 &&
- list.selectAll('li:last-child input.value').node() === this &&
- !d3.event.shiftKey) {
- addTag();
- d3.event.preventDefault();
- }
- }
-
- function bindTypeahead() {
- var geometry = entity.geometry(context.graph()),
- row = d3.select(this),
- key = row.selectAll('input.key'),
- value = row.selectAll('input.value');
-
- function sort(value, data) {
- var sameletter = [],
- other = [];
- for (var i = 0; i < data.length; i++) {
- if (data[i].value.substring(0, value.length) === value) {
- sameletter.push(data[i]);
- } else {
- other.push(data[i]);
- }
- }
- return sameletter.concat(other);
- }
-
- key.call(d3.combobox()
- .fetcher(function(value, __, callback) {
- taginfo.keys({
- debounce: true,
- geometry: geometry,
- query: value
- }, function(err, data) {
- if (!err) callback(sort(value, data));
- });
- }));
-
- value.call(d3.combobox()
- .fetcher(function(value, __, callback) {
- taginfo.values({
- debounce: true,
- key: key.property('value'),
- geometry: geometry,
- query: value
- }, function(err, data) {
- if (!err) callback(sort(value, data));
- });
- }));
- }
-
- function addTag() {
- var tags = taglist.tags();
- tags[''] = '';
- drawTags(tags);
- list.selectAll('li:last-child input.key').node().focus();
- }
-
- function removeTag(d) {
- var tags = taglist.tags();
- tags[d.key] = '';
- event.change(tags);
- delete tags[d.key];
- drawTags(tags);
- }
-
- taglist.tags = function(tags) {
- if (!arguments.length) {
- tags = {};
- list.selectAll('li').each(function() {
- var row = d3.select(this),
- key = row.selectAll('.key').property('value'),
- value = row.selectAll('.value').property('value');
- if (key !== '') tags[key] = value;
- });
- return tags;
- } else {
- drawTags(tags);
- }
- };
-
- return d3.rebind(taglist, event, 'on');
-};
-iD.ui.Tail = function() {
- var text = false,
- container,
- inner,
- xmargin = 25,
- tooltip_size = [0, 0],
- selection_size = [0, 0],
- transformProp = iD.util.prefixCSSProperty('Transform');
-
- function tail(selection) {
- d3.select(window).on('resize.tail-size', function() {
- selection_size = selection.size();
- });
-
- function setup() {
- container = d3.select(document.body)
- .append('div')
- .style('display', 'none')
- .attr('class', 'tail tooltip-inner');
-
- inner = container.append('div');
-
- selection
- .on('mousemove.tail', mousemove)
- .on('mouseover.tail', mouseover)
- .on('mouseout.tail', mouseout);
-
- container
- .on('mousemove.tail', mousemove);
-
- selection_size = selection.size();
- }
-
- function show() {
- container.style('display', 'block');
- tooltip_size = container.size();
- }
-
- function mousemove() {
- if (text === false) return;
- if (container.style('display') === 'none') show();
- var xoffset = ((d3.event.clientX + tooltip_size[0] + xmargin) > selection_size[0]) ?
- -tooltip_size[0] - xmargin : xmargin;
- container.classed('left', xoffset > 0);
- container.style(transformProp, 'translate(' +
- (~~d3.event.clientX + xoffset) + 'px,' +
- ~~d3.event.clientY + 'px)');
- }
-
- function mouseout() {
- if (d3.event.relatedTarget !== container.node() &&
- text !== false) container.style('display', 'none');
- }
-
- function mouseover() {
- if (d3.event.relatedTarget !== container.node() &&
- text !== false) show();
- }
-
- if (!container) setup();
- }
-
- tail.text = function(_) {
- if (!arguments.length) return text;
- if (_ === false) {
- text = _;
- container.style('display', 'none');
- return tail;
- }
- text = _;
- inner.text(text);
- tooltip_size = container.size();
- return tail;
- };
-
- return tail;
-};
-// toggles the visibility of ui elements, using a combination of the
-// hide class, which sets display=none, and a d3 transition for opacity.
-// this will cause blinking when called repeatedly, so check that the
-// value actually changes between calls.
-iD.ui.Toggle = function(show, callback) {
- return function(selection) {
- selection
- .style('opacity', show ? 0 : 1)
- .classed('hide', false)
- .transition()
- .style('opacity', show ? 1 : 0)
- .each('end', function() {
- d3.select(this).classed('hide', !show);
- if (callback) callback.apply(this);
- });
- };
-};
-iD.ui.UndoRedo = function(context) {
- return function(selection) {
- var tooltip = bootstrap.tooltip()
- .placement('bottom')
- .html(true);
-
- var undoButton = selection.append('button')
- .attr('class', 'col6 disabled')
- .html('<span class="undo icon"/>')
- .on('click', context.undo)
- .call(tooltip);
-
- var redoButton = selection.append('button')
- .attr('class', 'col6 disabled')
- .html('<span class="redo icon"/>')
- .on('click', context.redo)
- .call(tooltip);
-
- var keybinding = d3.keybinding('undo')
- .on(iD.ui.cmd('⌘Z'), context.undo)
- .on(iD.ui.cmd('⌘⇧Z'), context.redo);
-
- d3.select(document)
- .call(keybinding);
-
- context.history().on('change.editor', function() {
- var undo = context.history().undoAnnotation(),
- redo = context.history().redoAnnotation();
-
- function refreshTooltip(selection) {
- if (selection.property('tooltipVisible')) {
- selection.call(tooltip.show);
- }
- }
-
- undoButton
- .classed('disabled', !undo)
- .attr('data-original-title', iD.ui.tooltipHtml(undo || t('nothing_to_undo'), iD.ui.cmd('⌘Z')))
- .call(refreshTooltip);
-
- redoButton
- .classed('disabled', !redo)
- .attr('data-original-title', iD.ui.tooltipHtml(redo || t('nothing_to_redo'), iD.ui.cmd('⌘⇧Z')))
- .call(refreshTooltip);
- });
- };
-};
-iD.ui.Zoom = function(context) {
- var zooms = [{
- id: 'zoom-in',
- title: t('zoom.in'),
- action: context.zoomIn,
- key: '+'
- }, {
- id: 'zoom-out',
- title: t('zoom.out'),
- action: context.zoomOut,
- key: '-'
- }];
-
- return function(selection) {
- var button = selection.selectAll('button')
- .data(zooms)
- .enter().append('button')
- .attr('tabindex', -1)
- .attr('class', function(d) { return d.id; })
- .on('click.editor', function(d) { d.action(); })
- .call(bootstrap.tooltip()
- .placement('right')
- .html(true)
- .title(function(d) {
- return iD.ui.tooltipHtml(d.title, d.key);
- }));
-
- button.append('span')
- .attr('class', function(d) { return d.id + ' icon'; });
-
- var keybinding = d3.keybinding('zoom')
- .on('+', function() { context.zoomIn(); })
- .on('-', function() { context.zoomOut(); })
- .on('⇧=', function() { context.zoomIn(); })
- .on('dash', function() { context.zoomOut(); });
-
- d3.select(document)
- .call(keybinding);
- };
-};
-iD.ui.preset.access = function(field, context) {
- var event = d3.dispatch('change', 'close'),
- entity,
- items;
-
- function access(selection) {
- var wrap = selection.append('div')
- .attr('class', 'cf preset-input-wrap');
-
- items = wrap.append('ul').selectAll('li')
- .data(field.keys);
-
- var enter = items.enter()
- .append('li')
- .attr('class', function(d) { return 'cf preset-access-' + d; });
-
- enter.append('span')
- .attr('class', 'col6 label preset-label-access')
- .attr('for', function(d) { return 'preset-input-access-' + d; })
- .text(function(d) { return field.t('types.' + d); });
-
- enter.append('div')
- .attr('class', 'col6 preset-input-access-wrap')
- .append('input')
- .attr('type', 'text')
- .attr('class', 'preset-input-access')
- .attr('id', function(d) { return 'preset-input-access-' + d; })
- .on('change', change)
- .on('blur', change)
- .each(function(d) {
- d3.select(this)
- .call(d3.combobox()
- .data(access.options(d)));
- });
- }
-
- function change(d) {
- var tag = {};
- tag[d] = d3.select(this).property('value');
- event.change(tag);
- }
-
- access.options = function(type) {
- var options = ['no', 'permissive', 'private', 'designated', 'destination'];
-
- if (type != 'access') {
- options.unshift('yes');
- }
-
- return options.map(function(option) {
- return {
- title: field.t('options.' + option + '.description'),
- value: option
- };
- });
- };
-
- access.entity = function(_) {
- if (!arguments.length) return entity;
- entity = _;
- return access;
- };
-
- access.tags = function(tags) {
- items.selectAll('.preset-input-access')
- .property('value', function(d) { return tags[d] || ''; });
- return access;
- };
-
- access.focus = function() {
- items.selectAll('.preset-input-access')
- .node().focus();
- };
-
- return d3.rebind(access, event, 'on');
-};
-iD.ui.preset.address = function(field, context) {
-
- var event = d3.dispatch('change', 'close'),
- housename,
- housenumber,
- street,
- city,
- postcode,
- entity;
-
- function getStreets() {
-
- var extent = entity.extent(context.graph()),
- l = extent.center(),
- box = iD.geo.Extent(l).padByMeters(200);
-
- return context.intersects(box)
- .filter(isAddressable)
- .map(function(d) {
- var loc = context.projection([
- (extent[0][0] + extent[1][0]) / 2,
- (extent[0][1] + extent[1][1]) / 2]),
- closest = context.projection(iD.geo.chooseIndex(d, loc, context).loc);
- return {
- title: d.tags.name,
- value: d.tags.name,
- dist: iD.geo.dist(closest, loc)
- };
- }).sort(function(a, b) {
- return a.dist - b.dist;
- });
-
- function isAddressable(d) {
- return d.tags.highway && d.tags.name && d.type === 'way';
- }
- }
-
- function address(selection) {
-
- function close() { return iD.behavior.accept().on('accept', event.close); }
-
- var wrap = selection.append('div')
- .attr('class', 'preset-input-wrap');
-
- housename = wrap.append('input')
- .property('type', 'text')
- .attr('placeholder', field.t('placeholders.housename'))
- .attr('class', 'addr-housename')
- .attr('id', 'preset-input-' + field.id)
- .on('blur', change)
- .on('change', change)
- .call(close());
-
- housenumber = wrap.append('input')
- .property('type', 'text')
- .attr('placeholder', field.t('placeholders.number'))
- .attr('class', 'addr-number')
- .on('blur', change)
- .on('change', change)
- .call(close());
-
- street = wrap.append('input')
- .property('type', 'text')
- .attr('placeholder', field.t('placeholders.street'))
- .attr('class', 'addr-street')
- .on('blur', change)
- .on('change', change)
- .call(d3.combobox().data(getStreets()));
-
- city = wrap.append('input')
- .property('type', 'text')
- .attr('placeholder', field.t('placeholders.city'))
- .attr('class', 'addr-city')
- .on('blur', change)
- .on('change', change)
- .call(close());
-
- postcode = wrap.append('input')
- .property('type', 'text')
- .attr('placeholder', field.t('placeholders.postcode'))
- .attr('class', 'addr-postcode')
- .on('blur', change)
- .on('change', change)
- .call(close());
- }
-
- function change() {
- event.change({
- 'addr:housename': housename.property('value'),
- 'addr:housenumber': housenumber.property('value'),
- 'addr:street': street.property('value'),
- 'addr:city': city.property('value'),
- 'addr:postcode': postcode.property('value')
- });
- }
-
- address.entity = function(_) {
- if (!arguments.length) return entity;
- entity = _;
- return address;
- };
-
- address.tags = function(tags) {
- housename.property('value', tags['addr:housename'] || '');
- housenumber.property('value', tags['addr:housenumber'] || '');
- street.property('value', tags['addr:street'] || '');
- city.property('value', tags['addr:city'] || '');
- postcode.property('value', tags['addr:postcode'] || '');
- return address;
- };
-
- address.focus = function() {
- housename.node().focus();
- };
-
- return d3.rebind(address, event, 'on');
-};
-iD.ui.preset.check = function(field) {
-
- var event = d3.dispatch('change', 'close'),
- values = ['', 'yes', 'no'],
- value = '',
- box,
- text,
- label;
-
- var check = function(selection) {
-
- selection.classed('checkselect', 'true');
-
- label = selection.append('label')
- .attr('class', 'preset-input-wrap');
-
- box = label.append('input')
- .property('indeterminate', true)
- .attr('type', 'checkbox')
- .attr('id', 'preset-input-' + field.id);
-
- text = label.append('span')
- .text('unknown')
- .attr('class', 'value');
-
- box.on('click', function() {
- var t = {};
- t[field.key] = values[(values.indexOf(value) + 1) % 3];
- check.tags(t);
- event.change(t);
- d3.event.stopPropagation();
- });
- };
-
- check.tags = function(tags) {
- value = tags[field.key] || '';
- box.property('indeterminate', !value);
- box.property('checked', value === 'yes');
- text.text(value || 'unknown');
- label.classed('set', !!value);
- };
-
- check.focus = function() {
- box.node().focus();
- };
-
- return d3.rebind(check, event, 'on');
-};
-iD.ui.preset.combo = function(field) {
-
- var event = d3.dispatch('change', 'close'),
- input;
-
- function combo(selection) {
- var combobox = d3.combobox();
-
- input = selection.append('input')
- .attr('type', 'text')
- .attr('id', 'preset-input-' + field.id)
- .on('change', change)
- .on('blur', change)
- .call(combobox);
-
- if (field.options) {
- options(field.options);
- } else {
- iD.taginfo().values({
- key: field.key
- }, function(err, data) {
- if (!err) options(_.pluck(data, 'value'));
- });
- }
-
- function options(opts) {
- combobox.data(opts.map(function(d) {
- var o = {};
- o.title = o.value = d.replace('_', ' ');
- return o;
- }));
-
- input.attr('placeholder', function() {
- if (opts.length < 3) return '';
- return opts.slice(0, 3).join(', ') + '...';
- });
- }
- }
-
-
- function change() {
- var t = {};
- t[field.key] = input.property('value').replace(' ', '_');
- event.change(t);
- }
-
- combo.tags = function(tags) {
- input.property('value', tags[field.key] || '');
- };
-
- combo.focus = function() {
- input.node().focus();
- };
-
- return d3.rebind(combo, event, 'on');
-};
-iD.ui.preset.defaultcheck = function(field) {
-
- var event = d3.dispatch('change', 'close'),
- input;
-
- var check = function(selection) {
-
- input = selection.append('input')
- .attr('type', 'checkbox')
- .attr('id', 'preset-input-' + field.id)
- .on('change', function() {
- var t = {};
- t[field.key] = input.property('checked') ? field.value || 'yes' : undefined;
- event.change(t);
- });
- };
-
- check.tags = function(tags) {
- input.property('checked', !!tags[field.key] && tags[field.key] !== 'no');
- };
-
- check.focus = function() {
- input.node().focus();
- };
-
- return d3.rebind(check, event, 'on');
-};
-iD.ui.preset.text =
-iD.ui.preset.number =
-iD.ui.preset.tel =
-iD.ui.preset.email =
-iD.ui.preset.url = function(field) {
-
- var event = d3.dispatch('change', 'close'),
- input;
-
- function i(selection) {
- input = selection.append('input')
- .attr('type', field.type)
- .attr('id', 'preset-input-' + field.id)
- .attr('placeholder', field.placeholder || '')
- .on('blur', change)
- .on('change', change)
- .call(iD.behavior.accept().on('accept', event.close));
-
- function pm(elem, x) {
- var num = elem.value ?
- parseInt(elem.value, 10) : 0;
- if (!isNaN(num)) elem.value = num + x;
- change();
- }
-
- if (field.type == 'number') {
-
- input.attr('type', 'text');
-
- var numbercontrols = selection.append('div')
- .attr('class', 'spin-control');
-
- numbercontrols
- .append('button')
- .attr('class', 'increment')
- .on('click', function() {
- pm(input.node(), 1);
- });
- numbercontrols
- .append('button')
- .attr('class', 'decrement')
- .on('click', function() {
- pm(input.node(), -1);
- });
- }
- }
-
- function change() {
- var t = {};
- t[field.key] = input.property('value');
- event.change(t);
- }
-
- i.tags = function(tags) {
- input.property('value', tags[field.key] || '');
- };
-
- i.focus = function() {
- input.node().focus();
- };
-
- return d3.rebind(i, event, 'on');
-};
-iD.ui.preset.localized = function(field, context) {
-
- var event = d3.dispatch('change', 'close'),
- wikipedia = iD.wikipedia(),
- input, localizedInputs, wikiTitles;
-
- function i(selection) {
-
- input = selection.append('input')
- .attr('type', 'text')
- .attr('id', 'preset-input-' + field.id)
- .attr('class', 'localized-main')
- .attr('placeholder', field.placeholder || '')
- .on('blur', change)
- .on('change', change)
- .call(iD.behavior.accept().on('accept', event.close));
-
- selection.append('button')
- .attr('class', 'localized-add')
- .on('click', addBlank)
- .append('span')
- .attr('class', 'icon plus-dark');
-
- localizedInputs = selection.append('div')
- .attr('class', 'localized-wrap');
-
- }
-
- function addBlank() {
- var data = localizedInputs.selectAll('div.entry').data();
- data.push({ lang: '', value: '' });
- localizedInputs.call(render, data);
- }
-
- function change() {
- var t = {};
- t[field.key] = d3.select(this).property('value');
- event.change(t);
- }
-
- function key(lang) { return field.key + ':' + lang; }
-
- function changeLang(d) {
- var value = d3.select(this).property('value'),
- t = {},
- language = _.find(iD.data.wikipedia, function(d) {
- return d[0].toLowerCase() === value.toLowerCase() ||
- d[1].toLowerCase() === value.toLowerCase();
- });
-
- if (language) value = language[2];
-
- t[key(d.lang)] = '';
-
- if (d.value) {
- t[key(value)] = d.value;
- } else if (wikiTitles && wikiTitles[d.lang]) {
- t[key(value)] = wikiTitles[d.lang];
- }
-
- event.change(t);
-
- d.lang = value;
- }
-
- function changeValue(d) {
- var t = {};
- t[key(d.lang)] = d3.select(this).property('value') || '';
- event.change(t);
-
- }
-
- function fetcher(value, __, cb) {
- var v = value.toLowerCase();
-
- cb(iD.data.wikipedia.filter(function(d) {
- return d[0].toLowerCase().indexOf(v) >= 0 ||
- d[1].toLowerCase().indexOf(v) >= 0 ||
- d[2].toLowerCase().indexOf(v) >= 0;
- }).map(function(d) {
- return { value: d[1] };
- }));
- }
-
- function render(selection, data) {
- var wraps = selection.selectAll('div.entry').
- data(data, function(d) { return d.lang; });
-
- wraps.enter().insert('div', ':first-child')
- .attr('class', 'entry')
- .each(function(d) {
- var wrap = d3.select(this);
- var langcombo = d3.combobox().fetcher(fetcher);
-
- wrap.append('input')
- .attr('class', 'localized-lang')
- .attr('type', 'text')
- .on('blur', changeLang)
- .on('change', changeLang)
- .call(langcombo);
-
- wrap.append('input')
- .on('blur', changeValue)
- .on('change', changeValue)
- .attr('type', 'text')
- .attr('class', 'localized-value');
-
- wrap.append('button')
- .attr('class', 'localized-remove')
- .on('click', function(d) {
- var t = {};
- t[key(d.lang)] = '';
- event.change(t);
- d3.select(this.parentNode).remove();
- })
- .append('span').attr('class', 'icon remove');
-
- });
-
- wraps.exit().remove();
-
- selection.selectAll('.entry').select('.localized-lang').property('value', function(d) {
- var lang = _.find(iD.data.wikipedia, function(lang) {
- return lang[2] === d.lang;
- });
- return lang ? lang[1] : d.lang;
- });
-
- selection.selectAll('.entry').select('.localized-value').property('value', function(d) {
- return d.value;
- });
-
-
- }
-
- i.tags = function(tags) {
-
- // Fetch translations from wikipedia
- if (tags.wikipedia && !wikiTitles) {
- wikiTitles = {};
- var wm = tags.wikipedia.match(/([^:]+):(.+)/);
- if (wm && wm[0] && wm[1]) {
- wikipedia.translations(wm[1], wm[2], function(d) {
- wikiTitles = d;
- });
- }
- }
-
- input.property('value', tags[field.key] || '');
-
- var postfixed = [];
- for (var i in tags) {
- var m = i.match(new RegExp(field.key + ':([a-z]+)'));
- if (m && m[1]) {
- postfixed.push({ lang: m[1], value: tags[i]});
- }
- }
-
- localizedInputs.call(render, postfixed.reverse());
- };
-
- i.focus = function() {
- title.node().focus();
- };
-
- return d3.rebind(i, event, 'on');
-};
-iD.ui.preset.maxspeed = function(field, context) {
-
- var event = d3.dispatch('change', 'close'),
- entity,
- imperial,
- unitInput,
- combobox,
- input;
-
- var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
- imperialValues = [20, 25, 30, 40, 45, 50, 55, 65, 70];
-
- function maxspeed(selection) {
- combobox = d3.combobox();
- var unitCombobox = d3.combobox().data(['km/h', 'mph'].map(comboValues));
-
- input = selection.append('input')
- .attr('type', 'text')
- .attr('id', 'preset-input-' + field.id)
- .on('change', change)
- .on('blur', change)
- .call(combobox);
-
- var childNodes = context.graph().childNodes(context.entity(entity.id)),
- loc = childNodes[~~(childNodes.length/2)].loc;
-
- imperial = _.any(iD.data.imperial.features, function(f) {
- return _.any(f.geometry.coordinates, function(d) {
- return iD.geo.pointInPolygon(loc, d[0]);
- });
- });
-
- unitInput = selection.append('input')
- .attr('type', 'text')
- .attr('class', 'maxspeed-unit')
- .on('blur', changeUnits)
- .on('change', changeUnits)
- .call(unitCombobox);
-
- function changeUnits() {
- imperial = unitInput.property('value') === 'mph';
- unitInput.property('value', imperial ? 'mph' : 'km/h');
- setSuggestions();
- change();
- }
-
- }
-
- function setSuggestions() {
- combobox.data((imperial ? imperialValues : metricValues).map(comboValues));
- unitInput.property('value', imperial ? 'mph' : 'km/h');
- }
-
- function comboValues(d) {
- return {
- value: d.toString(),
- title: d.toString()
- };
- }
-
- function change() {
- var value = input.property('value');
- var t = {};
- if (value) {
- if (isNaN(value) || !imperial) {
- t[field.key] = value;
- } else {
- t[field.key] = value + ' mph';
- }
- } else {
- t[field.key] = '';
- }
- event.change(t);
- }
-
- maxspeed.tags = function(tags) {
- var value = tags[field.key];
-
- if (value && value.indexOf('mph') >= 0) {
- value = parseInt(value, 10);
- imperial = true;
- } else if (value) {
- imperial = false;
- }
-
- setSuggestions();
-
- input.property('value', value || '');
- };
-
- maxspeed.focus = function() {
- input.node().focus();
- };
-
- maxspeed.entity = function(_) {
- entity = _;
- };
-
- return d3.rebind(maxspeed, event, 'on');
-};
-iD.ui.preset.radio = function(field) {
-
- var event = d3.dispatch('change', 'close'),
- buttons;
-
- function radio(selection) {
- selection.classed('preset-radio', true);
-
- var buttonwrap = selection.append('div')
- .attr('class', 'preset-input-wrap toggle-list radio-wrap');
-
- buttons = buttonwrap.selectAll('button')
- .data(field.options || field.keys)
- .enter()
- .append('button')
- .text(function(d) { return field.t('options.' + d, { 'default': d }); })
- .on('click', function(d) {
- buttons.classed('active', function(e) { return d === e; });
- change();
- });
-
- buttonwrap.append('button')
- .attr('class','remove')
- .on('click', function() {
- buttons.classed('active', false);
- change();
- })
- .text(t('inspector.remove'))
- .append('span')
- .attr('class', 'icon remove');
- }
-
- function change() {
- var t = {};
- if (field.key) t[field.key] = null;
- buttons.each(function(d) {
- var active = d3.select(this).classed('active');
- if (field.key) {
- if (active) t[field.key] = d;
- } else {
- t[d] = active ? 'yes' : '';
- }
- });
- event.change(t);
- }
-
- radio.tags = function(tags) {
- buttons.classed('active', function(d) {
- if (field.key) {
- return tags[field.key] === d;
- } else {
- return tags[d] && tags[d] !== 'no';
- }
- });
- };
-
- radio.focus = function() {
- buttons.node().focus();
- };
-
- return d3.rebind(radio, event, 'on');
-};
-iD.ui.preset.textarea = function(field) {
-
- var event = d3.dispatch('change', 'close'),
- input;
-
- function i(selection) {
- input = selection.append('textarea')
- .attr('id', 'preset-input-' + field.id)
- .attr('placeholder', field.placeholder || '')
- .attr('maxlength', 255)
- .on('blur', change)
- .on('change', change)
- .call(iD.behavior.accept().on('accept', event.close));
- }
-
- function change() {
- var t = {};
- t[field.key] = input.text();
- event.change(t);
- }
-
- i.tags = function(tags) {
- input.text(tags[field.key] || '');
- };
-
- i.focus = function() {
- input.node().focus();
- };
-
- return d3.rebind(i, event, 'on');
-};
-iD.ui.preset.wikipedia = function(field, context) {
-
- var event = d3.dispatch('change', 'close'),
- wikipedia = iD.wikipedia(),
- language = iD.data.wikipedia[0],
- link, entity, lang, title;
-
- function i(selection) {
-
- var langcombo = d3.combobox()
- .fetcher(function(value, __, cb) {
- var v = value.toLowerCase();
-
- cb(iD.data.wikipedia.filter(function(d) {
- return d[0].toLowerCase().indexOf(v) >= 0 ||
- d[1].toLowerCase().indexOf(v) >= 0 ||
- d[2].toLowerCase().indexOf(v) >= 0;
- }).map(function(d) {
- return { value: d[1] };
- }));
- });
-
- var titlecombo = d3.combobox()
- .fetcher(function(value, __, cb) {
-
- if (!value) value = context.entity(entity.id).tags.name || '';
- var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
-
- searchfn(language && language[2], value, function(query, data) {
- cb(data.map(function(d) {
- return { value: d };
- }));
- });
- });
-
- lang = selection.append('input')
- .attr('type', 'text')
- .attr('class', 'wiki-lang')
- .on('blur', changeLang)
- .on('change', changeLang)
- .call(langcombo);
-
- title = selection.append('input')
- .attr('type', 'text')
- .attr('class', 'wiki-title')
- .attr('id', 'preset-input-' + field.id)
- .on('blur', change)
- .on('change', change)
- .call(titlecombo);
-
- link = selection.append('a')
- .attr('class', 'wiki-link minor')
- .attr('target', '_blank');
- link.append('span')
- .attr('class','icon out-link');
- }
-
- function changeLang() {
- var value = lang.property('value').toLowerCase();
- language = _.find(iD.data.wikipedia, function(d) {
- return d[0].toLowerCase() === value ||
- d[1].toLowerCase() === value ||
- d[2].toLowerCase() === value;
- }) || iD.data.wikipedia[0];
-
- if (value !== language[0]) {
- lang.property('value', language[1]);
- }
-
- change();
- }
-
- function change() {
- var t = {};
-
- var value = title.property('value');
-
- var m = value.match('http://([a-z]+)\\.wikipedia.org/wiki/(.*)'),
- newlanguage = m && m[1] && m[2] && _.find(iD.data.wikipedia, function(d) {
- return m[1] === d[2];
- });
-
- if (newlanguage) {
- // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
- value = m[2].replace(/_/g, ' ');
- value = value.slice(0, 1).toUpperCase() + value.slice(1);
- language = newlanguage;
- lang.property('value', language[0]);
- }
-
- t[field.key] = value ? language[2] + ':' + value : '';
- event.change(t);
- link.attr('href', 'http://' + language[2] + '.wikipedia.org/wiki/' + (value || ''));
- }
-
- i.tags = function(tags) {
- var m = tags[field.key] ? tags[field.key].match(/([^:]+):(.+)/) : null;
-
- var language = m && m[1] && m[2] && _.find(iD.data.wikipedia, function(d) {
- return m[1] === d[2];
- });
-
- // value in correct format
- if (language) {
- lang.property('value', language[1]);
- title.property('value', m[2]);
- link.attr('href', 'http://' + m[1] + '.wikipedia.org/wiki/' + m[2]);
-
- // unrecognized value format
- } else {
- lang.property('value', 'English');
- title.property('value', tags[field.key] || '');
- language = iD.data.wikipedia[0];
- link.attr('href', 'http://en.wikipedia.org/wiki/Special:Search?search=' + tags[field.key]);
- }
- };
-
- i.entity = function(_) {
- entity = _;
- };
-
- i.focus = function() {
- title.node().focus();
- };
-
- return d3.rebind(i, event, 'on');
-};
-iD.ui.intro.area = function(context, reveal) {
-
- var event = d3.dispatch('done'),
- timeout;
-
- var step = {
- name: 'Areas'
- };
-
- step.enter = function() {
-
- var playground = [-85.63552, 41.94159],
- corner = [-85.63565411045074, 41.9417715536927];
- context.map().centerZoom(playground, 19);
- reveal('button.add-area', 'intro.areas.add');
-
- context.on('enter.intro', addArea);
-
- function addArea(mode) {
- if (mode.id !== 'add-area') return;
- context.on('enter.intro', drawArea);
-
- var padding = 120 * Math.pow(2, context.map().zoom() - 19);
- var pointBox = iD.ui.intro.pad(context.projection(corner), padding);
- reveal(pointBox, 'intro.areas.corner');
-
- context.map().on('move.intro', function() {
- padding = 120 * Math.pow(2, context.map().zoom() - 19);
- pointBox = iD.ui.intro.pad(context.projection(corner), padding);
- reveal(pointBox, 'intro.areas.corner', 0);
- });
- }
-
- function drawArea(mode) {
- if (mode.id !== 'draw-area') return;
- context.on('enter.intro', enterSelect);
-
- var padding = 150 * Math.pow(2, context.map().zoom() - 19);
- var pointBox = iD.ui.intro.pad(context.projection(playground), padding);
- reveal(pointBox, 'intro.areas.place');
-
- context.map().on('move.intro', function() {
- padding = 150 * Math.pow(2, context.map().zoom() - 19);
- pointBox = iD.ui.intro.pad(context.projection(playground), padding);
- reveal(pointBox, 'intro.areas.place', 0);
- });
- }
-
- function enterSelect(mode) {
- if (mode.id !== 'select') return;
- context.map().on('move.intro', null);
- context.on('enter.intro', null);
-
- timeout = setTimeout(function() {
- reveal('.preset-grid-search-wrap input', 'intro.areas.search');
- d3.select('.preset-grid-search-wrap input').on('keyup.intro', keySearch);
- }, 500);
- }
-
- function keySearch() {
- var first = d3.select('.grid-button-wrap:first-child');
- if (first.datum().id === 'leisure/playground') {
- reveal(first.select('.grid-entry').node(), 'intro.areas.choose');
- d3.selection.prototype.one.call(context.history(), 'change.intro', selectedPreset);
- d3.select('.preset-grid-search-wrap input').on('keyup.intro', null);
- }
- }
-
- function selectedPreset() {
- reveal('.pane', 'intro.areas.describe');
- context.on('exit.intro', event.done);
- }
-
-
- };
-
- step.exit = function() {
- window.clearTimeout(timeout);
- context.on('enter.intro', null);
- context.on('exit.intro', null);
- context.history().on('change.intro', null);
- context.map().on('move.intro', null);
- d3.select('.preset-grid-search-wrap input').on('keyup.intro', null);
- };
-
- return d3.rebind(step, event, 'on');
-};
-iD.ui.intro.line = function(context, reveal) {
-
- var event = d3.dispatch('done'),
- timeouts = [];
-
- var step = {
- name: 'Lines'
- };
-
- function one(target, e, f) {
- d3.selection.prototype.one.call(target, e, f);
- }
-
- function timeout(f, t) {
- timeouts.push(window.setTimeout(f, t));
- }
-
- step.enter = function() {
-
- var centroid = [-85.62830, 41.95699];
- var midpoint = [-85.62975395449628, 41.95787501510204];
- var start = [-85.6297754121684, 41.9583158176903];
- var intersection = [-85.62974496187628, 41.95742515554585];
-
- context.map().centerZoom(start, 18);
- reveal('button.add-line', 'intro.lines.add');
-
- context.on('enter.intro', addLine);
-
- function addLine(mode) {
- if (mode.id !== 'add-line') return;
- context.on('enter.intro', drawLine);
-
- var padding = 150 * Math.pow(2, context.map().zoom() - 18);
- var pointBox = iD.ui.intro.pad(context.projection(start), padding);
- reveal(pointBox, 'intro.lines.start');
-
- context.map().on('move.intro', function() {
- padding = 150 * Math.pow(2, context.map().zoom() - 18);
- pointBox = iD.ui.intro.pad(context.projection(start), padding);
- reveal(pointBox, 'intro.lines.start', 0);
- });
- }
-
- function drawLine(mode) {
- if (mode.id !== 'draw-line') return;
- context.history().on('change.intro', addIntersection);
- context.on('enter.intro', retry);
-
- var padding = 300 * Math.pow(2, context.map().zoom() - 19);
- var pointBox = iD.ui.intro.pad(context.projection(midpoint), padding);
- reveal(pointBox, 'intro.lines.intersect');
-
- context.map().on('move.intro', function() {
- padding = 300 * Math.pow(2, context.map().zoom() - 19);
- pointBox = iD.ui.intro.pad(context.projection(midpoint), padding);
- reveal(pointBox, 'intro.lines.intersect', 0);
- });
- }
-
- // ended line before creating intersection
- function retry(mode) {
- if (mode.id !== 'select') return;
- var pointBox = iD.ui.intro.pad(context.projection(intersection), 30);
- reveal(pointBox, 'intro.lines.restart');
- timeout(function() {
- context.replace(iD.actions.DeleteMultiple(mode.selection()));
- step.exit();
- step.enter();
- }, 3000);
- }
-
- function addIntersection(changes) {
- if ( _.any(changes.created(), function(d) {
- return d.type === 'node' && context.graph().parentWays(d).length > 1;
- })) {
- context.history().on('change.intro', null);
- context.on('enter.intro', enterSelect);
-
- var padding = 900 * Math.pow(2, context.map().zoom() - 19);
- var pointBox = iD.ui.intro.pad(context.projection(centroid), padding);
- reveal(pointBox, 'intro.lines.finish');
-
- context.map().on('move.intro', function() {
- padding = 900 * Math.pow(2, context.map().zoom() - 19);
- pointBox = iD.ui.intro.pad(context.projection(centroid), padding);
- reveal(pointBox, 'intro.lines.finish', 0);
- });
- }
- }
-
- function enterSelect(mode) {
- if (mode.id !== 'select') return;
- context.map().on('move.intro', null);
- context.on('enter.intro', null);
- d3.select('#curtain').style('pointer-events', 'all');
-
- timeout(function() {
- d3.select('#curtain').style('pointer-events', 'none');
- var road = d3.select('.preset-grid .grid-entry').filter(function(d) {
- return d.id === 'category-road';
- });
- reveal(road.node(), 'intro.lines.road');
- road.one('click.intro', roadCategory);
- }, 500);
- }
-
- function roadCategory() {
- timeout(function() {
- var grid = d3.select('.subgrid');
- reveal(grid.node(), 'intro.lines.residential');
- grid.selectAll('.grid-entry').filter(function(d) {
- return d.id === 'highway/residential';
- }).one('click.intro', roadDetails);
- }, 200);
- }
-
- function roadDetails() {
- reveal('.pane', 'intro.lines.describe');
- context.on('exit.intro', event.done);
- }
-
- };
-
- step.exit = function() {
- d3.select('#curtain').style('pointer-events', 'none');
- timeouts.forEach(window.clearTimeout);
- context.on('enter.intro', null);
- context.on('exit.intro', null);
- context.map().on('move.intro', null);
- context.history().on('change.intro', null);
- };
-
- return d3.rebind(step, event, 'on');
-};
-iD.ui.intro.navigation = function(context, reveal) {
-
- var event = d3.dispatch('done'),
- timeouts = [];
-
- var step = {
- name: 'Navigation'
- };
-
- function set(f, t) {
- timeouts.push(window.setTimeout(f, t));
- }
-
- /*
- * Steps:
- * Drag map
- * Select poi
- * Show editor header
- * Show editor pane
- * Select road
- * Show header
- */
-
- step.enter = function() {
-
- var map = {
- left: 30,
- top: 60,
- width: window.innerWidth - 400,
- height: window.innerHeight - 200
- };
-
- context.map().centerZoom([-85.63591, 41.94285], 19);
-
- reveal(map, 'intro.navigation.drag');
-
- context.map().on('move.intro', _.debounce(function() {
- context.map().on('move.intro', null);
- townhall();
- context.on('enter.intro', inspectTownHall);
- }, 400));
-
- function townhall() {
- var hall = [-85.63645945147184, 41.942986488012565];
- var point = context.projection(hall);
-
- if (point[0] < 0 || point[0] > window.innerWidth - 200 ||
- point[1] < 0 || point[1] > window.innerHeight) {
- context.map().center(hall);
- point = context.projection(hall);
- }
- var box = iD.ui.intro.pointBox(point);
- reveal(box, 'intro.navigation.select');
-
- context.map().on('move.intro', function() {
- var box = iD.ui.intro.pointBox(context.projection(hall));
- reveal(box, 'intro.navigation.select', 0);
- });
- }
-
- function inspectTownHall(mode) {
- if (mode.id !== 'select') return;
- context.on('enter.intro', null);
- context.map().on('move.intro', null);
- set(function() {
- reveal('.tag-pane', 'intro.navigation.pane');
- context.on('exit.intro', event.done);
- }, 700);
- }
-
- };
-
- step.exit = function() {
- context.map().on('move.intro', null);
- context.on('enter.intro', null);
- context.on('exit.intro', null);
- timeouts.forEach(window.clearTimeout);
- };
-
- return d3.rebind(step, event, 'on');
-};
-iD.ui.intro.point = function(context, reveal) {
-
- var event = d3.dispatch('done'),
- timeouts = [];
-
- var step = {
- name: 'Points'
- };
-
- function setTimeout(f, t) {
- timeouts.push(window.setTimeout(f, t));
- }
-
- step.enter = function() {
-
- context.map().centerZoom([-85.63279, 41.94394], 19);
- reveal('button.add-point', 'intro.points.add');
-
- var corner = [-85.632481,41.944094];
-
- context.on('enter.intro', addPoint);
-
- function addPoint(mode) {
- if (mode.id !== 'add-point') return;
- context.on('enter.intro', enterSelect);
-
- var pointBox = iD.ui.intro.pad(context.projection(corner), 150);
- reveal(pointBox, 'intro.points.place');
-
- context.map().on('move.intro', function() {
- pointBox = iD.ui.intro.pad(context.projection(corner), 150);
- reveal(pointBox, 'intro.points.place', 0);
- });
-
- }
-
- function enterSelect(mode) {
- if (mode.id !== 'select') return;
- context.map().on('move.intro', null);
- context.on('enter.intro', null);
-
- setTimeout(function() {
- reveal('.preset-grid-search-wrap input', 'intro.points.search');
- d3.select('.preset-grid-search-wrap input').on('keyup.intro', keySearch);
- }, 500);
- }
-
- function keySearch() {
- var first = d3.select('.grid-button-wrap:first-child');
- if (first.datum().id === 'amenity/cafe') {
- reveal(first.select('.grid-entry').node(), 'intro.points.choose');
- d3.selection.prototype.one.call(context.history(), 'change.intro', selectedPreset);
-
- d3.select('.preset-grid-search-wrap input').on('keydown.intro', function() {
- // Prevent search from updating and changing the grid
- d3.event.stopPropagation();
- d3.event.preventDefault();
- }, true).on('keyup.intro', null);
- }
- }
-
- function selectedPreset() {
- setTimeout(function() {
- reveal('.tag-wrap', 'intro.points.describe');
- context.history().on('change.intro', closeEditor);
- context.on('exit.intro', selectPoint);
- }, 400);
- }
-
- function closeEditor() {
- d3.select('.preset-grid-search-wrap input').on('keydown.intro', null);
- context.history().on('change.intro', null);
- reveal('.tag-pane', 'intro.points.close');
- }
-
- function selectPoint() {
- context.on('exit.intro', null);
- context.history().on('change.intro', null);
- context.on('enter.intro', enterReselect);
-
- var pointBox = iD.ui.intro.pad(context.projection(corner), 150);
- reveal(pointBox, 'intro.points.reselect');
-
- context.map().on('move.intro', function() {
- pointBox = iD.ui.intro.pad(context.projection(corner), 150);
- reveal(pointBox, 'intro.points.reselect', 0);
- });
- }
-
- function enterReselect(mode) {
- if (mode.id !== 'select') return;
- context.map().on('move.intro', null);
- context.on('enter.intro', null);
-
- setTimeout(function() {
- reveal('.tag-pane', 'intro.points.fixname');
- context.on('exit.intro', deletePoint);
- }, 500);
- }
-
- function deletePoint() {
- context.on('exit.intro', null);
- context.on('enter.intro', enterDelete);
-
- var pointBox = iD.ui.intro.pad(context.projection(corner), 150);
- reveal(pointBox, 'intro.points.reselect_delete');
-
- context.map().on('move.intro', function() {
- pointBox = iD.ui.intro.pad(context.projection(corner), 150);
- reveal(pointBox, 'intro.points.reselect_delete', 0);
- });
- }
-
- function enterDelete(mode) {
- if (mode.id !== 'select') return;
- context.map().on('move.intro', null);
- context.on('enter.intro', null);
- context.on('exit.intro', deletePoint);
- context.map().on('move.intro', deletePoint);
- context.history().on('change.intro', deleted);
-
- setTimeout(function() {
- var node = d3.select('.radial-menu-item-delete').node();
- var pointBox = iD.ui.intro.pad(node.getBoundingClientRect(), 50);
- reveal(pointBox, 'intro.points.delete');
- }, 300);
- }
-
- function deleted(changed) {
- if (changed.deleted().length) event.done();
- }
-
- };
-
- step.exit = function() {
- timeouts.forEach(window.clearTimeout);
- context.on('exit.intro', null);
- context.on('enter.intro', null);
- context.map().on('move.intro', null);
- context.history().on('change.intro', null);
- d3.select('.preset-grid-search-wrap input').on('keyup.intro', null).on('keydown.intro', null);
- };
-
- return d3.rebind(step, event, 'on');
-};
-iD.ui.intro.startEditing = function(context, reveal) {
-
- var event = d3.dispatch('done', 'startEditing'),
- modal,
- timeouts = [];
-
- var step = {
- name: 'Start Editing'
- };
-
- function timeout(f, t) {
- timeouts.push(window.setTimeout(f, t));
- }
-
- step.enter = function() {
-
- reveal('.map-control.help-control', 'intro.startediting.help');
-
- timeout(function() {
- reveal('#bar button.save', 'intro.startediting.save');
- }, 3500);
-
- timeout(function() {
- reveal('#surface');
- }, 7000);
-
- timeout(function() {
- modal = iD.ui.modal(context.container());
-
- modal.select('.modal')
- .attr('class', 'modal-splash modal col6');
-
- modal.selectAll('.close').remove();
-
- var startbutton = modal.select('.content')
- .attr('class', 'fillL')
- .append('button')
- .attr('class', 'modal-section huge-modal-button')
- .on('click', function() {
- modal.remove();
- });
-
- startbutton.append('div')
- .attr('class','illustration');
- startbutton.append('h2')
- .text(t('intro.startediting.start'));
-
- event.startEditing();
-
- }, 7500);
- };
-
- step.exit = function() {
- if (modal) modal.remove();
- timeouts.forEach(window.clearTimeout);
- };
-
- return d3.rebind(step, event, 'on');
-};
-iD.presets = function(context) {
-
- // an iD.presets.Collection with methods for
- // loading new data and returning defaults
-
- var all = iD.presets.Collection([]),
- defaults = { area: all, line: all, point: all, vertex: all },
- fields = {},
- universal = [],
- recent = iD.presets.Collection([]),
- other,
- other_area;
-
- all.load = function(d) {
-
- if (d.fields) {
- _.forEach(d.fields, function(d, id) {
- fields[id] = iD.presets.Field(id, d);
- if (d.universal) universal.push(fields[id]);
- });
- }
-
- if (d.presets) {
- _.forEach(d.presets, function(d, id) {
- all.collection.push(iD.presets.Preset(id, d, fields));
- });
- }
-
- if (d.categories) {
- _.forEach(d.categories, function(d, id) {
- all.collection.push(iD.presets.Category(id, d, all));
- });
- }
-
- if (d.defaults) {
- var getItem = _.bind(all.item, all);
- defaults = {
- area: iD.presets.Collection(d.defaults.area.map(getItem)),
- line: iD.presets.Collection(d.defaults.line.map(getItem)),
- point: iD.presets.Collection(d.defaults.point.map(getItem)),
- vertex: iD.presets.Collection(d.defaults.vertex.map(getItem))
- };
- }
-
- other = all.item('other');
- other_area = all.item('other_area');
-
- return all;
- };
-
- all.field = function(id) {
- return fields[id];
- };
-
- all.universal = function() {
- return universal;
- };
-
- all.defaults = function(entity, n) {
- var geometry = entity.geometry(context.graph()),
- rec = recent.matchGeometry(geometry).collection.slice(0, 4),
- def = _.uniq(rec.concat(defaults[geometry].collection)).slice(0, n - 1);
- return iD.presets.Collection(_.unique(rec.concat(def).concat(geometry === 'area' ? other_area : other)));
- };
-
- all.choose = function(preset) {
- if (preset !== other && preset !== other_area) {
- recent = iD.presets.Collection(_.unique([preset].concat(recent.collection)));
- }
- return all;
- };
-
- return all;
-};
-iD.presets.Category = function(id, category, all) {
- category = _.clone(category);
-
- category.id = id;
-
- category.members = iD.presets.Collection(category.members.map(function(id) {
- return all.item(id);
- }));
-
- category.matchGeometry = function(geometry) {
- return category.geometry.indexOf(geometry) >= 0;
- };
-
- category.matchTags = function() { return false; };
-
- category.name = function() {
- return t('presets.categories.' + id + '.name', {'default': id});
- };
-
- category.terms = function() {
- return [];
- };
-
- return category;
-};
-iD.presets.Collection = function(collection) {
-
- var presets = {
-
- collection: collection,
-
- item: function(id) {
- return _.find(collection, function(d) {
- return d.id === id;
- });
- },
-
- match: function(entity, resolver) {
- return presets.matchGeometry(entity.geometry(resolver)).matchTags(entity);
- },
-
- matchGeometry: function(geometry) {
- return iD.presets.Collection(collection.filter(function(d) {
- return d.matchGeometry(geometry);
- }));
- },
-
- matchTags: function(entity) {
-
- var best = -1,
- match;
-
- for (var i = 0; i < collection.length; i++) {
- var score = collection[i].matchTags(entity);
- if (score > best) {
- best = score;
- match = collection[i];
- }
- }
-
- return match;
- },
-
- search: function(value) {
- if (!value) return this;
-
- value = value.toLowerCase();
-
- var searchable = _.filter(collection, function(a) {
- return a.searchable !== false;
- });
-
- var leading_name = _.filter(searchable, function(a) {
- return leading(a.name().toLowerCase());
- }).sort(function(a, b) {
- var i = a.name().toLowerCase().indexOf(value) - b.name().toLowerCase().indexOf(value);
- if (i === 0) return a.name().length - b.name().length;
- else return i;
- }),
- leading_terms = _.filter(searchable, function(a) {
- return _.any(a.terms() || [], leading);
- });
-
- function leading(a) {
- var index = a.indexOf(value);
- return index === 0 || a[index - 1] === ' ';
- }
-
- var levenstein_name = searchable.map(function(a) {
- return {
- preset: a,
- dist: iD.util.editDistance(value, a.name().toLowerCase())
- };
- }).filter(function(a) {
- return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
- }).sort(function(a, b) {
- return a.dist - b.dist;
- }).map(function(a) {
- return a.preset;
- }),
- leventstein_terms = _.filter(searchable, function(a) {
- return _.any(a.terms() || [], function(b) {
- return iD.util.editDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
- });
- });
-
- var other = presets.item('other');
-
- return iD.presets.Collection(
- _.unique(
- leading_name.concat(
- leading_terms,
- levenstein_name,
- leventstein_terms,
- other)));
- }
- };
-
- return presets;
-};
-iD.presets.Field = function(id, field) {
- field = _.clone(field);
-
- field.id = id;
-
- field.matchGeometry = function(geometry) {
- return !field.geometry || field.geometry.indexOf(geometry) >= 0;
- };
-
- field.t = function(scope, options) {
- return t('presets.fields.' + id + '.' + scope, options);
- };
-
- field.label = function() {
- return field.t('label', {'default': id});
- };
-
- return field;
-};
-iD.presets.Preset = function(id, preset, fields) {
- preset = _.clone(preset);
-
- preset.id = id;
- preset.fields = (preset.fields || []).map(getFields);
-
- function getFields(f) {
- return fields[f];
- }
-
- preset.matchGeometry = function(geometry) {
- return preset.geometry.indexOf(geometry) >= 0;
- };
-
- preset.matchTags = function(entity) {
- var tags = preset.tags,
- score = 0;
- for (var t in tags) {
- if (entity.tags[t] === tags[t]) {
- if (t === 'area') {
- // score area tag lower to prevent other/area preset
- // from being chosen over something more specific
- score += 0.5;
- } else {
- score += 1;
- }
- } else if (tags[t] === '*' && t in entity.tags) {
- score += 0.5;
- } else {
- return -1;
- }
- }
- return score;
- };
-
- preset.t = function(scope, options) {
- return t('presets.presets.' + id + '.' + scope, options);
- };
-
- preset.name = function() {
- return preset.t('name', {'default': id});
- };
-
- preset.terms = function() {
- return preset.t('terms', {'default': ''}).split(',');
- };
-
- preset.removeTags = function(tags, geometry) {
- tags = _.omit(tags, _.keys(preset.tags));
-
- for (var i in preset.fields) {
- var field = preset.fields[i];
- if (field.matchGeometry(geometry) && field['default'] === tags[field.key]) {
- delete tags[field.key];
- }
- }
- return tags;
-
- };
-
- preset.applyTags = function(tags, geometry) {
- for (var k in preset.tags) {
- if (preset.tags[k] !== '*') tags[k] = preset.tags[k];
- }
-
- for (var f in preset.fields) {
- f = preset.fields[f];
- if (f.matchGeometry(geometry) && f.key && !tags[f.key] && f['default']) {
- tags[f.key] = f['default'];
- }
- }
- return tags;
- };
-
- return preset;
-};
-iD.validate = function(changes, graph) {
- var warnings = [], change;
-
- // https://github.com/openstreetmap/josm/blob/mirror/src/org/
- // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
- function tagSuggestsArea(change) {
- if (_.isEmpty(change.tags)) return false;
- var tags = change.tags;
- var presence = ['landuse', 'amenities', 'tourism', 'shop'];
- for (var i = 0; i < presence.length; i++) {
- if (tags[presence[i]] !== undefined) {
- return presence[i] + '=' + tags[presence[i]];
- }
- }
- if (tags.building && tags.building === 'yes') return 'building=yes';
- }
-
- if (changes.deleted.length > 100) {
- warnings.push({
- message: t('validations.many_deletions', { n: changes.deleted.length })
- });
- }
-
- for (var i = 0; i < changes.created.length; i++) {
- change = changes.created[i];
-
- if (change.geometry(graph) === 'point' && _.isEmpty(change.tags)) {
- warnings.push({
- message: t('validations.untagged_point'),
- entity: change
- });
- }
-
- if (change.geometry(graph) === 'line' && _.isEmpty(change.tags)) {
- warnings.push({ message: t('validations.untagged_line'), entity: change });
- }
-
- var deprecatedTags = change.deprecatedTags();
- if (!_.isEmpty(deprecatedTags)) {
- warnings.push({
- message: t('validations.deprecated_tags', {
- tags: iD.util.tagText({ tags: deprecatedTags })
- }), entity: change });
- }
-
- if (change.geometry(graph) === 'area' && _.isEmpty(change.tags)) {
- warnings.push({ message: t('validations.untagged_area'), entity: change });
- }
-
- if (change.geometry(graph) === 'line' && tagSuggestsArea(change)) {
- warnings.push({
- message: t('validations.tag_suggests_area', {tag: tagSuggestsArea(change)}),
- entity: change
- });
- }
- }
-
- return warnings.length ? [warnings] : [];
-};
-})();
-window.locale = { _current: 'en' };
-
-locale.current = function(_) {
- if (!arguments.length) return locale._current;
- if (locale[_] !== undefined) locale._current = _;
- else if (locale[_.split('-')[0]]) locale._current = _.split('-')[0];
- return locale;
-};
-
-function t(s, o, loc) {
- loc = loc || locale._current;
-
- var path = s.split(".").reverse(),
- rep = locale[loc];
-
- while (rep !== undefined && path.length) rep = rep[path.pop()];
-
- if (rep !== undefined) {
- if (o) for (var k in o) rep = rep.replace('{' + k + '}', o[k]);
- return rep;
- } else {
- var missing = 'Missing translation: ' + s;
- if (typeof console !== "undefined") console.error(missing);
- if (loc !== 'en') return t(s, o, 'en');
- if (o && 'default' in o) return o['default'];
- return missing;
- }
-}
-iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:33Z","tags":{}},"n185964961":{"id":"n185964961","loc":[-85.6406588,41.942601],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185964962":{"id":"n185964962","loc":[-85.6394548,41.94261],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185970607":{"id":"n185970607","loc":[-85.641094,41.94006],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185970614":{"id":"n185970614","loc":[-85.641825,41.941316],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185970616":{"id":"n185970616","loc":[-85.641838,41.941556],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185973650":{"id":"n185973650","loc":[-85.639918,41.940064],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973660":{"id":"n185973660","loc":[-85.640645,41.941339],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973659":{"id":"n185973659","loc":[-85.6406115,41.9400658],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185974479":{"id":"n185974479","loc":[-85.639402,41.941344],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:18Z","tags":{}},"n185974481":{"id":"n185974481","loc":[-85.643071,41.941288],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:18Z","tags":{}},"n185976259":{"id":"n185976259","loc":[-85.642213,41.940043],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:24Z","tags":{}},"n185976261":{"id":"n185976261","loc":[-85.643056,41.94001],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:24Z","tags":{}},"n185964959":{"id":"n185964959","loc":[-85.6431031,41.9425754],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:12Z","tags":{}},"n185964960":{"id":"n185964960","loc":[-85.6418749,41.9425864],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:12Z","tags":{}},"n185981481":{"id":"n185981481","loc":[-85.6386827,41.9400828],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185981482":{"id":"n185981482","loc":[-85.6393664,41.9400854],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n2138493844":{"id":"n2138493844","loc":[-85.6427969,41.940522],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493845":{"id":"n2138493845","loc":[-85.6425891,41.9405228],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493846":{"id":"n2138493846","loc":[-85.6425868,41.9402875],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493847":{"id":"n2138493847","loc":[-85.6427969,41.9402858],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493848":{"id":"n2138493848","loc":[-85.6425708,41.9405234],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493849":{"id":"n2138493849","loc":[-85.642568,41.9402855],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493850":{"id":"n2138493850","loc":[-85.6423157,41.9402886],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2138493851":{"id":"n2138493851","loc":[-85.6423212,41.9404362],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2138493852":{"id":"n2138493852","loc":[-85.6422923,41.9404578],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2138493853":{"id":"n2138493853","loc":[-85.6422868,41.9404834],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2138493854":{"id":"n2138493854","loc":[-85.6423226,41.9405091],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2138493855":{"id":"n2138493855","loc":[-85.6423847,41.9405111],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2138493856":{"id":"n2138493856","loc":[-85.6424081,41.9405265],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2140155811":{"id":"n2140155811","loc":[-85.6419547,41.9410956],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155814":{"id":"n2140155814","loc":[-85.6427577,41.9410884],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155816":{"id":"n2140155816","loc":[-85.6427545,41.9410052],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155818":{"id":"n2140155818","loc":[-85.6428057,41.9410028],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155821":{"id":"n2140155821","loc":[-85.6427993,41.9407339],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155823":{"id":"n2140155823","loc":[-85.6427385,41.9407339],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155825":{"id":"n2140155825","loc":[-85.6427417,41.9406435],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155827":{"id":"n2140155827","loc":[-85.6419515,41.9406482],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155828":{"id":"n2140155828","loc":[-85.6429368,41.9412407],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155829":{"id":"n2140155829","loc":[-85.6417756,41.9412526],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155830":{"id":"n2140155830","loc":[-85.641766,41.9405983],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155831":{"id":"n2140155831","loc":[-85.6419803,41.9405983],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155832":{"id":"n2140155832","loc":[-85.6419611,41.9401366],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155833":{"id":"n2140155833","loc":[-85.6429336,41.94012],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155834":{"id":"n2140155834","loc":[-85.6430697,41.9411732],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155835":{"id":"n2140155835","loc":[-85.6428411,41.9409974],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155837":{"id":"n2140155837","loc":[-85.6428388,41.9407211],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155839":{"id":"n2140155839","loc":[-85.6430624,41.9405521],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155840":{"id":"n2140155840","loc":[-85.6427323,41.9412396],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155842":{"id":"n2140155842","loc":[-85.6418147,41.9412457],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155844":{"id":"n2140155844","loc":[-85.641813,41.9411319],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155845":{"id":"n2140155845","loc":[-85.6418394,41.9411111],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155847":{"id":"n2140155847","loc":[-85.6418838,41.9410977],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155849":{"id":"n2140155849","loc":[-85.6427324,41.9410921],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155851":{"id":"n2140155851","loc":[-85.6427798,41.9412945],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155852":{"id":"n2140155852","loc":[-85.6427701,41.9411777],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155854":{"id":"n2140155854","loc":[-85.6427323,41.9411572],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155856":{"id":"n2140155856","loc":[-85.6418478,41.9411666],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2165942818":{"id":"n2165942818","loc":[-85.6437533,41.9415029],"version":"1","changeset":"15116533","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-21T20:33:02Z","tags":{}},"n2165942819":{"id":"n2165942819","loc":[-85.6437623,41.9421195],"version":"1","changeset":"15116533","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-21T20:33:02Z","tags":{}},"n2168510551":{"id":"n2168510551","loc":[-85.6423795,41.9422615],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510552":{"id":"n2168510552","loc":[-85.6423744,41.9419439],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510553":{"id":"n2168510553","loc":[-85.642518,41.9419427],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510554":{"id":"n2168510554","loc":[-85.6425186,41.9419801],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510555":{"id":"n2168510555","loc":[-85.6428314,41.9419773],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510556":{"id":"n2168510556","loc":[-85.6428368,41.9423116],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510557":{"id":"n2168510557","loc":[-85.6424947,41.9423146],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510558":{"id":"n2168510558","loc":[-85.6424938,41.9422605],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2189046007":{"id":"n2189046007","loc":[-85.6410866,41.9424327],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046009":{"id":"n2189046009","loc":[-85.6410805,41.9420061],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046011":{"id":"n2189046011","loc":[-85.6412443,41.9420048],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046012":{"id":"n2189046012","loc":[-85.6412505,41.9424314],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046014":{"id":"n2189046014","loc":[-85.6413311,41.942968],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046016":{"id":"n2189046016","loc":[-85.6413281,41.942713],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046018":{"id":"n2189046018","loc":[-85.641521,41.9427117],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046021":{"id":"n2189046021","loc":[-85.6415234,41.9429236],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046022":{"id":"n2189046022","loc":[-85.6415045,41.9429238],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046025":{"id":"n2189046025","loc":[-85.641505,41.9429668],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046053":{"id":"n2189046053","loc":[-85.6385988,41.942412],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046054":{"id":"n2189046054","loc":[-85.6385985,41.9423311],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046055":{"id":"n2189046055","loc":[-85.6387617,41.9423308],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046056":{"id":"n2189046056","loc":[-85.6387616,41.9423026],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046058":{"id":"n2189046058","loc":[-85.6388215,41.9423025],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046059":{"id":"n2189046059","loc":[-85.6388219,41.9424115],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046060":{"id":"n2189046060","loc":[-85.6391096,41.9424486],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046061":{"id":"n2189046061","loc":[-85.6391105,41.9423673],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046063":{"id":"n2189046063","loc":[-85.6392911,41.9423684],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046065":{"id":"n2189046065","loc":[-85.6392903,41.9424497],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046067":{"id":"n2189046067","loc":[-85.6397927,41.9423876],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046069":{"id":"n2189046069","loc":[-85.6397897,41.9422981],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046070":{"id":"n2189046070","loc":[-85.6399702,41.9422947],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046072":{"id":"n2189046072","loc":[-85.6399732,41.9423843],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046074":{"id":"n2189046074","loc":[-85.6396331,41.9430227],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046075":{"id":"n2189046075","loc":[-85.6398673,41.9430189],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046077":{"id":"n2189046077","loc":[-85.6398656,41.9429637],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046079":{"id":"n2189046079","loc":[-85.6398885,41.9429633],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046082":{"id":"n2189046082","loc":[-85.6398832,41.942779],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046083":{"id":"n2189046083","loc":[-85.6398513,41.9427796],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046085":{"id":"n2189046085","loc":[-85.6398502,41.9427401],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046087":{"id":"n2189046087","loc":[-85.6397889,41.9427411],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046089":{"id":"n2189046089","loc":[-85.6397892,41.942753],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046090":{"id":"n2189046090","loc":[-85.6396983,41.9427544],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046092":{"id":"n2189046092","loc":[-85.6396993,41.9427882],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046094":{"id":"n2189046094","loc":[-85.6396746,41.9427886],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046096":{"id":"n2189046096","loc":[-85.6396758,41.9428296],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046097":{"id":"n2189046097","loc":[-85.6397007,41.9428292],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046099":{"id":"n2189046099","loc":[-85.6397018,41.9428686],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046103":{"id":"n2189046103","loc":[-85.6396289,41.9428697],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046112":{"id":"n2189046112","loc":[-85.6435683,41.9429457],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046113":{"id":"n2189046113","loc":[-85.643568,41.9427766],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046115":{"id":"n2189046115","loc":[-85.6434011,41.9427767],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046116":{"id":"n2189046116","loc":[-85.6434012,41.9428631],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046117":{"id":"n2189046117","loc":[-85.643448,41.9428631],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046118":{"id":"n2189046118","loc":[-85.6434481,41.9429457],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046119":{"id":"n2189046119","loc":[-85.6428363,41.9429809],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046120":{"id":"n2189046120","loc":[-85.6429171,41.9429791],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046121":{"id":"n2189046121","loc":[-85.642914,41.9429041],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046122":{"id":"n2189046122","loc":[-85.6429385,41.9429035],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046123":{"id":"n2189046123","loc":[-85.6429348,41.9428126],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046124":{"id":"n2189046124","loc":[-85.6427746,41.9428163],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046125":{"id":"n2189046125","loc":[-85.6427783,41.942906],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046126":{"id":"n2189046126","loc":[-85.6428332,41.9429047],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046127":{"id":"n2189046127","loc":[-85.6423018,41.9428859],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046128":{"id":"n2189046128","loc":[-85.6422987,41.9427208],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046130":{"id":"n2189046130","loc":[-85.6424218,41.9427195],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046131":{"id":"n2189046131","loc":[-85.6424246,41.9428684],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046132":{"id":"n2189046132","loc":[-85.6423845,41.9428689],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046133":{"id":"n2189046133","loc":[-85.6423848,41.942885],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046134":{"id":"n2189046134","loc":[-85.641533,41.9429392],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046135":{"id":"n2189046135","loc":[-85.6416096,41.9428768],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046137":{"id":"n2189046137","loc":[-85.6416763,41.9429221],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046138":{"id":"n2189046138","loc":[-85.6415997,41.9429845],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046139":{"id":"n2189046139","loc":[-85.6420598,41.9428016],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046140":{"id":"n2189046140","loc":[-85.6420593,41.9427415],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046141":{"id":"n2189046141","loc":[-85.6421957,41.9427409],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046142":{"id":"n2189046142","loc":[-85.6421963,41.9428182],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046143":{"id":"n2189046143","loc":[-85.6421281,41.9428185],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046144":{"id":"n2189046144","loc":[-85.6421279,41.9428013],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046145":{"id":"n2189046145","loc":[-85.6409429,41.9429345],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046146":{"id":"n2189046146","loc":[-85.6410354,41.9429334],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046147":{"id":"n2189046147","loc":[-85.6410325,41.9427972],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046148":{"id":"n2189046148","loc":[-85.640997,41.9427976],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046149":{"id":"n2189046149","loc":[-85.6409963,41.9427643],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046150":{"id":"n2189046150","loc":[-85.6408605,41.9427659],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046152":{"id":"n2189046152","loc":[-85.6408623,41.9428482],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046153":{"id":"n2189046153","loc":[-85.640941,41.9428473],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189152992":{"id":"n2189152992","loc":[-85.6437661,41.9422257],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152993":{"id":"n2189152993","loc":[-85.643768,41.9424067],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152994":{"id":"n2189152994","loc":[-85.6432176,41.9417705],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152995":{"id":"n2189152995","loc":[-85.6432097,41.941327],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152996":{"id":"n2189152996","loc":[-85.6436493,41.9413226],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152997":{"id":"n2189152997","loc":[-85.6436563,41.9417164],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152998":{"id":"n2189152998","loc":[-85.6435796,41.9417171],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152999":{"id":"n2189152999","loc":[-85.6435805,41.9417669],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153000":{"id":"n2189153000","loc":[-85.6438202,41.9414953],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153001":{"id":"n2189153001","loc":[-85.6438173,41.9413175],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153004":{"id":"n2189153004","loc":[-85.6432535,41.9418466],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153005":{"id":"n2189153005","loc":[-85.6433935,41.9418599],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153006":{"id":"n2189153006","loc":[-85.6434831,41.9418986],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153007":{"id":"n2189153007","loc":[-85.6435678,41.9419774],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153008":{"id":"n2189153008","loc":[-85.6435987,41.9420282],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153009":{"id":"n2189153009","loc":[-85.643438,41.9419573],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153010":{"id":"n2189153010","loc":[-85.6435284,41.9424676],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153011":{"id":"n2189153011","loc":[-85.6436207,41.9423631],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153012":{"id":"n2189153012","loc":[-85.6434957,41.9422973],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153013":{"id":"n2189153013","loc":[-85.6434457,41.9422458],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153014":{"id":"n2189153014","loc":[-85.6433976,41.9421772],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153015":{"id":"n2189153015","loc":[-85.6433861,41.9420785],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153016":{"id":"n2189153016","loc":[-85.6433765,41.9420313],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153017":{"id":"n2189153017","loc":[-85.6432207,41.9420284],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153018":{"id":"n2189153018","loc":[-85.6432245,41.9422759],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153019":{"id":"n2189153019","loc":[-85.6432649,41.9423474],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153020":{"id":"n2189153020","loc":[-85.6433226,41.9424132],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153021":{"id":"n2189153021","loc":[-85.6434111,41.9424704],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153022":{"id":"n2189153022","loc":[-85.6434591,41.9424347],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153025":{"id":"n2189153025","loc":[-85.6437669,41.9423073],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153026":{"id":"n2189153026","loc":[-85.6436611,41.942293],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153027":{"id":"n2189153027","loc":[-85.6435784,41.9422473],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153028":{"id":"n2189153028","loc":[-85.6435245,41.9421443],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153029":{"id":"n2189153029","loc":[-85.6435149,41.9420613],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153030":{"id":"n2189153030","loc":[-85.6433528,41.9419269],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153031":{"id":"n2189153031","loc":[-85.6432535,41.9419191],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153032":{"id":"n2189153032","loc":[-85.6430868,41.9419198],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153033":{"id":"n2189153033","loc":[-85.6434894,41.9420033],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153034":{"id":"n2189153034","loc":[-85.6432974,41.9419225],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153035":{"id":"n2189153035","loc":[-85.6433055,41.9421632],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153036":{"id":"n2189153036","loc":[-85.6433538,41.9422849],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153037":{"id":"n2189153037","loc":[-85.6434718,41.9423887],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153038":{"id":"n2189153038","loc":[-85.6436134,41.9422667],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153040":{"id":"n2189153040","loc":[-85.6438759,41.9414017],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153041":{"id":"n2189153041","loc":[-85.6438181,41.9413687],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153042":{"id":"n2189153042","loc":[-85.6436821,41.9413044],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153043":{"id":"n2189153043","loc":[-85.6435899,41.9412862],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153044":{"id":"n2189153044","loc":[-85.6433169,41.9417268],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153045":{"id":"n2189153045","loc":[-85.643301,41.9412859],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153046":{"id":"n2189153046","loc":[-85.6435531,41.9416981],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153047":{"id":"n2189153047","loc":[-85.6435427,41.9412863],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n185948706":{"id":"n185948706","loc":[-85.6369439,41.940122],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185949348":{"id":"n185949348","loc":[-85.640039,41.931135],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:09Z","tags":{}},"n185949870":{"id":"n185949870","loc":[-85.643195,41.949261],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:20Z","tags":{}},"n185954680":{"id":"n185954680","loc":[-85.6337802,41.9401143],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185954784":{"id":"n185954784","loc":[-85.6487485,41.942527],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185958670":{"id":"n185958670","loc":[-85.637255,41.940104],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958672":{"id":"n185958672","loc":[-85.636996,41.941355],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:31Z","tags":{}},"n185960207":{"id":"n185960207","loc":[-85.634992,41.940118],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:09Z","tags":{}},"n185963163":{"id":"n185963163","loc":[-85.638831,41.93398],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:45Z","tags":{}},"n185963165":{"id":"n185963165","loc":[-85.640073,41.933968],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:45Z","tags":{}},"n185963167":{"id":"n185963167","loc":[-85.641225,41.933972],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:45Z","tags":{}},"n185963168":{"id":"n185963168","loc":[-85.642386,41.933952],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:45Z","tags":{}},"n185964695":{"id":"n185964695","loc":[-85.6443608,41.9425645],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:12Z","tags":{}},"n185964697":{"id":"n185964697","loc":[-85.644384,41.939941],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:31Z","tags":{}},"n185964963":{"id":"n185964963","loc":[-85.6382347,41.9426146],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185964965":{"id":"n185964965","loc":[-85.637022,41.942622],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:40Z","tags":{}},"n185964967":{"id":"n185964967","loc":[-85.6363706,41.9426606],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185964968":{"id":"n185964968","loc":[-85.6357988,41.9427748],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185964969":{"id":"n185964969","loc":[-85.6355409,41.9428465],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185964970":{"id":"n185964970","loc":[-85.6348729,41.9430443],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185966958":{"id":"n185966958","loc":[-85.641946,41.946413],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:51Z","tags":{}},"n185966960":{"id":"n185966960","loc":[-85.643148,41.946389],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:51Z","tags":{}},"n185967774":{"id":"n185967774","loc":[-85.641889,41.943852],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:12Z","tags":{}},"n185967775":{"id":"n185967775","loc":[-85.641922,41.945121],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:12Z","tags":{}},"n185967776":{"id":"n185967776","loc":[-85.641927,41.947544],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:12Z","tags":{}},"n185967777":{"id":"n185967777","loc":[-85.641982,41.947622],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:12Z","tags":{}},"n185969289":{"id":"n185969289","loc":[-85.63928,41.929221],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:52Z","tags":{}},"n185969704":{"id":"n185969704","loc":[-85.6388186,41.9350099],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185969706":{"id":"n185969706","loc":[-85.6400709,41.9349957],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185969708":{"id":"n185969708","loc":[-85.6412214,41.9349827],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185969710":{"id":"n185969710","loc":[-85.6423509,41.934974],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185970602":{"id":"n185970602","loc":[-85.641293,41.931817],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185970604":{"id":"n185970604","loc":[-85.641258,41.932705],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185970605":{"id":"n185970605","loc":[-85.641148,41.936984],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185970606":{"id":"n185970606","loc":[-85.641112,41.938169],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185970906":{"id":"n185970906","loc":[-85.639454,41.943871],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:50Z","tags":{}},"n185970908":{"id":"n185970908","loc":[-85.6394635,41.9450504],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{}},"n185970909":{"id":"n185970909","loc":[-85.6394914,41.9451911],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{}},"n185971368":{"id":"n185971368","loc":[-85.635769,41.940122],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:01Z","tags":{}},"n185971978":{"id":"n185971978","loc":[-85.640003,41.936988],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:14Z","tags":{}},"n185971980":{"id":"n185971980","loc":[-85.642299,41.936988],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:14Z","tags":{}},"n185973633":{"id":"n185973633","loc":[-85.639023,41.92861],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973635":{"id":"n185973635","loc":[-85.639153,41.928969],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973637":{"id":"n185973637","loc":[-85.639213,41.929088],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973639":{"id":"n185973639","loc":[-85.63935,41.929396],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973641":{"id":"n185973641","loc":[-85.640143,41.931462],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973644":{"id":"n185973644","loc":[-85.64019,41.931788],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973646":{"id":"n185973646","loc":[-85.6401365,41.9327199],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185973648":{"id":"n185973648","loc":[-85.639983,41.938174],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185974477":{"id":"n185974477","loc":[-85.638206,41.941331],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:18Z","tags":{}},"n185975928":{"id":"n185975928","loc":[-85.640683,41.94513],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:13Z","tags":{}},"n185975930":{"id":"n185975930","loc":[-85.643102,41.945103],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:13Z","tags":{}},"n185976255":{"id":"n185976255","loc":[-85.642424,41.931817],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:24Z","tags":{}},"n185976257":{"id":"n185976257","loc":[-85.64242,41.932699],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:24Z","tags":{}},"n185976258":{"id":"n185976258","loc":[-85.6422621,41.9381489],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n185977452":{"id":"n185977452","loc":[-85.6457497,41.9398834],"version":"3","changeset":"5841745","user":"themps","uid":"196173","visible":"true","timestamp":"2010-09-22T00:20:34Z","tags":{}},"n185978772":{"id":"n185978772","loc":[-85.646656,41.939869],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185981472":{"id":"n185981472","loc":[-85.6388962,41.9321266],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185981474":{"id":"n185981474","loc":[-85.6388769,41.9327334],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185981476":{"id":"n185981476","loc":[-85.638829,41.934116],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:11Z","tags":{}},"n185981478":{"id":"n185981478","loc":[-85.63876,41.937002],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:11Z","tags":{}},"n185981480":{"id":"n185981480","loc":[-85.638682,41.93819],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:11Z","tags":{}},"n185981999":{"id":"n185981999","loc":[-85.638194,41.9400866],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n185982001":{"id":"n185982001","loc":[-85.646302,41.93988],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:26Z","tags":{}},"n185982877":{"id":"n185982877","loc":[-85.640676,41.943867],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:54Z","tags":{}},"n185982879":{"id":"n185982879","loc":[-85.640734,41.945887],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:54Z","tags":{}},"n185985823":{"id":"n185985823","loc":[-85.643106,41.943841],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:39Z","tags":{}},"n185985824":{"id":"n185985824","loc":[-85.643145,41.947641],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:39Z","tags":{}},"n185985825":{"id":"n185985825","loc":[-85.643219,41.950829],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:39Z","tags":{}},"n1475301385":{"id":"n1475301385","loc":[-85.6360612,41.9427042],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:12Z","tags":{}},"n1475301397":{"id":"n1475301397","loc":[-85.6366651,41.9426328],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:12Z","tags":{}},"n2139795811":{"id":"n2139795811","loc":[-85.6469154,41.9425427],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795830":{"id":"n2139795830","loc":[-85.6443194,41.9399444],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:57Z","tags":{}},"n2139795834":{"id":"n2139795834","loc":[-85.6453506,41.9399002],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:57Z","tags":{}},"n2139795837":{"id":"n2139795837","loc":[-85.645806,41.9398831],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:57Z","tags":{}},"n2139858932":{"id":"n2139858932","loc":[-85.6351721,41.9429557],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2140019000":{"id":"n2140019000","loc":[-85.6359935,41.9427224],"version":"1","changeset":"14895342","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:35:05Z","tags":{}},"n2165942817":{"id":"n2165942817","loc":[-85.6442017,41.9414993],"version":"1","changeset":"15116533","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-21T20:33:02Z","tags":{}},"n2165942820":{"id":"n2165942820","loc":[-85.6442107,41.9421159],"version":"1","changeset":"15116533","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-21T20:33:02Z","tags":{}},"n2189152990":{"id":"n2189152990","loc":[-85.6442328,41.942404],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:05Z","tags":{}},"n2189152991":{"id":"n2189152991","loc":[-85.6442309,41.9422229],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153002":{"id":"n2189153002","loc":[-85.6441329,41.9413147],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153003":{"id":"n2189153003","loc":[-85.6441357,41.9414925],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153023":{"id":"n2189153023","loc":[-85.6443453,41.9423074],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153024":{"id":"n2189153024","loc":[-85.6442318,41.9423045],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153039":{"id":"n2189153039","loc":[-85.6441343,41.9414025],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"w208643102":{"id":"w208643102","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153034","n2189153035","n2189153036","n2189153037","n2189153038"]},"w17966942":{"id":"w17966942","version":"3","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:48:04Z","tags":{"highway":"residential","name":"Millard St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Millard","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312476:15312477:15312478:15326070:15326071:15329003:15329004:15312479:15312480:15312483:15326956:15326957:15312485:15312486:15322600:15325988","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185954680","n185960207","n185971368","n185948706","n185958670","n185981999","n185981481","n185981482","n185973650","n185973659","n185970607","n185976259","n185976261","n2139795830","n185964697","n2139795834","n185977452","n2139795837","n185982001","n185978772"]},"w208643105":{"id":"w208643105","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153046","n2189153047"]},"w208631637":{"id":"w208631637","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046014","n2189046016","n2189046018","n2189046021","n2189046022","n2189046025","n2189046014"]},"w208643096":{"id":"w208643096","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"amenity":"parking","area":"yes","fee":"no"},"nodes":["n2189152990","n2189153024","n2189152991","n2189152992","n2189153025","n2189152993","n2189152990"]},"w208631656":{"id":"w208631656","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046134","n2189046135","n2189046137","n2189046138","n2189046134"]},"w204003417":{"id":"w204003417","version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{"area":"yes","building":"school"},"nodes":["n2140155811","n2140155814","n2140155816","n2140155818","n2140155821","n2140155823","n2140155825","n2140155827","n2140155811"]},"w208631654":{"id":"w208631654","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046127","n2189046128","n2189046130","n2189046131","n2189046132","n2189046133","n2189046127"]},"w17966327":{"id":"w17966327","version":"3","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:16Z","tags":{"highway":"residential","name":"S Douglas Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Douglas","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185976261","n2140155839","n2140155834","n185974481","n2189153032","n185964959"]},"w41785752":{"id":"w41785752","version":"10","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:59Z","tags":{"highway":"primary","name":"West Michigan Avenue","old_ref":"US 131","ref":"US 131 Business;M 60","tiger:cfcc":"A21","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_base_2":"US Hwy 131 (Bus)","tiger:name_direction_prefix":"W","tiger:name_type":"Ave","tiger:reviewed":"no","access":"yes"},"nodes":["n185954784","n2139795811","n185964695","n185964959","n185964960","n185964961","n185964962","n185964963","n185964965","n1475301397","n185964967","n1475301385","n2140019000","n185964968","n185964969","n2139858932","n185964970"]},"w203841842":{"id":"w203841842","version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{"area":"yes","leisure":"playground"},"nodes":["n2138493848","n2138493849","n2138493850","n2138493851","n2138493852","n2138493853","n2138493854","n2138493855","n2138493856","n2138493848"]},"w208643103":{"id":"w208643103","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"highway":"service"},"nodes":["n2189153039","n2189153040","n2189153041","n2189153042","n2189153043","n2189153047","n2189153045","n185974481"]},"w208643098":{"id":"w208643098","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189153000","n2189153041","n2189153001","n2189153002","n2189153039","n2189153003","n2189153000"]},"w208631646":{"id":"w208631646","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046067","n2189046069","n2189046070","n2189046072","n2189046067"]},"w208631653":{"id":"w208631653","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046119","n2189046120","n2189046121","n2189046122","n2189046123","n2189046124","n2189046125","n2189046126","n2189046119"]},"w17966041":{"id":"w17966041","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:41:50Z","tags":{"highway":"residential","name":"S Lincoln Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Lincoln","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312474:15312448","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185973659","n185973660","n185964961"]},"w208631645":{"id":"w208631645","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046060","n2189046061","n2189046063","n2189046065","n2189046060"]},"w206803397":{"id":"w206803397","version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:25Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168510551","n2168510552","n2168510553","n2168510554","n2168510555","n2168510556","n2168510557","n2168510558","n2168510551"]},"w17965792":{"id":"w17965792","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:10Z","tags":{"highway":"residential","name":"N Hooker Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hooker","tiger:name_direction_prefix":"N","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313197:15312414:15312395","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185964962","n185970906","n185970908","n185970909"]},"w208631651":{"id":"w208631651","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046112","n2189046113","n2189046115","n2189046116","n2189046117","n2189046118","n2189046112"]},"w208631643":{"id":"w208631643","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046053","n2189046054","n2189046055","n2189046056","n2189046058","n2189046059","n2189046053"]},"w17966878":{"id":"w17966878","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:48:03Z","tags":{"highway":"residential","name":"S Hooker Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hooker","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312508:15312529:15312553:15312597:15328883:15338803","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185981472","n185981474","n185963163","n185981476","n185969704","n185981478","n185981480","n185981481"]},"w17966102":{"id":"w17966102","version":"2","changeset":"14896694","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:01:36Z","tags":{"highway":"residential","name":"South St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"South","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312446","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185958672","n185974477","n185974479","n185973660","n185970614"]},"w208631660":{"id":"w208631660","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046145","n2189046146","n2189046147","n2189046148","n2189046149","n2189046150","n2189046152","n2189046153","n2189046145"]},"w208643101":{"id":"w208643101","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"highway":"service"},"nodes":["n2189153023","n2189153024","n2189153025","n2189153026","n2189153038","n2189153027","n2189153028","n2189153029","n2189153033","n2189153009","n2189153030","n2189153034","n2189153031","n2189153032"]},"w204000205":{"id":"w204000205","version":"2","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:19Z","tags":{"highway":"residential","name":"South St","oneway":"yes","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"South","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312446","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185974481","n2140155851","n185970614"]},"w203841841":{"id":"w203841841","version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{"area":"yes","leisure":"pitch","pitch":"basketball"},"nodes":["n2138493844","n2138493845","n2138493846","n2138493847","n2138493844"]},"w17965444":{"id":"w17965444","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:37:03Z","tags":{"highway":"residential","name":"N Grant Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Grant","tiger:name_direction_prefix":"N","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312348:15312365:15312422:15312392","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185964960","n185967774","n185967775","n185966958","n185967776","n185967777"]},"w208631648":{"id":"w208631648","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046074","n2189046075","n2189046077","n2189046079","n2189046082","n2189046083","n2189046085","n2189046087","n2189046089","n2189046090","n2189046092","n2189046094","n2189046096","n2189046097","n2189046099","n2189046103","n2189046074"]},"w208643100":{"id":"w208643100","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189153010","n2189153011","n2189153012","n2189153013","n2189153014","n2189153015","n2189153016","n2189153017","n2189153018","n2189153019","n2189153020","n2189153021","n2189153022","n2189153010"]},"w17965749":{"id":"w17965749","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:39:28Z","tags":{"highway":"residential","name":"S Grant Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Grant","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312445","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185970614","n185970616","n185964960"]},"w206574482":{"id":"w206574482","version":"2","changeset":"15128027","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-22T20:03:31Z","tags":{"addr:state":"MI","amenity":"library","area":"yes","building":"yes","ele":"249","gnis:county_name":"St. Joseph","gnis:feature_id":"2418162","gnis:import_uuid":"57871b70-0100-4405-bb30-88b2e001a944","gnis:reviewed":"no","name":"Three Rivers Public Library","source":"USGS Geonames"},"nodes":["n2165942817","n2165942818","n2165942819","n2165942820","n2165942817"]},"w208643097":{"id":"w208643097","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189152994","n2189152995","n2189152996","n2189152997","n2189152998","n2189152999","n2189152994"]},"w17966879":{"id":"w17966879","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:48:03Z","tags":{"highway":"residential","name":"S Hooker Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hooker","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312475:15312449","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185981482","n185974479","n185964962"]},"w17966325":{"id":"w17966325","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:43:58Z","tags":{"highway":"residential","name":"S Douglas Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Douglas","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15330300:15312522:15312547:15330299:15312603:15312571:15331740","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185976255","n185976257","n185963168","n185969710","n185971980","n185976258","n185954700","n185976259"]},"w17967390":{"id":"w17967390","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:51:27Z","tags":{"highway":"residential","name":"N Douglas Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Douglas","tiger:name_direction_prefix":"N","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312300","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185964959","n185985823","n185975930","n185966960","n185985824","n185949870","n185985825"]},"w208631635":{"id":"w208631635","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046007","n2189046009","n2189046011","n2189046012","n2189046007"]},"w208643099":{"id":"w208643099","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189153031","n2189153004","n2189153005","n2189153006","n2189153007","n2189153008","n2189153029","n2189153033","n2189153009","n2189153030","n2189153031"]},"w208631658":{"id":"w208631658","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046139","n2189046140","n2189046141","n2189046142","n2189046143","n2189046144","n2189046139"]},"w208643104":{"id":"w208643104","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153044","n2189153045"]},"w17966039":{"id":"w17966039","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:41:49Z","tags":{"highway":"residential","name":"S Lincoln Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Lincoln","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312526:15312511:15312550:15312601:15312998:15312626:15312574:15328327:15328328:15313210","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185973633","n185973635","n185973637","n185969289","n185973639","n185949348","n185973641","n185973644","n185973646","n185963165","n185969706","n185971978","n185973648","n185973650"]},"w204003420":{"id":"w204003420","version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2140155840","n2140155842","n2140155844","n2140155845","n2140155847","n2140155849","n2140155854","n2140155840"]},"w204003419":{"id":"w204003419","version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{"highway":"service"},"nodes":["n2140155834","n2140155835","n2140155837","n2140155839"]},"w204003418":{"id":"w204003418","version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{"amenity":"school","area":"yes","name":"Andrews Elementary School"},"nodes":["n2140155828","n2140155829","n2140155830","n2140155831","n2140155832","n2140155833","n2140155828"]},"w17965747":{"id":"w17965747","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:39:27Z","tags":{"highway":"residential","name":"S Grant Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Grant","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312509:15312524:15312549:15312605:15329008:15312572","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185970602","n185970604","n185963167","n185969708","n185970605","n185970606","n185970607"]},"w17967073":{"id":"w17967073","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:49:07Z","tags":{"highway":"residential","name":"N Lincoln Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Lincoln","tiger:name_direction_prefix":"N","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313196:15312424:15312394","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185964961","n185982877","n185975928","n185982879"]},"w204003421":{"id":"w204003421","version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2140155851","n2140155852","n2140155854","n2140155856"]},"r1943857":{"id":"r1943857","version":"2","changeset":"13612265","user":"migurski","uid":"8287","visible":"true","timestamp":"2012-10-24T04:10:54Z","tags":{"is_in:state":"MI","modifier":"Business","name":"US 131 Business (Three Rivers, MI)","network":"US:US","ref":"131","route":"road","type":"route"},"members":[{"id":"w17966509","type":"way","role":"forward"},{"id":"w143497377","type":"way","role":""},{"id":"w134150811","type":"way","role":""},{"id":"w134150800","type":"way","role":""},{"id":"w134150789","type":"way","role":""},{"id":"w134150795","type":"way","role":""},{"id":"w41785752","type":"way","role":""},{"id":"w17965146","type":"way","role":"forward"},{"id":"w17964031","type":"way","role":"forward"}]},"r270277":{"id":"r270277","version":"21","changeset":"15347356","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T03:41:02Z","tags":{"network":"US:MI","ref":"60","route":"road","state_id":"MI","type":"route","url":"http://en.wikipedia.org/wiki/M-60_%28Michigan_highway%29"},"members":[{"id":"w17751087","type":"way","role":"east"},{"id":"w117148312","type":"way","role":"east"},{"id":"w40942155","type":"way","role":"west"},{"id":"w17751017","type":"way","role":""},{"id":"w17751083","type":"way","role":""},{"id":"w17747780","type":"way","role":""},{"id":"w41068082","type":"way","role":""},{"id":"w197025212","type":"way","role":""},{"id":"w17743874","type":"way","role":""},{"id":"w17751044","type":"way","role":""},{"id":"w17752167","type":"way","role":""},{"id":"w17751089","type":"way","role":""},{"id":"w17743879","type":"way","role":""},{"id":"w17751064","type":"way","role":""},{"id":"w197057073","type":"way","role":""},{"id":"w167699963","type":"way","role":""},{"id":"w167699972","type":"way","role":""},{"id":"w17967584","type":"way","role":""},{"id":"w167699964","type":"way","role":""},{"id":"w17967582","type":"way","role":"west"},{"id":"w41260270","type":"way","role":"west"},{"id":"w17965146","type":"way","role":"west"},{"id":"w41785752","type":"way","role":""},{"id":"w134150795","type":"way","role":""},{"id":"w134150789","type":"way","role":""},{"id":"w134150800","type":"way","role":""},{"id":"w134150811","type":"way","role":""},{"id":"w134150836","type":"way","role":""},{"id":"w134150802","type":"way","role":""},{"id":"w41074896","type":"way","role":""},{"id":"w17966773","type":"way","role":""},{"id":"w17967415","type":"way","role":""},{"id":"w41074899","type":"way","role":""},{"id":"w17967581","type":"way","role":""},{"id":"w41074902","type":"way","role":""},{"id":"w41074906","type":"way","role":""},{"id":"w209707997","type":"way","role":""},{"id":"w209707998","type":"way","role":""},{"id":"w17964798","type":"way","role":""},{"id":"w17966034","type":"way","role":""},{"id":"w17967593","type":"way","role":""},{"id":"w41074888","type":"way","role":""},{"id":"w17733772","type":"way","role":""},{"id":"w41074813","type":"way","role":""},{"id":"w17742213","type":"way","role":""},{"id":"w17746863","type":"way","role":""},{"id":"w17745772","type":"way","role":""},{"id":"w17742222","type":"way","role":""},{"id":"w17745922","type":"way","role":""},{"id":"w17742198","type":"way","role":""},{"id":"w17747675","type":"way","role":""},{"id":"w17739927","type":"way","role":""},{"id":"w17745708","type":"way","role":""},{"id":"w41006323","type":"way","role":""},{"id":"w17744233","type":"way","role":""},{"id":"w17739436","type":"way","role":""},{"id":"w17742201","type":"way","role":""},{"id":"w151418616","type":"way","role":""},{"id":"w17750062","type":"way","role":""},{"id":"w17742227","type":"way","role":"east"},{"id":"w41006348","type":"way","role":"east"},{"id":"w41260984","type":"way","role":""},{"id":"w17832427","type":"way","role":""},{"id":"w17838408","type":"way","role":""},{"id":"w17835846","type":"way","role":""},{"id":"w17832923","type":"way","role":""},{"id":"w17839388","type":"way","role":""},{"id":"w17838390","type":"way","role":""},{"id":"w17831272","type":"way","role":""},{"id":"w17828581","type":"way","role":""},{"id":"w38240686","type":"way","role":""},{"id":"w17838405","type":"way","role":"east"},{"id":"w123323711","type":"way","role":"east"},{"id":"w17830167","type":"way","role":"east"},{"id":"w99011909","type":"way","role":"east"},{"id":"w41911361","type":"way","role":"east"},{"id":"w41911355","type":"way","role":"east"},{"id":"w41911356","type":"way","role":"east"},{"id":"w117148326","type":"way","role":"west"},{"id":"w41911352","type":"way","role":"west"},{"id":"w41911353","type":"way","role":"west"},{"id":"w41911354","type":"way","role":"west"},{"id":"w41911360","type":"way","role":"west"},{"id":"w38240676","type":"way","role":"west"},{"id":"w123323710","type":"way","role":"west"},{"id":"w41260271","type":"way","role":"east"},{"id":"w41260273","type":"way","role":"east"},{"id":"w17964031","type":"way","role":"east"},{"id":"w41006344","type":"way","role":"west"},{"id":"w41006351","type":"way","role":"west"}]},"n367813436":{"id":"n367813436","loc":[-85.63605205663384,41.94305506683346],"version":"2","changeset":"14895342","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:35:05Z","tags":{"addr:state":"MI","amenity":"fire_station","ele":"245","gnis:county_name":"St. Joseph","gnis:feature_id":"2417894","gnis:import_uuid":"57871b70-0100-4405-bb30-88b2e001a944","gnis:reviewed":"no","name":"Three Rivers Fire Department","source":"USGS Geonames"}},"n185948708":{"id":"n185948708","loc":[-85.6369828,41.9408789],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185948710":{"id":"n185948710","loc":[-85.6370184,41.9411346],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185954691":{"id":"n185954691","loc":[-85.634476,41.941475],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:32Z","tags":{}},"n185954692":{"id":"n185954692","loc":[-85.635008,41.941846],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:32Z","tags":{}},"n185954693":{"id":"n185954693","loc":[-85.635362,41.941962],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:33Z","tags":{}},"n185954695":{"id":"n185954695","loc":[-85.63578,41.941978],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:33Z","tags":{}},"n185972903":{"id":"n185972903","loc":[-85.63295,41.9430062],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185964971":{"id":"n185964971","loc":[-85.6346811,41.9431023],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n1819805854":{"id":"n1819805854","loc":[-85.6331275,41.9404837],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805918":{"id":"n1819805918","loc":[-85.6331168,41.942798],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805762":{"id":"n1819805762","loc":[-85.6333034,41.9424123],"version":"2","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n1819805907":{"id":"n1819805907","loc":[-85.6334819,41.9419121],"version":"2","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n1819805915":{"id":"n1819805915","loc":[-85.6334554,41.9413588],"version":"2","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n1819848888":{"id":"n1819848888","loc":[-85.6331625,41.942679],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848930":{"id":"n1819848930","loc":[-85.6338684,41.9431252],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819858505":{"id":"n1819858505","loc":[-85.6346782,41.9429092],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858507":{"id":"n1819858507","loc":[-85.6339003,41.9414534],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858508":{"id":"n1819858508","loc":[-85.6345709,41.9427742],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858509":{"id":"n1819858509","loc":[-85.63419,41.9417322],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858511":{"id":"n1819858511","loc":[-85.6340666,41.9415652],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858512":{"id":"n1819858512","loc":[-85.6343295,41.9423027],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858514":{"id":"n1819858514","loc":[-85.6343241,41.942207],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858521":{"id":"n1819858521","loc":[-85.633391,41.941231],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1819858528":{"id":"n1819858528","loc":[-85.6343027,41.9419716],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n185954683":{"id":"n185954683","loc":[-85.6335412,41.940147],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185954685":{"id":"n185954685","loc":[-85.6334296,41.9403023],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185954687":{"id":"n185954687","loc":[-85.6333988,41.9404704],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185954689":{"id":"n185954689","loc":[-85.6335511,41.9410225],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185954690":{"id":"n185954690","loc":[-85.6336721,41.9411669],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n1820938802":{"id":"n1820938802","loc":[-85.6330671,41.941845],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1821006702":{"id":"n1821006702","loc":[-85.6344047,41.9395496],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n2130304133":{"id":"n2130304133","loc":[-85.6349025,41.9427659],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304136":{"id":"n2130304136","loc":[-85.6346027,41.9422017],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304138":{"id":"n2130304138","loc":[-85.6348577,41.9421517],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304140":{"id":"n2130304140","loc":[-85.6348419,41.9422694],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304142":{"id":"n2130304142","loc":[-85.6349071,41.9423135],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304144":{"id":"n2130304144","loc":[-85.6350495,41.9423312],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304146":{"id":"n2130304146","loc":[-85.6351009,41.9422812],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304147":{"id":"n2130304147","loc":[-85.6351227,41.9421532],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304148":{"id":"n2130304148","loc":[-85.635526,41.9421547],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304149":{"id":"n2130304149","loc":[-85.6355339,41.9425768],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304150":{"id":"n2130304150","loc":[-85.6351582,41.9426562],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304151":{"id":"n2130304151","loc":[-85.6351207,41.9427032],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2138493807":{"id":"n2138493807","loc":[-85.6350923,41.9415216],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493808":{"id":"n2138493808","loc":[-85.6353603,41.9411061],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493809":{"id":"n2138493809","loc":[-85.6354421,41.9410942],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493810":{"id":"n2138493810","loc":[-85.6355079,41.9411044],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493811":{"id":"n2138493811","loc":[-85.6355693,41.9411246],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493812":{"id":"n2138493812","loc":[-85.6355829,41.9411061],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493813":{"id":"n2138493813","loc":[-85.6355624,41.9409777],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493814":{"id":"n2138493814","loc":[-85.6355011,41.9409152],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493815":{"id":"n2138493815","loc":[-85.635383,41.9409219],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493816":{"id":"n2138493816","loc":[-85.635299,41.9409658],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493817":{"id":"n2138493817","loc":[-85.6351695,41.941204],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493818":{"id":"n2138493818","loc":[-85.6348879,41.9415166],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493819":{"id":"n2138493819","loc":[-85.634897,41.9415757],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493820":{"id":"n2138493820","loc":[-85.6349606,41.9416399],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493821":{"id":"n2138493821","loc":[-85.6350219,41.9416669],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493822":{"id":"n2138493822","loc":[-85.6351241,41.9416314],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493823":{"id":"n2138493823","loc":[-85.6350855,41.9415622],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493824":{"id":"n2138493824","loc":[-85.6350401,41.9413603],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493825":{"id":"n2138493825","loc":[-85.6352206,41.9410765],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493826":{"id":"n2138493826","loc":[-85.6343865,41.9415594],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493827":{"id":"n2138493827","loc":[-85.6343506,41.9415873],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493828":{"id":"n2138493828","loc":[-85.6344158,41.9417557],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493829":{"id":"n2138493829","loc":[-85.6344614,41.9417968],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493830":{"id":"n2138493830","loc":[-85.6345005,41.9418186],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493831":{"id":"n2138493831","loc":[-85.6345965,41.9418162],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493832":{"id":"n2138493832","loc":[-85.6347317,41.9417242],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493833":{"id":"n2138493833","loc":[-85.6346722,41.941775],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2139858909":{"id":"n2139858909","loc":[-85.633403,41.9391006],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858910":{"id":"n2139858910","loc":[-85.6332973,41.9393967],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858911":{"id":"n2139858911","loc":[-85.633205,41.9396742],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858912":{"id":"n2139858912","loc":[-85.6332203,41.9397772],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858913":{"id":"n2139858913","loc":[-85.6333453,41.939936],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858914":{"id":"n2139858914","loc":[-85.6333761,41.9400018],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858915":{"id":"n2139858915","loc":[-85.63328,41.9402249],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858916":{"id":"n2139858916","loc":[-85.6332357,41.9403523],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858917":{"id":"n2139858917","loc":[-85.6332838,41.9405831],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858918":{"id":"n2139858918","loc":[-85.6333643,41.9408744],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858919":{"id":"n2139858919","loc":[-85.6334394,41.9410519],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858920":{"id":"n2139858920","loc":[-85.6335815,41.9411717],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858921":{"id":"n2139858921","loc":[-85.6337478,41.9412734],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858922":{"id":"n2139858922","loc":[-85.6343174,41.9415268],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858923":{"id":"n2139858923","loc":[-85.6343886,41.9417397],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858924":{"id":"n2139858924","loc":[-85.6344407,41.9418015],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858925":{"id":"n2139858925","loc":[-85.6345139,41.9418366],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858926":{"id":"n2139858926","loc":[-85.6344846,41.942005],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858927":{"id":"n2139858927","loc":[-85.6345775,41.9422218],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858928":{"id":"n2139858928","loc":[-85.6348771,41.9427814],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858929":{"id":"n2139858929","loc":[-85.6349487,41.9427995],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858930":{"id":"n2139858930","loc":[-85.6350415,41.9427874],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858931":{"id":"n2139858931","loc":[-85.6351246,41.9428589],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858978":{"id":"n2139858978","loc":[-85.6349658,41.9431481],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858979":{"id":"n2139858979","loc":[-85.6350081,41.9431287],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858980":{"id":"n2139858980","loc":[-85.6349967,41.9430997],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858981":{"id":"n2139858981","loc":[-85.6352158,41.9430352],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858982":{"id":"n2139858982","loc":[-85.6348174,41.94267],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858983":{"id":"n2139858983","loc":[-85.6346142,41.9425989],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858984":{"id":"n2139858984","loc":[-85.6344938,41.9423809],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858985":{"id":"n2139858985","loc":[-85.6344856,41.9422997],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139870380":{"id":"n2139870380","loc":[-85.6346707,41.9417955],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870381":{"id":"n2139870381","loc":[-85.6345949,41.9418311],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870382":{"id":"n2139870382","loc":[-85.6343322,41.9418659],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870383":{"id":"n2139870383","loc":[-85.6342072,41.941885],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870384":{"id":"n2139870384","loc":[-85.6341325,41.9418919],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870385":{"id":"n2139870385","loc":[-85.6341314,41.9422028],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870386":{"id":"n2139870386","loc":[-85.6340472,41.9423271],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870387":{"id":"n2139870387","loc":[-85.6342185,41.9427933],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870388":{"id":"n2139870388","loc":[-85.6340605,41.9423924],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870389":{"id":"n2139870389","loc":[-85.6339889,41.9424069],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870390":{"id":"n2139870390","loc":[-85.633971,41.942356],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870391":{"id":"n2139870391","loc":[-85.63361,41.9424235],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870392":{"id":"n2139870392","loc":[-85.6337137,41.9426819],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870393":{"id":"n2139870393","loc":[-85.6336977,41.9428632],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870394":{"id":"n2139870394","loc":[-85.6338823,41.9428647],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870395":{"id":"n2139870395","loc":[-85.6339412,41.9430069],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870396":{"id":"n2139870396","loc":[-85.6338873,41.9430353],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870397":{"id":"n2139870397","loc":[-85.6337676,41.942815],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870398":{"id":"n2139870398","loc":[-85.6336822,41.9423505],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870399":{"id":"n2139870399","loc":[-85.634037,41.9422725],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870400":{"id":"n2139870400","loc":[-85.6340294,41.9422518],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870401":{"id":"n2139870401","loc":[-85.6336726,41.9423312],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870402":{"id":"n2139870402","loc":[-85.6342188,41.9425715],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870403":{"id":"n2139870403","loc":[-85.6342524,41.942565],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870404":{"id":"n2139870404","loc":[-85.6341438,41.942299],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870405":{"id":"n2139870405","loc":[-85.6341149,41.9423061],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870407":{"id":"n2139870407","loc":[-85.6340846,41.9431458],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870408":{"id":"n2139870408","loc":[-85.6339436,41.9429032],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870409":{"id":"n2139870409","loc":[-85.6343143,41.9428207],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870410":{"id":"n2139870410","loc":[-85.6343507,41.94277],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870411":{"id":"n2139870411","loc":[-85.6341527,41.942254],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870412":{"id":"n2139870412","loc":[-85.6340925,41.9422199],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870413":{"id":"n2139870413","loc":[-85.6335435,41.9423433],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870414":{"id":"n2139870414","loc":[-85.6335023,41.9423975],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870415":{"id":"n2139870415","loc":[-85.6335086,41.9424552],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870416":{"id":"n2139870416","loc":[-85.6336296,41.942665],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870417":{"id":"n2139870417","loc":[-85.6341396,41.9428596],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870418":{"id":"n2139870418","loc":[-85.6339701,41.9424487],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870419":{"id":"n2139870419","loc":[-85.6335514,41.9425294],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870420":{"id":"n2139870420","loc":[-85.6337406,41.9424929],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870421":{"id":"n2139870421","loc":[-85.6338939,41.9428687],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870422":{"id":"n2139870422","loc":[-85.6341323,41.9419538],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870423":{"id":"n2139870423","loc":[-85.6340321,41.9420376],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870424":{"id":"n2139870424","loc":[-85.6337648,41.942238],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870425":{"id":"n2139870425","loc":[-85.6337604,41.9422685],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870426":{"id":"n2139870426","loc":[-85.6337682,41.9422928],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870427":{"id":"n2139870427","loc":[-85.6338086,41.9423862],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870428":{"id":"n2139870428","loc":[-85.6349465,41.9416631],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870429":{"id":"n2139870429","loc":[-85.6351097,41.9416973],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870430":{"id":"n2139870430","loc":[-85.6353371,41.9416798],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870431":{"id":"n2139870431","loc":[-85.6349627,41.9422506],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870432":{"id":"n2139870432","loc":[-85.634979,41.9421815],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870433":{"id":"n2139870433","loc":[-85.634885,41.9421679],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870434":{"id":"n2139870434","loc":[-85.6348689,41.9422377],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870435":{"id":"n2139870435","loc":[-85.6349779,41.9419486],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870436":{"id":"n2139870436","loc":[-85.6349505,41.9418933],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870437":{"id":"n2139870437","loc":[-85.6347327,41.9419505],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870438":{"id":"n2139870438","loc":[-85.6347614,41.9420087],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870439":{"id":"n2139870439","loc":[-85.6351889,41.9416912],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870440":{"id":"n2139870440","loc":[-85.6351092,41.9418426],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870441":{"id":"n2139870441","loc":[-85.635086,41.9419659],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870442":{"id":"n2139870442","loc":[-85.6350584,41.9421466],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870443":{"id":"n2139870443","loc":[-85.6350993,41.9421606],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870444":{"id":"n2139870444","loc":[-85.6350993,41.9422132],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870445":{"id":"n2139870445","loc":[-85.6350794,41.9422855],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870446":{"id":"n2139870446","loc":[-85.6350474,41.9423159],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870447":{"id":"n2139870447","loc":[-85.6349251,41.9422998],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870448":{"id":"n2139870448","loc":[-85.634911,41.9422755],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870449":{"id":"n2139870449","loc":[-85.6349157,41.9422553],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870450":{"id":"n2139870450","loc":[-85.6347213,41.9419324],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870451":{"id":"n2139870451","loc":[-85.6349535,41.9418771],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870452":{"id":"n2139870452","loc":[-85.6350135,41.9419421],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870453":{"id":"n2139870453","loc":[-85.6348584,41.9418997],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870454":{"id":"n2139870454","loc":[-85.6348113,41.9418101],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870455":{"id":"n2139870455","loc":[-85.6347306,41.9417449],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870456":{"id":"n2139870456","loc":[-85.6349123,41.941776],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870457":{"id":"n2139870457","loc":[-85.6349423,41.9421448],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870458":{"id":"n2139870458","loc":[-85.6349436,41.9420652],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870459":{"id":"n2139870459","loc":[-85.6349136,41.9419963],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870460":{"id":"n2139870460","loc":[-85.6349814,41.9419789],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139989328":{"id":"n2139989328","loc":[-85.6334188,41.9421725],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989330":{"id":"n2139989330","loc":[-85.6335087,41.9416308],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989335":{"id":"n2139989335","loc":[-85.6336856,41.9429371],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989337":{"id":"n2139989337","loc":[-85.6333713,41.9427217],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989339":{"id":"n2139989339","loc":[-85.6332912,41.9425383],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989341":{"id":"n2139989341","loc":[-85.6339369,41.9409198],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989344":{"id":"n2139989344","loc":[-85.634097,41.9409469],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989346":{"id":"n2139989346","loc":[-85.634137,41.9412852],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989348":{"id":"n2139989348","loc":[-85.6344536,41.9414151],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989350":{"id":"n2139989350","loc":[-85.6350794,41.9412392],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989351":{"id":"n2139989351","loc":[-85.6352541,41.9409387],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989353":{"id":"n2139989353","loc":[-85.6357198,41.9408007],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989355":{"id":"n2139989355","loc":[-85.6357235,41.9427088],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989357":{"id":"n2139989357","loc":[-85.6337119,41.9421256],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989359":{"id":"n2139989359","loc":[-85.6336913,41.9420655],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989360":{"id":"n2139989360","loc":[-85.633582,41.9420867],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989362":{"id":"n2139989362","loc":[-85.6336058,41.9421491],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989364":{"id":"n2139989364","loc":[-85.6339685,41.9410995],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989366":{"id":"n2139989366","loc":[-85.6339067,41.9411383],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989368":{"id":"n2139989368","loc":[-85.6339685,41.9411972],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989370":{"id":"n2139989370","loc":[-85.6340398,41.9411619],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139870379":{"id":"n2139870379","loc":[-85.6348391,41.9416651],"version":"2","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2140006363":{"id":"n2140006363","loc":[-85.6353144,41.9430345],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006364":{"id":"n2140006364","loc":[-85.6349191,41.9431422],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140018997":{"id":"n2140018997","loc":[-85.63645945147184,41.942986488012565],"version":"1","changeset":"14895342","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:35:05Z","tags":{"amenity":"townhall","name":"Three Rivers City Hall"}},"n2140018998":{"id":"n2140018998","loc":[-85.6370319,41.9427919],"version":"1","changeset":"14895342","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:35:05Z","tags":{}},"n2140018999":{"id":"n2140018999","loc":[-85.6360687,41.9427808],"version":"1","changeset":"14895342","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:35:05Z","tags":{}},"n2199856288":{"id":"n2199856288","loc":[-85.6344968,41.9407307],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856289":{"id":"n2199856289","loc":[-85.634492,41.9406036],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856290":{"id":"n2199856290","loc":[-85.634891,41.9406001],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856291":{"id":"n2199856291","loc":[-85.6348894,41.9405288],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856292":{"id":"n2199856292","loc":[-85.6349166,41.94053],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856293":{"id":"n2199856293","loc":[-85.6349166,41.9404956],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856294":{"id":"n2199856294","loc":[-85.6350219,41.9404956],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856295":{"id":"n2199856295","loc":[-85.6350251,41.94053],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856296":{"id":"n2199856296","loc":[-85.6350538,41.9405288],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856297":{"id":"n2199856297","loc":[-85.6350602,41.94079],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856298":{"id":"n2199856298","loc":[-85.6351703,41.9407912],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856299":{"id":"n2199856299","loc":[-85.6351688,41.9409171],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856300":{"id":"n2199856300","loc":[-85.6347889,41.9409135],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856301":{"id":"n2199856301","loc":[-85.6347921,41.94079],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856302":{"id":"n2199856302","loc":[-85.6348942,41.9407888],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856303":{"id":"n2199856303","loc":[-85.6348926,41.9407283],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n185951869":{"id":"n185951869","loc":[-85.6387639,41.957288],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185958643":{"id":"n185958643","loc":[-85.636746,41.929221],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958645":{"id":"n185958645","loc":[-85.636791,41.929363],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958647":{"id":"n185958647","loc":[-85.6375975,41.9314987],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n185958649":{"id":"n185958649","loc":[-85.637669,41.931667],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958651":{"id":"n185958651","loc":[-85.637728,41.931901],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958653":{"id":"n185958653","loc":[-85.637724,41.932187],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958656":{"id":"n185958656","loc":[-85.637732,41.932761],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958658":{"id":"n185958658","loc":[-85.637688,41.93398],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958660":{"id":"n185958660","loc":[-85.637685,41.934223],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958662":{"id":"n185958662","loc":[-85.6376468,41.9350232],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n185958664":{"id":"n185958664","loc":[-85.637564,41.937028],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958666":{"id":"n185958666","loc":[-85.637458,41.938197],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958668":{"id":"n185958668","loc":[-85.637424,41.938692],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185964972":{"id":"n185964972","loc":[-85.6341901,41.9432732],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185971361":{"id":"n185971361","loc":[-85.635762,41.938208],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:01Z","tags":{}},"n185971364":{"id":"n185971364","loc":[-85.635732,41.9384],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:01Z","tags":{}},"n185971366":{"id":"n185971366","loc":[-85.635736,41.938697],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:01Z","tags":{}},"n185972775":{"id":"n185972775","loc":[-85.635638,42.070357],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972777":{"id":"n185972777","loc":[-85.635724,42.069929],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972779":{"id":"n185972779","loc":[-85.635804,42.069248],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972781":{"id":"n185972781","loc":[-85.635869,42.068361],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972783":{"id":"n185972783","loc":[-85.635883,42.067582],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972785":{"id":"n185972785","loc":[-85.635875,42.067114],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972787":{"id":"n185972787","loc":[-85.635778,42.065359],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972788":{"id":"n185972788","loc":[-85.635728,42.063416],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972789":{"id":"n185972789","loc":[-85.635665,42.062491],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972790":{"id":"n185972790","loc":[-85.635617,42.061928],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972791":{"id":"n185972791","loc":[-85.635614,42.061898],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972793":{"id":"n185972793","loc":[-85.635379,42.060288],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972795":{"id":"n185972795","loc":[-85.635092,42.05799],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972797":{"id":"n185972797","loc":[-85.634843,42.055781],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972798":{"id":"n185972798","loc":[-85.634817,42.055549],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972800":{"id":"n185972800","loc":[-85.634708,42.053942],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972802":{"id":"n185972802","loc":[-85.634447,42.051809],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972805":{"id":"n185972805","loc":[-85.634241,42.04946],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972807":{"id":"n185972807","loc":[-85.633787,42.045926],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972809":{"id":"n185972809","loc":[-85.633811,42.045645],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972811":{"id":"n185972811","loc":[-85.63373,42.043626],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972813":{"id":"n185972813","loc":[-85.633698,42.042184],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972814":{"id":"n185972814","loc":[-85.63369,42.04181],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972815":{"id":"n185972815","loc":[-85.633681,42.040714],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972816":{"id":"n185972816","loc":[-85.633571,42.036322],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972817":{"id":"n185972817","loc":[-85.633537,42.034044],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972819":{"id":"n185972819","loc":[-85.633481,42.030785],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972821":{"id":"n185972821","loc":[-85.633452,42.027538],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972824":{"id":"n185972824","loc":[-85.633438,42.027427],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972826":{"id":"n185972826","loc":[-85.633342,42.022656],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972830":{"id":"n185972830","loc":[-85.63327,42.020724],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972832":{"id":"n185972832","loc":[-85.633198,42.019106],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972834":{"id":"n185972834","loc":[-85.633249,42.018363],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972835":{"id":"n185972835","loc":[-85.633139,42.012944],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972836":{"id":"n185972836","loc":[-85.63309,42.008284],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:38Z","tags":{}},"n185972839":{"id":"n185972839","loc":[-85.63298,42.00005],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:38Z","tags":{}},"n185972845":{"id":"n185972845","loc":[-85.6325369,41.9764959],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185972847":{"id":"n185972847","loc":[-85.6327549,41.9750005],"version":"4","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185972849":{"id":"n185972849","loc":[-85.6329374,41.9742527],"version":"4","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185972851":{"id":"n185972851","loc":[-85.6331387,41.9736039],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185972862":{"id":"n185972862","loc":[-85.6383589,41.9585023],"version":"4","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185972868":{"id":"n185972868","loc":[-85.6393633,41.9551716],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185972878":{"id":"n185972878","loc":[-85.639377,41.95335],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:39Z","tags":{}},"n185972882":{"id":"n185972882","loc":[-85.6389179,41.9516944],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185972885":{"id":"n185972885","loc":[-85.6387444,41.9512105],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185972891":{"id":"n185972891","loc":[-85.636421,41.946392],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:39Z","tags":{}},"n185972895":{"id":"n185972895","loc":[-85.635965,41.945809],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:39Z","tags":{}},"n185972897":{"id":"n185972897","loc":[-85.635683,41.945449],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:39Z","tags":{}},"n185972899":{"id":"n185972899","loc":[-85.635281,41.9450252],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185972905":{"id":"n185972905","loc":[-85.6324428,41.9425743],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185985217":{"id":"n185985217","loc":[-85.638243,41.943674],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985219":{"id":"n185985219","loc":[-85.638228,41.943747],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985221":{"id":"n185985221","loc":[-85.638163,41.943797],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985222":{"id":"n185985222","loc":[-85.638089,41.943832],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985223":{"id":"n185985223","loc":[-85.637969,41.943841],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985225":{"id":"n185985225","loc":[-85.637841,41.943833],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985227":{"id":"n185985227","loc":[-85.637601,41.943789],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985229":{"id":"n185985229","loc":[-85.637449,41.943754],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985231":{"id":"n185985231","loc":[-85.637342,41.943734],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985233":{"id":"n185985233","loc":[-85.637218,41.943703],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:21Z","tags":{}},"n185985235":{"id":"n185985235","loc":[-85.637151,41.943663],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:21Z","tags":{}},"n185985238":{"id":"n185985238","loc":[-85.637118,41.943615],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:21Z","tags":{}},"n185985240":{"id":"n185985240","loc":[-85.637073,41.943494],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:21Z","tags":{}},"n185990434":{"id":"n185990434","loc":[-85.6329028,41.9984292],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:18Z","tags":{"railway":"level_crossing"}},"n1475284023":{"id":"n1475284023","loc":[-85.6336163,41.9435806],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{"railway":"level_crossing"}},"n1475293222":{"id":"n1475293222","loc":[-85.6394045,41.953658],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:50Z","tags":{"railway":"level_crossing"}},"n1475293226":{"id":"n1475293226","loc":[-85.6364975,41.9638663],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:50Z","tags":{"railway":"level_crossing"}},"n1475293234":{"id":"n1475293234","loc":[-85.6390449,41.9565145],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293240":{"id":"n1475293240","loc":[-85.636943,41.9473114],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293252":{"id":"n1475293252","loc":[-85.6392115,41.9559003],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293254":{"id":"n1475293254","loc":[-85.6348931,41.9685127],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{"railway":"level_crossing"}},"n1475293260":{"id":"n1475293260","loc":[-85.6375999,41.9485401],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:52Z","tags":{}},"n1475293261":{"id":"n1475293261","loc":[-85.6391256,41.9523817],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:52Z","tags":{"railway":"level_crossing"}},"n1475293264":{"id":"n1475293264","loc":[-85.6394155,41.9546493],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:52Z","tags":{"railway":"level_crossing"}},"n1819805614":{"id":"n1819805614","loc":[-85.6345652,41.9363097],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805618":{"id":"n1819805618","loc":[-85.6295334,41.9426862],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805622":{"id":"n1819805622","loc":[-85.6308208,41.9430773],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805626":{"id":"n1819805626","loc":[-85.6274734,41.9406592],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805629":{"id":"n1819805629","loc":[-85.6296943,41.9430533],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805632":{"id":"n1819805632","loc":[-85.6340931,41.9354477],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805636":{"id":"n1819805636","loc":[-85.6304131,41.9436598],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805639":{"id":"n1819805639","loc":[-85.6304882,41.9426623],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805641":{"id":"n1819805641","loc":[-85.6336103,41.9367487],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805643":{"id":"n1819805643","loc":[-85.6300376,41.9418084],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805645":{"id":"n1819805645","loc":[-85.6365286,41.9336679],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805647":{"id":"n1819805647","loc":[-85.632016,41.9429221],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805666":{"id":"n1819805666","loc":[-85.6314753,41.9442663],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805669":{"id":"n1819805669","loc":[-85.6268619,41.9402203],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805673":{"id":"n1819805673","loc":[-85.6296728,41.9412099],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805676":{"id":"n1819805676","loc":[-85.6354557,41.932766],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805680":{"id":"n1819805680","loc":[-85.632752,41.9431012],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805683":{"id":"n1819805683","loc":[-85.631147,41.9432014],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805687":{"id":"n1819805687","loc":[-85.635284,41.9343942],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805690":{"id":"n1819805690","loc":[-85.6249736,41.9405794],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805694":{"id":"n1819805694","loc":[-85.6294153,41.9417925],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805698":{"id":"n1819805698","loc":[-85.6323486,41.9426986],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805702":{"id":"n1819805702","loc":[-85.6340287,41.9373871],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805707":{"id":"n1819805707","loc":[-85.6353698,41.9316326],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805711":{"id":"n1819805711","loc":[-85.6284176,41.940356],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805715":{"id":"n1819805715","loc":[-85.6291471,41.9412897],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805718":{"id":"n1819805718","loc":[-85.6311105,41.943979],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805722":{"id":"n1819805722","loc":[-85.6320868,41.9400128],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805724":{"id":"n1819805724","loc":[-85.635166,41.9324627],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805727":{"id":"n1819805727","loc":[-85.6344686,41.9350567],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805728":{"id":"n1819805728","loc":[-85.6357132,41.9332369],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805731":{"id":"n1819805731","loc":[-85.629984,41.9434444],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805760":{"id":"n1819805760","loc":[-85.6330996,41.9378784],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805766":{"id":"n1819805766","loc":[-85.625274,41.9411141],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805770":{"id":"n1819805770","loc":[-85.6326321,41.9412173],"version":"2","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{}},"n1819805774":{"id":"n1819805774","loc":[-85.6347047,41.9312096],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805777":{"id":"n1819805777","loc":[-85.6363569,41.9339552],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805780":{"id":"n1819805780","loc":[-85.6327392,41.941926],"version":"2","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{}},"n1819805783":{"id":"n1819805783","loc":[-85.6357239,41.9338435],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805786":{"id":"n1819805786","loc":[-85.6356595,41.9346576],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805789":{"id":"n1819805789","loc":[-85.6316469,41.9436598],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805792":{"id":"n1819805792","loc":[-85.6350587,41.9354557],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805795":{"id":"n1819805795","loc":[-85.6360028,41.9322791],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805798":{"id":"n1819805798","loc":[-85.63125,41.9443062],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805802":{"id":"n1819805802","loc":[-85.6263362,41.9408109],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805805":{"id":"n1819805805","loc":[-85.6315075,41.9438753],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805808":{"id":"n1819805808","loc":[-85.6340008,41.9316051],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805810":{"id":"n1819805810","loc":[-85.6345545,41.9320557],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805812":{"id":"n1819805812","loc":[-85.6250809,41.9408587],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805814":{"id":"n1819805814","loc":[-85.6257783,41.9400926],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805834":{"id":"n1819805834","loc":[-85.6326408,41.9424363],"version":"2","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{}},"n1819805838":{"id":"n1819805838","loc":[-85.6365607,41.9334365],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805842":{"id":"n1819805842","loc":[-85.6288253,41.9410343],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805846":{"id":"n1819805846","loc":[-85.6279133,41.9402921],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805849":{"id":"n1819805849","loc":[-85.6289433,41.9405156],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805852":{"id":"n1819805852","loc":[-85.6313787,41.9439152],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805858":{"id":"n1819805858","loc":[-85.6300805,41.9420398],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805861":{"id":"n1819805861","loc":[-85.6321941,41.9396297],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805864":{"id":"n1819805864","loc":[-85.6329129,41.9393903],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805868":{"id":"n1819805868","loc":[-85.632001,41.9434922],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805870":{"id":"n1819805870","loc":[-85.6314903,41.9431535],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805873":{"id":"n1819805873","loc":[-85.6251667,41.9401166],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805876":{"id":"n1819805876","loc":[-85.63287,41.939941],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805878":{"id":"n1819805878","loc":[-85.6307886,41.9437317],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805880":{"id":"n1819805880","loc":[-85.6321727,41.940348],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805883":{"id":"n1819805883","loc":[-85.6265872,41.940113],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805885":{"id":"n1819805885","loc":[-85.6268404,41.9406672],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805887":{"id":"n1819805887","loc":[-85.6325267,41.9389035],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805889":{"id":"n1819805889","loc":[-85.6364964,41.933189],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805911":{"id":"n1819805911","loc":[-85.6248663,41.9401804],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805922":{"id":"n1819805922","loc":[-85.633267,41.9387199],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805925":{"id":"n1819805925","loc":[-85.6293402,41.9408428],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819848849":{"id":"n1819848849","loc":[-85.6464957,41.9695178],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848850":{"id":"n1819848850","loc":[-85.6497642,41.9611355],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848851":{"id":"n1819848851","loc":[-85.6480943,41.9624818],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848854":{"id":"n1819848854","loc":[-85.6500362,41.9657367],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848855":{"id":"n1819848855","loc":[-85.6493673,41.9783496],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848856":{"id":"n1819848856","loc":[-85.6457409,41.9548007],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848857":{"id":"n1819848857","loc":[-85.651313,41.9760426],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848858":{"id":"n1819848858","loc":[-85.6495819,41.9784772],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848859":{"id":"n1819848859","loc":[-85.6495105,41.9833722],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848860":{"id":"n1819848860","loc":[-85.6405053,41.9492792],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848863":{"id":"n1819848863","loc":[-85.6502293,41.9786826],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848865":{"id":"n1819848865","loc":[-85.6406877,41.9495106],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848870":{"id":"n1819848870","loc":[-85.6493136,41.9704611],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848871":{"id":"n1819848871","loc":[-85.6372249,41.9441284],"version":"2","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n1819848873":{"id":"n1819848873","loc":[-85.6512379,41.9659441],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848875":{"id":"n1819848875","loc":[-85.6508087,41.9650187],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848877":{"id":"n1819848877","loc":[-85.6487166,41.9605352],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848878":{"id":"n1819848878","loc":[-85.6506478,41.9760665],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848879":{"id":"n1819848879","loc":[-85.651431,41.9758512],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848886":{"id":"n1819848886","loc":[-85.6477617,41.9563945],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848889":{"id":"n1819848889","loc":[-85.6497895,41.9832286],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848892":{"id":"n1819848892","loc":[-85.6504868,41.9791931],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848893":{"id":"n1819848893","loc":[-85.6498002,41.9615085],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848894":{"id":"n1819848894","loc":[-85.6404302,41.9502846],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848901":{"id":"n1819848901","loc":[-85.6354412,41.9439886],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848903":{"id":"n1819848903","loc":[-85.6472145,41.9698528],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848904":{"id":"n1819848904","loc":[-85.6401979,41.9486233],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848905":{"id":"n1819848905","loc":[-85.6475042,41.963503],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848909":{"id":"n1819848909","loc":[-85.6343405,41.94358],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848914":{"id":"n1819848914","loc":[-85.6503474,41.9737773],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848915":{"id":"n1819848915","loc":[-85.6389533,41.9470992],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848916":{"id":"n1819848916","loc":[-85.6483625,41.9577907],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848917":{"id":"n1819848917","loc":[-85.6484768,41.9617419],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848918":{"id":"n1819848918","loc":[-85.644078,41.9545693],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848919":{"id":"n1819848919","loc":[-85.6437169,41.9543041],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848920":{"id":"n1819848920","loc":[-85.6478331,41.9627949],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848922":{"id":"n1819848922","loc":[-85.6499144,41.9785889],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848924":{"id":"n1819848924","loc":[-85.647633,41.9720066],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848926":{"id":"n1819848926","loc":[-85.6487987,41.978868],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848927":{"id":"n1819848927","loc":[-85.6495105,41.9730355],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848928":{"id":"n1819848928","loc":[-85.648223,41.9829654],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848929":{"id":"n1819848929","loc":[-85.6514846,41.9659122],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848931":{"id":"n1819848931","loc":[-85.6498753,41.9731871],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848932":{"id":"n1819848932","loc":[-85.640906,41.9508575],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848933":{"id":"n1819848933","loc":[-85.649775,41.9799767],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848934":{"id":"n1819848934","loc":[-85.6507014,41.9739927],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848937":{"id":"n1819848937","loc":[-85.6479763,41.9840899],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848938":{"id":"n1819848938","loc":[-85.6501113,41.9600884],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848939":{"id":"n1819848939","loc":[-85.6389962,41.9478253],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848941":{"id":"n1819848941","loc":[-85.637469,41.9445791],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848942":{"id":"n1819848942","loc":[-85.6494569,41.9601682],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848943":{"id":"n1819848943","loc":[-85.6368803,41.9439351],"version":"2","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n1819848945":{"id":"n1819848945","loc":[-85.6474398,41.9724213],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848946":{"id":"n1819848946","loc":[-85.6382629,41.9463666],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848948":{"id":"n1819848948","loc":[-85.6489633,41.9830771],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848952":{"id":"n1819848952","loc":[-85.6488882,41.9600326],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848953":{"id":"n1819848953","loc":[-85.6488094,41.9774324],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848954":{"id":"n1819848954","loc":[-85.6491135,41.9600485],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848955":{"id":"n1819848955","loc":[-85.6501435,41.9734583],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848956":{"id":"n1819848956","loc":[-85.6495534,41.960958],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848958":{"id":"n1819848958","loc":[-85.6474683,41.9561491],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848959":{"id":"n1819848959","loc":[-85.6401083,41.9485451],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848960":{"id":"n1819848960","loc":[-85.6481764,41.9678686],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848961":{"id":"n1819848961","loc":[-85.6484017,41.967382],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848962":{"id":"n1819848962","loc":[-85.6501328,41.959897],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848964":{"id":"n1819848964","loc":[-85.6403695,41.9504586],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848966":{"id":"n1819848966","loc":[-85.6398975,41.9491499],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848967":{"id":"n1819848967","loc":[-85.6412455,41.9510187],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848968":{"id":"n1819848968","loc":[-85.6482622,41.9619493],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848969":{"id":"n1819848969","loc":[-85.6405841,41.9501474],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848970":{"id":"n1819848970","loc":[-85.6478583,41.9703394],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848971":{"id":"n1819848971","loc":[-85.6493388,41.9832845],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848972":{"id":"n1819848972","loc":[-85.6485664,41.9829415],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848974":{"id":"n1819848974","loc":[-85.6491457,41.9779887],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848975":{"id":"n1819848975","loc":[-85.6468889,41.9697033],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848976":{"id":"n1819848976","loc":[-85.6452726,41.9546072],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848977":{"id":"n1819848977","loc":[-85.6448435,41.9546072],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848979":{"id":"n1819848979","loc":[-85.6485342,41.9763138],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848980":{"id":"n1819848980","loc":[-85.6495282,41.9664087],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848986":{"id":"n1819848986","loc":[-85.6486307,41.9603278],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848987":{"id":"n1819848987","loc":[-85.6492278,41.9791871],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848990":{"id":"n1819848990","loc":[-85.6501934,41.9800724],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848992":{"id":"n1819848992","loc":[-85.6482445,41.9819685],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848993":{"id":"n1819848993","loc":[-85.6481871,41.9704451],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848994":{"id":"n1819848994","loc":[-85.6371364,41.9457602],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848996":{"id":"n1819848996","loc":[-85.6500362,41.9801023],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849000":{"id":"n1819849000","loc":[-85.639007,41.9485914],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849001":{"id":"n1819849001","loc":[-85.6488882,41.9669253],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849002":{"id":"n1819849002","loc":[-85.6484698,41.9565062],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849004":{"id":"n1819849004","loc":[-85.6510769,41.9761064],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849005":{"id":"n1819849005","loc":[-85.6503581,41.9799029],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849006":{"id":"n1819849006","loc":[-85.6489381,41.9703893],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849008":{"id":"n1819849008","loc":[-85.6497457,41.9833588],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849011":{"id":"n1819849011","loc":[-85.6497358,41.9717593],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849012":{"id":"n1819849012","loc":[-85.6494676,41.9796796],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849019":{"id":"n1819849019","loc":[-85.6486093,41.9771034],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849021":{"id":"n1819849021","loc":[-85.6504546,41.9796556],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849022":{"id":"n1819849022","loc":[-85.6371294,41.9454154],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849023":{"id":"n1819849023","loc":[-85.6503436,41.9759249],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849025":{"id":"n1819849025","loc":[-85.6462382,41.9693822],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849026":{"id":"n1819849026","loc":[-85.6497573,41.983093],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849028":{"id":"n1819849028","loc":[-85.6497465,41.9602799],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849029":{"id":"n1819849029","loc":[-85.6374728,41.9460698],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849030":{"id":"n1819849030","loc":[-85.6486592,41.9566039],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849031":{"id":"n1819849031","loc":[-85.6515989,41.9654993],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849032":{"id":"n1819849032","loc":[-85.6387028,41.9482658],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849033":{"id":"n1819849033","loc":[-85.6464742,41.9688398],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849034":{"id":"n1819849034","loc":[-85.6495212,41.9589236],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849035":{"id":"n1819849035","loc":[-85.6490599,41.9790096],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849036":{"id":"n1819849036","loc":[-85.6489918,41.9800724],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849038":{"id":"n1819849038","loc":[-85.6499182,41.9659042],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849040":{"id":"n1819849040","loc":[-85.639758,41.9490143],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849041":{"id":"n1819849041","loc":[-85.6514846,41.9755241],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849042":{"id":"n1819849042","loc":[-85.6436633,41.9540647],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849045":{"id":"n1819849045","loc":[-85.6475541,41.9726387],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849046":{"id":"n1819849046","loc":[-85.6488308,41.9718331],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849047":{"id":"n1819849047","loc":[-85.6377694,41.9460953],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849048":{"id":"n1819849048","loc":[-85.6490706,41.9804452],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849049":{"id":"n1819849049","loc":[-85.6485449,41.9766248],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849051":{"id":"n1819849051","loc":[-85.6483625,41.9790256],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849052":{"id":"n1819849052","loc":[-85.6490706,41.9585167],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849053":{"id":"n1819849053","loc":[-85.6425008,41.9522874],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849054":{"id":"n1819849054","loc":[-85.6475793,41.9632158],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849055":{"id":"n1819849055","loc":[-85.6408631,41.9499399],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849056":{"id":"n1819849056","loc":[-85.6483373,41.9814681],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849057":{"id":"n1819849057","loc":[-85.6313548,41.9442876],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849058":{"id":"n1819849058","loc":[-85.6432663,41.9529796],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849059":{"id":"n1819849059","loc":[-85.6487128,41.9582873],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849060":{"id":"n1819849060","loc":[-85.6482338,41.9817612],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849062":{"id":"n1819849062","loc":[-85.6485664,41.9788661],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849063":{"id":"n1819849063","loc":[-85.6373081,41.9448824],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849064":{"id":"n1819849064","loc":[-85.6472215,41.9557582],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849065":{"id":"n1819849065","loc":[-85.6348984,41.9440414],"version":"2","changeset":"14893390","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:53:38Z","tags":{}},"n1819849066":{"id":"n1819849066","loc":[-85.6501972,41.9647315],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849067":{"id":"n1819849067","loc":[-85.6489741,41.9808281],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849068":{"id":"n1819849068","loc":[-85.6420111,41.9515034],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849069":{"id":"n1819849069","loc":[-85.6397972,41.9488882],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849070":{"id":"n1819849070","loc":[-85.6499718,41.9593465],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849071":{"id":"n1819849071","loc":[-85.6486844,41.9811311],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849072":{"id":"n1819849072","loc":[-85.6390392,41.9474663],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849074":{"id":"n1819849074","loc":[-85.6495642,41.9616362],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849075":{"id":"n1819849075","loc":[-85.6483518,41.9791931],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849076":{"id":"n1819849076","loc":[-85.6478974,41.9833104],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849077":{"id":"n1819849077","loc":[-85.640155,41.948719],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849078":{"id":"n1819849078","loc":[-85.6399366,41.9487845],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849079":{"id":"n1819849079","loc":[-85.6492959,41.9825348],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849080":{"id":"n1819849080","loc":[-85.6505083,41.9648352],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849081":{"id":"n1819849081","loc":[-85.6492959,41.9645241],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849082":{"id":"n1819849082","loc":[-85.6402049,41.9491835],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849083":{"id":"n1819849083","loc":[-85.6495175,41.9826963],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849084":{"id":"n1819849084","loc":[-85.6480836,41.9728361],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849085":{"id":"n1819849085","loc":[-85.6374349,41.9443425],"version":"2","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n1819849086":{"id":"n1819849086","loc":[-85.6478331,41.9681238],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849089":{"id":"n1819849089","loc":[-85.639368,41.9486169],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849092":{"id":"n1819849092","loc":[-85.6503581,41.9788022],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849093":{"id":"n1819849093","loc":[-85.64862,41.9568014],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849094":{"id":"n1819849094","loc":[-85.6496999,41.9828877],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849095":{"id":"n1819849095","loc":[-85.647472,41.972198],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849096":{"id":"n1819849096","loc":[-85.6485771,41.9644523],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849097":{"id":"n1819849097","loc":[-85.6388353,41.9480488],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849099":{"id":"n1819849099","loc":[-85.6472752,41.9683312],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849104":{"id":"n1819849104","loc":[-85.6479548,41.9836035],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849105":{"id":"n1819849105","loc":[-85.6462489,41.9691668],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849107":{"id":"n1819849107","loc":[-85.6511912,41.9746328],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849108":{"id":"n1819849108","loc":[-85.6498646,41.9714881],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849111":{"id":"n1819849111","loc":[-85.6488239,41.961684],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849112":{"id":"n1819849112","loc":[-85.6469356,41.9553812],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849114":{"id":"n1819849114","loc":[-85.6479548,41.9640853],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849119":{"id":"n1819849119","loc":[-85.6491565,41.961692],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849121":{"id":"n1819849121","loc":[-85.651667,41.9656728],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849124":{"id":"n1819849124","loc":[-85.6388423,41.9484414],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849126":{"id":"n1819849126","loc":[-85.6371686,41.9450978],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849127":{"id":"n1819849127","loc":[-85.6502615,41.9656728],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849129":{"id":"n1819849129","loc":[-85.6498501,41.9613031],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849131":{"id":"n1819849131","loc":[-85.6513881,41.9653298],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849133":{"id":"n1819849133","loc":[-85.639883,41.9485291],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849139":{"id":"n1819849139","loc":[-85.6508693,41.9658264],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849140":{"id":"n1819849140","loc":[-85.6486806,41.9761642],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849141":{"id":"n1819849141","loc":[-85.6483159,41.9717613],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849144":{"id":"n1819849144","loc":[-85.6443714,41.9546232],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849146":{"id":"n1819849146","loc":[-85.641775,41.9513359],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849147":{"id":"n1819849147","loc":[-85.6495604,41.9757335],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849148":{"id":"n1819849148","loc":[-85.6465671,41.9551678],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849150":{"id":"n1819849150","loc":[-85.6485127,41.9794084],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849151":{"id":"n1819849151","loc":[-85.6499144,41.9757096],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849152":{"id":"n1819849152","loc":[-85.6433736,41.9531072],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849154":{"id":"n1819849154","loc":[-85.6489741,41.9607426],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849155":{"id":"n1819849155","loc":[-85.640627,41.9507697],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849156":{"id":"n1819849156","loc":[-85.6509659,41.9743058],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849157":{"id":"n1819849157","loc":[-85.6486844,41.9704431],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849158":{"id":"n1819849158","loc":[-85.6498538,41.9711132],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849159":{"id":"n1819849159","loc":[-85.6358937,41.943719],"version":"2","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n1819849160":{"id":"n1819849160","loc":[-85.6497358,41.9707702],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849161":{"id":"n1819849161","loc":[-85.6480476,41.9564842],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849162":{"id":"n1819849162","loc":[-85.6482982,41.9574556],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849163":{"id":"n1819849163","loc":[-85.6501757,41.9757794],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849164":{"id":"n1819849164","loc":[-85.6372973,41.9459916],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849165":{"id":"n1819849165","loc":[-85.6513773,41.9750775],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849166":{"id":"n1819849166","loc":[-85.6436418,41.9537455],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849167":{"id":"n1819849167","loc":[-85.6483625,41.9571524],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849169":{"id":"n1819849169","loc":[-85.647751,41.9727962],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849170":{"id":"n1819849170","loc":[-85.6504546,41.9656808],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849171":{"id":"n1819849171","loc":[-85.6479977,41.971839],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849172":{"id":"n1819849172","loc":[-85.6482767,41.9642449],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849174":{"id":"n1819849174","loc":[-85.6414317,41.9512086],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849176":{"id":"n1819849176","loc":[-85.6469034,41.9685287],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849179":{"id":"n1819849179","loc":[-85.6408631,41.9497564],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849182":{"id":"n1819849182","loc":[-85.6476721,41.96384],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849183":{"id":"n1819849183","loc":[-85.6479725,41.983111],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849184":{"id":"n1819849184","loc":[-85.640788,41.9500516],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849185":{"id":"n1819849185","loc":[-85.6427798,41.9528778],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849186":{"id":"n1819849186","loc":[-85.6435308,41.9534124],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849187":{"id":"n1819849187","loc":[-85.6483733,41.9821998],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849189":{"id":"n1819849189","loc":[-85.6351752,41.9440796],"version":"2","changeset":"14893390","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:53:38Z","tags":{}},"n1819849191":{"id":"n1819849191","loc":[-85.6487021,41.9601463],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849192":{"id":"n1819849192","loc":[-85.6363811,41.9437605],"version":"2","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n1819849193":{"id":"n1819849193","loc":[-85.6490883,41.9759728],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849194":{"id":"n1819849194","loc":[-85.6423292,41.9520081],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849195":{"id":"n1819849195","loc":[-85.6500003,41.960242],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849196":{"id":"n1819849196","loc":[-85.6385778,41.9466443],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849197":{"id":"n1819849197","loc":[-85.6494032,41.9718789],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849198":{"id":"n1819849198","loc":[-85.6404339,41.9506501],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849199":{"id":"n1819849199","loc":[-85.6426226,41.9527083],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849200":{"id":"n1819849200","loc":[-85.6439101,41.9545035],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849201":{"id":"n1819849201","loc":[-85.6516563,41.9657845],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:00Z","tags":{}},"n1819849202":{"id":"n1819849202","loc":[-85.6473395,41.9699585],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:00Z","tags":{}},"n1819858501":{"id":"n1819858501","loc":[-85.6361263,41.9437126],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858503":{"id":"n1819858503","loc":[-85.6350068,41.944034],"version":"2","changeset":"14893390","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:53:38Z","tags":{}},"n1819858513":{"id":"n1819858513","loc":[-85.6371402,41.9453282],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858518":{"id":"n1819858518","loc":[-85.6348713,41.9432923],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858523":{"id":"n1819858523","loc":[-85.6357047,41.943799],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1819858526":{"id":"n1819858526","loc":[-85.6349947,41.9435756],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1819858531":{"id":"n1819858531","loc":[-85.6350376,41.943827],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1820937508":{"id":"n1820937508","loc":[-85.1026013,42.0881722],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937509":{"id":"n1820937509","loc":[-85.0558088,42.102493],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937511":{"id":"n1820937511","loc":[-85.3030116,41.9724451],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937513":{"id":"n1820937513","loc":[-85.0353221,42.1027398],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937514":{"id":"n1820937514","loc":[-85.0835468,42.1015469],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937515":{"id":"n1820937515","loc":[-85.2421298,42.0106305],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937517":{"id":"n1820937517","loc":[-85.0090632,42.0910452],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937518":{"id":"n1820937518","loc":[-85.086626,42.0948838],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937520":{"id":"n1820937520","loc":[-85.2552039,42.0015448],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937521":{"id":"n1820937521","loc":[-85.3739614,41.9969917],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937522":{"id":"n1820937522","loc":[-85.4831166,41.993898],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937523":{"id":"n1820937523","loc":[-85.0341084,42.0977657],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937524":{"id":"n1820937524","loc":[-85.3272802,41.9710333],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937525":{"id":"n1820937525","loc":[-85.2125568,42.0414521],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937526":{"id":"n1820937526","loc":[-85.3798022,41.9992458],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937527":{"id":"n1820937527","loc":[-85.2652021,41.999768],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937528":{"id":"n1820937528","loc":[-85.3852739,42.0004896],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937529":{"id":"n1820937529","loc":[-85.3911919,42.0030513],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937530":{"id":"n1820937530","loc":[-85.5440349,41.9717109],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937531":{"id":"n1820937531","loc":[-85.2790155,41.9911764],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937532":{"id":"n1820937532","loc":[-85.4723277,41.9950518],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937533":{"id":"n1820937533","loc":[-85.5690546,41.9653931],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937535":{"id":"n1820937535","loc":[-85.5674882,41.9649623],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937536":{"id":"n1820937536","loc":[-85.6362815,41.9189165],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937537":{"id":"n1820937537","loc":[-85.5659003,41.963638],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937539":{"id":"n1820937539","loc":[-85.6391353,41.9122262],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937540":{"id":"n1820937540","loc":[-85.4834385,41.9894803],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937541":{"id":"n1820937541","loc":[-85.6399078,41.9160744],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937542":{"id":"n1820937542","loc":[-85.632874,41.941031],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937543":{"id":"n1820937543","loc":[-85.1307591,42.0726961],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937544":{"id":"n1820937544","loc":[-85.6444397,41.9128378],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937545":{"id":"n1820937545","loc":[-85.6197204,41.9420365],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937546":{"id":"n1820937546","loc":[-85.1164857,42.0864631],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937547":{"id":"n1820937547","loc":[-85.6476111,41.9142222],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937548":{"id":"n1820937548","loc":[-85.2915747,41.9774223],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937549":{"id":"n1820937549","loc":[-85.6430192,41.9102461],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937550":{"id":"n1820937550","loc":[-85.1597495,42.0639017],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937551":{"id":"n1820937551","loc":[-85.5504079,41.9701793],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937553":{"id":"n1820937553","loc":[-85.2781317,41.9948951],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937555":{"id":"n1820937555","loc":[-85.3724594,41.997518],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937556":{"id":"n1820937556","loc":[-85.5629434,41.9665155],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937557":{"id":"n1820937557","loc":[-85.3791971,41.9990808],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937558":{"id":"n1820937558","loc":[-85.001891,42.0878843],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937560":{"id":"n1820937560","loc":[-85.3140838,41.9709056],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937561":{"id":"n1820937561","loc":[-85.2468032,42.0146987],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937563":{"id":"n1820937563","loc":[-85.0877378,42.097255],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937564":{"id":"n1820937564","loc":[-85.2442498,42.0150654],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937566":{"id":"n1820937566","loc":[-85.3108973,41.9701478],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937568":{"id":"n1820937568","loc":[-85.0344584,42.1016572],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937569":{"id":"n1820937569","loc":[-85.2331025,42.0297387],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937570":{"id":"n1820937570","loc":[-85.5058446,41.9746996],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937571":{"id":"n1820937571","loc":[-85.5622739,41.9676427],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937572":{"id":"n1820937572","loc":[-85.2792687,41.9890337],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937574":{"id":"n1820937574","loc":[-84.9909302,42.08695],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937575":{"id":"n1820937575","loc":[-85.6218233,41.9418609],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937576":{"id":"n1820937576","loc":[-85.3577437,41.9931062],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937577":{"id":"n1820937577","loc":[-85.639028,41.9165853],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937578":{"id":"n1820937578","loc":[-84.9956576,42.0865348],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937579":{"id":"n1820937579","loc":[-85.4828376,41.990198],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937580":{"id":"n1820937580","loc":[-85.3244478,41.9720543],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937582":{"id":"n1820937582","loc":[-85.0517479,42.1035159],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937583":{"id":"n1820937583","loc":[-85.225646,42.0338025],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937584":{"id":"n1820937584","loc":[-84.9941019,42.0862163],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937586":{"id":"n1820937586","loc":[-85.1051762,42.0879452],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937587":{"id":"n1820937587","loc":[-85.1245203,42.0753162],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937588":{"id":"n1820937588","loc":[-85.3250808,41.9719506],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937589":{"id":"n1820937589","loc":[-85.2720109,41.997933],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937590":{"id":"n1820937590","loc":[-85.2556653,42.0027248],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937591":{"id":"n1820937591","loc":[-85.0872483,42.0943544],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937592":{"id":"n1820937592","loc":[-85.2778353,41.9955023],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937593":{"id":"n1820937593","loc":[-85.2984733,41.9735538],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937594":{"id":"n1820937594","loc":[-85.101578,42.0889552],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937595":{"id":"n1820937595","loc":[-85.3888745,42.0016959],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937596":{"id":"n1820937596","loc":[-84.9903508,42.0870654],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937597":{"id":"n1820937597","loc":[-85.6405558,41.9146261],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937598":{"id":"n1820937598","loc":[-85.6460704,41.9141311],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937599":{"id":"n1820937599","loc":[-85.0377468,42.1037428],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937600":{"id":"n1820937600","loc":[-85.2298345,42.0312899],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937601":{"id":"n1820937601","loc":[-85.1080958,42.0861964],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937602":{"id":"n1820937602","loc":[-85.6325307,41.9402329],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937603":{"id":"n1820937603","loc":[-85.1165984,42.0832184],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937604":{"id":"n1820937604","loc":[-85.6354446,41.9190602],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937605":{"id":"n1820937605","loc":[-85.1114592,42.0862959],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937606":{"id":"n1820937606","loc":[-85.0858763,42.1001646],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937607":{"id":"n1820937607","loc":[-85.0472083,42.1015151],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937608":{"id":"n1820937608","loc":[-85.0802477,42.1027609],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937610":{"id":"n1820937610","loc":[-85.0924585,42.0928564],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937611":{"id":"n1820937611","loc":[-85.0329617,42.09827],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937612":{"id":"n1820937612","loc":[-85.2814617,41.993465],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937613":{"id":"n1820937613","loc":[-85.3097708,41.9700282],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937614":{"id":"n1820937614","loc":[-85.2809427,41.993695],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937615":{"id":"n1820937615","loc":[-85.0583233,42.1026494],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937617":{"id":"n1820937617","loc":[-85.2801592,41.9840021],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937619":{"id":"n1820937619","loc":[-85.1064154,42.0863449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937620":{"id":"n1820937620","loc":[-85.0423173,42.1014662],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937621":{"id":"n1820937621","loc":[-85.2168913,42.0398107],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937622":{"id":"n1820937622","loc":[-85.2798481,41.9833401],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937623":{"id":"n1820937623","loc":[-85.0575468,42.1028672],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937625":{"id":"n1820937625","loc":[-85.0130369,42.0893067],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937626":{"id":"n1820937626","loc":[-85.0346985,42.1018256],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937627":{"id":"n1820937627","loc":[-85.2231569,42.0372768],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937628":{"id":"n1820937628","loc":[-85.2956195,41.9732268],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937629":{"id":"n1820937629","loc":[-85.1052312,42.086893],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937630":{"id":"n1820937630","loc":[-85.4813356,41.9958436],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937631":{"id":"n1820937631","loc":[-85.0961599,42.0914672],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937632":{"id":"n1820937632","loc":[-85.308419,41.9704749],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937633":{"id":"n1820937633","loc":[-85.295952,41.9715119],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937634":{"id":"n1820937634","loc":[-85.3310933,41.9703923],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937635":{"id":"n1820937635","loc":[-85.2940745,41.9739686],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937636":{"id":"n1820937636","loc":[-85.3803343,42.000484],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937637":{"id":"n1820937637","loc":[-85.1174231,42.0845533],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937638":{"id":"n1820937638","loc":[-85.0095836,42.089839],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937639":{"id":"n1820937639","loc":[-85.3179354,41.9705866],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937640":{"id":"n1820937640","loc":[-85.257708,42.0001189],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937641":{"id":"n1820937641","loc":[-85.2563522,42.0002771],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937642":{"id":"n1820937642","loc":[-85.3181929,41.970419],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937643":{"id":"n1820937643","loc":[-85.2911884,41.9757154],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937644":{"id":"n1820937644","loc":[-85.2714423,41.9975862],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937645":{"id":"n1820937645","loc":[-85.0193669,42.089888],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937646":{"id":"n1820937646","loc":[-85.3889818,42.0039921],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937647":{"id":"n1820937647","loc":[-85.3408093,41.9853965],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937648":{"id":"n1820937648","loc":[-85.1258091,42.0748332],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937649":{"id":"n1820937649","loc":[-85.5722561,41.962782],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937650":{"id":"n1820937650","loc":[-85.3266902,41.9721819],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937651":{"id":"n1820937651","loc":[-85.1473255,42.065192],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937652":{"id":"n1820937652","loc":[-85.1462526,42.0655106],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937653":{"id":"n1820937653","loc":[-85.4641051,42.0013929],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937654":{"id":"n1820937654","loc":[-85.5620379,41.9700677],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937655":{"id":"n1820937655","loc":[-85.3226025,41.971121],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937656":{"id":"n1820937656","loc":[-85.0200965,42.0899516],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937657":{"id":"n1820937657","loc":[-85.0624714,42.1044711],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937658":{"id":"n1820937658","loc":[-85.5649562,41.9637178],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937659":{"id":"n1820937659","loc":[-85.2360315,42.0253315],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937660":{"id":"n1820937660","loc":[-85.3881449,41.9994475],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937661":{"id":"n1820937661","loc":[-85.5032911,41.976263],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937662":{"id":"n1820937662","loc":[-85.481297,41.9871414],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937663":{"id":"n1820937663","loc":[-85.1167056,42.0841898],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937664":{"id":"n1820937664","loc":[-85.2891714,41.9787223],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937665":{"id":"n1820937665","loc":[-85.4393429,42.0058736],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937666":{"id":"n1820937666","loc":[-85.0077007,42.0895762],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937667":{"id":"n1820937667","loc":[-85.2736202,41.9979171],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937668":{"id":"n1820937668","loc":[-84.9935332,42.0859296],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937669":{"id":"n1820937669","loc":[-85.0622769,42.1046713],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937670":{"id":"n1820937670","loc":[-85.2309031,42.0311249],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937671":{"id":"n1820937671","loc":[-85.0343726,42.10069],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937672":{"id":"n1820937672","loc":[-85.0596551,42.1048612],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937673":{"id":"n1820937673","loc":[-85.1338597,42.0707449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937674":{"id":"n1820937674","loc":[-85.3117663,41.9689194],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937675":{"id":"n1820937675","loc":[-85.0705649,42.1057499],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937676":{"id":"n1820937676","loc":[-85.2441425,42.0180944],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937677":{"id":"n1820937677","loc":[-85.1171174,42.0862692],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937678":{"id":"n1820937678","loc":[-85.0346824,42.1005519],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937680":{"id":"n1820937680","loc":[-85.2389927,42.0229245],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937681":{"id":"n1820937681","loc":[-85.0834892,42.1018642],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937682":{"id":"n1820937682","loc":[-85.0619443,42.1049459],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937683":{"id":"n1820937683","loc":[-85.2845366,41.9811868],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937684":{"id":"n1820937684","loc":[-85.210411,42.0394123],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937685":{"id":"n1820937685","loc":[-85.4377383,42.0055942],"version":"2","changeset":"12524188","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-28T14:51:01Z","tags":{}},"n1820937686":{"id":"n1820937686","loc":[-85.2882058,41.9789138],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937687":{"id":"n1820937687","loc":[-85.2741191,41.9955808],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937688":{"id":"n1820937688","loc":[-85.3442211,41.9903575],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937689":{"id":"n1820937689","loc":[-85.2641413,41.9995237],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937690":{"id":"n1820937690","loc":[-85.2804489,41.9829174],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937691":{"id":"n1820937691","loc":[-85.5593342,41.9729074],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937692":{"id":"n1820937692","loc":[-85.3590912,41.9932601],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937694":{"id":"n1820937694","loc":[-85.4826445,41.9957479],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937695":{"id":"n1820937695","loc":[-85.4539127,42.0063041],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937696":{"id":"n1820937696","loc":[-85.2456767,42.0153683],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937697":{"id":"n1820937697","loc":[-85.5794015,41.9489631],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937698":{"id":"n1820937698","loc":[-85.4108686,42.0078507],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937699":{"id":"n1820937699","loc":[-85.0616386,42.1051529],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937700":{"id":"n1820937700","loc":[-85.4977979,41.978241],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937701":{"id":"n1820937701","loc":[-85.2488417,42.0086319],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937702":{"id":"n1820937702","loc":[-85.5588836,41.9728116],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937703":{"id":"n1820937703","loc":[-85.4557366,42.0051241],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937705":{"id":"n1820937705","loc":[-85.0723151,42.1056094],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937706":{"id":"n1820937706","loc":[-85.0057909,42.0887323],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937707":{"id":"n1820937707","loc":[-85.0756786,42.105677],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937708":{"id":"n1820937708","loc":[-85.0901504,42.0940001],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937709":{"id":"n1820937709","loc":[-85.0979999,42.0910213],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937710":{"id":"n1820937710","loc":[-85.2376301,42.0239686],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937711":{"id":"n1820937711","loc":[-85.2780671,41.9902299],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937712":{"id":"n1820937712","loc":[-85.251481,42.0113188],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937713":{"id":"n1820937713","loc":[-85.3114767,41.9690311],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937714":{"id":"n1820937714","loc":[-85.2649621,41.9975662],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937715":{"id":"n1820937715","loc":[-85.283807,41.9813383],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937716":{"id":"n1820937716","loc":[-85.5515451,41.9703867],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937717":{"id":"n1820937717","loc":[-85.1176605,42.0850896],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937718":{"id":"n1820937718","loc":[-85.1069317,42.0862441],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937719":{"id":"n1820937719","loc":[-85.2739314,41.9976938],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937720":{"id":"n1820937720","loc":[-85.5550212,41.9702112],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937721":{"id":"n1820937721","loc":[-85.3076679,41.9719904],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937722":{"id":"n1820937722","loc":[-85.592319,41.9440316],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937723":{"id":"n1820937723","loc":[-85.3139979,41.9704031],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937724":{"id":"n1820937724","loc":[-85.0421134,42.1013149],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937725":{"id":"n1820937725","loc":[-85.2508373,42.0102741],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937726":{"id":"n1820937726","loc":[-85.0830922,42.1038821],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937727":{"id":"n1820937727","loc":[-85.6342473,41.9360031],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937730":{"id":"n1820937730","loc":[-85.0500192,42.1024942],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937731":{"id":"n1820937731","loc":[-85.3498644,41.9926221],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937732":{"id":"n1820937732","loc":[-85.0234117,42.0918903],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937733":{"id":"n1820937733","loc":[-85.0464425,42.1009408],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937734":{"id":"n1820937734","loc":[-85.033938,42.099886],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937736":{"id":"n1820937736","loc":[-85.0152752,42.0886009],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937737":{"id":"n1820937737","loc":[-85.0441894,42.1012671],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937738":{"id":"n1820937738","loc":[-85.4668731,41.9979804],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937739":{"id":"n1820937739","loc":[-85.4407377,42.006033],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937740":{"id":"n1820937740","loc":[-85.2262253,42.0344878],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937741":{"id":"n1820937741","loc":[-85.2550001,42.0033706],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937742":{"id":"n1820937742","loc":[-85.3071422,41.9722617],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937743":{"id":"n1820937743","loc":[-85.6147852,41.942228],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937744":{"id":"n1820937744","loc":[-85.0183853,42.0901825],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937745":{"id":"n1820937745","loc":[-85.6323161,41.9228489],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937746":{"id":"n1820937746","loc":[-85.0095568,42.0901376],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937747":{"id":"n1820937747","loc":[-85.2524037,42.0113826],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937748":{"id":"n1820937748","loc":[-85.3186864,41.9708578],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937749":{"id":"n1820937749","loc":[-85.2805669,41.9870883],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937750":{"id":"n1820937750","loc":[-85.0585768,42.1038144],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937751":{"id":"n1820937751","loc":[-85.2970786,41.9715358],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937752":{"id":"n1820937752","loc":[-85.1315758,42.0723445],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937753":{"id":"n1820937753","loc":[-85.2448291,42.0175444],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937754":{"id":"n1820937754","loc":[-85.2446468,42.0174248],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937755":{"id":"n1820937755","loc":[-85.229165,42.032129],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937756":{"id":"n1820937756","loc":[-85.5612654,41.9724926],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937757":{"id":"n1820937757","loc":[-85.2331776,42.030854],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937758":{"id":"n1820937758","loc":[-85.2271909,42.0334519],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937759":{"id":"n1820937759","loc":[-85.1032396,42.0879214],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937760":{"id":"n1820937760","loc":[-85.0638447,42.1044154],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937761":{"id":"n1820937761","loc":[-85.1260706,42.0745556],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937762":{"id":"n1820937762","loc":[-85.3454485,41.99132],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937763":{"id":"n1820937763","loc":[-85.2639321,41.9980088],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937764":{"id":"n1820937764","loc":[-85.0837681,42.1013746],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937765":{"id":"n1820937765","loc":[-85.2808137,41.9869368],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937766":{"id":"n1820937766","loc":[-85.6338997,41.9309373],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937767":{"id":"n1820937767","loc":[-85.2267403,42.0332766],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937768":{"id":"n1820937768","loc":[-85.0605831,42.1052074],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937769":{"id":"n1820937769","loc":[-85.0259021,42.0930037],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937770":{"id":"n1820937770","loc":[-85.232963,42.0313162],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937771":{"id":"n1820937771","loc":[-85.2404947,42.0125381],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937772":{"id":"n1820937772","loc":[-85.0910892,42.0935742],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937773":{"id":"n1820937773","loc":[-85.2554829,42.0019435],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937774":{"id":"n1820937774","loc":[-85.2799339,41.9867773],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937775":{"id":"n1820937775","loc":[-85.1075432,42.0852767],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937776":{"id":"n1820937776","loc":[-85.1176927,42.0854001],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937777":{"id":"n1820937777","loc":[-85.1067064,42.0863357],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937778":{"id":"n1820937778","loc":[-85.2517492,42.0106333],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937779":{"id":"n1820937779","loc":[-85.0987174,42.0909031],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937780":{"id":"n1820937780","loc":[-85.1160083,42.0863994],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937781":{"id":"n1820937781","loc":[-85.1268645,42.0739703],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937782":{"id":"n1820937782","loc":[-85.0454702,42.1002852],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937783":{"id":"n1820937783","loc":[-85.1334145,42.0705418],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937784":{"id":"n1820937784","loc":[-85.5866542,41.947431],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937786":{"id":"n1820937786","loc":[-85.2359886,42.0250366],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937787":{"id":"n1820937787","loc":[-85.3138048,41.9698527],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937788":{"id":"n1820937788","loc":[-85.1274291,42.0733081],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937790":{"id":"n1820937790","loc":[-85.6292905,41.9411267],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937791":{"id":"n1820937791","loc":[-85.5958809,41.9417333],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937792":{"id":"n1820937792","loc":[-85.1271019,42.0737581],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937793":{"id":"n1820937793","loc":[-85.2312679,42.0314437],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937794":{"id":"n1820937794","loc":[-85.1081387,42.0863516],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937795":{"id":"n1820937795","loc":[-85.2424473,42.0212109],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937796":{"id":"n1820937796","loc":[-85.2710654,41.9975236],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937797":{"id":"n1820937797","loc":[-85.4798408,41.9863223],"version":"2","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1820937798":{"id":"n1820937798","loc":[-85.035939,42.104296],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937799":{"id":"n1820937799","loc":[-85.2178139,42.0395398],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937800":{"id":"n1820937800","loc":[-85.0630709,42.1042614],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937801":{"id":"n1820937801","loc":[-85.0440124,42.1014861],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937802":{"id":"n1820937802","loc":[-85.1321874,42.0720458],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937804":{"id":"n1820937804","loc":[-85.079427,42.1029121],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937805":{"id":"n1820937805","loc":[-85.2962632,41.9738968],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937806":{"id":"n1820937806","loc":[-85.6334748,41.9274627],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937807":{"id":"n1820937807","loc":[-85.1057341,42.0872804],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937808":{"id":"n1820937808","loc":[-85.4960169,41.9778263],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937809":{"id":"n1820937809","loc":[-85.2821226,41.9910273],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937810":{"id":"n1820937810","loc":[-85.0013868,42.0885054],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937811":{"id":"n1820937811","loc":[-85.2952547,41.9729795],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937812":{"id":"n1820937812","loc":[-85.1298375,42.0667842],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937813":{"id":"n1820937813","loc":[-85.1339201,42.0710025],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937814":{"id":"n1820937814","loc":[-85.0374356,42.103691],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937815":{"id":"n1820937815","loc":[-85.0061115,42.0880607],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937817":{"id":"n1820937817","loc":[-85.2398402,42.0226934],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937818":{"id":"n1820937818","loc":[-85.123501,42.076236],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937819":{"id":"n1820937819","loc":[-85.1209489,42.0791294],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937820":{"id":"n1820937820","loc":[-85.0818624,42.1025778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937821":{"id":"n1820937821","loc":[-85.4428835,42.0054749],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937822":{"id":"n1820937822","loc":[-85.4710359,41.9961147],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937823":{"id":"n1820937823","loc":[-85.4253354,42.006198],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937824":{"id":"n1820937824","loc":[-85.5486483,41.9709451],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937825":{"id":"n1820937825","loc":[-85.2303238,42.0310452],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937826":{"id":"n1820937826","loc":[-85.6450405,41.9136361],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937828":{"id":"n1820937828","loc":[-85.2606853,41.9964073],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937830":{"id":"n1820937830","loc":[-85.097383,42.0911447],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937831":{"id":"n1820937831","loc":[-85.0498207,42.102136],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937832":{"id":"n1820937832","loc":[-85.1232435,42.0763793],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937833":{"id":"n1820937833","loc":[-85.394093,42.0055921],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937834":{"id":"n1820937834","loc":[-85.3566665,41.9928295],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937835":{"id":"n1820937835","loc":[-85.3543276,41.9920002],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937837":{"id":"n1820937837","loc":[-85.084668,42.1034932],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937838":{"id":"n1820937838","loc":[-85.4400296,42.0060649],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937839":{"id":"n1820937839","loc":[-85.2362246,42.025714],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937840":{"id":"n1820937840","loc":[-85.0409225,42.1012791],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937841":{"id":"n1820937841","loc":[-85.2442283,42.019832],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937842":{"id":"n1820937842","loc":[-85.1123001,42.084824],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937843":{"id":"n1820937843","loc":[-85.1603074,42.0638061],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937844":{"id":"n1820937844","loc":[-85.1359744,42.0650646],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937845":{"id":"n1820937845","loc":[-85.1757569,42.053849],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937846":{"id":"n1820937846","loc":[-85.5200925,41.9716686],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937848":{"id":"n1820937848","loc":[-85.5525322,41.9701315],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937849":{"id":"n1820937849","loc":[-85.0406489,42.10149],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937850":{"id":"n1820937850","loc":[-85.0142547,42.088825],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937851":{"id":"n1820937851","loc":[-85.343749,41.9881884],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937852":{"id":"n1820937852","loc":[-85.074996,42.1060205],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937853":{"id":"n1820937853","loc":[-85.2436275,42.0136864],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937854":{"id":"n1820937854","loc":[-85.2641453,41.9980897],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937856":{"id":"n1820937856","loc":[-85.2802343,41.9870086],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937857":{"id":"n1820937857","loc":[-85.0099256,42.0909946],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937858":{"id":"n1820937858","loc":[-85.493957,41.9786079],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937859":{"id":"n1820937859","loc":[-85.0739405,42.1059795],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937860":{"id":"n1820937860","loc":[-85.2331605,42.0301423],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937862":{"id":"n1820937862","loc":[-85.2035231,42.0438425],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937863":{"id":"n1820937863","loc":[-85.0884928,42.0986971],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937864":{"id":"n1820937864","loc":[-85.131597,42.0690142],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937865":{"id":"n1820937865","loc":[-85.3937454,42.0052677],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937866":{"id":"n1820937866","loc":[-85.2212729,42.0378561],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937867":{"id":"n1820937867","loc":[-85.0886068,42.0982421],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937868":{"id":"n1820937868","loc":[-85.0875004,42.0968064],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937869":{"id":"n1820937869","loc":[-85.0771323,42.1042642],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937870":{"id":"n1820937870","loc":[-85.0164554,42.0894887],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937871":{"id":"n1820937871","loc":[-85.6069102,41.9415577],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937872":{"id":"n1820937872","loc":[-85.3273875,41.9704908],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937873":{"id":"n1820937873","loc":[-85.3890891,41.9997983],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937875":{"id":"n1820937875","loc":[-85.5091276,41.9723705],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937876":{"id":"n1820937876","loc":[-85.0770626,42.1047696],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937877":{"id":"n1820937877","loc":[-85.612575,41.9419567],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937878":{"id":"n1820937878","loc":[-85.3868146,42.0036094],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937879":{"id":"n1820937879","loc":[-85.2722738,41.9981204],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937880":{"id":"n1820937880","loc":[-85.3064878,41.9723733],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937882":{"id":"n1820937882","loc":[-85.1270845,42.0727678],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937884":{"id":"n1820937884","loc":[-85.3316512,41.97923],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937885":{"id":"n1820937885","loc":[-85.3932519,42.0042472],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937886":{"id":"n1820937886","loc":[-85.2457411,42.0175444],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937887":{"id":"n1820937887","loc":[-85.1397509,42.0648415],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937891":{"id":"n1820937891","loc":[-85.3196735,41.9719665],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937892":{"id":"n1820937892","loc":[-85.3372473,41.9845033],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937894":{"id":"n1820937894","loc":[-85.3254778,41.9719745],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937897":{"id":"n1820937897","loc":[-85.3185148,41.9691268],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937899":{"id":"n1820937899","loc":[-85.5419106,41.9714556],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937901":{"id":"n1820937901","loc":[-85.3293509,41.9748368],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937903":{"id":"n1820937903","loc":[-85.0798078,42.1028365],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937905":{"id":"n1820937905","loc":[-85.3954191,42.0056025],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937909":{"id":"n1820937909","loc":[-85.3417534,41.9857155],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937913":{"id":"n1820937913","loc":[-84.9927822,42.0857107],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937915":{"id":"n1820937915","loc":[-85.5444212,41.9712801],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937917":{"id":"n1820937917","loc":[-85.259088,41.9981682],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937921":{"id":"n1820937921","loc":[-85.2784576,41.9876358],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937922":{"id":"n1820937922","loc":[-84.9971918,42.087753],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937924":{"id":"n1820937924","loc":[-85.5310688,41.966899],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:33Z","tags":{}},"n1820937928":{"id":"n1820937928","loc":[-85.3766436,41.9979326],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937930":{"id":"n1820937930","loc":[-85.5494852,41.9704346],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937933":{"id":"n1820937933","loc":[-85.5548281,41.9695412],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937935":{"id":"n1820937935","loc":[-85.0768588,42.105088],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937937":{"id":"n1820937937","loc":[-85.2646885,41.9978054],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937939":{"id":"n1820937939","loc":[-85.2441532,42.0176082],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937941":{"id":"n1820937941","loc":[-85.105553,42.0877928],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937943":{"id":"n1820937943","loc":[-85.0879457,42.0958909],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937944":{"id":"n1820937944","loc":[-85.3187015,41.9704402],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937945":{"id":"n1820937945","loc":[-85.5624456,41.970626],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937946":{"id":"n1820937946","loc":[-85.0580176,42.1028644],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937948":{"id":"n1820937948","loc":[-85.3016061,41.9726286],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937949":{"id":"n1820937949","loc":[-85.4310388,42.0069418],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937950":{"id":"n1820937950","loc":[-85.2945144,41.9740723],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937951":{"id":"n1820937951","loc":[-85.1170222,42.082657],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937952":{"id":"n1820937952","loc":[-85.0864503,42.0947632],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937953":{"id":"n1820937953","loc":[-85.4285926,42.0059533],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937970":{"id":"n1820937970","loc":[-85.3629965,41.9938023],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937972":{"id":"n1820937972","loc":[-85.2438099,42.0199755],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937974":{"id":"n1820937974","loc":[-85.1327654,42.0699285],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937977":{"id":"n1820937977","loc":[-85.1515956,42.0611935],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937978":{"id":"n1820937978","loc":[-85.0107369,42.0896638],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937979":{"id":"n1820937979","loc":[-85.1152626,42.0862083],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937980":{"id":"n1820937980","loc":[-85.4531831,42.0062881],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937981":{"id":"n1820937981","loc":[-85.0341473,42.0985924],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937982":{"id":"n1820937982","loc":[-85.0877485,42.0960171],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937983":{"id":"n1820937983","loc":[-85.2756373,41.9951742],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937984":{"id":"n1820937984","loc":[-85.2965421,41.9714401],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937985":{"id":"n1820937985","loc":[-85.2409775,42.0226934],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937986":{"id":"n1820937986","loc":[-85.0170723,42.0900579],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937987":{"id":"n1820937987","loc":[-85.1034663,42.0880555],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937988":{"id":"n1820937988","loc":[-85.0585071,42.1031577],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937990":{"id":"n1820937990","loc":[-85.0819174,42.1032373],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937992":{"id":"n1820937992","loc":[-85.0546608,42.1030542],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937993":{"id":"n1820937993","loc":[-85.0100811,42.0906125],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937995":{"id":"n1820937995","loc":[-85.6304278,41.9432655],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937997":{"id":"n1820937997","loc":[-85.0255628,42.092778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820938011":{"id":"n1820938011","loc":[-85.2316756,42.0317146],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938012":{"id":"n1820938012","loc":[-85.4067917,42.008042],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938013":{"id":"n1820938013","loc":[-85.390398,42.0028759],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938014":{"id":"n1820938014","loc":[-85.0161604,42.0886527],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938015":{"id":"n1820938015","loc":[-85.125337,42.0744589],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938016":{"id":"n1820938016","loc":[-85.2151317,42.0404801],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938017":{"id":"n1820938017","loc":[-85.3165085,41.9706025],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938018":{"id":"n1820938018","loc":[-85.5641193,41.9640688],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938019":{"id":"n1820938019","loc":[-85.147583,42.0642203],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938022":{"id":"n1820938022","loc":[-85.2803781,41.9947886],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938024":{"id":"n1820938024","loc":[-85.2692469,41.9982053],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938026":{"id":"n1820938026","loc":[-85.4321975,42.0067505],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938028":{"id":"n1820938028","loc":[-85.572535,41.9633405],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938030":{"id":"n1820938030","loc":[-85.3237505,41.9716475],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938032":{"id":"n1820938032","loc":[-85.6487698,41.9141583],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938033":{"id":"n1820938033","loc":[-85.0526371,42.1038315],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938034":{"id":"n1820938034","loc":[-85.088069,42.0978731],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938035":{"id":"n1820938035","loc":[-85.2516312,42.0102267],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938039":{"id":"n1820938039","loc":[-85.2731374,41.9982958],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938040":{"id":"n1820938040","loc":[-85.5453224,41.9713439],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938041":{"id":"n1820938041","loc":[-85.4480548,42.0049647],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938043":{"id":"n1820938043","loc":[-85.2504081,42.010322],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938045":{"id":"n1820938045","loc":[-85.2663447,41.99919],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938046":{"id":"n1820938046","loc":[-85.0507287,42.102907],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938047":{"id":"n1820938047","loc":[-85.0408246,42.1024743],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938048":{"id":"n1820938048","loc":[-85.2796335,41.9866099],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938050":{"id":"n1820938050","loc":[-85.452475,42.0061127],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938051":{"id":"n1820938051","loc":[-85.2410569,42.0128147],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938052":{"id":"n1820938052","loc":[-85.0413302,42.1011477],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938053":{"id":"n1820938053","loc":[-85.6327409,41.9197627],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938056":{"id":"n1820938056","loc":[-85.1072039,42.0857994],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938057":{"id":"n1820938057","loc":[-85.2001114,42.0448145],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938058":{"id":"n1820938058","loc":[-85.2655347,41.9978186],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938059":{"id":"n1820938059","loc":[-85.2330918,42.0304874],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938060":{"id":"n1820938060","loc":[-85.2601113,41.9966545],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938061":{"id":"n1820938061","loc":[-85.5397863,41.9708494],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938062":{"id":"n1820938062","loc":[-85.2702085,41.9977217],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938063":{"id":"n1820938063","loc":[-85.2219982,42.03699],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938064":{"id":"n1820938064","loc":[-85.0668957,42.105121],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938065":{"id":"n1820938065","loc":[-85.2328665,42.0270769],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938066":{"id":"n1820938066","loc":[-85.3189654,41.9694778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938067":{"id":"n1820938067","loc":[-85.3814115,42.0022915],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938068":{"id":"n1820938068","loc":[-85.2759108,41.9956008],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938069":{"id":"n1820938069","loc":[-85.0391938,42.1034853],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938070":{"id":"n1820938070","loc":[-85.2850623,41.9810353],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938071":{"id":"n1820938071","loc":[-85.538074,41.970855],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938073":{"id":"n1820938073","loc":[-85.1319661,42.0670932],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938074":{"id":"n1820938074","loc":[-85.2816763,41.9913678],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938075":{"id":"n1820938075","loc":[-85.3182144,41.9700282],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938076":{"id":"n1820938076","loc":[-85.5909028,41.9458989],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938077":{"id":"n1820938077","loc":[-85.4057617,42.0074361],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938078":{"id":"n1820938078","loc":[-85.2620438,41.9967729],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938079":{"id":"n1820938079","loc":[-85.1122143,42.0851107],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938080":{"id":"n1820938080","loc":[-85.2443785,42.0174567],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938081":{"id":"n1820938081","loc":[-85.0319733,42.0953853],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938082":{"id":"n1820938082","loc":[-85.0878276,42.09443],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938083":{"id":"n1820938083","loc":[-85.0271789,42.0935809],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938084":{"id":"n1820938084","loc":[-85.0326399,42.0974222],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938085":{"id":"n1820938085","loc":[-85.3989167,42.0065592],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938086":{"id":"n1820938086","loc":[-85.3263361,41.9721261],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938087":{"id":"n1820938087","loc":[-85.2547855,42.0037134],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938088":{"id":"n1820938088","loc":[-85.4373259,42.005746],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938089":{"id":"n1820938089","loc":[-85.3094275,41.9699245],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938090":{"id":"n1820938090","loc":[-85.2783246,41.9872793],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938092":{"id":"n1820938092","loc":[-85.0815633,42.1025169],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938093":{"id":"n1820938093","loc":[-85.1788511,42.0522134],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938095":{"id":"n1820938095","loc":[-85.2830345,41.9816733],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938096":{"id":"n1820938096","loc":[-85.0744984,42.1059835],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938097":{"id":"n1820938097","loc":[-85.2788396,41.9879333],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938098":{"id":"n1820938098","loc":[-85.3640093,41.9946531],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938099":{"id":"n1820938099","loc":[-85.291167,41.9787463],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938100":{"id":"n1820938100","loc":[-85.0772436,42.1038156],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938101":{"id":"n1820938101","loc":[-85.00563,42.0887482],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938102":{"id":"n1820938102","loc":[-85.0326881,42.0961245],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938104":{"id":"n1820938104","loc":[-85.0530448,42.1038634],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938105":{"id":"n1820938105","loc":[-85.2625266,41.9970639],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938106":{"id":"n1820938106","loc":[-85.2827556,41.9823512],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938107":{"id":"n1820938107","loc":[-85.2784319,41.9910752],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938108":{"id":"n1820938108","loc":[-85.0882099,42.094393],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938109":{"id":"n1820938109","loc":[-85.5718484,41.9645371],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938110":{"id":"n1820938110","loc":[-85.2559764,42.0099317],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938111":{"id":"n1820938111","loc":[-85.2969284,41.973179],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938113":{"id":"n1820938113","loc":[-85.3875055,42.0019726],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938114":{"id":"n1820938114","loc":[-85.4250779,42.0068199],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938115":{"id":"n1820938115","loc":[-85.0645367,42.104889],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938116":{"id":"n1820938116","loc":[-85.1636762,42.0623724],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938117":{"id":"n1820938117","loc":[-85.0757322,42.1055935],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938118":{"id":"n1820938118","loc":[-85.3695197,41.9981559],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938120":{"id":"n1820938120","loc":[-85.1297516,42.0671027],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938121":{"id":"n1820938121","loc":[-85.1057448,42.0875551],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938122":{"id":"n1820938122","loc":[-85.2805175,41.9943182],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938123":{"id":"n1820938123","loc":[-85.2545173,42.0040722],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938124":{"id":"n1820938124","loc":[-84.9966607,42.0871319],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938125":{"id":"n1820938125","loc":[-85.0099899,42.0904612],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938126":{"id":"n1820938126","loc":[-85.2489919,42.0091102],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938127":{"id":"n1820938127","loc":[-85.0342706,42.0979476],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938128":{"id":"n1820938128","loc":[-85.1080891,42.0855884],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938129":{"id":"n1820938129","loc":[-85.0128183,42.0905356],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938130":{"id":"n1820938130","loc":[-85.631608,41.9434251],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938131":{"id":"n1820938131","loc":[-85.2551975,42.0008524],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938132":{"id":"n1820938132","loc":[-85.6421823,41.9096233],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938133":{"id":"n1820938133","loc":[-85.0125059,42.0906284],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938134":{"id":"n1820938134","loc":[-85.5499358,41.9701793],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938135":{"id":"n1820938135","loc":[-85.5472107,41.9712323],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938136":{"id":"n1820938136","loc":[-85.2760758,41.9958691],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938137":{"id":"n1820938137","loc":[-85.276678,41.9960433],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938138":{"id":"n1820938138","loc":[-85.0570319,42.1024731],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938140":{"id":"n1820938140","loc":[-85.2394325,42.0227492],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938142":{"id":"n1820938142","loc":[-85.5666341,41.9638829],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938144":{"id":"n1820938144","loc":[-85.258101,41.9996353],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938147":{"id":"n1820938147","loc":[-85.2129645,42.0413565],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938149":{"id":"n1820938149","loc":[-84.9962369,42.0868373],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938151":{"id":"n1820938151","loc":[-85.2570386,42.0084968],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938153":{"id":"n1820938153","loc":[-85.3971142,42.0050285],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938155":{"id":"n1820938155","loc":[-85.1072093,42.0855566],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938157":{"id":"n1820938157","loc":[-85.2840323,41.9920959],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938159":{"id":"n1820938159","loc":[-85.1187924,42.0816458],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938161":{"id":"n1820938161","loc":[-85.2681324,41.9985788],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938163":{"id":"n1820938163","loc":[-85.0887034,42.0984969],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938165":{"id":"n1820938165","loc":[-85.4133405,42.0073141],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938166":{"id":"n1820938166","loc":[-85.0097445,42.0902888],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938167":{"id":"n1820938167","loc":[-85.0828133,42.1037388],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938168":{"id":"n1820938168","loc":[-85.0549599,42.1030833],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938169":{"id":"n1820938169","loc":[-85.4571528,42.0010421],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938178":{"id":"n1820938178","loc":[-85.2706644,41.9975941],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938180":{"id":"n1820938180","loc":[-85.2258606,42.0335794],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938182":{"id":"n1820938182","loc":[-85.2832276,41.9814659],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938184":{"id":"n1820938184","loc":[-85.1082299,42.0860928],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938185":{"id":"n1820938185","loc":[-85.3839392,42.0022381],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938186":{"id":"n1820938186","loc":[-85.2772131,41.995905],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938187":{"id":"n1820938187","loc":[-85.1044895,42.0879214],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938188":{"id":"n1820938188","loc":[-85.2135267,42.0407087],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938189":{"id":"n1820938189","loc":[-85.2543993,42.0044628],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938190":{"id":"n1820938190","loc":[-85.1501793,42.0617351],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938191":{"id":"n1820938191","loc":[-85.3350587,41.9820469],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938192":{"id":"n1820938192","loc":[-85.1350731,42.0655735],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938193":{"id":"n1820938193","loc":[-85.0404008,42.1028843],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938194":{"id":"n1820938194","loc":[-85.6323161,41.943042],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938195":{"id":"n1820938195","loc":[-85.1259593,42.0742837],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938196":{"id":"n1820938196","loc":[-85.4562988,42.0033758],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938197":{"id":"n1820938197","loc":[-85.256824,42.0056826],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938198":{"id":"n1820938198","loc":[-85.2742103,41.9963862],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938199":{"id":"n1820938199","loc":[-85.0380888,42.1037877],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938200":{"id":"n1820938200","loc":[-85.47404,41.9944721],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938201":{"id":"n1820938201","loc":[-85.103021,42.087948],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938202":{"id":"n1820938202","loc":[-85.4030151,42.0065113],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938203":{"id":"n1820938203","loc":[-85.2113981,42.040735],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938204":{"id":"n1820938204","loc":[-85.2603433,41.9965137],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938206":{"id":"n1820938206","loc":[-85.1669378,42.0607634],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938207":{"id":"n1820938207","loc":[-85.0642027,42.1046076],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938208":{"id":"n1820938208","loc":[-85.2812428,41.9915696],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938209":{"id":"n1820938209","loc":[-85.0839559,42.1038343],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938210":{"id":"n1820938210","loc":[-85.1239946,42.0769368],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938211":{"id":"n1820938211","loc":[-85.2311177,42.0283042],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938212":{"id":"n1820938212","loc":[-85.2791614,41.9882682],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938213":{"id":"n1820938213","loc":[-85.2674941,41.9987582],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938214":{"id":"n1820938214","loc":[-85.352787,41.9919579],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938215":{"id":"n1820938215","loc":[-85.0874146,42.0952182],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938216":{"id":"n1820938216","loc":[-85.0069711,42.0877092],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938217":{"id":"n1820938217","loc":[-85.2059049,42.0404004],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938218":{"id":"n1820938218","loc":[-85.2403552,42.0227332],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938219":{"id":"n1820938219","loc":[-85.2492923,42.0098915],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938220":{"id":"n1820938220","loc":[-85.269778,41.9979541],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938221":{"id":"n1820938221","loc":[-85.2097673,42.0389024],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938222":{"id":"n1820938222","loc":[-85.0845942,42.1032015],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938223":{"id":"n1820938223","loc":[-84.993206,42.0858142],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938224":{"id":"n1820938224","loc":[-85.2108187,42.0402729],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938225":{"id":"n1820938225","loc":[-84.9893959,42.0873043],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938226":{"id":"n1820938226","loc":[-85.2952332,41.9719984],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938227":{"id":"n1820938227","loc":[-85.4100961,42.0081536],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938228":{"id":"n1820938228","loc":[-85.3299088,41.9785696],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938229":{"id":"n1820938229","loc":[-85.2258176,42.0340097],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938230":{"id":"n1820938230","loc":[-85.3146739,41.9711449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938231":{"id":"n1820938231","loc":[-85.5447645,41.9712801],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938232":{"id":"n1820938232","loc":[-85.5510087,41.9705941],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938233":{"id":"n1820938233","loc":[-85.5122389,41.9703445],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938234":{"id":"n1820938234","loc":[-85.2792687,41.9865381],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938235":{"id":"n1820938235","loc":[-85.1475229,42.0630151],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938237":{"id":"n1820938237","loc":[-85.0332889,42.0996034],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938238":{"id":"n1820938238","loc":[-85.2588882,41.9986877],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938239":{"id":"n1820938239","loc":[-85.0656458,42.1050892],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938240":{"id":"n1820938240","loc":[-84.9913915,42.086098],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938241":{"id":"n1820938241","loc":[-85.4752416,41.9944402],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938242":{"id":"n1820938242","loc":[-85.1214304,42.0791147],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938243":{"id":"n1820938243","loc":[-85.0075183,42.0886925],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938244":{"id":"n1820938244","loc":[-85.1052888,42.0872087],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938245":{"id":"n1820938245","loc":[-85.3104252,41.9703393],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938246":{"id":"n1820938246","loc":[-85.232109,42.0318158],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938247":{"id":"n1820938247","loc":[-85.0756075,42.1059528],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938248":{"id":"n1820938248","loc":[-85.0075612,42.0890866],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938249":{"id":"n1820938249","loc":[-85.1013312,42.0897474],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938250":{"id":"n1820938250","loc":[-85.1168076,42.0828919],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938251":{"id":"n1820938251","loc":[-85.2951367,41.9723334],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938252":{"id":"n1820938252","loc":[-85.0879363,42.0976053],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938253":{"id":"n1820938253","loc":[-85.0354763,42.1021838],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938254":{"id":"n1820938254","loc":[-85.2379627,42.0236339],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938255":{"id":"n1820938255","loc":[-85.1308245,42.0685364],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938256":{"id":"n1820938256","loc":[-85.0914446,42.0934774],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938257":{"id":"n1820938257","loc":[-85.2436812,42.014069],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938258":{"id":"n1820938258","loc":[-85.0682529,42.1056106],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938259":{"id":"n1820938259","loc":[-85.290652,41.9766805],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938260":{"id":"n1820938260","loc":[-85.0133494,42.0897434],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938261":{"id":"n1820938261","loc":[-85.2753047,41.9949429],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938262":{"id":"n1820938262","loc":[-85.0314691,42.0950788],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938263":{"id":"n1820938263","loc":[-85.3444786,41.9908359],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938264":{"id":"n1820938264","loc":[-85.0443115,42.1009061],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938265":{"id":"n1820938265","loc":[-85.0634853,42.1043159],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938267":{"id":"n1820938267","loc":[-85.3978223,42.0053952],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938268":{"id":"n1820938268","loc":[-85.0228659,42.0911885],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938269":{"id":"n1820938269","loc":[-85.0220237,42.0906272],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938270":{"id":"n1820938270","loc":[-85.1061525,42.0863369],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938271":{"id":"n1820938271","loc":[-85.2382309,42.0233708],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938272":{"id":"n1820938272","loc":[-85.310672,41.9702755],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938273":{"id":"n1820938273","loc":[-85.1448192,42.0652613],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938274":{"id":"n1820938274","loc":[-85.6036057,41.9403766],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938275":{"id":"n1820938275","loc":[-85.0778941,42.1032413],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938276":{"id":"n1820938276","loc":[-85.1279374,42.0723974],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938277":{"id":"n1820938277","loc":[-85.2806635,41.9847836],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938278":{"id":"n1820938278","loc":[-85.2653201,41.9976352],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938279":{"id":"n1820938279","loc":[-85.0351665,42.1001805],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938280":{"id":"n1820938280","loc":[-85.0718269,42.1056253],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938281":{"id":"n1820938281","loc":[-85.2574248,42.0075322],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938282":{"id":"n1820938282","loc":[-85.126666,42.0740778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938283":{"id":"n1820938283","loc":[-85.077705,42.1034733],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938284":{"id":"n1820938284","loc":[-85.3535552,41.9919045],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938286":{"id":"n1820938286","loc":[-85.2810711,41.9866657],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938287":{"id":"n1820938287","loc":[-85.4567494,42.0019885],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938288":{"id":"n1820938288","loc":[-85.2642419,41.9992936],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938289":{"id":"n1820938289","loc":[-85.2643344,41.9980925],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938290":{"id":"n1820938290","loc":[-85.3270335,41.9776125],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938291":{"id":"n1820938291","loc":[-85.1200584,42.0795077],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938292":{"id":"n1820938292","loc":[-85.2290792,42.0340256],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938293":{"id":"n1820938293","loc":[-85.6015887,41.9401372],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938294":{"id":"n1820938294","loc":[-85.5370869,41.970488],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938295":{"id":"n1820938295","loc":[-85.3108866,41.9698048],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938297":{"id":"n1820938297","loc":[-85.1556511,42.0628184],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938298":{"id":"n1820938298","loc":[-85.0027922,42.0875221],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938300":{"id":"n1820938300","loc":[-85.3873338,42.0040614],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938301":{"id":"n1820938301","loc":[-85.0350753,42.1004034],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938302":{"id":"n1820938302","loc":[-85.6239476,41.9411906],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938304":{"id":"n1820938304","loc":[-85.0118246,42.0897964],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938306":{"id":"n1820938306","loc":[-85.4796877,41.995275],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938307":{"id":"n1820938307","loc":[-85.5388636,41.9707856],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938309":{"id":"n1820938309","loc":[-85.2971902,41.9727773],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938310":{"id":"n1820938310","loc":[-85.5426831,41.9715513],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938311":{"id":"n1820938311","loc":[-85.2798373,41.9836671],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938312":{"id":"n1820938312","loc":[-85.2432198,42.0104017],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938313":{"id":"n1820938313","loc":[-85.2650412,41.9987554],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938317":{"id":"n1820938317","loc":[-85.0015423,42.0882386],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938318":{"id":"n1820938318","loc":[-85.1409783,42.064879],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938319":{"id":"n1820938319","loc":[-85.1691908,42.058995],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938320":{"id":"n1820938320","loc":[-85.1059165,42.0864882],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938321":{"id":"n1820938321","loc":[-85.3664941,41.9965771],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938323":{"id":"n1820938323","loc":[-85.3143198,41.9710971],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938324":{"id":"n1820938324","loc":[-85.0016067,42.0880675],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938325":{"id":"n1820938325","loc":[-85.0148139,42.0887164],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938326":{"id":"n1820938326","loc":[-85.0324682,42.0959056],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938327":{"id":"n1820938327","loc":[-85.0898661,42.0939921],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938328":{"id":"n1820938328","loc":[-85.2556427,42.0004936],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938329":{"id":"n1820938329","loc":[-85.6287112,41.9407437],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938330":{"id":"n1820938330","loc":[-84.9913392,42.0866701],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938331":{"id":"n1820938331","loc":[-85.2685777,41.9984632],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938332":{"id":"n1820938332","loc":[-85.0078884,42.0901614],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938333":{"id":"n1820938333","loc":[-84.999642,42.0878616],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938334":{"id":"n1820938334","loc":[-85.0188909,42.0899186],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938335":{"id":"n1820938335","loc":[-85.2830238,41.9819843],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938336":{"id":"n1820938336","loc":[-85.2491421,42.0096204],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938337":{"id":"n1820938337","loc":[-85.0585701,42.1034295],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938338":{"id":"n1820938338","loc":[-85.0651965,42.1051636],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938339":{"id":"n1820938339","loc":[-85.0583944,42.104292],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938340":{"id":"n1820938340","loc":[-85.119876,42.0801567],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938341":{"id":"n1820938341","loc":[-85.0943937,42.0931323],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938342":{"id":"n1820938342","loc":[-85.1504583,42.0613209],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938343":{"id":"n1820938343","loc":[-85.0425426,42.1019836],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938345":{"id":"n1820938345","loc":[-84.9991391,42.0878206],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938346":{"id":"n1820938346","loc":[-85.2563841,42.0094614],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938347":{"id":"n1820938347","loc":[-85.0515387,42.103297],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938348":{"id":"n1820938348","loc":[-85.0857261,42.1003636],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938349":{"id":"n1820938349","loc":[-85.078971,42.1029241],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938350":{"id":"n1820938350","loc":[-85.5699558,41.958931],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938351":{"id":"n1820938351","loc":[-85.3181285,41.9696533],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938352":{"id":"n1820938352","loc":[-85.5998506,41.9402329],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938353":{"id":"n1820938353","loc":[-85.2567277,42.000317],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938354":{"id":"n1820938354","loc":[-85.3082795,41.9708338],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938355":{"id":"n1820938355","loc":[-85.3127856,41.9692784],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938356":{"id":"n1820938356","loc":[-85.0340775,42.1010721],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938357":{"id":"n1820938357","loc":[-85.3158111,41.9706583],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938359":{"id":"n1820938359","loc":[-85.2312035,42.0280412],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938360":{"id":"n1820938360","loc":[-85.2448613,42.018477],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938361":{"id":"n1820938361","loc":[-85.29077,41.9759068],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938364":{"id":"n1820938364","loc":[-85.3677387,41.9976615],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938365":{"id":"n1820938365","loc":[-85.0785204,42.1030355],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938366":{"id":"n1820938366","loc":[-85.2262039,42.0333722],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938367":{"id":"n1820938367","loc":[-85.1226011,42.0780902],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938368":{"id":"n1820938368","loc":[-85.3229673,41.971129],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938369":{"id":"n1820938369","loc":[-85.385334,42.0000056],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938370":{"id":"n1820938370","loc":[-85.000098,42.0879094],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938372":{"id":"n1820938372","loc":[-85.3852481,42.0025091],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938373":{"id":"n1820938373","loc":[-85.3770513,41.9982515],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938374":{"id":"n1820938374","loc":[-85.6278314,41.9405362],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938375":{"id":"n1820938375","loc":[-85.6355133,41.9344068],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938376":{"id":"n1820938376","loc":[-85.635642,41.9324753],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938377":{"id":"n1820938377","loc":[-85.3154463,41.970778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938378":{"id":"n1820938378","loc":[-85.0920334,42.093411],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938379":{"id":"n1820938379","loc":[-85.3269155,41.9722297],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938381":{"id":"n1820938381","loc":[-85.1134334,42.0849184],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938382":{"id":"n1820938382","loc":[-85.005968,42.088585],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938384":{"id":"n1820938384","loc":[-85.1245203,42.0757183],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938385":{"id":"n1820938385","loc":[-85.020704,42.0905396],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938386":{"id":"n1820938386","loc":[-85.119585,42.0808984],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938387":{"id":"n1820938387","loc":[-85.0072447,42.0880117],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938388":{"id":"n1820938388","loc":[-85.2742908,41.9960273],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938389":{"id":"n1820938389","loc":[-85.3275807,41.9696852],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938390":{"id":"n1820938390","loc":[-85.2385635,42.0231556],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938392":{"id":"n1820938392","loc":[-85.0202856,42.0900778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938393":{"id":"n1820938393","loc":[-85.2067847,42.0395398],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938394":{"id":"n1820938394","loc":[-85.5183544,41.9713495],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938396":{"id":"n1820938396","loc":[-85.5073037,41.9736787],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938397":{"id":"n1820938397","loc":[-85.2519638,42.0114225],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938398":{"id":"n1820938398","loc":[-85.287487,41.9793285],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938399":{"id":"n1820938399","loc":[-85.2298088,42.0336431],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938400":{"id":"n1820938400","loc":[-85.229444,42.0339141],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938401":{"id":"n1820938401","loc":[-85.2421791,42.0220239],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938402":{"id":"n1820938402","loc":[-85.2976687,41.9737612],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938403":{"id":"n1820938403","loc":[-85.3622069,41.993473],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938404":{"id":"n1820938404","loc":[-85.2465458,42.014906],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938405":{"id":"n1820938405","loc":[-85.5724663,41.9639412],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938406":{"id":"n1820938406","loc":[-85.3708501,41.9982037],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938408":{"id":"n1820938408","loc":[-85.2564592,42.0055311],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938409":{"id":"n1820938409","loc":[-85.1192846,42.0810856],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938410":{"id":"n1820938410","loc":[-85.5623812,41.971663],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938411":{"id":"n1820938411","loc":[-85.3221948,41.9719665],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938412":{"id":"n1820938412","loc":[-85.5168738,41.9710305],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938413":{"id":"n1820938413","loc":[-85.4546852,42.0061127],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938414":{"id":"n1820938414","loc":[-85.5896153,41.9463617],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938415":{"id":"n1820938415","loc":[-85.2978189,41.9722138],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938416":{"id":"n1820938416","loc":[-85.1021681,42.0883581],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938417":{"id":"n1820938417","loc":[-85.2797193,41.9912984],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938419":{"id":"n1820938419","loc":[-85.2362461,42.0248533],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938420":{"id":"n1820938420","loc":[-85.4833639,41.9846252],"version":"2","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1820938422":{"id":"n1820938422","loc":[-85.3281064,41.9689433],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938424":{"id":"n1820938424","loc":[-85.2416963,42.0130088],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938425":{"id":"n1820938425","loc":[-85.5718655,41.9564577],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938426":{"id":"n1820938426","loc":[-85.0512812,42.1030701],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938427":{"id":"n1820938427","loc":[-85.1273527,42.0723616],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938428":{"id":"n1820938428","loc":[-85.0215033,42.0904083],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938429":{"id":"n1820938429","loc":[-85.6169953,41.942228],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938430":{"id":"n1820938430","loc":[-85.2829165,41.9907243],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938431":{"id":"n1820938431","loc":[-85.2240796,42.0374203],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938432":{"id":"n1820938432","loc":[-85.0167598,42.0898442],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938433":{"id":"n1820938433","loc":[-85.2132649,42.0411334],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938434":{"id":"n1820938434","loc":[-85.2293839,42.031513],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938435":{"id":"n1820938435","loc":[-85.1203374,42.0792608],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938436":{"id":"n1820938436","loc":[-85.109571,42.086268],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938437":{"id":"n1820938437","loc":[-85.1079026,42.0853842],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938438":{"id":"n1820938438","loc":[-85.109237,42.0862413],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938439":{"id":"n1820938439","loc":[-85.2259936,42.0350831],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938440":{"id":"n1820938440","loc":[-85.3669705,41.99679],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938441":{"id":"n1820938441","loc":[-85.2418143,42.0223507],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938442":{"id":"n1820938442","loc":[-85.3101248,41.9702515],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938443":{"id":"n1820938443","loc":[-85.069315,42.1059688],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938444":{"id":"n1820938444","loc":[-85.205862,42.0410378],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938445":{"id":"n1820938445","loc":[-85.0388076,42.1036604],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938446":{"id":"n1820938446","loc":[-85.2225389,42.0370115],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938447":{"id":"n1820938447","loc":[-85.3241474,41.9719346],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938448":{"id":"n1820938448","loc":[-85.3125496,41.9690789],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938449":{"id":"n1820938449","loc":[-85.1146497,42.0857039],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938450":{"id":"n1820938450","loc":[-85.1333944,42.0714963],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938451":{"id":"n1820938451","loc":[-85.5619306,41.9720937],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938452":{"id":"n1820938452","loc":[-85.2553651,42.0006479],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938453":{"id":"n1820938453","loc":[-85.3151137,41.9710093],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938454":{"id":"n1820938454","loc":[-85.2592315,41.9977947],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938455":{"id":"n1820938455","loc":[-85.2655723,41.9995966],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938456":{"id":"n1820938456","loc":[-85.4820652,41.9959233],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938459":{"id":"n1820938459","loc":[-85.450737,42.0055068],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938460":{"id":"n1820938460","loc":[-85.2428658,42.0205573],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938461":{"id":"n1820938461","loc":[-85.0835576,42.1021559],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938462":{"id":"n1820938462","loc":[-85.244636,42.0194733],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938463":{"id":"n1820938463","loc":[-85.5702562,41.9581332],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938465":{"id":"n1820938465","loc":[-85.5680031,41.9659515],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938467":{"id":"n1820938467","loc":[-85.2798752,41.9948353],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938468":{"id":"n1820938468","loc":[-85.0477407,42.1015537],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938469":{"id":"n1820938469","loc":[-85.6403842,41.913732],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938470":{"id":"n1820938470","loc":[-85.0396029,42.103289],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938471":{"id":"n1820938471","loc":[-85.2824702,41.9907777],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938472":{"id":"n1820938472","loc":[-85.2969284,41.9735538],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938474":{"id":"n1820938474","loc":[-85.401041,42.0070853],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938475":{"id":"n1820938475","loc":[-85.4116625,42.0073883],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938476":{"id":"n1820938476","loc":[-85.0437764,42.1016214],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938477":{"id":"n1820938477","loc":[-85.3643269,41.9958436],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938478":{"id":"n1820938478","loc":[-85.3895182,42.0009465],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938479":{"id":"n1820938479","loc":[-85.636157,41.9333373],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938480":{"id":"n1820938480","loc":[-85.2811355,41.9858044],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938481":{"id":"n1820938481","loc":[-85.0239052,42.092153],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938482":{"id":"n1820938482","loc":[-85.2558798,42.0053557],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938483":{"id":"n1820938483","loc":[-85.2544422,42.0047339],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938484":{"id":"n1820938484","loc":[-85.4864683,41.9843183],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938485":{"id":"n1820938485","loc":[-85.2554185,42.0031075],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938486":{"id":"n1820938486","loc":[-85.3082795,41.9712486],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938487":{"id":"n1820938487","loc":[-85.2433378,42.0133436],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938488":{"id":"n1820938488","loc":[-85.0216696,42.0904162],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938489":{"id":"n1820938489","loc":[-85.2546138,42.0050289],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938490":{"id":"n1820938490","loc":[-85.2717521,41.9977349],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938491":{"id":"n1820938491","loc":[-85.0100489,42.0908195],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938492":{"id":"n1820938492","loc":[-85.207879,42.0392211],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938493":{"id":"n1820938493","loc":[-85.0007363,42.0882836],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938494":{"id":"n1820938494","loc":[-85.5775303,41.9504097],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938495":{"id":"n1820938495","loc":[-85.1131584,42.0847683],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938496":{"id":"n1820938496","loc":[-85.0887825,42.0941633],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938497":{"id":"n1820938497","loc":[-85.1185926,42.0818938],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938498":{"id":"n1820938498","loc":[-85.2748487,41.9948712],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938499":{"id":"n1820938499","loc":[-85.2566952,42.0090788],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938500":{"id":"n1820938500","loc":[-85.0774757,42.1036234],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938501":{"id":"n1820938501","loc":[-85.4190869,42.008903],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938502":{"id":"n1820938502","loc":[-85.1140395,42.0850577],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938503":{"id":"n1820938503","loc":[-85.1136104,42.0848627],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938504":{"id":"n1820938504","loc":[-85.5828089,41.9480638],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938505":{"id":"n1820938505","loc":[-85.625514,41.9405202],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938506":{"id":"n1820938506","loc":[-85.2063384,42.0398322],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938507":{"id":"n1820938507","loc":[-85.3395476,41.9851636],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938508":{"id":"n1820938508","loc":[-85.0328853,42.0963606],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938510":{"id":"n1820938510","loc":[-85.1170369,42.0843702],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938511":{"id":"n1820938511","loc":[-85.2784748,41.9868487],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938512":{"id":"n1820938512","loc":[-85.6310501,41.9435528],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938514":{"id":"n1820938514","loc":[-85.0334284,42.0981028],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938515":{"id":"n1820938515","loc":[-84.9912091,42.0868226],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938516":{"id":"n1820938516","loc":[-85.2806141,41.9940351],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938517":{"id":"n1820938517","loc":[-85.1233025,42.0776734],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938518":{"id":"n1820938518","loc":[-85.2047891,42.0429023],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938519":{"id":"n1820938519","loc":[-85.1475443,42.0648312],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938520":{"id":"n1820938520","loc":[-85.2644685,41.9990891],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938521":{"id":"n1820938521","loc":[-85.1056281,42.0872553],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938522":{"id":"n1820938522","loc":[-85.4813184,41.9930105],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938523":{"id":"n1820938523","loc":[-85.321551,41.9722936],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938524":{"id":"n1820938524","loc":[-85.1564664,42.0631211],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938525":{"id":"n1820938525","loc":[-85.4149885,42.0079144],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938527":{"id":"n1820938527","loc":[-85.2861888,41.9803653],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938528":{"id":"n1820938528","loc":[-85.1301379,42.0682178],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938529":{"id":"n1820938529","loc":[-85.4156537,42.0084247],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938530":{"id":"n1820938530","loc":[-85.245151,42.0176082],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938531":{"id":"n1820938531","loc":[-85.457818,42.0001651],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938532":{"id":"n1820938532","loc":[-85.310951,41.9694538],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938533":{"id":"n1820938533","loc":[-85.1509089,42.0611298],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938534":{"id":"n1820938534","loc":[-85.1108249,42.086321],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938535":{"id":"n1820938535","loc":[-85.1260344,42.0740687],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938536":{"id":"n1820938536","loc":[-85.4561228,42.0042791],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938537":{"id":"n1820938537","loc":[-85.2805082,41.9945761],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938538":{"id":"n1820938538","loc":[-85.273352,41.9981921],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938539":{"id":"n1820938539","loc":[-85.1084216,42.0864364],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938540":{"id":"n1820938540","loc":[-85.5009737,41.9773637],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938541":{"id":"n1820938541","loc":[-85.3960843,42.0051879],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938542":{"id":"n1820938542","loc":[-85.3425088,41.9865034],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938545":{"id":"n1820938545","loc":[-84.9937907,42.0860849],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938546":{"id":"n1820938546","loc":[-85.1084176,42.086065],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938547":{"id":"n1820938547","loc":[-85.3492851,41.9924786],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938548":{"id":"n1820938548","loc":[-85.2512235,42.0101147],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938549":{"id":"n1820938549","loc":[-85.3717298,41.9979326],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938551":{"id":"n1820938551","loc":[-85.2573712,42.0064081],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938552":{"id":"n1820938552","loc":[-85.2514596,42.010139],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938553":{"id":"n1820938553","loc":[-85.416512,42.0088073],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938554":{"id":"n1820938554","loc":[-85.4365964,42.0061606],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938555":{"id":"n1820938555","loc":[-85.4552431,42.0057301],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938556":{"id":"n1820938556","loc":[-85.2916283,41.9778769],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938557":{"id":"n1820938557","loc":[-85.100709,42.0902968],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938558":{"id":"n1820938558","loc":[-85.4703064,41.9965771],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938559":{"id":"n1820938559","loc":[-85.3134722,41.9696134],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938560":{"id":"n1820938560","loc":[-85.4834213,41.9885768],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938561":{"id":"n1820938561","loc":[-85.2740641,41.9975236],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938562":{"id":"n1820938562","loc":[-85.148334,42.0623405],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938563":{"id":"n1820938563","loc":[-85.2358598,42.0263675],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938565":{"id":"n1820938565","loc":[-85.2902979,41.9790892],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938566":{"id":"n1820938566","loc":[-85.2528865,42.0112869],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938567":{"id":"n1820938567","loc":[-85.2595319,41.9973003],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938568":{"id":"n1820938568","loc":[-85.071151,42.105689],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938570":{"id":"n1820938570","loc":[-85.299278,41.9732188],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938571":{"id":"n1820938571","loc":[-85.0354669,42.1024771],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938583":{"id":"n1820938583","loc":[-85.3313937,41.972562],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938585":{"id":"n1820938585","loc":[-85.0756933,42.1058334],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938587":{"id":"n1820938587","loc":[-85.3130324,41.9694219],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938590":{"id":"n1820938590","loc":[-85.0934227,42.0931681],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938592":{"id":"n1820938592","loc":[-85.3517956,41.9922553],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938593":{"id":"n1820938593","loc":[-85.4023971,42.0065169],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938594":{"id":"n1820938594","loc":[-85.3506798,41.9925583],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938595":{"id":"n1820938595","loc":[-85.3673524,41.9971193],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938596":{"id":"n1820938596","loc":[-85.1073608,42.0853523],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938597":{"id":"n1820938597","loc":[-85.2976579,41.972477],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938598":{"id":"n1820938598","loc":[-85.5616517,41.9694295],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938599":{"id":"n1820938599","loc":[-85.3552074,41.9921915],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938600":{"id":"n1820938600","loc":[-85.4665126,41.9999953],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938601":{"id":"n1820938601","loc":[-85.2740695,41.9966226],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938602":{"id":"n1820938602","loc":[-85.279376,41.9886669],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938603":{"id":"n1820938603","loc":[-85.0771109,42.1040413],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938604":{"id":"n1820938604","loc":[-85.2636049,41.9977895],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938605":{"id":"n1820938605","loc":[-85.3762145,41.9976456],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938606":{"id":"n1820938606","loc":[-85.2321369,42.0289577],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938620":{"id":"n1820938620","loc":[-85.4947724,41.9776189],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938622":{"id":"n1820938622","loc":[-85.1547069,42.0622768],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938624":{"id":"n1820938624","loc":[-85.0005056,42.0880249],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938626":{"id":"n1820938626","loc":[-85.0735596,42.1059357],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938628":{"id":"n1820938628","loc":[-85.4665298,41.99932],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938629":{"id":"n1820938629","loc":[-85.434515,42.0065273],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938630":{"id":"n1820938630","loc":[-85.117462,42.0823823],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938631":{"id":"n1820938631","loc":[-85.0131777,42.0890707],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938632":{"id":"n1820938632","loc":[-85.0875326,42.0961934],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938634":{"id":"n1820938634","loc":[-85.6433839,41.9112042],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938635":{"id":"n1820938635","loc":[-85.1366181,42.064969],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938636":{"id":"n1820938636","loc":[-85.073109,42.1057925],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938638":{"id":"n1820938638","loc":[-85.161406,42.0632541],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938640":{"id":"n1820938640","loc":[-85.6343932,41.9188845],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938642":{"id":"n1820938642","loc":[-85.2500004,42.010306],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938644":{"id":"n1820938644","loc":[-85.291918,41.9753166],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938663":{"id":"n1820938663","loc":[-85.2841611,41.9916812],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938664":{"id":"n1820938664","loc":[-85.1052955,42.0868134],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938665":{"id":"n1820938665","loc":[-85.4606118,42.0005534],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938666":{"id":"n1820938666","loc":[-85.5672736,41.9642922],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938667":{"id":"n1820938667","loc":[-85.6348481,41.9316932],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938668":{"id":"n1820938668","loc":[-85.0224904,42.0909576],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938669":{"id":"n1820938669","loc":[-85.0133856,42.0899755],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938670":{"id":"n1820938670","loc":[-85.344779,41.991139],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938671":{"id":"n1820938671","loc":[-85.632874,41.9425313],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938673":{"id":"n1820938673","loc":[-85.4941501,41.9779698],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938675":{"id":"n1820938675","loc":[-85.0862559,42.0997519],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938676":{"id":"n1820938676","loc":[-85.0097874,42.0898032],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938678":{"id":"n1820938678","loc":[-84.9913553,42.0863675],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938680":{"id":"n1820938680","loc":[-85.0533666,42.1038315],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938682":{"id":"n1820938682","loc":[-85.2950294,41.9743914],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938684":{"id":"n1820938684","loc":[-85.2517385,42.0104499],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938686":{"id":"n1820938686","loc":[-85.0247971,42.0922514],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938688":{"id":"n1820938688","loc":[-85.0807037,42.1026017],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938690":{"id":"n1820938690","loc":[-85.52462,41.9722748],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938694":{"id":"n1820938694","loc":[-85.2586535,41.9988818],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938695":{"id":"n1820938695","loc":[-85.0931612,42.092948],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938697":{"id":"n1820938697","loc":[-85.2470822,42.016564],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938698":{"id":"n1820938698","loc":[-85.4143018,42.0075158],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938699":{"id":"n1820938699","loc":[-85.0771484,42.104487],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938700":{"id":"n1820938700","loc":[-85.0291208,42.0942775],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938701":{"id":"n1820938701","loc":[-85.6367964,41.9185971],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938702":{"id":"n1820938702","loc":[-85.085419,42.1010693],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938703":{"id":"n1820938703","loc":[-85.0583877,42.1040584],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938705":{"id":"n1820938705","loc":[-85.2573379,42.0003182],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938706":{"id":"n1820938706","loc":[-85.2655937,41.9981575],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938707":{"id":"n1820938707","loc":[-85.023181,42.0915758],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938708":{"id":"n1820938708","loc":[-85.2318687,42.0274674],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938709":{"id":"n1820938709","loc":[-85.1056389,42.0866184],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938710":{"id":"n1820938710","loc":[-85.5276265,41.9700978],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:33Z","tags":{}},"n1820938711":{"id":"n1820938711","loc":[-85.0864128,42.0945761],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938712":{"id":"n1820938712","loc":[-84.9897071,42.0871888],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938714":{"id":"n1820938714","loc":[-85.1328845,42.0665611],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938715":{"id":"n1820938715","loc":[-85.0336537,42.0991377],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938716":{"id":"n1820938716","loc":[-85.087597,42.0986692],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938717":{"id":"n1820938717","loc":[-85.1241394,42.0761882],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938718":{"id":"n1820938718","loc":[-85.1176002,42.0847723],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938719":{"id":"n1820938719","loc":[-85.2423615,42.0216572],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938721":{"id":"n1820938721","loc":[-85.2196378,42.0387908],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938722":{"id":"n1820938722","loc":[-85.0164272,42.0890082],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938723":{"id":"n1820938723","loc":[-85.5917182,41.9451807],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938724":{"id":"n1820938724","loc":[-85.2458806,42.0086638],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938725":{"id":"n1820938725","loc":[-85.1264474,42.0740527],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938726":{"id":"n1820938726","loc":[-85.1961631,42.04738],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938727":{"id":"n1820938727","loc":[-85.2784643,41.9943648],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938728":{"id":"n1820938728","loc":[-85.2905554,41.9763216],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938729":{"id":"n1820938729","loc":[-85.2913386,41.9771511],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938730":{"id":"n1820938730","loc":[-85.0112519,42.0895683],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938732":{"id":"n1820938732","loc":[-85.4290261,42.0064531],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938733":{"id":"n1820938733","loc":[-85.3867073,42.0031629],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938734":{"id":"n1820938734","loc":[-85.4943647,41.9836005],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938735":{"id":"n1820938735","loc":[-85.4900303,41.9860728],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938736":{"id":"n1820938736","loc":[-85.0866153,42.0944539],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938737":{"id":"n1820938737","loc":[-85.0869532,42.0990911],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938738":{"id":"n1820938738","loc":[-85.6321659,41.9208851],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938739":{"id":"n1820938739","loc":[-85.5930485,41.9433453],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938740":{"id":"n1820938740","loc":[-85.0406851,42.102733],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938741":{"id":"n1820938741","loc":[-85.1051131,42.0869846],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938742":{"id":"n1820938742","loc":[-85.1377554,42.0648893],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938743":{"id":"n1820938743","loc":[-85.2795694,41.994604],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938745":{"id":"n1820938745","loc":[-85.4948153,41.9826594],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938746":{"id":"n1820938746","loc":[-85.4488916,42.0050923],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938747":{"id":"n1820938747","loc":[-85.1052526,42.0866144],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938748":{"id":"n1820938748","loc":[-85.1468749,42.0653991],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938749":{"id":"n1820938749","loc":[-85.0856886,42.1006104],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938750":{"id":"n1820938750","loc":[-85.2144022,42.0404004],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938751":{"id":"n1820938751","loc":[-85.277771,41.9907458],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938752":{"id":"n1820938752","loc":[-85.1474542,42.0636149],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938753":{"id":"n1820938753","loc":[-85.0820515,42.1028075],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938754":{"id":"n1820938754","loc":[-85.1122948,42.08525],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938756":{"id":"n1820938756","loc":[-85.0173352,42.0901933],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938757":{"id":"n1820938757","loc":[-85.2259721,42.0354018],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938758":{"id":"n1820938758","loc":[-85.0872389,42.0987795],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938759":{"id":"n1820938759","loc":[-85.2291436,42.031874],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938760":{"id":"n1820938760","loc":[-85.3802485,42.0016002],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938761":{"id":"n1820938761","loc":[-85.3945822,42.0057938],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938762":{"id":"n1820938762","loc":[-85.5273237,41.9713017],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938763":{"id":"n1820938763","loc":[-85.2868862,41.9798629],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938764":{"id":"n1820938764","loc":[-85.2516677,42.0107899],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938766":{"id":"n1820938766","loc":[-85.3183002,41.9693103],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938768":{"id":"n1820938768","loc":[-85.2159042,42.0401932],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938770":{"id":"n1820938770","loc":[-85.0094481,42.0911141],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938771":{"id":"n1820938771","loc":[-85.0244538,42.0922155],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938772":{"id":"n1820938772","loc":[-85.231697,42.028862],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938773":{"id":"n1820938773","loc":[-85.2102394,42.0390617],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938774":{"id":"n1820938774","loc":[-85.2463419,42.0151212],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938775":{"id":"n1820938775","loc":[-85.0726195,42.1056424],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938776":{"id":"n1820938776","loc":[-85.0060431,42.0883262],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938778":{"id":"n1820938778","loc":[-85.425889,42.0056982],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938779":{"id":"n1820938779","loc":[-85.1183042,42.0820638],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938780":{"id":"n1820938780","loc":[-85.441596,42.0058257],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938781":{"id":"n1820938781","loc":[-85.1124879,42.0847086],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938782":{"id":"n1820938782","loc":[-85.2452733,42.0153894],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938783":{"id":"n1820938783","loc":[-85.2741191,41.9969244],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938784":{"id":"n1820938784","loc":[-85.2829487,41.9822236],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938785":{"id":"n1820938785","loc":[-85.3202743,41.972142],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938786":{"id":"n1820938786","loc":[-85.2345402,42.0266465],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938787":{"id":"n1820938787","loc":[-85.3037626,41.9724611],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938789":{"id":"n1820938789","loc":[-85.2474792,42.0161973],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938790":{"id":"n1820938790","loc":[-85.2951045,41.9727323],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938791":{"id":"n1820938791","loc":[-85.322345,41.9712726],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938792":{"id":"n1820938792","loc":[-85.2402372,42.0110394],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938793":{"id":"n1820938793","loc":[-85.5135693,41.9698659],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938794":{"id":"n1820938794","loc":[-85.4695339,41.9967366],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938796":{"id":"n1820938796","loc":[-85.0418492,42.1011131],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938797":{"id":"n1820938797","loc":[-85.3334107,41.9806337],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938798":{"id":"n1820938798","loc":[-85.5625314,41.9711685],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938799":{"id":"n1820938799","loc":[-85.3755707,41.9973585],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938800":{"id":"n1820938800","loc":[-85.5227532,41.9722429],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938801":{"id":"n1820938801","loc":[-85.4267687,42.0052836],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938803":{"id":"n1820938803","loc":[-85.0284704,42.0940837],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938804":{"id":"n1820938804","loc":[-85.015585,42.0885305],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938805":{"id":"n1820938805","loc":[-85.0765905,42.1053865],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938806":{"id":"n1820938806","loc":[-85.2614953,41.9964551],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938808":{"id":"n1820938808","loc":[-85.0307355,42.0947313],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938810":{"id":"n1820938810","loc":[-85.3894753,42.0003565],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938812":{"id":"n1820938812","loc":[-85.0868848,42.095006],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938813":{"id":"n1820938813","loc":[-85.3854198,42.0009465],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938814":{"id":"n1820938814","loc":[-85.2659692,41.9993534],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938815":{"id":"n1820938815","loc":[-85.1234259,42.0765266],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938816":{"id":"n1820938816","loc":[-85.1426906,42.0648893],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938818":{"id":"n1820938818","loc":[-85.1014533,42.0893067],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938819":{"id":"n1820938819","loc":[-85.0883064,42.098067],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938820":{"id":"n1820938820","loc":[-85.0503156,42.102704],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938821":{"id":"n1820938821","loc":[-85.1179649,42.0821884],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938822":{"id":"n1820938822","loc":[-85.3484697,41.9921596],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938823":{"id":"n1820938823","loc":[-85.3732962,41.9970874],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938824":{"id":"n1820938824","loc":[-85.2784104,41.9898312],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938825":{"id":"n1820938825","loc":[-85.4441709,42.0052198],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938826":{"id":"n1820938826","loc":[-85.3925438,42.0038326],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938829":{"id":"n1820938829","loc":[-85.5717582,41.9621861],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938830":{"id":"n1820938830","loc":[-85.0866314,42.0995051],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938831":{"id":"n1820938831","loc":[-85.576672,41.9522769],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938832":{"id":"n1820938832","loc":[-85.1587238,42.0636205],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938833":{"id":"n1820938833","loc":[-85.3804245,41.9999155],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938834":{"id":"n1820938834","loc":[-85.280083,41.9948843],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938836":{"id":"n1820938836","loc":[-85.561892,41.9686693],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938837":{"id":"n1820938837","loc":[-85.0158975,42.0885253],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938838":{"id":"n1820938838","loc":[-85.4248204,42.007633],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938839":{"id":"n1820938839","loc":[-85.0352738,42.1039657],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938840":{"id":"n1820938840","loc":[-85.211956,42.0411812],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938841":{"id":"n1820938841","loc":[-85.4816575,41.9908997],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938842":{"id":"n1820938842","loc":[-85.3807635,42.0020308],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938843":{"id":"n1820938843","loc":[-85.0100865,42.0898521],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938844":{"id":"n1820938844","loc":[-85.0103936,42.0897434],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938848":{"id":"n1820938848","loc":[-85.2430052,42.0131363],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938849":{"id":"n1820938849","loc":[-85.112559,42.0853723],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938851":{"id":"n1820938851","loc":[-85.3641553,41.9952535],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938852":{"id":"n1820938852","loc":[-85.2087373,42.0390777],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938853":{"id":"n1820938853","loc":[-85.2473933,42.0148263],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938854":{"id":"n1820938854","loc":[-85.0213464,42.090509],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938855":{"id":"n1820938855","loc":[-85.0673208,42.1052353],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938856":{"id":"n1820938856","loc":[-85.1003053,42.0905528],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938857":{"id":"n1820938857","loc":[-85.2617367,41.9965389],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938858":{"id":"n1820938858","loc":[-85.280363,41.9916015],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938859":{"id":"n1820938859","loc":[-85.0038866,42.0873469],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938860":{"id":"n1820938860","loc":[-85.2476401,42.0151451],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938861":{"id":"n1820938861","loc":[-85.193717,42.0499294],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938862":{"id":"n1820938862","loc":[-85.3478689,41.9917609],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938863":{"id":"n1820938863","loc":[-85.5638017,41.9648881],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938864":{"id":"n1820938864","loc":[-85.4356308,42.0064476],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938865":{"id":"n1820938865","loc":[-85.0561722,42.1023509],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938867":{"id":"n1820938867","loc":[-85.2256031,42.0356034],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938868":{"id":"n1820938868","loc":[-85.6102576,41.9420844],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938869":{"id":"n1820938869","loc":[-85.2285213,42.0339938],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938870":{"id":"n1820938870","loc":[-85.0326238,42.0978003],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938871":{"id":"n1820938871","loc":[-85.0131389,42.0903736],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938872":{"id":"n1820938872","loc":[-85.2550859,42.0012259],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938873":{"id":"n1820938873","loc":[-85.1130029,42.0846966],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938874":{"id":"n1820938874","loc":[-85.1579041,42.06336],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938875":{"id":"n1820938875","loc":[-85.0430522,42.1020234],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938876":{"id":"n1820938876","loc":[-85.2786679,41.9865935],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938877":{"id":"n1820938877","loc":[-85.1221666,42.0788706],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938878":{"id":"n1820938878","loc":[-85.2554614,42.0103303],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938879":{"id":"n1820938879","loc":[-85.2349801,42.0265748],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938880":{"id":"n1820938880","loc":[-85.0997434,42.0907864],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938881":{"id":"n1820938881","loc":[-85.0045464,42.0878167],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938882":{"id":"n1820938882","loc":[-85.2728048,41.9982519],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938883":{"id":"n1820938883","loc":[-85.3111333,41.9691587],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938884":{"id":"n1820938884","loc":[-85.3219802,41.9721899],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938885":{"id":"n1820938885","loc":[-85.3091378,41.9699325],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938887":{"id":"n1820938887","loc":[-85.4242367,42.0085203],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938888":{"id":"n1820938888","loc":[-84.9968377,42.0874504],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938890":{"id":"n1820938890","loc":[-85.5443139,41.9714078],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938891":{"id":"n1820938891","loc":[-85.6404013,41.9154676],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938892":{"id":"n1820938892","loc":[-85.3644986,41.9962582],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938893":{"id":"n1820938893","loc":[-85.0496772,42.1018323],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938894":{"id":"n1820938894","loc":[-85.297261,41.9737373],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938895":{"id":"n1820938895","loc":[-85.0327096,42.098071],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938896":{"id":"n1820938896","loc":[-85.3856773,41.9996867],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938897":{"id":"n1820938897","loc":[-85.0493862,42.1015509],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938898":{"id":"n1820938898","loc":[-84.9969879,42.0876614],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938899":{"id":"n1820938899","loc":[-85.0848625,42.1013587],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938900":{"id":"n1820938900","loc":[-85.5853195,41.9479201],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938901":{"id":"n1820938901","loc":[-85.6329169,41.9387964],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938902":{"id":"n1820938902","loc":[-85.0843046,42.1029468],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938903":{"id":"n1820938903","loc":[-85.1228747,42.0778474],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938904":{"id":"n1820938904","loc":[-85.4855456,41.984095],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938905":{"id":"n1820938905","loc":[-85.0573269,42.1026801],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938906":{"id":"n1820938906","loc":[-85.2425868,42.0131523],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938907":{"id":"n1820938907","loc":[-85.1149622,42.0860053],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938908":{"id":"n1820938908","loc":[-85.4833097,41.9951578],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938909":{"id":"n1820938909","loc":[-85.075979,42.1056372],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938910":{"id":"n1820938910","loc":[-85.0338509,42.0977139],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938911":{"id":"n1820938911","loc":[-85.6384272,41.9115715],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938912":{"id":"n1820938912","loc":[-85.0458363,42.1004074],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938913":{"id":"n1820938913","loc":[-85.0592138,42.1048305],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938914":{"id":"n1820938914","loc":[-85.2807493,41.9916653],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938915":{"id":"n1820938915","loc":[-85.1103274,42.0864193],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938916":{"id":"n1820938916","loc":[-85.6267156,41.9404404],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938918":{"id":"n1820938918","loc":[-85.0331374,42.0982911],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938919":{"id":"n1820938919","loc":[-85.5637331,41.965409],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938920":{"id":"n1820938920","loc":[-85.5457515,41.9714237],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938922":{"id":"n1820938922","loc":[-85.082073,42.1030104],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938923":{"id":"n1820938923","loc":[-85.0780765,42.103102],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938924":{"id":"n1820938924","loc":[-85.4208035,42.0089508],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938925":{"id":"n1820938925","loc":[-85.3469934,41.9914795],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938926":{"id":"n1820938926","loc":[-85.0322,42.095619],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938927":{"id":"n1820938927","loc":[-85.4784431,41.9949401],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938928":{"id":"n1820938928","loc":[-85.1303095,42.0667523],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938929":{"id":"n1820938929","loc":[-85.2463784,42.0084781],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938930":{"id":"n1820938930","loc":[-85.6299986,41.9427707],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938931":{"id":"n1820938931","loc":[-85.6325907,41.9238499],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938932":{"id":"n1820938932","loc":[-85.4808464,41.9914476],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938934":{"id":"n1820938934","loc":[-85.2411599,42.0105292],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938935":{"id":"n1820938935","loc":[-85.0163213,42.0892379],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938936":{"id":"n1820938936","loc":[-85.3290934,41.9682322],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938937":{"id":"n1820938937","loc":[-85.4925623,41.9853231],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938938":{"id":"n1820938938","loc":[-85.0338294,42.09892],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938940":{"id":"n1820938940","loc":[-85.4174561,42.008903],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938941":{"id":"n1820938941","loc":[-85.1165595,42.0838845],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938942":{"id":"n1820938942","loc":[-85.2954585,41.9717192],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938943":{"id":"n1820938943","loc":[-85.6330199,41.9257338],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938944":{"id":"n1820938944","loc":[-85.2294654,42.0324478],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938945":{"id":"n1820938945","loc":[-85.5601282,41.9728914],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938946":{"id":"n1820938946","loc":[-85.1176324,42.08568],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938947":{"id":"n1820938947","loc":[-85.0210245,42.0906005],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938948":{"id":"n1820938948","loc":[-85.0251887,42.09253],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938949":{"id":"n1820938949","loc":[-85.0895832,42.0939551],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938950":{"id":"n1820938950","loc":[-84.9915109,42.085842],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938951":{"id":"n1820938951","loc":[-85.2187366,42.0393486],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938952":{"id":"n1820938952","loc":[-85.006605,42.087579],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938953":{"id":"n1820938953","loc":[-85.046641,42.1012393],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938954":{"id":"n1820938954","loc":[-85.052102,42.103695],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938955":{"id":"n1820938955","loc":[-85.283925,41.9912825],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938956":{"id":"n1820938956","loc":[-85.2326626,42.0316349],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938957":{"id":"n1820938957","loc":[-85.1174298,42.0859694],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938958":{"id":"n1820938958","loc":[-85.3802056,41.9994794],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938959":{"id":"n1820938959","loc":[-85.4586334,41.9999737],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938960":{"id":"n1820938960","loc":[-85.4302234,42.0069418],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938961":{"id":"n1820938961","loc":[-85.092201,42.0930674],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938962":{"id":"n1820938962","loc":[-85.3684511,41.9979382],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938963":{"id":"n1820938963","loc":[-85.4618735,42.0011856],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938964":{"id":"n1820938964","loc":[-85.4828205,41.9877793],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938965":{"id":"n1820938965","loc":[-85.0837789,42.1025726],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938966":{"id":"n1820938966","loc":[-85.0176195,42.090253],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938967":{"id":"n1820938967","loc":[-85.3801627,42.001074],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938968":{"id":"n1820938968","loc":[-85.4767007,41.994488],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938969":{"id":"n1820938969","loc":[-85.274268,41.9957495],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938970":{"id":"n1820938970","loc":[-85.2977438,41.9719506],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938971":{"id":"n1820938971","loc":[-85.2425546,42.0208682],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938972":{"id":"n1820938972","loc":[-85.2557082,42.002382],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938973":{"id":"n1820938973","loc":[-85.3187937,41.9691986],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938975":{"id":"n1820938975","loc":[-85.2448077,42.0153045],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938977":{"id":"n1820938977","loc":[-85.0343015,42.0997718],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938978":{"id":"n1820938978","loc":[-85.2449364,42.01874],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938979":{"id":"n1820938979","loc":[-85.2598391,41.9969602],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938980":{"id":"n1820938980","loc":[-85.4294724,42.0067665],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938981":{"id":"n1820938981","loc":[-85.428082,42.0055124],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938983":{"id":"n1820938983","loc":[-85.5436315,41.9717484],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938985":{"id":"n1820938985","loc":[-85.5978336,41.9407437],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938986":{"id":"n1820938986","loc":[-85.491661,41.9860249],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938987":{"id":"n1820938987","loc":[-85.4942789,41.9801392],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938988":{"id":"n1820938988","loc":[-85.0416306,42.1010841],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938989":{"id":"n1820938989","loc":[-85.2653644,41.9984433],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938990":{"id":"n1820938990","loc":[-85.1028266,42.0881124],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938991":{"id":"n1820938991","loc":[-85.0163146,42.0887932],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938992":{"id":"n1820938992","loc":[-85.5282209,41.9678112],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:33Z","tags":{}},"n1820938993":{"id":"n1820938993","loc":[-85.5442752,41.9715888],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938994":{"id":"n1820938994","loc":[-85.5634327,41.9658558],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938995":{"id":"n1820938995","loc":[-85.0384227,42.1037627],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938996":{"id":"n1820938996","loc":[-85.1144258,42.0854439],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938997":{"id":"n1820938997","loc":[-85.1870651,42.0506305],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938998":{"id":"n1820938998","loc":[-85.1256159,42.0747376],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938999":{"id":"n1820938999","loc":[-85.3272695,41.9715836],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939000":{"id":"n1820939000","loc":[-85.0543067,42.103098],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939001":{"id":"n1820939001","loc":[-85.4678173,41.9973585],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939003":{"id":"n1820939003","loc":[-85.0266626,42.0933154],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939004":{"id":"n1820939004","loc":[-85.0353046,42.1019728],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939005":{"id":"n1820939005","loc":[-85.1237961,42.0762798],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939006":{"id":"n1820939006","loc":[-85.2812214,41.9826702],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939007":{"id":"n1820939007","loc":[-85.2927763,41.9747343],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939008":{"id":"n1820939008","loc":[-85.3270979,41.9720862],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939009":{"id":"n1820939009","loc":[-85.488657,41.9856581],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939010":{"id":"n1820939010","loc":[-85.3087301,41.9701399],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939011":{"id":"n1820939011","loc":[-85.0276939,42.093768],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939012":{"id":"n1820939012","loc":[-85.2956516,41.9748779],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939013":{"id":"n1820939013","loc":[-85.1298579,42.0726443],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939014":{"id":"n1820939014","loc":[-85.105144,42.0870893],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939015":{"id":"n1820939015","loc":[-85.0677486,42.1053917],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939016":{"id":"n1820939016","loc":[-85.0333681,42.0993459],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939017":{"id":"n1820939017","loc":[-85.6384272,41.910805],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939018":{"id":"n1820939018","loc":[-85.399496,42.006894],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939019":{"id":"n1820939019","loc":[-85.2648427,41.9998318],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939020":{"id":"n1820939020","loc":[-85.1237424,42.0766779],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939021":{"id":"n1820939021","loc":[-85.2515025,42.0109442],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939022":{"id":"n1820939022","loc":[-85.5566306,41.9718385],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939023":{"id":"n1820939023","loc":[-85.090644,42.0938369],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939024":{"id":"n1820939024","loc":[-85.1245525,42.074914],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939025":{"id":"n1820939025","loc":[-85.1099934,42.0863926],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939026":{"id":"n1820939026","loc":[-85.1251653,42.0744589],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939027":{"id":"n1820939027","loc":[-85.401792,42.0068143],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939028":{"id":"n1820939028","loc":[-85.0094763,42.0899584],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939029":{"id":"n1820939029","loc":[-85.1330779,42.0705605],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939030":{"id":"n1820939030","loc":[-85.4935064,41.984398],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939031":{"id":"n1820939031","loc":[-85.5713334,41.9613939],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939032":{"id":"n1820939032","loc":[-85.0873945,42.0964669],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939033":{"id":"n1820939033","loc":[-85.0886497,42.0986481],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939034":{"id":"n1820939034","loc":[-85.3276343,41.9758897],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939035":{"id":"n1820939035","loc":[-85.1304386,42.0727387],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939036":{"id":"n1820939036","loc":[-85.2551932,42.0052999],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939037":{"id":"n1820939037","loc":[-85.2206936,42.0384458],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939038":{"id":"n1820939038","loc":[-85.2313645,42.0286389],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939039":{"id":"n1820939039","loc":[-85.0754586,42.1059835],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939040":{"id":"n1820939040","loc":[-85.0663324,42.1050812],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939041":{"id":"n1820939041","loc":[-85.2406234,42.0106887],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939042":{"id":"n1820939042","loc":[-85.0685962,42.1058175],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939043":{"id":"n1820939043","loc":[-85.0689462,42.1059437],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939044":{"id":"n1820939044","loc":[-85.0586144,42.1046144],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939045":{"id":"n1820939045","loc":[-85.3650565,41.9965452],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939047":{"id":"n1820939047","loc":[-85.5752558,41.9536014],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939048":{"id":"n1820939048","loc":[-85.5110159,41.9710624],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939050":{"id":"n1820939050","loc":[-85.2832641,41.9926477],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939051":{"id":"n1820939051","loc":[-85.0078402,42.0898947],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939052":{"id":"n1820939052","loc":[-85.3882737,42.0017916],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939053":{"id":"n1820939053","loc":[-85.1718945,42.0564937],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939054":{"id":"n1820939054","loc":[-85.0947048,42.0929293],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939055":{"id":"n1820939055","loc":[-85.4456944,42.0051082],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939056":{"id":"n1820939056","loc":[-85.3139872,41.9706903],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939057":{"id":"n1820939057","loc":[-85.3893895,42.0034021],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939058":{"id":"n1820939058","loc":[-85.2425332,42.0106089],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939059":{"id":"n1820939059","loc":[-85.6085624,41.9420844],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939060":{"id":"n1820939060","loc":[-85.210411,42.0397789],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939061":{"id":"n1820939061","loc":[-85.2762542,41.9960473],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939062":{"id":"n1820939062","loc":[-85.4686584,41.9969973],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939063":{"id":"n1820939063","loc":[-85.3860421,42.0018394],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939064":{"id":"n1820939064","loc":[-85.5636944,41.9644414],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939065":{"id":"n1820939065","loc":[-85.3267331,41.9766554],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939066":{"id":"n1820939066","loc":[-85.0868996,42.0943822],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939067":{"id":"n1820939067","loc":[-85.104861,42.0880038],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939068":{"id":"n1820939068","loc":[-85.5537123,41.9695093],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939069":{"id":"n1820939069","loc":[-85.6325092,41.9396743],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939070":{"id":"n1820939070","loc":[-85.3869648,42.0024454],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939071":{"id":"n1820939071","loc":[-85.2775349,41.9957335],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939072":{"id":"n1820939072","loc":[-85.2055616,42.0421533],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939073":{"id":"n1820939073","loc":[-85.4731431,41.9946531],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939074":{"id":"n1820939074","loc":[-85.0399609,42.1030833],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939075":{"id":"n1820939075","loc":[-85.3055758,41.9725169],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939076":{"id":"n1820939076","loc":[-85.4834599,41.994488],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939077":{"id":"n1820939077","loc":[-85.3819866,42.0023018],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939078":{"id":"n1820939078","loc":[-85.1218756,42.0789992],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939079":{"id":"n1820939079","loc":[-85.2793159,41.9944458],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939080":{"id":"n1820939080","loc":[-85.2495498,42.0101466],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939081":{"id":"n1820939081","loc":[-85.0035969,42.0872434],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939082":{"id":"n1820939082","loc":[-85.1054243,42.0865626],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939083":{"id":"n1820939083","loc":[-85.0917665,42.0934774],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939084":{"id":"n1820939084","loc":[-85.3442211,41.988938],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939086":{"id":"n1820939086","loc":[-85.273989,41.9953588],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939087":{"id":"n1820939087","loc":[-85.1142541,42.0852488],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939089":{"id":"n1820939089","loc":[-85.1526684,42.0615758],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939090":{"id":"n1820939090","loc":[-85.2538843,42.0110159],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939091":{"id":"n1820939091","loc":[-85.28341,41.9909635],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939092":{"id":"n1820939092","loc":[-85.3963178,42.0050217],"version":"2","changeset":"13114234","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-09-15T03:33:29Z","tags":{}},"n1820939093":{"id":"n1820939093","loc":[-85.0851682,42.1012472],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939095":{"id":"n1820939095","loc":[-85.2811784,41.986243],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939096":{"id":"n1820939096","loc":[-85.4274125,42.0052995],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939097":{"id":"n1820939097","loc":[-85.0871262,42.0951652],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939099":{"id":"n1820939099","loc":[-85.1314253,42.0671665],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939100":{"id":"n1820939100","loc":[-85.2778997,41.991001],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939101":{"id":"n1820939101","loc":[-85.112107,42.0862812],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939102":{"id":"n1820939102","loc":[-85.299911,41.9729955],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939103":{"id":"n1820939103","loc":[-85.639822,41.9094796],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939104":{"id":"n1820939104","loc":[-85.122294,42.0785334],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939105":{"id":"n1820939105","loc":[-85.2476294,42.015719],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939106":{"id":"n1820939106","loc":[-85.4946007,41.9814631],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939107":{"id":"n1820939107","loc":[-85.0879524,42.0986919],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939108":{"id":"n1820939108","loc":[-85.0342814,42.098274],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939109":{"id":"n1820939109","loc":[-85.2450695,42.0095463],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939110":{"id":"n1820939110","loc":[-85.3847546,42.0024135],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939111":{"id":"n1820939111","loc":[-85.2961344,41.9742558],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939112":{"id":"n1820939112","loc":[-85.27899,41.994317],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939114":{"id":"n1820939114","loc":[-85.1017644,42.0886618],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939115":{"id":"n1820939115","loc":[-85.076215,42.1056333],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939116":{"id":"n1820939116","loc":[-85.1198009,42.0805349],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939117":{"id":"n1820939117","loc":[-85.11988,42.0798513],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939118":{"id":"n1820939118","loc":[-85.147819,42.0625476],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939119":{"id":"n1820939119","loc":[-85.0585969,42.1029042],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939120":{"id":"n1820939120","loc":[-85.1248596,42.0745744],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939121":{"id":"n1820939121","loc":[-85.3023786,41.9725249],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939123":{"id":"n1820939123","loc":[-85.0119332,42.0900699],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939124":{"id":"n1820939124","loc":[-85.2466852,42.0170343],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939125":{"id":"n1820939125","loc":[-85.0033019,42.0872792],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939126":{"id":"n1820939126","loc":[-85.0042084,42.0875778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939128":{"id":"n1820939128","loc":[-85.0052961,42.0885424],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939130":{"id":"n1820939130","loc":[-85.0647942,42.10508],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939131":{"id":"n1820939131","loc":[-85.2824123,41.9825107],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939132":{"id":"n1820939132","loc":[-85.3210039,41.9723255],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939133":{"id":"n1820939133","loc":[-85.0491033,42.1014184],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939134":{"id":"n1820939134","loc":[-85.1127776,42.0855168],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939135":{"id":"n1820939135","loc":[-85.1243768,42.0759322],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939137":{"id":"n1820939137","loc":[-85.125974,42.0747547],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939138":{"id":"n1820939138","loc":[-85.1071248,42.0859973],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939139":{"id":"n1820939139","loc":[-85.5326175,41.9674833],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:32Z","tags":{}},"n1820939140":{"id":"n1820939140","loc":[-85.1338715,42.0660833],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939142":{"id":"n1820939142","loc":[-85.649671,41.9135675],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939144":{"id":"n1820939144","loc":[-85.0236545,42.0920444],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939145":{"id":"n1820939145","loc":[-85.1084391,42.0859376],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939146":{"id":"n1820939146","loc":[-85.1539988,42.0618626],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939147":{"id":"n1820939147","loc":[-85.2354521,42.026511],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939148":{"id":"n1820939148","loc":[-85.2362246,42.0260408],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939149":{"id":"n1820939149","loc":[-85.2401342,42.0115233],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939150":{"id":"n1820939150","loc":[-85.295319,41.9747423],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939151":{"id":"n1820939151","loc":[-85.1164696,42.0835409],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939152":{"id":"n1820939152","loc":[-85.3232891,41.9712885],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939153":{"id":"n1820939153","loc":[-85.2574463,42.0068944],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939155":{"id":"n1820939155","loc":[-85.5704064,41.9598246],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939156":{"id":"n1820939156","loc":[-85.0349077,42.0998116],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939157":{"id":"n1820939157","loc":[-85.0949529,42.0925619],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939159":{"id":"n1820939159","loc":[-85.0179829,42.0902343],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939160":{"id":"n1820939160","loc":[-85.0405832,42.1016942],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939161":{"id":"n1820939161","loc":[-85.2534015,42.0111833],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939162":{"id":"n1820939162","loc":[-85.0839881,42.102708],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939163":{"id":"n1820939163","loc":[-85.0341996,42.1008385],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939164":{"id":"n1820939164","loc":[-85.1037761,42.0879731],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939173":{"id":"n1820939173","loc":[-85.0460616,42.1005786],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939177":{"id":"n1820939177","loc":[-85.0061651,42.0878059],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939181":{"id":"n1820939181","loc":[-85.1456775,42.0654684],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939183":{"id":"n1820939183","loc":[-85.1325508,42.0718439],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939185":{"id":"n1820939185","loc":[-85.2485842,42.008329],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939187":{"id":"n1820939187","loc":[-85.2744128,41.9949322],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939189":{"id":"n1820939189","loc":[-85.2579025,41.9999542],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939191":{"id":"n1820939191","loc":[-85.3358998,41.9828987],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939193":{"id":"n1820939193","loc":[-85.3192658,41.9716714],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939194":{"id":"n1820939194","loc":[-85.6400795,41.9130725],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939195":{"id":"n1820939195","loc":[-85.3278489,41.9780591],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939196":{"id":"n1820939196","loc":[-85.2800197,41.983061],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939197":{"id":"n1820939197","loc":[-85.3278167,41.9692943],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939198":{"id":"n1820939198","loc":[-85.3366894,41.9838653],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939199":{"id":"n1820939199","loc":[-85.0328383,42.0969923],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939201":{"id":"n1820939201","loc":[-85.3259284,41.9720383],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939217":{"id":"n1820939217","loc":[-85.1840181,42.0503277],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939220":{"id":"n1820939220","loc":[-85.422563,42.0089986],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939222":{"id":"n1820939222","loc":[-85.555386,41.9707856],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939224":{"id":"n1820939224","loc":[-85.3830809,42.002254],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939226":{"id":"n1820939226","loc":[-84.9917938,42.0857517],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939227":{"id":"n1820939227","loc":[-85.2936775,41.9740484],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939228":{"id":"n1820939228","loc":[-85.2632133,41.9975024],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939229":{"id":"n1820939229","loc":[-85.2809424,41.9853259],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939230":{"id":"n1820939230","loc":[-85.242104,42.0131204],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939232":{"id":"n1820939232","loc":[-85.2610246,41.9963901],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939233":{"id":"n1820939233","loc":[-85.2335531,42.0268378],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939234":{"id":"n1820939234","loc":[-85.3188839,41.9713575],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939235":{"id":"n1820939235","loc":[-85.2413637,42.0225658],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939237":{"id":"n1820939237","loc":[-85.0010796,42.0887215],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939239":{"id":"n1820939239","loc":[-85.2241697,42.0362624],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939243":{"id":"n1820939243","loc":[-85.0368456,42.1040134],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939244":{"id":"n1820939244","loc":[-85.1327986,42.069524],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939260":{"id":"n1820939260","loc":[-85.5408163,41.9711206],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939261":{"id":"n1820939261","loc":[-85.2959199,41.9746546],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939262":{"id":"n1820939262","loc":[-85.3298659,41.9683598],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939263":{"id":"n1820939263","loc":[-85.2240581,42.0358425],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939264":{"id":"n1820939264","loc":[-85.2438206,42.0101944],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939265":{"id":"n1820939265","loc":[-85.3984489,42.0059589],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939266":{"id":"n1820939266","loc":[-85.2330811,42.0294279],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939268":{"id":"n1820939268","loc":[-85.1126877,42.0857704],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939271":{"id":"n1820939271","loc":[-85.254925,42.0106253],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939273":{"id":"n1820939273","loc":[-85.4328046,42.0064662],"version":"2","changeset":"12524188","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-28T14:51:01Z","tags":{}},"n1820939277":{"id":"n1820939277","loc":[-85.289622,41.9789616],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939279":{"id":"n1820939279","loc":[-85.4574532,42.0004043],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939281":{"id":"n1820939281","loc":[-85.4803486,41.9867211],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939283":{"id":"n1820939283","loc":[-85.157475,42.0631848],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939285":{"id":"n1820939285","loc":[-85.2571458,42.0059935],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939287":{"id":"n1820939287","loc":[-85.2818544,41.9825984],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939289":{"id":"n1820939289","loc":[-85.2298302,42.0328781],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939291":{"id":"n1820939291","loc":[-85.4819523,41.984821],"version":"2","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1820939301":{"id":"n1820939301","loc":[-85.3139765,41.9701159],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939304":{"id":"n1820939304","loc":[-85.0424447,42.101742],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939306":{"id":"n1820939306","loc":[-85.6360283,41.9338482],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939310":{"id":"n1820939310","loc":[-85.3463025,41.9913622],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939312":{"id":"n1820939312","loc":[-85.4664869,41.9988097],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939314":{"id":"n1820939314","loc":[-85.149364,42.0622449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939316":{"id":"n1820939316","loc":[-85.2460415,42.0153125],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939318":{"id":"n1820939318","loc":[-85.4806103,41.9924523],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939320":{"id":"n1820939320","loc":[-85.2449042,42.0190987],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939322":{"id":"n1820939322","loc":[-85.5280165,41.9689263],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:33Z","tags":{}},"n1820939324":{"id":"n1820939324","loc":[-85.0051204,42.0882625],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939326":{"id":"n1820939326","loc":[-85.1240925,42.0771546],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939329":{"id":"n1820939329","loc":[-85.2261653,42.0342225],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939331":{"id":"n1820939331","loc":[-85.5259933,41.972211],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939333":{"id":"n1820939333","loc":[-85.0074754,42.0883183],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939335":{"id":"n1820939335","loc":[-85.0764014,42.1055549],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939336":{"id":"n1820939336","loc":[-85.2908773,41.9769597],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939337":{"id":"n1820939337","loc":[-85.4095382,42.0083449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939346":{"id":"n1820939346","loc":[-85.2514166,42.0111753],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939348":{"id":"n1820939348","loc":[-85.0030377,42.0873799],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939350":{"id":"n1820939350","loc":[-85.3659362,41.9964974],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939352":{"id":"n1820939352","loc":[-85.226058,42.0348281],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939355":{"id":"n1820939355","loc":[-85.1902408,42.0507101],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939357":{"id":"n1820939357","loc":[-85.2781854,41.9946001],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939359":{"id":"n1820939359","loc":[-85.2139988,42.0405175],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939361":{"id":"n1820939361","loc":[-85.0086609,42.0908262],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939363":{"id":"n1820939363","loc":[-85.0627128,42.1043398],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939365":{"id":"n1820939365","loc":[-85.1311346,42.072501],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939369":{"id":"n1820939369","loc":[-85.248198,42.0082652],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939370":{"id":"n1820939370","loc":[-84.99792,42.087794],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939371":{"id":"n1820939371","loc":[-85.2786775,41.9942783],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939372":{"id":"n1820939372","loc":[-85.0342103,42.1013957],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939373":{"id":"n1820939373","loc":[-85.2022357,42.0444799],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939374":{"id":"n1820939374","loc":[-85.2279205,42.0337388],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939375":{"id":"n1820939375","loc":[-85.1337699,42.0712614],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939376":{"id":"n1820939376","loc":[-85.317517,41.9707062],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939377":{"id":"n1820939377","loc":[-85.1326326,42.070218],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939394":{"id":"n1820939394","loc":[-85.0197746,42.0899118],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939397":{"id":"n1820939397","loc":[-85.2590076,41.9984632],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939399":{"id":"n1820939399","loc":[-85.2469964,42.0083449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939400":{"id":"n1820939400","loc":[-85.2470929,42.0146668],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939401":{"id":"n1820939401","loc":[-84.9984095,42.0878087],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939402":{"id":"n1820939402","loc":[-85.2372653,42.0243273],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939403":{"id":"n1820939403","loc":[-85.2454986,42.0091955],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939404":{"id":"n1820939404","loc":[-85.0539205,42.1035995],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939405":{"id":"n1820939405","loc":[-85.550601,41.9706101],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939406":{"id":"n1820939406","loc":[-85.0351343,42.0999656],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939407":{"id":"n1820939407","loc":[-85.0082908,42.0905755],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939408":{"id":"n1820939408","loc":[-85.0132904,42.0902251],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939410":{"id":"n1820939410","loc":[-85.0892546,42.094012],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939412":{"id":"n1820939412","loc":[-85.0350793,42.1030315],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939416":{"id":"n1820939416","loc":[-85.0012406,42.0886777],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939418":{"id":"n1820939418","loc":[-85.0577453,42.1029229],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939420":{"id":"n1820939420","loc":[-85.1230786,42.0776722],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939422":{"id":"n1820939422","loc":[-85.571136,41.9649304],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939436":{"id":"n1820939436","loc":[-85.1137968,42.0848997],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939437":{"id":"n1820939437","loc":[-85.3559584,41.9925105],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939438":{"id":"n1820939438","loc":[-85.0080172,42.0903565],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939439":{"id":"n1820939439","loc":[-85.0048897,42.0880913],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939441":{"id":"n1820939441","loc":[-85.0406959,42.1018574],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939443":{"id":"n1820939443","loc":[-85.3897328,42.0029078],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939445":{"id":"n1820939445","loc":[-85.122349,42.0782814],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939448":{"id":"n1820939448","loc":[-85.4872193,41.985036],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939450":{"id":"n1820939450","loc":[-85.0120459,42.0904919],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939452":{"id":"n1820939452","loc":[-85.6320543,41.921982],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939456":{"id":"n1820939456","loc":[-85.0844749,42.1036843],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939458":{"id":"n1820939458","loc":[-85.0968037,42.091296],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939463":{"id":"n1820939463","loc":[-85.5339747,41.9681841],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:33Z","tags":{}},"n1820939465":{"id":"n1820939465","loc":[-85.4125423,42.0072129],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939467":{"id":"n1820939467","loc":[-85.6335563,41.9303626],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939469":{"id":"n1820939469","loc":[-85.2821014,41.9932126],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939471":{"id":"n1820939471","loc":[-85.374691,41.9969917],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939485":{"id":"n1820939485","loc":[-85.4471321,42.0049806],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939487":{"id":"n1820939487","loc":[-85.3752532,41.9972206],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939489":{"id":"n1820939489","loc":[-85.4517283,42.005927],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939492":{"id":"n1820939492","loc":[-85.4662552,42.0005693],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939494":{"id":"n1820939494","loc":[-85.0120083,42.0902928],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939496":{"id":"n1820939496","loc":[-85.044463,42.1004631],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939498":{"id":"n1820939498","loc":[-85.418293,42.0089667],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939500":{"id":"n1820939500","loc":[-85.0554762,42.1027358],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939504":{"id":"n1820939504","loc":[-85.1246289,42.0746858],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939507":{"id":"n1820939507","loc":[-85.0408139,42.1021838],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939508":{"id":"n1820939508","loc":[-85.1236204,42.0775169],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939509":{"id":"n1820939509","loc":[-85.0350109,42.1037428],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939510":{"id":"n1820939510","loc":[-85.0551583,42.1029878],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939511":{"id":"n1820939511","loc":[-85.0956771,42.0916662],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939512":{"id":"n1820939512","loc":[-85.2323408,42.0273638],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939513":{"id":"n1820939513","loc":[-85.1232771,42.0762388],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939531":{"id":"n1820939531","loc":[-85.264608,41.9997828],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939533":{"id":"n1820939533","loc":[-85.4198808,42.0087914],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939535":{"id":"n1820939535","loc":[-85.3080864,41.9715677],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939536":{"id":"n1820939536","loc":[-85.1189426,42.0812596],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939537":{"id":"n1820939537","loc":[-85.2642741,41.9996764],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939538":{"id":"n1820939538","loc":[-85.2572531,42.0079627],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939539":{"id":"n1820939539","loc":[-85.2907807,41.9790174],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939540":{"id":"n1820939540","loc":[-85.3171415,41.9707301],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939541":{"id":"n1820939541","loc":[-85.08777,42.0953841],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939542":{"id":"n1820939542","loc":[-85.1239262,42.0773218],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939543":{"id":"n1820939543","loc":[-84.9973956,42.0877968],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939544":{"id":"n1820939544","loc":[-85.011606,42.0896161],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939545":{"id":"n1820939545","loc":[-85.4077358,42.0082971],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939546":{"id":"n1820939546","loc":[-85.3614945,41.9933717],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939547":{"id":"n1820939547","loc":[-85.3189118,41.9697649],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939550":{"id":"n1820939550","loc":[-85.1262691,42.0740221],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939551":{"id":"n1820939551","loc":[-85.3863639,41.9994635],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939552":{"id":"n1820939552","loc":[-85.2836034,41.9923953],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939554":{"id":"n1820939554","loc":[-85.3222377,41.9715916],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939555":{"id":"n1820939555","loc":[-85.0122658,42.0906312],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939556":{"id":"n1820939556","loc":[-85.0022652,42.0877581],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939557":{"id":"n1820939557","loc":[-85.1011314,42.0899954],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939559":{"id":"n1820939559","loc":[-85.0008181,42.0885293],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939561":{"id":"n1820939561","loc":[-85.3637046,41.9942488],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939562":{"id":"n1820939562","loc":[-85.4500117,42.0052892],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939563":{"id":"n1820939563","loc":[-85.0537636,42.1036365],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939565":{"id":"n1820939565","loc":[-85.2367503,42.0246939],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939566":{"id":"n1820939566","loc":[-85.0448479,42.1002653],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939567":{"id":"n1820939567","loc":[-85.6337065,41.9295006],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939568":{"id":"n1820939568","loc":[-85.0879792,42.095623],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939569":{"id":"n1820939569","loc":[-85.6347623,41.9352369],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939570":{"id":"n1820939570","loc":[-85.1497931,42.0620378],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939571":{"id":"n1820939571","loc":[-85.5676169,41.9656324],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939572":{"id":"n1820939572","loc":[-85.638041,41.9166971],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939573":{"id":"n1820939573","loc":[-85.4993429,41.9781293],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939574":{"id":"n1820939574","loc":[-85.5352831,41.9692127],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:33Z","tags":{}},"n1820939575":{"id":"n1820939575","loc":[-84.9924429,42.0857118],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939577":{"id":"n1820939577","loc":[-85.0581101,42.1026721],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939578":{"id":"n1820939578","loc":[-85.641088,41.9094477],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939579":{"id":"n1820939579","loc":[-85.2548821,42.0052282],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939580":{"id":"n1820939580","loc":[-85.1124463,42.0859734],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939581":{"id":"n1820939581","loc":[-85.1083479,42.0857624],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939583":{"id":"n1820939583","loc":[-85.1387424,42.0648893],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939584":{"id":"n1820939584","loc":[-85.5152645,41.9700892],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939585":{"id":"n1820939585","loc":[-85.5463738,41.9713439],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939586":{"id":"n1820939586","loc":[-85.360207,41.9933717],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939587":{"id":"n1820939587","loc":[-85.2402372,42.0120917],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939588":{"id":"n1820939588","loc":[-85.3936381,42.0047255],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939589":{"id":"n1820939589","loc":[-85.3310246,41.973784],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939590":{"id":"n1820939590","loc":[-85.0329403,42.096642],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939591":{"id":"n1820939591","loc":[-85.0097271,42.0910981],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939593":{"id":"n1820939593","loc":[-85.0446562,42.1003437],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939595":{"id":"n1820939595","loc":[-85.0856671,42.1008452],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939596":{"id":"n1820939596","loc":[-85.4087228,42.0083449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939597":{"id":"n1820939597","loc":[-85.0609519,42.1052564],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939598":{"id":"n1820939598","loc":[-85.3432126,41.9874548],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939599":{"id":"n1820939599","loc":[-85.4041738,42.0067027],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939600":{"id":"n1820939600","loc":[-85.0825437,42.1035768],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939601":{"id":"n1820939601","loc":[-85.048422,42.101498],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939602":{"id":"n1820939602","loc":[-85.0336256,42.0999031],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939603":{"id":"n1820939603","loc":[-85.046818,42.1014104],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939605":{"id":"n1820939605","loc":[-85.2856524,41.98078],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939607":{"id":"n1820939607","loc":[-85.1118173,42.0864245],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939609":{"id":"n1820939609","loc":[-85.0443397,42.1006263],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939610":{"id":"n1820939610","loc":[-85.0336698,42.0978361],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939611":{"id":"n1820939611","loc":[-85.4630322,42.0014248],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939612":{"id":"n1820939612","loc":[-85.0613127,42.1052353],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939613":{"id":"n1820939613","loc":[-85.0137571,42.0887801],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939614":{"id":"n1820939614","loc":[-85.272487,41.9982013],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939616":{"id":"n1820939616","loc":[-85.4665727,41.9983791],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939617":{"id":"n1820939617","loc":[-85.1288078,42.0725476],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939618":{"id":"n1820939618","loc":[-85.4653282,42.00109],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939619":{"id":"n1820939619","loc":[-85.2314717,42.0276746],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939620":{"id":"n1820939620","loc":[-85.255982,42.0003569],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939621":{"id":"n1820939621","loc":[-85.2886779,41.9787223],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939622":{"id":"n1820939622","loc":[-85.22438,42.0367509],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939623":{"id":"n1820939623","loc":[-85.0334713,42.0998382],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939624":{"id":"n1820939624","loc":[-85.2236504,42.037484],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939625":{"id":"n1820939625","loc":[-85.636908,41.9175162],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939627":{"id":"n1820939627","loc":[-85.2669187,41.9989707],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939628":{"id":"n1820939628","loc":[-85.3247268,41.9720702],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939629":{"id":"n1820939629","loc":[-85.3785104,41.9987299],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939630":{"id":"n1820939630","loc":[-85.5267658,41.9720515],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939631":{"id":"n1820939631","loc":[-85.2445116,42.0098811],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939632":{"id":"n1820939632","loc":[-85.1271448,42.0725077],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939633":{"id":"n1820939633","loc":[-85.0345751,42.099724],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939634":{"id":"n1820939634","loc":[-85.4217476,42.0089986],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939635":{"id":"n1820939635","loc":[-85.3121848,41.9689433],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939636":{"id":"n1820939636","loc":[-85.2826419,41.9929985],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939637":{"id":"n1820939637","loc":[-85.3160257,41.9706344],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939638":{"id":"n1820939638","loc":[-85.5684967,41.9657919],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939640":{"id":"n1820939640","loc":[-85.225131,42.0356194],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939642":{"id":"n1820939642","loc":[-85.1324124,42.0693328],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939644":{"id":"n1820939644","loc":[-84.9994073,42.0878843],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939645":{"id":"n1820939645","loc":[-85.1087596,42.0863329],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939646":{"id":"n1820939646","loc":[-85.2915532,41.9782996],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939647":{"id":"n1820939647","loc":[-84.9988708,42.0877808],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939648":{"id":"n1820939648","loc":[-85.2243628,42.0356728],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939649":{"id":"n1820939649","loc":[-85.0427397,42.1020524],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939650":{"id":"n1820939650","loc":[-85.6388392,41.9100752],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939651":{"id":"n1820939651","loc":[-85.0133709,42.0888557],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939652":{"id":"n1820939652","loc":[-85.318798,41.9701211],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939653":{"id":"n1820939653","loc":[-85.6335778,41.9190602],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939654":{"id":"n1820939654","loc":[-85.6338396,41.9370247],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939655":{"id":"n1820939655","loc":[-85.0939069,42.0931988],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939656":{"id":"n1820939656","loc":[-85.5702347,41.9651378],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939657":{"id":"n1820939657","loc":[-85.4235286,42.0088392],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939658":{"id":"n1820939658","loc":[-85.2740856,41.9972206],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939659":{"id":"n1820939659","loc":[-85.4824299,41.9934195],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939660":{"id":"n1820939660","loc":[-85.3857846,42.0014408],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939661":{"id":"n1820939661","loc":[-85.0451658,42.10028],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939662":{"id":"n1820939662","loc":[-85.3893036,42.001377],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939664":{"id":"n1820939664","loc":[-85.2455845,42.0088607],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939665":{"id":"n1820939665","loc":[-85.2741071,41.9951116],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939666":{"id":"n1820939666","loc":[-85.1298375,42.0677718],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939667":{"id":"n1820939667","loc":[-85.5491848,41.9707377],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939669":{"id":"n1820939669","loc":[-85.2780298,41.995238],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939670":{"id":"n1820939670","loc":[-85.1330068,42.0716926],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939671":{"id":"n1820939671","loc":[-85.0811342,42.1025129],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939672":{"id":"n1820939672","loc":[-85.2325124,42.0290135],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939673":{"id":"n1820939673","loc":[-85.2975077,41.9716953],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939674":{"id":"n1820939674","loc":[-85.0951729,42.0922394],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939676":{"id":"n1820939676","loc":[-85.0363252,42.1043119],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939677":{"id":"n1820939677","loc":[-85.2960057,41.97349],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939678":{"id":"n1820939678","loc":[-85.3701849,41.9982515],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939679":{"id":"n1820939679","loc":[-85.3381486,41.9848861],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939680":{"id":"n1820939680","loc":[-85.2058448,42.0417286],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939682":{"id":"n1820939682","loc":[-85.0819335,42.1034443],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939683":{"id":"n1820939683","loc":[-85.3872223,41.9993359],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939684":{"id":"n1820939684","loc":[-85.095366,42.091909],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939685":{"id":"n1820939685","loc":[-85.2327914,42.0291888],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939686":{"id":"n1820939686","loc":[-85.0433459,42.1018773],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939687":{"id":"n1820939687","loc":[-85.0585339,42.1027318],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939688":{"id":"n1820939688","loc":[-85.0062885,42.0876347],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939689":{"id":"n1820939689","loc":[-85.246299,42.017377],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939690":{"id":"n1820939690","loc":[-85.2932376,41.9742877],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939691":{"id":"n1820939691","loc":[-85.2962846,41.9736815],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939692":{"id":"n1820939692","loc":[-85.6052365,41.9409193],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939693":{"id":"n1820939693","loc":[-85.2570536,42.0003341],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939694":{"id":"n1820939694","loc":[-85.0488458,42.1014064],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939695":{"id":"n1820939695","loc":[-85.4050321,42.0069578],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939696":{"id":"n1820939696","loc":[-85.4847517,41.9845894],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939697":{"id":"n1820939697","loc":[-85.0844655,42.1013826],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939698":{"id":"n1820939698","loc":[-85.1437206,42.0650008],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939699":{"id":"n1820939699","loc":[-85.1168183,42.0864034],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939700":{"id":"n1820939700","loc":[-85.5479831,41.9711366],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939701":{"id":"n1820939701","loc":[-85.0349948,42.1034124],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939702":{"id":"n1820939702","loc":[-85.0835589,42.1038821],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939703":{"id":"n1820939703","loc":[-85.0203875,42.0902649],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939704":{"id":"n1820939704","loc":[-85.0371191,42.1038184],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939705":{"id":"n1820939705","loc":[-85.1273312,42.0735681],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939707":{"id":"n1820939707","loc":[-85.1272239,42.0730226],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939710":{"id":"n1820939710","loc":[-85.0349881,42.1019012],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939712":{"id":"n1820939712","loc":[-85.2440459,42.0178313],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939713":{"id":"n1820939713","loc":[-85.2444751,42.0182618],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939714":{"id":"n1820939714","loc":[-85.0539996,42.1032863],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939715":{"id":"n1820939715","loc":[-85.2215905,42.0373246],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939716":{"id":"n1820939716","loc":[-85.0649712,42.1051994],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939717":{"id":"n1820939717","loc":[-85.0927146,42.0927581],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939718":{"id":"n1820939718","loc":[-85.3884668,42.0042312],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939719":{"id":"n1820939719","loc":[-85.0840672,42.1013241],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939720":{"id":"n1820939720","loc":[-85.304739,41.9725408],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939721":{"id":"n1820939721","loc":[-85.2243585,42.0371334],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939722":{"id":"n1820939722","loc":[-85.0599823,42.1049686],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939723":{"id":"n1820939723","loc":[-85.0298825,42.0944288],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939724":{"id":"n1820939724","loc":[-85.0366095,42.1042443],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939725":{"id":"n1820939725","loc":[-85.0698783,42.1058135],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939726":{"id":"n1820939726","loc":[-85.1054551,42.0873361],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939727":{"id":"n1820939727","loc":[-84.9952324,42.0864285],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939728":{"id":"n1820939728","loc":[-85.3442211,41.9897993],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939729":{"id":"n1820939729","loc":[-85.4386134,42.0056822],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939730":{"id":"n1820939730","loc":[-85.2438528,42.0146589],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939731":{"id":"n1820939731","loc":[-85.0355581,42.1041846],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939732":{"id":"n1820939732","loc":[-85.557682,41.9724447],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939734":{"id":"n1820939734","loc":[-85.2299418,42.033314],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939735":{"id":"n1820939735","loc":[-85.6297412,41.9419088],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939736":{"id":"n1820939736","loc":[-85.2645101,41.9980259],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939738":{"id":"n1820939738","loc":[-85.082195,42.1035649],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939739":{"id":"n1820939739","loc":[-85.234272,42.0267102],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939740":{"id":"n1820939740","loc":[-85.0130758,42.0895006],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939741":{"id":"n1820939741","loc":[-85.4594702,42.0000375],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939742":{"id":"n1820939742","loc":[-84.9946745,42.0863687],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939743":{"id":"n1820939743","loc":[-85.6438775,41.9120186],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939744":{"id":"n1820939744","loc":[-85.6372685,41.9168089],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939745":{"id":"n1820939745","loc":[-85.2789468,41.9893208],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939747":{"id":"n1820939747","loc":[-85.3775019,41.998427],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939749":{"id":"n1820939749","loc":[-85.0993571,42.0909178],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939750":{"id":"n1820939750","loc":[-85.1308503,42.0669339],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939751":{"id":"n1820939751","loc":[-85.4802566,41.9856659],"version":"2","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1820939752":{"id":"n1820939752","loc":[-85.2543563,42.0108804],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939753":{"id":"n1820939753","loc":[-85.1041033,42.0878815],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939755":{"id":"n1820939755","loc":[-85.4000969,42.0071651],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939757":{"id":"n1820939757","loc":[-85.3858275,42.0022381],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939758":{"id":"n1820939758","loc":[-85.3653998,41.996609],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939759":{"id":"n1820939759","loc":[-85.2432949,42.0202305],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939760":{"id":"n1820939760","loc":[-85.3878874,42.0042472],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939761":{"id":"n1820939761","loc":[-85.2516741,42.0114145],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939762":{"id":"n1820939762","loc":[-85.2788825,41.9865142],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939763":{"id":"n1820939763","loc":[-85.0009147,42.0886686],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939764":{"id":"n1820939764","loc":[-85.3918142,42.003434],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939765":{"id":"n1820939765","loc":[-85.5532832,41.9696848],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939766":{"id":"n1820939766","loc":[-85.5545063,41.969254],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939768":{"id":"n1820939768","loc":[-85.1327989,42.0704769],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939770":{"id":"n1820939770","loc":[-85.0588558,42.1047696],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939772":{"id":"n1820939772","loc":[-85.555798,41.9713017],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939773":{"id":"n1820939773","loc":[-85.0565853,42.1023589],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939774":{"id":"n1820939774","loc":[-85.2582941,41.9992765],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939775":{"id":"n1820939775","loc":[-85.3007264,41.9727642],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939776":{"id":"n1820939776","loc":[-85.2477045,42.0082652],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939777":{"id":"n1820939777","loc":[-85.2415247,42.0104973],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1821006698":{"id":"n1821006698","loc":[-85.6345227,41.9382009],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006700":{"id":"n1821006700","loc":[-85.6344894,41.938975],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006704":{"id":"n1821006704","loc":[-85.6351181,41.9370157],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006706":{"id":"n1821006706","loc":[-85.6357554,41.9361657],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006708":{"id":"n1821006708","loc":[-85.6351235,41.9368481],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006710":{"id":"n1821006710","loc":[-85.6352844,41.9364211],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006712":{"id":"n1821006712","loc":[-85.6351503,41.937307],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006716":{"id":"n1821006716","loc":[-85.6350366,41.9379774],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006725":{"id":"n1821006725","loc":[-85.6352147,41.9375903],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821137607":{"id":"n1821137607","loc":[-85.5297057,41.9669915],"version":"1","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:32Z","tags":{}},"n1821137608":{"id":"n1821137608","loc":[-85.5288598,41.9673094],"version":"1","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:32Z","tags":{}},"n1821139530":{"id":"n1821139530","loc":[-85.4832228,41.9881686],"version":"1","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1821139531":{"id":"n1821139531","loc":[-85.4812101,41.9851258],"version":"1","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1821139532":{"id":"n1821139532","loc":[-85.4799127,41.9860244],"version":"1","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1821139533":{"id":"n1821139533","loc":[-85.4800313,41.9865555],"version":"1","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1841425201":{"id":"n1841425201","loc":[-85.4334577,42.0063713],"version":"1","changeset":"12524188","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-28T14:50:57Z","tags":{}},"n1841425222":{"id":"n1841425222","loc":[-85.4382449,42.0055785],"version":"1","changeset":"12524188","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-28T14:50:58Z","tags":{}},"n1914861007":{"id":"n1914861007","loc":[-85.394959,42.0057472],"version":"1","changeset":"13114234","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-09-15T03:33:21Z","tags":{}},"n1914861057":{"id":"n1914861057","loc":[-85.3967185,42.0049695],"version":"1","changeset":"13114234","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-09-15T03:33:22Z","tags":{}},"n1914861112":{"id":"n1914861112","loc":[-85.394179,42.0056906],"version":"1","changeset":"13114234","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-09-15T03:33:24Z","tags":{}},"n1914861306":{"id":"n1914861306","loc":[-85.3900226,42.0028488],"version":"1","changeset":"13114234","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-09-15T03:33:27Z","tags":{}},"n2114807565":{"id":"n2114807565","loc":[-85.6385979,41.9577824],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807568":{"id":"n2114807568","loc":[-85.6325097,41.9775713],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807572":{"id":"n2114807572","loc":[-85.6328996,41.9980965],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807578":{"id":"n2114807578","loc":[-85.6344818,41.9696956],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807583":{"id":"n2114807583","loc":[-85.6326289,41.9757853],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807593":{"id":"n2114807593","loc":[-85.6360828,41.9650674],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2130304159":{"id":"n2130304159","loc":[-85.6352537,41.9450015],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{"railway":"level_crossing"}},"n2139795852":{"id":"n2139795852","loc":[-85.6374708,41.9311633],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:57Z","tags":{}},"n2139858882":{"id":"n2139858882","loc":[-85.635178,41.9356158],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858883":{"id":"n2139858883","loc":[-85.63533,41.9355886],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858884":{"id":"n2139858884","loc":[-85.6353819,41.93556],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858885":{"id":"n2139858885","loc":[-85.6353665,41.9355157],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858886":{"id":"n2139858886","loc":[-85.6353165,41.9354971],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858887":{"id":"n2139858887","loc":[-85.6352454,41.9355328],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858888":{"id":"n2139858888","loc":[-85.6350184,41.9357846],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858889":{"id":"n2139858889","loc":[-85.634978,41.9359448],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858890":{"id":"n2139858890","loc":[-85.6347723,41.9361523],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858891":{"id":"n2139858891","loc":[-85.6347165,41.9362667],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858892":{"id":"n2139858892","loc":[-85.6346992,41.9364312],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858893":{"id":"n2139858893","loc":[-85.634603,41.9366329],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858894":{"id":"n2139858894","loc":[-85.6345973,41.9367488],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858895":{"id":"n2139858895","loc":[-85.6345127,41.9369734],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858896":{"id":"n2139858896","loc":[-85.634478,41.9371923],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858897":{"id":"n2139858897","loc":[-85.6344838,41.9373768],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858898":{"id":"n2139858898","loc":[-85.6346242,41.9375299],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858899":{"id":"n2139858899","loc":[-85.6347723,41.9376357],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858900":{"id":"n2139858900","loc":[-85.6347607,41.9377788],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858901":{"id":"n2139858901","loc":[-85.6346204,41.9379533],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858902":{"id":"n2139858902","loc":[-85.6344184,41.9380105],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858903":{"id":"n2139858903","loc":[-85.6341627,41.9380406],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858904":{"id":"n2139858904","loc":[-85.634005,41.9381679],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858905":{"id":"n2139858905","loc":[-85.63393,41.9383353],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858906":{"id":"n2139858906","loc":[-85.6338588,41.9384597],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858907":{"id":"n2139858907","loc":[-85.6336627,41.9387759],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858908":{"id":"n2139858908","loc":[-85.6335127,41.9389361],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858933":{"id":"n2139858933","loc":[-85.6353118,41.9432646],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858934":{"id":"n2139858934","loc":[-85.6353952,41.9433002],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858935":{"id":"n2139858935","loc":[-85.6356496,41.9433255],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858936":{"id":"n2139858936","loc":[-85.6363128,41.9433373],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858937":{"id":"n2139858937","loc":[-85.6365467,41.9433779],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858938":{"id":"n2139858938","loc":[-85.6368692,41.9435265],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858939":{"id":"n2139858939","loc":[-85.6370986,41.9437039],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858940":{"id":"n2139858940","loc":[-85.6372371,41.9437732],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858941":{"id":"n2139858941","loc":[-85.6374756,41.9438171],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858942":{"id":"n2139858942","loc":[-85.6376164,41.9439286],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858943":{"id":"n2139858943","loc":[-85.6377504,41.944138],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858944":{"id":"n2139858944","loc":[-85.6384204,41.9443137],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858945":{"id":"n2139858945","loc":[-85.6385726,41.9444506],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858946":{"id":"n2139858946","loc":[-85.638702,41.9445739],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858947":{"id":"n2139858947","loc":[-85.6387179,41.9446516],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858948":{"id":"n2139858948","loc":[-85.6387088,41.9447985],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858949":{"id":"n2139858949","loc":[-85.6387656,41.9449877],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858950":{"id":"n2139858950","loc":[-85.638777,41.9451448],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858951":{"id":"n2139858951","loc":[-85.6387088,41.9452631],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858964":{"id":"n2139858964","loc":[-85.6383346,41.9442912],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858966":{"id":"n2139858966","loc":[-85.6384724,41.9443605],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858967":{"id":"n2139858967","loc":[-85.6354078,41.9434285],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858968":{"id":"n2139858968","loc":[-85.635271,41.943654],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858969":{"id":"n2139858969","loc":[-85.6352657,41.9437437],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858970":{"id":"n2139858970","loc":[-85.635271,41.9438195],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858971":{"id":"n2139858971","loc":[-85.6351563,41.9438906],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858972":{"id":"n2139858972","loc":[-85.6351384,41.9438882],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858973":{"id":"n2139858973","loc":[-85.6351514,41.9438034],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858974":{"id":"n2139858974","loc":[-85.6351237,41.9436641],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858975":{"id":"n2139858975","loc":[-85.6351498,41.9436108],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858976":{"id":"n2139858976","loc":[-85.6351058,41.9435345],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858977":{"id":"n2139858977","loc":[-85.6349641,41.9432051],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858986":{"id":"n2139858986","loc":[-85.6341205,41.9380746],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858990":{"id":"n2139858990","loc":[-85.6345671,41.9381816],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858995":{"id":"n2139858995","loc":[-85.6339783,41.9382273],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139859003":{"id":"n2139859003","loc":[-85.6340477,41.9373489],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:14Z","tags":{}},"n2139859004":{"id":"n2139859004","loc":[-85.6339784,41.9374752],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:14Z","tags":{}},"n2139870406":{"id":"n2139870406","loc":[-85.6342265,41.9432605],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139877106":{"id":"n2139877106","loc":[-85.6346323,41.9438746],"version":"1","changeset":"14893390","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:53:38Z","tags":{}},"n2139982399":{"id":"n2139982399","loc":[-85.6324055,41.9408537],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982400":{"id":"n2139982400","loc":[-85.632488,41.941063],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{"leisure":"slipway"}},"n2139982401":{"id":"n2139982401","loc":[-85.6327261,41.9415366],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982402":{"id":"n2139982402","loc":[-85.6326391,41.9413598],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982403":{"id":"n2139982403","loc":[-85.6327041,41.9414391],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982405":{"id":"n2139982405","loc":[-85.6322891,41.9406009],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982406":{"id":"n2139982406","loc":[-85.6325412,41.9425257],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139989333":{"id":"n2139989333","loc":[-85.6340584,41.9431731],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2140006331":{"id":"n2140006331","loc":[-85.6361751,41.9459744],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006334":{"id":"n2140006334","loc":[-85.636528,41.9459751],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006336":{"id":"n2140006336","loc":[-85.6370918,41.9458926],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006338":{"id":"n2140006338","loc":[-85.6378806,41.9456474],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006340":{"id":"n2140006340","loc":[-85.6385831,41.9454343],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006342":{"id":"n2140006342","loc":[-85.639341,41.945157],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006344":{"id":"n2140006344","loc":[-85.6393497,41.9450232],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006346":{"id":"n2140006346","loc":[-85.6388245,41.9450145],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006348":{"id":"n2140006348","loc":[-85.6388167,41.9441739],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006351":{"id":"n2140006351","loc":[-85.6382915,41.9441797],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006353":{"id":"n2140006353","loc":[-85.63828,41.9438109],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006355":{"id":"n2140006355","loc":[-85.6381949,41.9436009],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006357":{"id":"n2140006357","loc":[-85.6371904,41.9435918],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006359":{"id":"n2140006359","loc":[-85.6366966,41.9432727],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006361":{"id":"n2140006361","loc":[-85.6353755,41.9432744],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006365":{"id":"n2140006365","loc":[-85.6350906,41.9435472],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006366":{"id":"n2140006366","loc":[-85.6343461,41.9441573],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006395":{"id":"n2140006395","loc":[-85.6351171,41.9437175],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006397":{"id":"n2140006397","loc":[-85.635352,41.9450206],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006399":{"id":"n2140006399","loc":[-85.6358194,41.9454937],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006401":{"id":"n2140006401","loc":[-85.6348693,41.9445739],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006431":{"id":"n2140006431","loc":[-85.6376737,41.9438023],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006437":{"id":"n2140006437","loc":[-85.6382631,41.9442724],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2189123379":{"id":"n2189123379","loc":[-85.6342671,41.9352665],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"w203974076":{"id":"w203974076","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"footway"},"nodes":["n2139870442","n2139870457","n2139870458","n2139870459","n2139870460","n2139870452"]},"w170989131":{"id":"w170989131","version":"5","changeset":"13114234","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-09-15T03:33:30Z","tags":{"name":"St Joseph River","source":"Bing Imagery","waterway":"river"},"nodes":["n1820938225","n1820938712","n1820937596","n1820937574","n1820938515","n1820938330","n1820938678","n1820938240","n1820938950","n1820939226","n1820939575","n1820937913","n1820938223","n1820937668","n1820938545","n1820937584","n1820939742","n1820939727","n1820937578","n1820938149","n1820938124","n1820938888","n1820938898","n1820937922","n1820939543","n1820939370","n1820939401","n1820939647","n1820938345","n1820939644","n1820938333","n1820938370","n1820938624","n1820938493","n1820939559","n1820939763","n1820939237","n1820939416","n1820937810","n1820938317","n1820938324","n1820937558","n1820939556","n1820938298","n1820939348","n1820939125","n1820939081","n1820938859","n1820939126","n1820938881","n1820939439","n1820939324","n1820939128","n1820938101","n1820937706","n1820938382","n1820938776","n1820937815","n1820939177","n1820939688","n1820938952","n1820938216","n1820938387","n1820939333","n1820938243","n1820938248","n1820937666","n1820939051","n1820938332","n1820939438","n1820939407","n1820939361","n1820937517","n1820938770","n1820939591","n1820937857","n1820938491","n1820937993","n1820938125","n1820938166","n1820937746","n1820939028","n1820937638","n1820938676","n1820938843","n1820938844","n1820937978","n1820938730","n1820939544","n1820938304","n1820939123","n1820939494","n1820939450","n1820939555","n1820938133","n1820938129","n1820938871","n1820939408","n1820938669","n1820938260","n1820939740","n1820937625","n1820938631","n1820939651","n1820939613","n1820937850","n1820938325","n1820937736","n1820938804","n1820938837","n1820938014","n1820938991","n1820938722","n1820938935","n1820937870","n1820938432","n1820937986","n1820938756","n1820938966","n1820939159","n1820937744","n1820938334","n1820937645","n1820939394","n1820937656","n1820938392","n1820939703","n1820938385","n1820938947","n1820938854","n1820938428","n1820938488","n1820938269","n1820938668","n1820938268","n1820938707","n1820937732","n1820939144","n1820938481","n1820938771","n1820938686","n1820938948","n1820937997","n1820937769","n1820939003","n1820938083","n1820939011","n1820938803","n1820938700","n1820939723","n1820938808","n1820938262","n1820938081","n1820938926","n1820938326","n1820938102","n1820938508","n1820939590","n1820939199","n1820938084","n1820938870","n1820938895","n1820937611","n1820938918","n1820938514","n1820939610","n1820938910","n1820937523","n1820938127","n1820939108","n1820937981","n1820938938","n1820938715","n1820939016","n1820938237","n1820939623","n1820939602","n1820937734","n1820938977","n1820939633","n1820939156","n1820939406","n1820938279","n1820938301","n1820937678","n1820937671","n1820939163","n1820938356","n1820939372","n1820937568","n1820937626","n1820939710","n1820939004","n1820938253","n1820938571","n1820937513","n1820939412","n1820939701","n1820939509","n1820938839","n1820939731","n1820937798","n1820939676","n1820939724","n1820939243","n1820939704","n1820937814","n1820937599","n1820938199","n1820938995","n1820938445","n1820938069","n1820938470","n1820939074","n1820938193","n1820938740","n1820938047","n1820939507","n1820939441","n1820939160","n1820937849","n1820937840","n1820938052","n1820938988","n1820938796","n1820937724","n1820937620","n1820939304","n1820938343","n1820939649","n1820938875","n1820939686","n1820938476","n1820937801","n1820937737","n1820938264","n1820939609","n1820939496","n1820939593","n1820939566","n1820939661","n1820937782","n1820938912","n1820939173","n1820937733","n1820938953","n1820939603","n1820937607","n1820938468","n1820939601","n1820939694","n1820939133","n1820938897","n1820938893","n1820937831","n1820937730","n1820938820","n1820938046","n1820938426","n1820938347","n1820937582","n1820938954","n1820938033","n1820938104","n1820938680","n1820939563","n1820939404","n1820939714","n1820939000","n1820937992","n1820938168","n1820939510","n1820939500","n1820937509","n1820938865","n1820939773","n1820938138","n1820938905","n1820937623","n1820939418","n1820937946","n1820939577","n1820937615","n1820939687","n1820939119","n1820937988","n1820938337","n1820937750","n1820938703","n1820938339","n1820939044","n1820939770","n1820938913","n1820937672","n1820939722","n1820937768","n1820939597","n1820939612","n1820937699","n1820937682","n1820937669","n1820937657","n1820939363","n1820937800","n1820938265","n1820937760","n1820938207","n1820938115","n1820939130","n1820939716","n1820938338","n1820938239","n1820939040","n1820938064","n1820938855","n1820939015","n1820938258","n1820939042","n1820939043","n1820938443","n1820939725","n1820937675","n1820938568","n1820938280","n1820937705","n1820938775","n1820938636","n1820938626","n1820937859","n1820938096","n1820937852","n1820939039","n1820938247","n1820938585","n1820937707","n1820938117","n1820938909","n1820939115","n1820939335","n1820938805","n1820937935","n1820937876","n1820938699","n1820937869","n1820938603","n1820938100","n1820938500","n1820938283","n1820938275","n1820938923","n1820938365","n1820938349","n1820937804","n1820937903","n1820937608","n1820938688","n1820939671","n1820938092","n1820937820","n1820938753","n1820938922","n1820937990","n1820939682","n1820939738","n1820939600","n1820938167","n1820937726","n1820939702","n1820938209","n1820939456","n1820937837","n1820938222","n1820938902","n1820939162","n1820938965","n1820938461","n1820937681","n1820937514","n1820937764","n1820939719","n1820939697","n1820938899","n1820939093","n1820938702","n1820939595","n1820938749","n1820938348","n1820937606","n1820938675","n1820938830","n1820938737","n1820938758","n1820938716","n1820939107","n1820937863","n1820939033","n1820938163","n1820937867","n1820938819","n1820938034","n1820938252","n1820937563","n1820937868","n1820939032","n1820938632","n1820937982","n1820937943","n1820939568","n1820939541","n1820938215","n1820939097","n1820938812","n1820937518","n1820937952","n1820938711","n1820938736","n1820939066","n1820937591","n1820938082","n1820938108","n1820938496","n1820939410","n1820938949","n1820938327","n1820937708","n1820939023","n1820937772","n1820938256","n1820939083","n1820938378","n1820938961","n1820937610","n1820939717","n1820938695","n1820938590","n1820939655","n1820938341","n1820939054","n1820939157","n1820939674","n1820939684","n1820939511","n1820937631","n1820939458","n1820937830","n1820937709","n1820937779","n1820939749","n1820938880","n1820938856","n1820938557","n1820939557","n1820938249","n1820938818","n1820937594","n1820939114","n1820938416","n1820937508","n1820938990","n1820938201","n1820937759","n1820937987","n1820939164","n1820939753","n1820938187","n1820939067","n1820937586","n1820937941","n1820938121","n1820937807","n1820938521","n1820939726","n1820938244","n1820939014","n1820938741","n1820937629","n1820938664","n1820938747","n1820939082","n1820938709","n1820938320","n1820938270","n1820937619","n1820937777","n1820937718","n1820939138","n1820938056","n1820938155","n1820938596","n1820937775","n1820938437","n1820938128","n1820939581","n1820939145","n1820938546","n1820938184","n1820937601","n1820937794","n1820938539","n1820939645","n1820938438","n1820938436","n1820939025","n1820938915","n1820938534","n1820937605","n1820939607","n1820939101","n1820939580","n1820939268","n1820939134","n1820938849","n1820938754","n1820938079","n1820937842","n1820938781","n1820938873","n1820938495","n1820938381","n1820938503","n1820939436","n1820938502","n1820939087","n1820938996","n1820938449","n1820938907","n1820937979","n1820937780","n1820937546","n1820939699","n1820937677","n1820938957","n1820938946","n1820937776","n1820937717","n1820938718","n1820937637","n1820938510","n1820937663","n1820938941","n1820939151","n1820937603","n1820938250","n1820937951","n1820938630","n1820938821","n1820938779","n1820938497","n1820938159","n1820939536","n1820938409","n1820938386","n1820939116","n1820938340","n1820939117","n1820938291","n1820938435","n1820937819","n1820938242","n1820939078","n1820938877","n1820939104","n1820939445","n1820938367","n1820938903","n1820939420","n1820938517","n1820939508","n1820939542","n1820939326","n1820938210","n1820939020","n1820938815","n1820937832","n1820939513","n1820937818","n1820939005","n1820938717","n1820939135","n1820938384","n1820937587","n1820939024","n1820939504","n1820939120","n1820939026","n1820938015","n1820938998","n1820937648","n1820939137","n1820937761","n1820938195","n1820938535","n1820939550","n1820938725","n1820938282","n1820937781","n1820937792","n1820939705","n1820937788","n1820939707","n1820937882","n1820939632","n1820938427","n1820938276","n1820939617","n1820939013","n1820939035","n1820937543","n1820939365","n1820937752","n1820937802","n1820939183","n1820939670","n1820938450","n1820939375","n1820937813","n1820937673","n1820937783","n1820939029","n1820939768","n1820939377","n1820937974","n1820939244","n1820939642","n1820937864","n1820938255","n1820938528","n1820939666","n1820938120","n1820937812","n1820938928","n1820939750","n1820939099","n1820938073","n1820938714","n1820939140","n1820938192","n1820937844","n1820938635","n1820938742","n1820939583","n1820937887","n1820938318","n1820938816","n1820939698","n1820938273","n1820939181","n1820937652","n1820938748","n1820937651","n1820938519","n1820938019","n1820938752","n1820938235","n1820939118","n1820938562","n1820939314","n1820939570","n1820938190","n1820938342","n1820938533","n1820937977","n1820939089","n1820939146","n1820938622","n1820938297","n1820938524","n1820939283","n1820938874","n1820938832","n1820937550","n1820937843","n1820938638","n1820938116","n1820938206","n1820938319","n1820939053","n1820937845","n1820938093","n1820939217","n1820938997","n1820939355","n1820938861","n1820938726","n1820938057","n1820939373","n1820937862","n1820938518","n1820939072","n1820939680","n1820938444","n1820938217","n1820938506","n1820938393","n1820938492","n1820938852","n1820938221","n1820938773","n1820937684","n1820939060","n1820938224","n1820938203","n1820938840","n1820937525","n1820938147","n1820938433","n1820938188","n1820939359","n1820938750","n1820938016","n1820938768","n1820937621","n1820937799","n1820938951","n1820938721","n1820939037","n1820937866","n1820939715","n1820938063","n1820938446","n1820937627","n1820939624","n1820938431","n1820939721","n1820939622","n1820939239","n1820939263","n1820939648","n1820939640","n1820938867","n1820938757","n1820938439","n1820939352","n1820937740","n1820939329","n1820938229","n1820937583","n1820938180","n1820938366","n1820937767","n1820937758","n1820939374","n1820938869","n1820938292","n1820938400","n1820938399","n1820939734","n1820939289","n1820938944","n1820937755","n1820938759","n1820938434","n1820937600","n1820937825","n1820937670","n1820937793","n1820938011","n1820938246","n1820938956","n1820937770","n1820937757","n1820938059","n1820937860","n1820937569","n1820939266","n1820939685","n1820939672","n1820938606","n1820938772","n1820939038","n1820938211","n1820938359","n1820939619","n1820938708","n1820939512","n1820938065","n1820939233","n1820939739","n1820938786","n1820938879","n1820939147","n1820938563","n1820939148","n1820937839","n1820937659","n1820937786","n1820938419","n1820939565","n1820939402","n1820937710","n1820938254","n1820938271","n1820938390","n1820937680","n1820938140","n1820937817","n1820938218","n1820937985","n1820939235","n1820938441","n1820938401","n1820938719","n1820937795","n1820938971","n1820938460","n1820939759","n1820937972","n1820937841","n1820938462","n1820939320","n1820938978","n1820938360","n1820939713","n1820937676","n1820939712","n1820937939","n1820938080","n1820937754","n1820937753","n1820938530","n1820937886","n1820939689","n1820939124","n1820938697","n1820938789","n1820939105","n1820938860","n1820938853","n1820939400","n1820937561","n1820938404","n1820938774","n1820939316","n1820937696","n1820938782","n1820938975","n1820937564","n1820939730","n1820938257","n1820937853","n1820938487","n1820938848","n1820938906","n1820939230","n1820938424","n1820938051","n1820937771","n1820939587","n1820939149","n1820938792","n1820939041","n1820938934","n1820939777","n1820937515","n1820939058","n1820938312","n1820939264","n1820939631","n1820939109","n1820939403","n1820939664","n1820938724","n1820938929","n1820939399","n1820939776","n1820939369","n1820939185","n1820937701","n1820938126","n1820938336","n1820938219","n1820939080","n1820938642","n1820938043","n1820937725","n1820938548","n1820938552","n1820938035","n1820938684","n1820937778","n1820938764","n1820939021","n1820939346","n1820937712","n1820939761","n1820938397","n1820937747","n1820938566","n1820939161","n1820939090","n1820939752","n1820939271","n1820938878","n1820938110","n1820938346","n1820938499","n1820938151","n1820939538","n1820938281","n1820939153","n1820938551","n1820939285","n1820938197","n1820938408","n1820938482","n1820939036","n1820939579","n1820938489","n1820938483","n1820938189","n1820938123","n1820938087","n1820937741","n1820938485","n1820937590","n1820938972","n1820937773","n1820937520","n1820938872","n1820938131","n1820938452","n1820938328","n1820939620","n1820937641","n1820938353","n1820939693","n1820938705","n1820937640","n1820939189","n1820938144","n1820939774","n1820938694","n1820938238","n1820939397","n1820937917","n1820938454","n1820938567","n1820938979","n1820938060","n1820938204","n1820937828","n1820939232","n1820938806","n1820938857","n1820938078","n1820938105","n1820939228","n1820938604","n1820937763","n1820937854","n1820938289","n1820939736","n1820937937","n1820937714","n1820938278","n1820938058","n1820938706","n1820938989","n1820938313","n1820938520","n1820938288","n1820937689","n1820939537","n1820939531","n1820939019","n1820937527","n1820938455","n1820938814","n1820938045","n1820939627","n1820938213","n1820938161","n1820938331","n1820938024","n1820938220","n1820938062","n1820938178","n1820937796","n1820937644","n1820938490","n1820937589","n1820937879","n1820939614","n1820938882","n1820938039","n1820938538","n1820937667","n1820937719","n1820938561","n1820939658","n1820938783","n1820938601","n1820938198","n1820938388","n1820938969","n1820937687","n1820939086","n1820939665","n1820939187","n1820938498","n1820938261","n1820937983","n1820938068","n1820938136","n1820939061","n1820938137","n1820938186","n1820939071","n1820937592","n1820939669","n1820937553","n1820939357","n1820938727","n1820939371","n1820939112","n1820939079","n1820938743","n1820938467","n1820938834","n1820938022","n1820938537","n1820938122","n1820938516","n1820937614","n1820937612","n1820939469","n1820939636","n1820939050","n1820939552","n1820938157","n1820938663","n1820938955","n1820939091","n1820938430","n1820938471","n1820937809","n1820938074","n1820938208","n1820938914","n1820938858","n1820938417","n1820937531","n1820938107","n1820939100","n1820938751","n1820937711","n1820938824","n1820939745","n1820937572","n1820938602","n1820938212","n1820938097","n1820937921","n1820938090","n1820938511","n1820938876","n1820939762","n1820938234","n1820938048","n1820937774","n1820937856","n1820937749","n1820937765","n1820938286","n1820939095","n1820938480","n1820939229","n1820938277","n1820937617","n1820938311","n1820937622","n1820939196","n1820937690","n1820939006","n1820939287","n1820939131","n1820938106","n1820938784","n1820938335","n1820938095","n1820938182","n1820937715","n1820937683","n1820938070","n1820939605","n1820938527","n1820938763","n1820938398","n1820937686","n1820939621","n1820937664","n1820939277","n1820938565","n1820939539","n1820938099","n1820939646","n1820938556","n1820937548","n1820938729","n1820939336","n1820938259","n1820938728","n1820938361","n1820937643","n1820938644","n1820939007","n1820939690","n1820939227","n1820937635","n1820937950","n1820938682","n1820939150","n1820939012","n1820939261","n1820939111","n1820937805","n1820939691","n1820939677","n1820937628","n1820937811","n1820938790","n1820938251","n1820938226","n1820938942","n1820937633","n1820937984","n1820937751","n1820939673","n1820938970","n1820938415","n1820938597","n1820938309","n1820938111","n1820938472","n1820938894","n1820938402","n1820937593","n1820938570","n1820939102","n1820939775","n1820937948","n1820939121","n1820937511","n1820938787","n1820939720","n1820939075","n1820937880","n1820937742","n1820937721","n1820939535","n1820938486","n1820938354","n1820937632","n1820939010","n1820938885","n1820938089","n1820937613","n1820938442","n1820938245","n1820938272","n1820937566","n1820938295","n1820938532","n1820938883","n1820937713","n1820937674","n1820939635","n1820938448","n1820938355","n1820938587","n1820938559","n1820937787","n1820939301","n1820937723","n1820939056","n1820937560","n1820938323","n1820938230","n1820938453","n1820938377","n1820938357","n1820939637","n1820938017","n1820939540","n1820939376","n1820937639","n1820937642","n1820938075","n1820938351","n1820938766","n1820937897","n1820938973","n1820938066","n1820939547","n1820939652","n1820937944","n1820937748","n1820939234","n1820939193","n1820937891","n1820938785","n1820939132","n1820938523","n1820938884","n1820938411","n1820939554","n1820938791","n1820937655","n1820938368","n1820939152","n1820938030","n1820938447","n1820937580","n1820939628","n1820937588","n1820937894","n1820939201","n1820938086","n1820937650","n1820938379","n1820939008","n1820938999","n1820937524","n1820937872","n1820938389","n1820939197","n1820938422","n1820938936","n1820939262","n1820937634","n1820938583","n1820939589","n1820937901","n1820939034","n1820939065","n1820938290","n1820939195","n1820938228","n1820937884","n1820938797","n1820938191","n1820939191","n1820939198","n1820937892","n1820939679","n1820938507","n1820937647","n1820937909","n1820938542","n1820939598","n1820937851","n1820939084","n1820939728","n1820937688","n1820938263","n1820938670","n1820937762","n1820939310","n1820938925","n1820938862","n1820938822","n1820938547","n1820937731","n1820938594","n1820938592","n1820938214","n1820938284","n1820937835","n1820938599","n1820939437","n1820937834","n1820937576","n1820937692","n1820939586","n1820939546","n1820938403","n1820937970","n1820939561","n1820938098","n1820938851","n1820938477","n1820938892","n1820939045","n1820939758","n1820939350","n1820938321","n1820938440","n1820938595","n1820938364","n1820938962","n1820938118","n1820939678","n1820938406","n1820938549","n1820937555","n1820938823","n1820937521","n1820939471","n1820939487","n1820938799","n1820938605","n1820937928","n1820938373","n1820939747","n1820939629","n1820937557","n1820937526","n1820938958","n1820938833","n1820937636","n1820938967","n1820938760","n1820938842","n1820938067","n1820939077","n1820939224","n1820938185","n1820939110","n1820938372","n1820939757","n1820939063","n1820939660","n1820938813","n1820937528","n1820938369","n1820938896","n1820939551","n1820939683","n1820937660","n1820937873","n1820938810","n1820938478","n1820939662","n1820937595","n1820939052","n1820938113","n1820939070","n1820938733","n1820937878","n1820938300","n1820939760","n1820939718","n1820937646","n1820939057","n1820939443","n1914861306","n1820938013","n1820937529","n1820939764","n1820938826","n1820937885","n1820939588","n1820937865","n1820937833","n1914861112","n1820938761","n1914861007","n1820937905","n1820938541","n1820939092","n1914861057","n1820938153","n1820938267","n1820939265","n1820938085","n1820939018","n1820939755","n1820938474","n1820939027","n1820938593","n1820938202","n1820939599","n1820939695","n1820938077","n1820938012","n1820939545","n1820939596","n1820939337","n1820938227","n1820937698","n1820938475","n1820939465","n1820938165","n1820938698","n1820938525","n1820938529","n1820938553","n1820938940","n1820939498","n1820938501","n1820939533","n1820938924","n1820939634","n1820939220","n1820939657","n1820938887","n1820938838","n1820938114","n1820937823","n1820938778","n1820938801","n1820939096","n1820938981","n1820937953","n1820938732","n1820938980","n1820938960","n1820937949","n1820938026","n1820939273","n1841425201","n1820938629","n1820938864","n1820938554","n1820938088","n1820937685","n1841425222","n1820939729","n1820937665","n1820937838","n1820937739","n1820938780","n1820937821","n1820938825","n1820939055","n1820939485","n1820938041","n1820938746","n1820939562","n1820938459","n1820939489","n1820938050","n1820937980","n1820937695","n1820938413","n1820938555","n1820937703","n1820938536","n1820938196","n1820938287","n1820938169","n1820939279","n1820938531","n1820938959","n1820939741","n1820938665","n1820938963","n1820939611","n1820937653","n1820939618","n1820939492","n1820938600","n1820938628","n1820939312","n1820939616","n1820937738","n1820939001","n1820939062","n1820938794","n1820938558","n1820937822","n1820937532","n1820939073","n1820938200","n1820938241","n1820938968","n1820938927","n1820938306","n1820937630","n1820938456","n1820937694","n1820938908","n1820939076","n1820937522","n1820939659","n1820938522","n1820939318","n1820938932","n1820938841","n1820937579","n1820937540","n1820938560","n1821139530","n1820938964","n1820937662","n1820939281","n1821139533","n1820937797","n1821139532","n1820939751","n1821139531","n1820939291","n1820938420","n1820939696","n1820938904","n1820938484","n1820939448","n1820939009","n1820938735","n1820938986","n1820938937","n1820939030","n1820938734","n1820938745","n1820939106","n1820938987","n1820937858","n1820938673","n1820938620","n1820937808","n1820937700","n1820939573","n1820938540","n1820937661","n1820937570","n1820938396","n1820937875","n1820939048","n1820938233","n1820938793","n1820939584","n1820938412","n1820938394","n1820937846","n1820938800","n1820938690","n1820939331","n1820939630","n1820938762","n1820938710","n1820939322","n1820938992","n1821137608","n1821137607","n1820937924","n1820939139","n1820939463","n1820939574","n1820938294","n1820938071","n1820938307","n1820938061","n1820939260","n1820937899","n1820938310","n1820938983","n1820937530","n1820938993","n1820938890","n1820937915","n1820938231","n1820938040","n1820938920","n1820939585","n1820938135","n1820939700","n1820937824","n1820939667","n1820937930","n1820938134","n1820937551","n1820939405","n1820938232","n1820937716","n1820937848","n1820939765","n1820939068","n1820939766","n1820937933","n1820937720","n1820939222","n1820939772","n1820939022","n1820939732","n1820937702","n1820937691","n1820938945","n1820937756","n1820938451","n1820938410","n1820938798","n1820937945","n1820937654","n1820938598","n1820938836","n1820937571","n1820937556","n1820938994","n1820938919","n1820938863","n1820939064","n1820938018","n1820937658","n1820937537","n1820938142","n1820938666","n1820937535","n1820939571","n1820938465","n1820939638","n1820937533","n1820939656","n1820939422","n1820938109","n1820938405","n1820938028","n1820937649","n1820938829","n1820939031","n1820939155","n1820938350","n1820938463","n1820938425","n1820939047","n1820938831","n1820938494","n1820937697","n1820938504","n1820938900","n1820937784","n1820938414","n1820938076","n1820938723","n1820937722","n1820938739","n1820937791","n1820938985","n1820938352","n1820938293","n1820938274","n1820939692","n1820937871","n1820939059","n1820938868","n1820937877","n1820937743","n1820938429","n1820937545","n1820937575","n1820938302","n1820938505","n1820938916","n1820938374","n1820938329","n1820937790","n1820939735","n1820938930","n1820937995","n1820938512","n1820938130","n1820938194","n1820938671","n1820938802","n1820937542","n1820937602","n1820939069","n1820938901","n1820939654","n1820937727","n1820939569","n1820938375","n1820939306","n1820938479","n1820938376","n1820938667","n1820937766","n1820939467","n1820939567","n1820937806","n1820938943","n1820938931","n1820937745","n1820939452","n1820938738","n1820938053","n1820939653","n1820938640","n1820937604","n1820937536","n1820938701","n1820939625","n1820939744","n1820939572","n1820937577","n1820937541","n1820938891","n1820937597","n1820938469","n1820939194","n1820937539","n1820938911","n1820939017","n1820939650","n1820939103","n1820939578","n1820938132","n1820937549","n1820938634","n1820939743","n1820937544","n1820937826","n1820937598","n1820937547","n1820938032","n1820939142"]},"w17963021":{"id":"w17963021","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:22:17Z","tags":{"highway":"residential","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15331667","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185948706","n185948708","n185948710"]},"w203974069":{"id":"w203974069","version":"2","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:34Z","tags":{"amenity":"shelter","area":"yes","building":"yes","shelter_type":"picnic_shelter"},"nodes":["n2139870431","n2139870432","n2139870433","n2139870434","n2139870431"]},"w209816575":{"id":"w209816575","version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199856288","n2199856289","n2199856290","n2199856291","n2199856292","n2199856293","n2199856294","n2199856295","n2199856296","n2199856297","n2199856298","n2199856299","n2199856300","n2199856301","n2199856302","n2199856303","n2199856288"]},"w203841838":{"id":"w203841838","version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{"area":"yes","natural":"water"},"nodes":["n2138493826","n2138493827","n2138493828","n2138493829","n2138493830","n2138493831","n2138493833","n2138493832","n2138493826"]},"w203972937":{"id":"w203972937","version":"2","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:26Z","tags":{"highway":"path","name":"Riverwalk Trail","surface":"asphalt","width":"3"},"nodes":["n2139858882","n2139858883","n2139858884","n2139858885","n2139858886","n2139858887","n2139858882","n2139858888","n2139858889","n2139858890","n2139858891","n2139858892","n2139858893","n2139858894","n2139858895","n2139858896","n2139858897","n2139858898","n2139858899","n2139858900","n2139858901","n2139858902","n2139858903","n2139858986","n2139858904","n2139858995","n2139858905","n2139858906","n2139858907","n2139858908","n2139858909","n2139858910","n2139858911","n2139858912","n2139858913","n2139858914","n2139858915","n2139858916","n2139858917","n2139858918","n2139858919","n2139858920","n2139858921","n2139858922","n2139858923","n2139858924","n2139858925","n2139858926","n2139858927","n2139858982","n2139858928","n2139858929","n2139858930","n2139858931","n2139858932","n2139858981","n2139858933","n2139858934","n2139858935","n2139858936","n2139858937","n2139858938","n2139858939","n2139858940","n2139858941","n2139858942","n2139858943","n2140006437","n2139858964","n2139858944","n2139858966","n2139858945","n2139858946","n2139858947","n2139858948","n2139858949","n2139858950","n2139858951"]},"w17964015":{"id":"w17964015","version":"2","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"residential","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326005:15326006","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185954680","n185954683","n185954685","n185954687","n185954689","n185954690","n185954691","n2139870379","n2139870456","n185954692","n185954693","n185954695"]},"w17967315":{"id":"w17967315","version":"2","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:01Z","tags":{"highway":"residential","name":"South Andrews Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Andrews","tiger:name_direction_prefix":"S","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185981999","n185974477","n185964963"]},"w203974071":{"id":"w203974071","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"footway"},"nodes":["n2139870439","n2139870440","n2139870441","n2139870442","n2139870443","n2139870444","n2139870445","n2139870446","n2139870447","n2139870448","n2139870449"]},"w170848824":{"id":"w170848824","version":"3","changeset":"15276848","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:54:30Z","tags":{"name":"Rocky River","source":"Bing","waterway":"river"},"nodes":["n1819858503","n1819858531","n1819858526","n1819858518","n1819858505","n1819858508","n1819858512","n1819858514","n1819858528","n1819858509","n1819858511","n1819858507","n1819858521"]},"w203986458":{"id":"w203986458","version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{"amenity":"shelter","area":"yes","shelter_type":"picnic_shelter"},"nodes":["n2139989357","n2139989359","n2139989360","n2139989362","n2139989357"]},"w170844917":{"id":"w170844917","version":"7","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{"source":"Bing","waterway":"riverbank"},"nodes":["n1819805911","n1819805690","n1819805812","n1819805766","n1819805802","n1819805885","n1819805626","n1819805842","n1819805715","n1819805694","n1819805618","n1819805629","n1819805731","n1819805636","n1819805878","n1819805718","n1819805798","n1819849057","n1819805666","n1819805852","n1819805805","n1819805789","n1819805868","n1819805680","n1819805918","n1819848888","n1819805762","n2139989328","n1819805907","n2139989330","n1819805915","n1819858521","n1819805854","n1819805876","n1819805864","n1819805922","n2139859004","n1819805702","n2139859003","n1819805614","n1819805792","n1819805786","n1819805777","n1819805645","n1819805838","n1819805889","n1819805795","n1819805707","n1819805774","n1819805808","n1819805810","n1819805724","n1819805676","n1819805728","n1819805783","n1819805687","n1819805727","n2189123379","n1819805632","n1819805641","n1819805760","n1819805887","n1819805861","n1819805722","n1819805880","n2139982405","n2139982399","n2139982400","n1819805770","n2139982402","n2139982403","n2139982401","n1819805780","n1819805834","n2139982406","n1819805698","n1819805647","n1819805870","n1819805683","n1819805622","n1819805639","n1819805858","n1819805643","n1819805673","n1819805925","n1819805849","n1819805711","n1819805846","n1819805669","n1819805883","n1819805814","n1819805873","n1819805911"]},"w17967326":{"id":"w17967326","version":"4","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:01Z","tags":{"highway":"residential","name":"North Constantine Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Constantine","tiger:name_direction_prefix":"N","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185985217","n185985219","n185985221","n185985222","n185985223","n185985225","n2140006431","n185985227","n185985229","n185985231","n185985233","n185985235","n185985238","n185985240","n2140018998","n185964965"]},"w134150789":{"id":"w134150789","version":"5","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:59Z","tags":{"highway":"primary","name":"West Michigan Avenue","old_ref":"US 131","ref":"US 131 Business;M 60","tiger:cfcc":"A21","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_base_2":"US Hwy 131 (Bus)","tiger:name_direction_prefix":"W","tiger:name_type":"Ave","tiger:reviewed":"no"},"nodes":["n185964971","n2139870406","n185964972"]},"w17966400":{"id":"w17966400","version":"3","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:01Z","tags":{"highway":"tertiary","name":"South Constantine Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Constantine","tiger:name_direction_prefix":"S","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958672","n185964965"]},"w203974066":{"id":"w203974066","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2139870417","n2139870418","n2139870420","n2139870419"]},"w17965998":{"id":"w17965998","version":"5","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:53Z","tags":{"name":"Conrail Railroad","railway":"rail","tiger:cfcc":"B11","tiger:county":"St. Joseph, MI","tiger:name_base":"Conrail Railroad","tiger:reviewed":"no"},"nodes":["n185972775","n185972777","n185972779","n185972781","n185972783","n185972785","n185972787","n185972788","n185972789","n185972790","n185972791","n185972793","n185972795","n185972797","n185972798","n185972800","n185972802","n185972805","n185972807","n185972809","n185972811","n185972813","n185972814","n185972815","n185972816","n185972817","n185972819","n185972821","n185972824","n185972826","n185972830","n185972832","n185972834","n185972835","n185972836","n185972839","n185990434","n2114807572","n2114807568","n185972845","n2114807583","n185972847","n185972849","n185972851","n2114807578","n1475293254","n2114807593","n1475293226","n185972862","n2114807565","n185951869","n1475293234","n1475293252","n185972868","n1475293264","n1475293222","n185972878","n1475293261","n185972882","n185972885","n1475293260","n1475293240","n185972891","n185972895","n185972897","n185972899","n2130304159","n1475284023","n185972903"]},"w134150795":{"id":"w134150795","version":"4","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:59Z","tags":{"bridge":"yes","highway":"primary","name":"West Michigan Avenue","old_ref":"US 131","ref":"US 131 Business;M 60","tiger:cfcc":"A21","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_base_2":"US Hwy 131 (Bus)","tiger:name_direction_prefix":"W","tiger:name_type":"Ave","tiger:reviewed":"no"},"nodes":["n185964970","n185964971"]},"w203974067":{"id":"w203974067","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2139870420","n2139870421"]},"w170995908":{"id":"w170995908","version":"3","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:15Z","tags":{"highway":"residential","name":"Thomas Street","source":"Bing"},"nodes":["n1821006702","n1821006700","n1821006698","n2139858990","n1821006716","n1821006725","n1821006712","n1821006704","n1821006708","n1821006710","n1821006706"]},"w17965834":{"id":"w17965834","version":"3","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:01Z","tags":{"highway":"residential","name":"Spring Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Spring","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093"},"nodes":["n185971361","n185971364","n185971366","n185971368","n185954695","n185964968"]},"w203974070":{"id":"w203974070","version":"2","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:34Z","tags":{"amenity":"shelter","area":"yes","building":"yes","shelter_type":"picnic_shelter"},"nodes":["n2139870435","n2139870436","n2139870437","n2139870438","n2139870435"]},"w203989879":{"id":"w203989879","version":"1","changeset":"14895342","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:35:05Z","tags":{"highway":"service"},"nodes":["n2140018998","n2140018999","n2140019000"]},"w203974062":{"id":"w203974062","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139870387","n2139870388","n2139870389","n2139870390","n2139870391","n2139870392","n2139870397","n2139870393","n2139870396","n2139870395","n2139870394","n2139870387"]},"w203974061":{"id":"w203974061","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"bridge":"yes","highway":"footway"},"nodes":["n2139870382","n2139870383"]},"w203049587":{"id":"w203049587","version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{"area":"yes","name":"Scidmore Park Petting Zoo","tourism":"zoo","zoo":"petting_zoo"},"nodes":["n2130304133","n2130304136","n2130304138","n2130304140","n2130304142","n2130304144","n2130304146","n2130304147","n2130304148","n2130304149","n2130304150","n2130304151","n2130304133"]},"w203972941":{"id":"w203972941","version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:14Z","tags":{"highway":"path"},"nodes":["n2139858982","n2139858983","n2139858984","n2139858985","n2139858927"]},"w203974065":{"id":"w203974065","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"service"},"nodes":["n2139870406","n2139870407","n2139870408","n2139870417","n2139870409","n2139870410","n2139870411","n2139870412","n2139870426","n2139870413","n2139870414","n2139870415","n2139870419","n2139870416","n2139870421","n2139870408"]},"w203972940":{"id":"w203972940","version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:14Z","tags":{"highway":"path","name":"Riverwalk Trail"},"nodes":["n2139858934","n2139858967","n2139858968","n2139858969","n2139858970","n2139858971","n2139858972","n2139858973","n2139858974","n2139858975","n2139858976","n2139858977","n2139858978","n2139858979","n2139858980","n2139858981"]},"w203974072":{"id":"w203974072","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"footway"},"nodes":["n2139858925","n2139870450","n2139870453","n2139870451","n2139870452","n2139870441"]},"w203974074":{"id":"w203974074","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"footway"},"nodes":["n2139870454","n2139870456","n2139870429"]},"w203974060":{"id":"w203974060","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"footway"},"nodes":["n2139870383","n2139870384","n2139870422","n2139870385","n2139870386","n2139870388"]},"w203841837":{"id":"w203841837","version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{"area":"yes","natural":"water"},"nodes":["n2138493807","n2138493808","n2138493809","n2138493810","n2138493811","n2138493812","n2138493813","n2138493814","n2138493815","n2138493816","n2138493825","n2138493817","n2138493824","n2138493818","n2138493819","n2138493820","n2138493821","n2138493822","n2138493823","n2138493807"]},"w134150845":{"id":"w134150845","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{"bridge":"yes","name":"Conrail Railroad","railway":"rail","tiger:cfcc":"B11","tiger:county":"St. Joseph, MI","tiger:name_base":"Conrail Railroad","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15324560:15329061:15329062:15333515:15333516:15333517:15328802:15312982:15312984:15312980:15326010:15326011:15313203:15322169:15324562:15312971:15312973:15312977:15328799:15328907:15328908:15322175:15329059:15333626:15333627:15325105:15322549:15337756:153","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185972903","n185972905"]},"w203974059":{"id":"w203974059","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"footway"},"nodes":["n2139870430","n2139870439","n2139870429","n2139870428","n2139870379","n2139870455","n2139870380","n2139870381","n2139858925","n2139870382"]},"w203986457":{"id":"w203986457","version":"2","changeset":"15287771","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T21:56:30Z","tags":{"area":"yes","ele":"241","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417887","gnis:state_id":"26","leisure":"park","name":"Scidmore Park","website":"http://www.threeriversmi.us/?page_id=53"},"nodes":["n2139989333","n2139989335","n2139989337","n2139989339","n1819805762","n2139989328","n1819805907","n2139989330","n1819805915","n2139989341","n2139989344","n2139989346","n2139989348","n2139989350","n2139989351","n2139989353","n2139989355","n2139989333"]},"w170848331":{"id":"w170848331","version":"4","changeset":"15276848","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:54:29Z","tags":{"name":"Rocky River","source":"Bing","waterway":"river"},"nodes":["n1819848937","n1819849104","n1819849076","n1819849183","n1819848928","n1819848972","n1819848948","n1819848971","n1819848859","n1819849008","n1819848889","n1819849026","n1819849094","n1819849083","n1819849079","n1819849187","n1819848992","n1819849060","n1819849056","n1819849071","n1819849067","n1819849048","n1819849036","n1819849150","n1819849075","n1819849051","n1819849062","n1819848926","n1819849035","n1819848987","n1819849012","n1819848933","n1819848996","n1819848990","n1819849005","n1819849021","n1819848892","n1819849092","n1819848863","n1819848922","n1819848858","n1819848855","n1819848974","n1819848953","n1819849019","n1819849049","n1819848979","n1819849140","n1819849193","n1819849147","n1819849151","n1819849163","n1819849023","n1819848878","n1819849004","n1819848857","n1819848879","n1819849041","n1819849165","n1819849107","n1819849156","n1819848934","n1819848914","n1819848955","n1819848931","n1819848927","n1819849084","n1819849169","n1819849045","n1819848945","n1819849095","n1819848924","n1819849171","n1819849141","n1819849046","n1819849197","n1819849011","n1819849108","n1819849158","n1819849160","n1819848870","n1819849006","n1819849157","n1819848993","n1819848970","n1819849202","n1819848903","n1819848975","n1819848849","n1819849025","n1819849105","n1819849033","n1819849176","n1819849099","n1819849086","n1819848960","n1819848961","n1819849001","n1819848980","n1819849038","n1819848854","n1819849127","n1819849170","n1819849139","n1819848873","n1819848929","n1819849201","n1819849121","n1819849031","n1819849131","n1819848875","n1819849080","n1819849066","n1819849081","n1819849096","n1819849172","n1819849114","n1819849182","n1819848905","n1819849054","n1819848920","n1819848851","n1819848968","n1819848917","n1819849111","n1819849119","n1819849074","n1819848893","n1819849129","n1819848850","n1819848956","n1819849154","n1819848877","n1819848986","n1819849191","n1819848952","n1819848954","n1819848942","n1819849028","n1819849195","n1819848938","n1819848962","n1819849070","n1819849034","n1819849052","n1819849059","n1819848916","n1819849162","n1819849167","n1819849093","n1819849030","n1819849002","n1819849161","n1819848886","n1819848958","n1819849064","n1819849112","n1819849148","n1819848856","n1819848976","n1819848977","n1819849144","n1819848918","n1819849200","n1819848919","n1819849042","n1819849166","n1819849186","n1819849152","n1819849058","n1819849185","n1819849199","n1819849053","n1819849194","n1819849068","n1819849146","n1819849174","n1819848967","n1819848932","n1819849155","n1819849198","n1819848964","n1819848894","n1819848969","n1819849184","n1819849055","n1819849179","n1819848865","n1819848860","n1819849082","n1819848966","n1819849040","n1819849069","n1819849078","n1819849077","n1819848904","n1819848959","n1819849133","n1819849089","n1819849000","n1819849124","n1819849032","n1819849097","n1819848939","n1819849072","n1819848915","n1819849196","n1819848946","n1819849047","n1819849029","n1819849164","n1819848994","n1819849022","n1819858513","n1819849126","n1819849063","n1819848941","n1819849085","n1819848871","n1819848943","n1819849192","n1819858501","n1819849159","n1819858523","n1819848901","n1819849189","n1819858503","n1819849065","n2139877106","n1819848909","n1819848930","n1819848888"]},"w17967397":{"id":"w17967397","version":"2","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:01Z","tags":{"highway":"residential","name":"North Andrews Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Andrews","tiger:name_direction_prefix":"N","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185964963","n185985217"]},"w17964497":{"id":"w17964497","version":"3","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:48:05Z","tags":{"highway":"tertiary","name":"Constantine St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Constantine","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958643","n185958645","n2139795852","n185958647","n185958649","n185958651","n185958653","n185958656","n185958658","n185958660","n185958662","n185958664","n185958666","n185958668","n185958670","n185948710","n185958672"]},"w203974068":{"id":"w203974068","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"footway"},"nodes":["n2139870422","n2139870423","n2139870424","n2139870425","n2139870426","n2139870427"]},"w203974063":{"id":"w203974063","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139870398","n2139870399","n2139870400","n2139870401","n2139870398"]},"w203986459":{"id":"w203986459","version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{"amenity":"shelter","area":"yes","shelter_type":"picnic_shelter"},"nodes":["n2139989364","n2139989366","n2139989368","n2139989370","n2139989364"]},"w203988286":{"id":"w203988286","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"area":"yes","leisure":"park","name":"Memory Isle Park","website":"http://www.threeriversmi.us/?page_id=53"},"nodes":["n2140006331","n2140006334","n2140006336","n2140006338","n2140006340","n2140006342","n2140006344","n2140006346","n2140006348","n2140006351","n2140006353","n2140006355","n2140006357","n2140006359","n2140006361","n2140006363","n2140006364","n2140006365","n2140006395","n2140006366","n2140006401","n2140006397","n2140006399","n2140006331"]},"w203974073":{"id":"w203974073","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"footway"},"nodes":["n2139870453","n2139870454","n2139870455"]},"w203974064":{"id":"w203974064","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139870402","n2139870403","n2139870404","n2139870405","n2139870402"]},"n185966959":{"id":"n185966959","loc":[-85.642185,41.946411],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:51Z","tags":{}},"n1475283980":{"id":"n1475283980","loc":[-85.6398249,41.9451425],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475284013":{"id":"n1475284013","loc":[-85.6396448,41.9451666],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284042":{"id":"n1475284042","loc":[-85.6386382,41.9454789],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n185975925":{"id":"n185975925","loc":[-85.6393332,41.9452388],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185975919":{"id":"n185975919","loc":[-85.6391279,41.9453044],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185975917":{"id":"n185975917","loc":[-85.6389034,41.9453872],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n2140006369":{"id":"n2140006369","loc":[-85.6386163,41.9451631],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006370":{"id":"n2140006370","loc":[-85.6385144,41.9449357],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006417":{"id":"n2140006417","loc":[-85.6385785,41.9450299],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006419":{"id":"n2140006419","loc":[-85.6385781,41.9452152],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2189123361":{"id":"n2189123361","loc":[-85.6404948,41.947015],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123363":{"id":"n2189123363","loc":[-85.6395765,41.946495],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123365":{"id":"n2189123365","loc":[-85.6389347,41.9460875],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n185966962":{"id":"n185966962","loc":[-85.644417,41.946364],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:51Z","tags":{}},"n185975911":{"id":"n185975911","loc":[-85.637532,41.9458276],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185975913":{"id":"n185975913","loc":[-85.6376323,41.9457936],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185975915":{"id":"n185975915","loc":[-85.6383596,41.9455425],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185975932":{"id":"n185975932","loc":[-85.644403,41.945088],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:13Z","tags":{}},"n185975934":{"id":"n185975934","loc":[-85.645486,41.945084],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:13Z","tags":{}},"n185979974":{"id":"n185979974","loc":[-85.644381,41.943831],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:24Z","tags":{}},"n2139795809":{"id":"n2139795809","loc":[-85.6464756,41.9450813],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795810":{"id":"n2139795810","loc":[-85.6466646,41.945174],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139858952":{"id":"n2139858952","loc":[-85.6383567,41.9454039],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858953":{"id":"n2139858953","loc":[-85.6380506,41.9455301],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858954":{"id":"n2139858954","loc":[-85.6377321,41.9455546],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858955":{"id":"n2139858955","loc":[-85.6376571,41.9455245],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858956":{"id":"n2139858956","loc":[-85.6375859,41.9454544],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858957":{"id":"n2139858957","loc":[-85.6376686,41.9453185],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858958":{"id":"n2139858958","loc":[-85.6378936,41.9451712],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858959":{"id":"n2139858959","loc":[-85.6379225,41.9450825],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858960":{"id":"n2139858960","loc":[-85.6379302,41.9447564],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858961":{"id":"n2139858961","loc":[-85.6379763,41.9446963],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858962":{"id":"n2139858962","loc":[-85.6380436,41.9446706],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858963":{"id":"n2139858963","loc":[-85.6381286,41.9445969],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858965":{"id":"n2139858965","loc":[-85.6382523,41.9444134],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2140006367":{"id":"n2140006367","loc":[-85.6380923,41.9454418],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006368":{"id":"n2140006368","loc":[-85.6384089,41.9453146],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006372":{"id":"n2140006372","loc":[-85.6383252,41.9447706],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006374":{"id":"n2140006374","loc":[-85.6381033,41.9447436],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006376":{"id":"n2140006376","loc":[-85.6379759,41.9447815],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006378":{"id":"n2140006378","loc":[-85.6379832,41.9448654],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006380":{"id":"n2140006380","loc":[-85.6380632,41.9450738],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006382":{"id":"n2140006382","loc":[-85.6380414,41.9452064],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006389":{"id":"n2140006389","loc":[-85.6379068,41.9453092],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006391":{"id":"n2140006391","loc":[-85.637925,41.9453904],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006393":{"id":"n2140006393","loc":[-85.6379977,41.94545],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2189123275":{"id":"n2189123275","loc":[-85.6371346,41.9462544],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123278":{"id":"n2189123278","loc":[-85.6368371,41.9466153],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123280":{"id":"n2189123280","loc":[-85.6379537,41.9489088],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123282":{"id":"n2189123282","loc":[-85.6383816,41.9497858],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123285":{"id":"n2189123285","loc":[-85.6393673,41.9512417],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123287":{"id":"n2189123287","loc":[-85.640554,41.9517766],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123289":{"id":"n2189123289","loc":[-85.6411,41.9522344],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123291":{"id":"n2189123291","loc":[-85.6417418,41.9526574],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123293":{"id":"n2189123293","loc":[-85.642321,41.9529407],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123295":{"id":"n2189123295","loc":[-85.6427697,41.9532278],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123297":{"id":"n2189123297","loc":[-85.6433332,41.9538254],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123300":{"id":"n2189123300","loc":[-85.6435785,41.9543648],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123301":{"id":"n2189123301","loc":[-85.6444394,41.9541048],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123303":{"id":"n2189123303","loc":[-85.6450603,41.954],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123312":{"id":"n2189123312","loc":[-85.6454829,41.9539108],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123314":{"id":"n2189123314","loc":[-85.6460464,41.9538526],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123315":{"id":"n2189123315","loc":[-85.6463178,41.9537167],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123316":{"id":"n2189123316","loc":[-85.646276,41.9534141],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123317":{"id":"n2189123317","loc":[-85.6459995,41.9531541],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123318":{"id":"n2189123318","loc":[-85.645222,41.9531929],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123319":{"id":"n2189123319","loc":[-85.6447316,41.9531813],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123320":{"id":"n2189123320","loc":[-85.6440637,41.9532977],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123321":{"id":"n2189123321","loc":[-85.6438185,41.9531774],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123322":{"id":"n2189123322","loc":[-85.6440011,41.9528398],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123323":{"id":"n2189123323","loc":[-85.6442672,41.9525914],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123324":{"id":"n2189123324","loc":[-85.6442881,41.9523276],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123326":{"id":"n2189123326","loc":[-85.644262,41.952153],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123328":{"id":"n2189123328","loc":[-85.6441681,41.9520404],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123330":{"id":"n2189123330","loc":[-85.6442098,41.9517494],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123333":{"id":"n2189123333","loc":[-85.6438498,41.9515864],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123336":{"id":"n2189123336","loc":[-85.6435889,41.9513225],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123339":{"id":"n2189123339","loc":[-85.6425349,41.9510315],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123342":{"id":"n2189123342","loc":[-85.6422688,41.9508802],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123345":{"id":"n2189123345","loc":[-85.6418775,41.9508142],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123348":{"id":"n2189123348","loc":[-85.6415488,41.9508064],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123351":{"id":"n2189123351","loc":[-85.6411027,41.9505488],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123353":{"id":"n2189123353","loc":[-85.6410374,41.9498208],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123355":{"id":"n2189123355","loc":[-85.6410061,41.9494327],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123357":{"id":"n2189123357","loc":[-85.6411522,41.9482569],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123359":{"id":"n2189123359","loc":[-85.6410548,41.9473036],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123368":{"id":"n2189123368","loc":[-85.6380216,41.9458974],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123370":{"id":"n2189123370","loc":[-85.6386721,41.9507782],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"w17968193":{"id":"w17968193","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:56:35Z","tags":{"highway":"residential","name":"French St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"French","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312389:15312396","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185970906","n185982877","n185967774","n185985823","n185979974"]},"w203972939":{"id":"w203972939","version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:14Z","tags":{"highway":"path"},"nodes":["n2139858965","n2139858966"]},"w203988289":{"id":"w203988289","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"area":"yes","natural":"water"},"nodes":["n2140006367","n2140006368","n2140006419","n2140006369","n2140006417","n2140006370","n2140006372","n2140006374","n2140006376","n2140006378","n2140006380","n2140006382","n2140006389","n2140006391","n2140006393","n2140006367"]},"w208640157":{"id":"w208640157","version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{"area":"yes","natural":"wetland"},"nodes":["n1819849029","n2189123275","n2189123278","n2189123280","n2189123282","n2189123370","n2189123285","n2189123287","n2189123289","n2189123291","n2189123293","n2189123295","n2189123297","n2189123300","n2189123301","n2189123303","n2189123312","n2189123314","n2189123315","n2189123316","n2189123317","n2189123318","n2189123319","n2189123320","n2189123321","n2189123322","n2189123323","n2189123324","n2189123326","n2189123328","n2189123330","n2189123333","n2189123336","n2189123339","n2189123342","n2189123345","n2189123348","n2189123351","n2189123353","n2189123355","n2189123357","n2189123359","n2189123361","n2189123363","n2189123365","n2189123368","n1819849029"]},"w17966281":{"id":"w17966281","version":"3","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:48:03Z","tags":{"highway":"residential","name":"Pealer St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Pealer","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312363:15312366:15312367:15312368:15325990:15325991:15324554","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185975911","n185975913","n185975915","n1475284042","n185975917","n185975919","n185975925","n185970909","n1475284013","n1475283980","n185975928","n185967775","n185975930","n185975932","n185975934","n2139795809","n2139795810"]},"w17965353":{"id":"w17965353","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:36:24Z","tags":{"highway":"residential","name":"Yauney St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Yauney","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312346:15312347","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185966958","n185966959","n185966960","n185966962"]},"w203972938":{"id":"w203972938","version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:14Z","tags":{"highway":"path","name":"Riverwalk Trail"},"nodes":["n2139858964","n2139858965","n2139858963","n2139858962","n2139858961","n2139858960","n2139858959","n2139858958","n2139858957","n2139858956","n2139858955","n2139858954","n2139858953","n2139858952","n2139858951"]},"n354002665":{"id":"n354002665","loc":[-85.6366599,41.9444923],"version":"1","changeset":"698464","user":"iandees","uid":"4732","visible":"true","timestamp":"2009-02-28T21:20:26Z","tags":{"ele":"244","gnis:county_id":"149","gnis:created":"04/14/1980","gnis:feature_id":"1624726","gnis:state_id":"26","name":"Memory Isle","place":"island"}},"n354031301":{"id":"n354031301","loc":[-85.635,41.9463889],"version":"1","changeset":"698464","user":"iandees","uid":"4732","visible":"true","timestamp":"2009-02-28T22:12:53Z","tags":{"amenity":"post_office","ele":"248","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2418163","gnis:state_id":"26","name":"Three Rivers Post Office"}},"n185963454":{"id":"n185963454","loc":[-85.633686,41.946072],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:55Z","tags":{}},"n185963455":{"id":"n185963455","loc":[-85.633815,41.946131],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:55Z","tags":{}},"n185963456":{"id":"n185963456","loc":[-85.633951,41.946174],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:55Z","tags":{}},"n185978375":{"id":"n185978375","loc":[-85.634385,41.94559],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:23Z","tags":{}},"n185978377":{"id":"n185978377","loc":[-85.634544,41.945725],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:23Z","tags":{}},"n185978379":{"id":"n185978379","loc":[-85.634573,41.945764],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:23Z","tags":{}},"n185978381":{"id":"n185978381","loc":[-85.634616,41.945849],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:23Z","tags":{}},"n185978383":{"id":"n185978383","loc":[-85.634629,41.945893],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:24Z","tags":{}},"n185984011":{"id":"n185984011","loc":[-85.636058,41.946201],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:46Z","tags":{}},"n185984013":{"id":"n185984013","loc":[-85.636112,41.946366],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:46Z","tags":{}},"n185984015":{"id":"n185984015","loc":[-85.636143,41.946551],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:46Z","tags":{}},"n185988237":{"id":"n185988237","loc":[-85.6354162,41.946044],"version":"3","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:16Z","tags":{}},"n185988969":{"id":"n185988969","loc":[-85.635374,41.945325],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:16Z","tags":{}},"n185988971":{"id":"n185988971","loc":[-85.635643,41.945585],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:16Z","tags":{}},"n185988972":{"id":"n185988972","loc":[-85.635853,41.94586],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:16Z","tags":{}},"n1475283992":{"id":"n1475283992","loc":[-85.6372968,41.9459007],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475284011":{"id":"n1475284011","loc":[-85.6359415,41.9459797],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284019":{"id":"n1475284019","loc":[-85.6364433,41.9460423],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n185984009":{"id":"n185984009","loc":[-85.6360524,41.9460485],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185988239":{"id":"n185988239","loc":[-85.6358187,41.9460423],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185988243":{"id":"n185988243","loc":[-85.6366156,41.9460282],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185988244":{"id":"n185988244","loc":[-85.6368316,41.9460046],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185988245":{"id":"n185988245","loc":[-85.6370133,41.9459704],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185988241":{"id":"n185988241","loc":[-85.636291,41.9460461],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185964976":{"id":"n185964976","loc":[-85.633923,41.9434157],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185964980":{"id":"n185964980","loc":[-85.6333656,41.9437293],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185978388":{"id":"n185978388","loc":[-85.6346449,41.9460571],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n1819858504":{"id":"n1819858504","loc":[-85.6365343,41.9447926],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858506":{"id":"n1819858506","loc":[-85.6370546,41.9451882],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858516":{"id":"n1819858516","loc":[-85.6358369,41.9444654],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858519":{"id":"n1819858519","loc":[-85.6361534,41.9446176],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858525":{"id":"n1819858525","loc":[-85.6368025,41.9449442],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1819858527":{"id":"n1819858527","loc":[-85.6334199,41.9457495],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n185963452":{"id":"n185963452","loc":[-85.633564,41.9458519],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185963453":{"id":"n185963453","loc":[-85.6336152,41.9459804],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185963451":{"id":"n185963451","loc":[-85.6332888,41.9456871],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n2130304152":{"id":"n2130304152","loc":[-85.6359466,41.9454599],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304153":{"id":"n2130304153","loc":[-85.6362773,41.9452683],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304154":{"id":"n2130304154","loc":[-85.6352028,41.9442868],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304155":{"id":"n2130304155","loc":[-85.6348756,41.9444769],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304156":{"id":"n2130304156","loc":[-85.6349723,41.9444207],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304157":{"id":"n2130304157","loc":[-85.6338698,41.9434443],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304158":{"id":"n2130304158","loc":[-85.635094,41.9451026],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304160":{"id":"n2130304160","loc":[-85.6353716,41.9449322],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304162":{"id":"n2130304162","loc":[-85.6365942,41.9459352],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304163":{"id":"n2130304163","loc":[-85.6369006,41.9457469],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304164":{"id":"n2130304164","loc":[-85.6363292,41.9452278],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304165":{"id":"n2130304165","loc":[-85.6360248,41.9454175],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2139824683":{"id":"n2139824683","loc":[-85.6339825,41.9446441],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:01Z","tags":{}},"n2139824689":{"id":"n2139824689","loc":[-85.6340437,41.9446925],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:01Z","tags":{}},"n2139824702":{"id":"n2139824702","loc":[-85.6340961,41.9447551],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824705":{"id":"n2139824705","loc":[-85.6337467,41.944809],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824707":{"id":"n2139824707","loc":[-85.6341598,41.9448129],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824710":{"id":"n2139824710","loc":[-85.6342771,41.9448223],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824712":{"id":"n2139824712","loc":[-85.6346058,41.944841],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824713":{"id":"n2139824713","loc":[-85.633808,41.9448574],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824714":{"id":"n2139824714","loc":[-85.6340889,41.9448589],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824716":{"id":"n2139824716","loc":[-85.6343335,41.944871],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824717":{"id":"n2139824717","loc":[-85.6343341,41.9448717],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824720":{"id":"n2139824720","loc":[-85.6338757,41.9449069],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824721":{"id":"n2139824721","loc":[-85.6341445,41.9449071],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824724":{"id":"n2139824724","loc":[-85.6334787,41.9449262],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824726":{"id":"n2139824726","loc":[-85.6347119,41.9449332],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824727":{"id":"n2139824727","loc":[-85.6347175,41.9449418],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824728":{"id":"n2139824728","loc":[-85.6344284,41.9449538],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824729":{"id":"n2139824729","loc":[-85.6339339,41.9449573],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824730":{"id":"n2139824730","loc":[-85.6339179,41.9449682],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824732":{"id":"n2139824732","loc":[-85.6335472,41.9449895],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824733":{"id":"n2139824733","loc":[-85.6339736,41.9450164],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824735":{"id":"n2139824735","loc":[-85.6336034,41.9450415],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824736":{"id":"n2139824736","loc":[-85.6348317,41.945043],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824737":{"id":"n2139824737","loc":[-85.63403,41.9450651],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824738":{"id":"n2139824738","loc":[-85.6336611,41.9450949],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824740":{"id":"n2139824740","loc":[-85.6336582,41.9450966],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824744":{"id":"n2139824744","loc":[-85.6331702,41.9451107],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824745":{"id":"n2139824745","loc":[-85.6333388,41.9451142],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824746":{"id":"n2139824746","loc":[-85.6337131,41.9451341],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824747":{"id":"n2139824747","loc":[-85.6337021,41.9451372],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824748":{"id":"n2139824748","loc":[-85.6341244,41.9451472],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824749":{"id":"n2139824749","loc":[-85.6333952,41.945166],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824750":{"id":"n2139824750","loc":[-85.633395,41.9451661],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824751":{"id":"n2139824751","loc":[-85.6346258,41.9451725],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824752":{"id":"n2139824752","loc":[-85.6332387,41.9451741],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824753":{"id":"n2139824753","loc":[-85.6346901,41.9451853],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824754":{"id":"n2139824754","loc":[-85.6346611,41.9452035],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824755":{"id":"n2139824755","loc":[-85.6346574,41.9452059],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824756":{"id":"n2139824756","loc":[-85.6345611,41.9452133],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824757":{"id":"n2139824757","loc":[-85.633453,41.9452194],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824758":{"id":"n2139824758","loc":[-85.6335508,41.9452283],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824759":{"id":"n2139824759","loc":[-85.6347424,41.9452312],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824760":{"id":"n2139824760","loc":[-85.6342305,41.9452395],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824761":{"id":"n2139824761","loc":[-85.6342319,41.9452449],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824762":{"id":"n2139824762","loc":[-85.6334969,41.94526],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824763":{"id":"n2139824763","loc":[-85.63468,41.9452706],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824764":{"id":"n2139824764","loc":[-85.6346772,41.9452724],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824765":{"id":"n2139824765","loc":[-85.6338611,41.9452763],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824766":{"id":"n2139824766","loc":[-85.6347811,41.9452939],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824767":{"id":"n2139824767","loc":[-85.6347375,41.9453211],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824768":{"id":"n2139824768","loc":[-85.6339171,41.9453301],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824769":{"id":"n2139824769","loc":[-85.6348307,41.9453377],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824770":{"id":"n2139824770","loc":[-85.6347067,41.9453405],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824771":{"id":"n2139824771","loc":[-85.6343461,41.9453461],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824772":{"id":"n2139824772","loc":[-85.6343481,41.9453475],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824773":{"id":"n2139824773","loc":[-85.634805,41.9453538],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824774":{"id":"n2139824774","loc":[-85.6336997,41.9453692],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824775":{"id":"n2139824775","loc":[-85.6339709,41.9453818],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824776":{"id":"n2139824776","loc":[-85.6336229,41.9454134],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824777":{"id":"n2139824777","loc":[-85.6349022,41.9454141],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824778":{"id":"n2139824778","loc":[-85.6348854,41.9454246],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824779":{"id":"n2139824779","loc":[-85.6340286,41.9454373],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824780":{"id":"n2139824780","loc":[-85.6336963,41.9454572],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824781":{"id":"n2139824781","loc":[-85.6336789,41.9454672],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824782":{"id":"n2139824782","loc":[-85.6344933,41.945475],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824783":{"id":"n2139824783","loc":[-85.6340854,41.9454918],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824784":{"id":"n2139824784","loc":[-85.6350036,41.9455034],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824785":{"id":"n2139824785","loc":[-85.6337501,41.9455089],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824786":{"id":"n2139824786","loc":[-85.6337497,41.9455091],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824787":{"id":"n2139824787","loc":[-85.6345425,41.9455186],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824788":{"id":"n2139824788","loc":[-85.6341459,41.9455372],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824789":{"id":"n2139824789","loc":[-85.6341376,41.945542],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824790":{"id":"n2139824790","loc":[-85.6338394,41.9455462],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824791":{"id":"n2139824791","loc":[-85.6349171,41.9455588],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824792":{"id":"n2139824792","loc":[-85.6338074,41.9455646],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824793":{"id":"n2139824793","loc":[-85.6346229,41.9455894],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824794":{"id":"n2139824794","loc":[-85.6338983,41.9455995],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824795":{"id":"n2139824795","loc":[-85.6338962,41.9456007],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824796":{"id":"n2139824796","loc":[-85.6342475,41.9456348],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824797":{"id":"n2139824797","loc":[-85.6339505,41.9456497],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824798":{"id":"n2139824798","loc":[-85.6347243,41.9456788],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824799":{"id":"n2139824799","loc":[-85.635057,41.9456831],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824800":{"id":"n2139824800","loc":[-85.635287,41.9457056],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824801":{"id":"n2139824801","loc":[-85.6350753,41.9457068],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824802":{"id":"n2139824802","loc":[-85.6347753,41.9457252],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824803":{"id":"n2139824803","loc":[-85.6340521,41.9457473],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824804":{"id":"n2139824804","loc":[-85.6352875,41.9457611],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824805":{"id":"n2139824805","loc":[-85.6352941,41.9457611],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824806":{"id":"n2139824806","loc":[-85.6350758,41.9457623],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824807":{"id":"n2139824807","loc":[-85.6348194,41.9457638],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824808":{"id":"n2139824808","loc":[-85.635296,41.9459428],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824809":{"id":"n2139824809","loc":[-85.6348212,41.9459455],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139832635":{"id":"n2139832635","loc":[-85.6354612,41.9448791],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832636":{"id":"n2139832636","loc":[-85.6360241,41.9453844],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832637":{"id":"n2139832637","loc":[-85.6361452,41.9453121],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832639":{"id":"n2139832639","loc":[-85.6355997,41.944797],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832641":{"id":"n2139832641","loc":[-85.6351346,41.9443541],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832647":{"id":"n2139832647","loc":[-85.6329883,41.9453692],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832653":{"id":"n2139832653","loc":[-85.6333643,41.9456293],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832663":{"id":"n2139832663","loc":[-85.6335394,41.9455339],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832665":{"id":"n2139832665","loc":[-85.6332375,41.9452476],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832667":{"id":"n2139832667","loc":[-85.6331664,41.9452161],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832669":{"id":"n2139832669","loc":[-85.6331144,41.9451875],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832671":{"id":"n2139832671","loc":[-85.6330779,41.9451274],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832673":{"id":"n2139832673","loc":[-85.6330664,41.9450802],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832678":{"id":"n2139832678","loc":[-85.6332218,41.9453585],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832686":{"id":"n2139832686","loc":[-85.6334246,41.945541],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832691":{"id":"n2139832691","loc":[-85.6329898,41.9454997],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832693":{"id":"n2139832693","loc":[-85.6343554,41.9443274],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832694":{"id":"n2139832694","loc":[-85.6336339,41.9437089],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832696":{"id":"n2139832696","loc":[-85.633532,41.9437708],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832697":{"id":"n2139832697","loc":[-85.6338316,41.9440868],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832698":{"id":"n2139832698","loc":[-85.6342258,41.9444141],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832699":{"id":"n2139832699","loc":[-85.6339164,41.9442166],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832700":{"id":"n2139832700","loc":[-85.6341389,41.944384],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832701":{"id":"n2139832701","loc":[-85.634235,41.9443259],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832702":{"id":"n2139832702","loc":[-85.633613,41.9437875],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832703":{"id":"n2139832703","loc":[-85.633915,41.9436132],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832704":{"id":"n2139832704","loc":[-85.6340019,41.9435613],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832706":{"id":"n2139832706","loc":[-85.6343197,41.9438427],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832708":{"id":"n2139832708","loc":[-85.6342361,41.9438936],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832709":{"id":"n2139832709","loc":[-85.6353839,41.9460401],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832710":{"id":"n2139832710","loc":[-85.6354032,41.9456763],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832711":{"id":"n2139832711","loc":[-85.6356839,41.9459252],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832712":{"id":"n2139832712","loc":[-85.6356109,41.945735],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832713":{"id":"n2139832713","loc":[-85.6353997,41.9457421],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832714":{"id":"n2139832714","loc":[-85.6353895,41.9459347],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832715":{"id":"n2139832715","loc":[-85.6334777,41.9436628],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832716":{"id":"n2139832716","loc":[-85.6333137,41.9435382],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832717":{"id":"n2139832717","loc":[-85.6330938,41.9435406],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832721":{"id":"n2139832721","loc":[-85.6333023,41.9434922],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832722":{"id":"n2139832722","loc":[-85.6330466,41.943623],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832723":{"id":"n2139832723","loc":[-85.6332746,41.9435624],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832724":{"id":"n2139832724","loc":[-85.6333511,41.9435176],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832725":{"id":"n2139832725","loc":[-85.6332241,41.9434001],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832726":{"id":"n2139832726","loc":[-85.6332355,41.9433686],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139870373":{"id":"n2139870373","loc":[-85.6351783,41.9439117],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870374":{"id":"n2139870374","loc":[-85.6351431,41.9439217],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870375":{"id":"n2139870375","loc":[-85.6348853,41.9439117],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870376":{"id":"n2139870376","loc":[-85.6348317,41.9439105],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870377":{"id":"n2139870377","loc":[-85.6346384,41.944007],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870378":{"id":"n2139870378","loc":[-85.6345563,41.9440523],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2140006403":{"id":"n2140006403","loc":[-85.6359942,41.9450097],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006405":{"id":"n2140006405","loc":[-85.6363884,41.9446079],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006407":{"id":"n2140006407","loc":[-85.6362148,41.9447874],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006409":{"id":"n2140006409","loc":[-85.6379476,41.9445869],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006411":{"id":"n2140006411","loc":[-85.6378485,41.9445674],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006413":{"id":"n2140006413","loc":[-85.6378952,41.9444547],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006415":{"id":"n2140006415","loc":[-85.6379962,41.944477],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006421":{"id":"n2140006421","loc":[-85.6355248,41.9433702],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006423":{"id":"n2140006423","loc":[-85.6378471,41.9439233],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006425":{"id":"n2140006425","loc":[-85.6378913,41.9441238],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006426":{"id":"n2140006426","loc":[-85.6381674,41.9442289],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006427":{"id":"n2140006427","loc":[-85.6382359,41.9440975],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006428":{"id":"n2140006428","loc":[-85.6382071,41.9440252],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006429":{"id":"n2140006429","loc":[-85.6381409,41.9439973],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006430":{"id":"n2140006430","loc":[-85.6380569,41.9440153],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006433":{"id":"n2140006433","loc":[-85.6379071,41.9442467],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006435":{"id":"n2140006435","loc":[-85.6381634,41.9443125],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006436":{"id":"n2140006436","loc":[-85.6382407,41.944301],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006438":{"id":"n2140006438","loc":[-85.6382761,41.9442188],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006439":{"id":"n2140006439","loc":[-85.6382429,41.9441761],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006440":{"id":"n2140006440","loc":[-85.6382016,41.9441632],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006441":{"id":"n2140006441","loc":[-85.6378185,41.9439835],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2166205688":{"id":"n2166205688","loc":[-85.6349963,41.9444392],"version":"1","changeset":"15117845","user":"rolandg","uid":"8703","visible":"true","timestamp":"2013-02-21T23:02:38Z","tags":{}},"n2168544780":{"id":"n2168544780","loc":[-85.633944,41.945807],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544781":{"id":"n2168544781","loc":[-85.6340783,41.9458621],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544782":{"id":"n2168544782","loc":[-85.6338184,41.9457548],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544783":{"id":"n2168544783","loc":[-85.6339925,41.9459777],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544784":{"id":"n2168544784","loc":[-85.6337317,41.9458698],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544785":{"id":"n2168544785","loc":[-85.6337297,41.9460042],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544786":{"id":"n2168544786","loc":[-85.633919,41.9460797],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544787":{"id":"n2168544787","loc":[-85.6338672,41.9459263],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544788":{"id":"n2168544788","loc":[-85.6338246,41.9459853],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544789":{"id":"n2168544789","loc":[-85.6337615,41.9459601],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544790":{"id":"n2168544790","loc":[-85.6342079,41.9460399],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544791":{"id":"n2168544791","loc":[-85.6343346,41.9458503],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544792":{"id":"n2168544792","loc":[-85.6343759,41.9458116],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544793":{"id":"n2168544793","loc":[-85.6344394,41.9458109],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544795":{"id":"n2168544795","loc":[-85.6344827,41.945851],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544797":{"id":"n2168544797","loc":[-85.6344807,41.945969],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544798":{"id":"n2168544798","loc":[-85.6344404,41.9459697],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544799":{"id":"n2168544799","loc":[-85.6344413,41.9460333],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544800":{"id":"n2168544800","loc":[-85.6342173,41.9460705],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544801":{"id":"n2168544801","loc":[-85.6342162,41.9460392],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544802":{"id":"n2168544802","loc":[-85.6344251,41.9460351],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544805":{"id":"n2168544805","loc":[-85.6344257,41.9460507],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544807":{"id":"n2168544807","loc":[-85.6344721,41.9460498],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544809":{"id":"n2168544809","loc":[-85.6344754,41.9461427],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544811":{"id":"n2168544811","loc":[-85.6344311,41.9461435],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544813":{"id":"n2168544813","loc":[-85.6344317,41.9461592],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544815":{"id":"n2168544815","loc":[-85.6343708,41.9461604],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544817":{"id":"n2168544817","loc":[-85.6343715,41.9461786],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544819":{"id":"n2168544819","loc":[-85.6343229,41.9461795],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544821":{"id":"n2168544821","loc":[-85.6343222,41.9461606],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544823":{"id":"n2168544823","loc":[-85.6342476,41.9461621],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544825":{"id":"n2168544825","loc":[-85.6342444,41.94607],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544827":{"id":"n2168544827","loc":[-85.634138,41.9461632],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544829":{"id":"n2168544829","loc":[-85.6342016,41.9460703],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544830":{"id":"n2168544830","loc":[-85.6332929,41.9463092],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544831":{"id":"n2168544831","loc":[-85.633122,41.946239],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544832":{"id":"n2168544832","loc":[-85.6332954,41.9460055],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544833":{"id":"n2168544833","loc":[-85.6333954,41.9460466],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544834":{"id":"n2168544834","loc":[-85.6334044,41.9460345],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544835":{"id":"n2168544835","loc":[-85.6334594,41.9460571],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544836":{"id":"n2168544836","loc":[-85.6333871,41.9461544],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544837":{"id":"n2168544837","loc":[-85.633403,41.9461609],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544838":{"id":"n2168544838","loc":[-85.6341683,41.9464167],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544839":{"id":"n2168544839","loc":[-85.6341711,41.9463411],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544840":{"id":"n2168544840","loc":[-85.6344471,41.9463469],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544841":{"id":"n2168544841","loc":[-85.6344441,41.9464243],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544842":{"id":"n2168544842","loc":[-85.6343622,41.9464226],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544843":{"id":"n2168544843","loc":[-85.6343593,41.9464989],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544844":{"id":"n2168544844","loc":[-85.6342812,41.9464973],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544845":{"id":"n2168544845","loc":[-85.634283,41.9464504],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544846":{"id":"n2168544846","loc":[-85.6342609,41.9464499],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544847":{"id":"n2168544847","loc":[-85.6342621,41.9464187],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544848":{"id":"n2168544848","loc":[-85.6348414,41.9463396],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544849":{"id":"n2168544849","loc":[-85.6348387,41.9461872],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544850":{"id":"n2168544850","loc":[-85.6351186,41.9461844],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544851":{"id":"n2168544851","loc":[-85.635119,41.9462112],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544852":{"id":"n2168544852","loc":[-85.6351918,41.9462104],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544853":{"id":"n2168544853","loc":[-85.6351944,41.9463515],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544854":{"id":"n2168544854","loc":[-85.6351049,41.9463524],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544855":{"id":"n2168544855","loc":[-85.6351046,41.946337],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2189153180":{"id":"n2189153180","loc":[-85.6340369,41.9469572],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153181":{"id":"n2189153181","loc":[-85.6342531,41.946953],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153183":{"id":"n2189153183","loc":[-85.6348115,41.9465468],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153184":{"id":"n2189153184","loc":[-85.6348105,41.9464569],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153185":{"id":"n2189153185","loc":[-85.6351431,41.9464549],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153186":{"id":"n2189153186","loc":[-85.6351441,41.9465448],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153187":{"id":"n2189153187","loc":[-85.6350077,41.9465456],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153188":{"id":"n2189153188","loc":[-85.635008,41.9465721],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153189":{"id":"n2189153189","loc":[-85.6348965,41.9465727],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153190":{"id":"n2189153190","loc":[-85.6348962,41.9465463],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153191":{"id":"n2189153191","loc":[-85.6348963,41.9471586],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153192":{"id":"n2189153192","loc":[-85.6348944,41.947032],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153193":{"id":"n2189153193","loc":[-85.6350241,41.947031],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153194":{"id":"n2189153194","loc":[-85.635026,41.9471575],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153195":{"id":"n2189153195","loc":[-85.6352328,41.9471053],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153196":{"id":"n2189153196","loc":[-85.6352359,41.9469906],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153197":{"id":"n2189153197","loc":[-85.6353694,41.9469925],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153198":{"id":"n2189153198","loc":[-85.6353664,41.9471072],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153199":{"id":"n2189153199","loc":[-85.6348241,41.9469287],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153200":{"id":"n2189153200","loc":[-85.6348248,41.9468185],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153201":{"id":"n2189153201","loc":[-85.6351199,41.9468195],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153202":{"id":"n2189153202","loc":[-85.6351192,41.9469298],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153203":{"id":"n2189153203","loc":[-85.6347965,41.9468057],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153204":{"id":"n2189153204","loc":[-85.634792,41.9466044],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153205":{"id":"n2189153205","loc":[-85.6349483,41.9466025],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153206":{"id":"n2189153206","loc":[-85.6349493,41.9466448],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153207":{"id":"n2189153207","loc":[-85.6349753,41.9466445],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153208":{"id":"n2189153208","loc":[-85.6349743,41.9465995],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153209":{"id":"n2189153209","loc":[-85.6351173,41.9465977],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153210":{"id":"n2189153210","loc":[-85.6351219,41.9468015],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153211":{"id":"n2189153211","loc":[-85.6349806,41.9468032],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153212":{"id":"n2189153212","loc":[-85.6349794,41.9467519],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153213":{"id":"n2189153213","loc":[-85.6349521,41.9467523],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153214":{"id":"n2189153214","loc":[-85.6349532,41.9468037],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153215":{"id":"n2189153215","loc":[-85.6346302,41.9468381],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153216":{"id":"n2189153216","loc":[-85.6343028,41.9468449],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153217":{"id":"n2189153217","loc":[-85.6342006,41.9468297],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153218":{"id":"n2189153218","loc":[-85.6336698,41.9465918],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153219":{"id":"n2189153219","loc":[-85.6344663,41.9466639],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153220":{"id":"n2189153220","loc":[-85.6344639,41.9466015],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153221":{"id":"n2189153221","loc":[-85.6342283,41.9466065],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153222":{"id":"n2189153222","loc":[-85.6342303,41.9466587],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153223":{"id":"n2189153223","loc":[-85.6342843,41.9466575],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153224":{"id":"n2189153224","loc":[-85.6342851,41.9466794],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153225":{"id":"n2189153225","loc":[-85.6343475,41.9466781],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153226":{"id":"n2189153226","loc":[-85.634347,41.9466664],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153227":{"id":"n2189153227","loc":[-85.6354428,41.9470148],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153228":{"id":"n2189153228","loc":[-85.6354432,41.9468005],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153229":{"id":"n2189153229","loc":[-85.6360277,41.9468011],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153230":{"id":"n2189153230","loc":[-85.6360273,41.9470154],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153231":{"id":"n2189153231","loc":[-85.6354565,41.9465823],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153232":{"id":"n2189153232","loc":[-85.6354496,41.946218],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153233":{"id":"n2189153233","loc":[-85.6356355,41.9465788],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153234":{"id":"n2189153234","loc":[-85.6357155,41.9468008],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153235":{"id":"n2189153235","loc":[-85.6359539,41.9467969],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153236":{"id":"n2189153236","loc":[-85.6359561,41.9463036],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153237":{"id":"n2189153237","loc":[-85.6360129,41.9464793],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153238":{"id":"n2189153238","loc":[-85.6360152,41.9463898],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153239":{"id":"n2189153239","loc":[-85.6359607,41.9464928],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153240":{"id":"n2189153240","loc":[-85.6356903,41.9462227],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153242":{"id":"n2189153242","loc":[-85.6354163,41.946142],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153243":{"id":"n2189153243","loc":[-85.6357546,41.9462214],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153244":{"id":"n2189153244","loc":[-85.6357937,41.9462542],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153245":{"id":"n2189153245","loc":[-85.6358723,41.9467048],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153246":{"id":"n2189153246","loc":[-85.6361494,41.946757],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153247":{"id":"n2189153247","loc":[-85.6354173,41.9469082],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153248":{"id":"n2189153248","loc":[-85.635443,41.9469079],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153249":{"id":"n2189153249","loc":[-85.6360275,41.9469093],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153250":{"id":"n2189153250","loc":[-85.6361542,41.946915],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153251":{"id":"n2189153251","loc":[-85.6358654,41.9464843],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153252":{"id":"n2189153252","loc":[-85.6359549,41.9467499],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153253":{"id":"n2189153253","loc":[-85.6357172,41.9466335],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153254":{"id":"n2189153254","loc":[-85.6355644,41.9461768],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153255":{"id":"n2189153255","loc":[-85.6355655,41.946528],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153256":{"id":"n2189153256","loc":[-85.6357055,41.9465971],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153257":{"id":"n2189153257","loc":[-85.635869,41.9465971],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153259":{"id":"n2189153259","loc":[-85.6354561,41.9470278],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153260":{"id":"n2189153260","loc":[-85.6357961,41.9470233],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153261":{"id":"n2189153261","loc":[-85.6357977,41.9470907],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153262":{"id":"n2189153262","loc":[-85.6357297,41.9470916],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153263":{"id":"n2189153263","loc":[-85.635733,41.947233],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153264":{"id":"n2189153264","loc":[-85.6362674,41.9468637],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153265":{"id":"n2189153265","loc":[-85.6362646,41.9467047],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153266":{"id":"n2189153266","loc":[-85.6363267,41.9467047],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153267":{"id":"n2189153267","loc":[-85.6362633,41.9465848],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153268":{"id":"n2189153268","loc":[-85.6363805,41.9465468],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153269":{"id":"n2189153269","loc":[-85.6364604,41.9466842],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153270":{"id":"n2189153270","loc":[-85.6364604,41.9468647],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2199109756":{"id":"n2199109756","loc":[-85.6337134,41.9471841],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109757":{"id":"n2199109757","loc":[-85.6336514,41.94716],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109758":{"id":"n2199109758","loc":[-85.6337043,41.9470847],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109759":{"id":"n2199109759","loc":[-85.6335997,41.9470441],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109760":{"id":"n2199109760","loc":[-85.6335064,41.9471771],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n185960195":{"id":"n185960195","loc":[-85.6295992,41.9524346],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185960796":{"id":"n185960796","loc":[-85.634723,41.953681],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:24Z","tags":{}},"n185961396":{"id":"n185961396","loc":[-85.634767,41.959009],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:39Z","tags":{}},"n185962625":{"id":"n185962625","loc":[-85.635175,41.97201],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:29Z","tags":{}},"n185964982":{"id":"n185964982","loc":[-85.632799,41.9440543],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185965289":{"id":"n185965289","loc":[-85.634621,41.947323],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:49Z","tags":{}},"n185965291":{"id":"n185965291","loc":[-85.636166,41.947296],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:49Z","tags":{}},"n185965399":{"id":"n185965399","loc":[-85.634776,41.959834],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:52Z","tags":{}},"n185966937":{"id":"n185966937","loc":[-85.633183,41.947315],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"n185966948":{"id":"n185966948","loc":[-85.626406,41.957188],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"n185967422":{"id":"n185967422","loc":[-85.6320229,41.9490123],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185967917":{"id":"n185967917","loc":[-85.634763,41.958292],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:17Z","tags":{}},"n185967918":{"id":"n185967918","loc":[-85.636271,41.958311],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:17Z","tags":{}},"n185968100":{"id":"n185968100","loc":[-85.630835,41.950656],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185970515":{"id":"n185970515","loc":[-85.634832,41.963866],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:41Z","tags":{}},"n185971578":{"id":"n185971578","loc":[-85.634641,41.948627],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:05Z","tags":{}},"n185971580":{"id":"n185971580","loc":[-85.6361818,41.9486135],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185971631":{"id":"n185971631","loc":[-85.634729,41.954667],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:06Z","tags":{}},"n185971632":{"id":"n185971632","loc":[-85.636236,41.954656],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:06Z","tags":{}},"n185972155":{"id":"n185972155","loc":[-85.623333,41.961987],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185974583":{"id":"n185974583","loc":[-85.634686,41.951158],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:21Z","tags":{}},"n185974585":{"id":"n185974585","loc":[-85.6362059,41.9511457],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185975064":{"id":"n185975064","loc":[-85.636218,41.953667],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:49Z","tags":{}},"n185975735":{"id":"n185975735","loc":[-85.634923,41.969269],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:09Z","tags":{}},"n185978390":{"id":"n185978390","loc":[-85.634668,41.949875],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:24Z","tags":{}},"n185978392":{"id":"n185978392","loc":[-85.634686,41.952415],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:24Z","tags":{}},"n185978394":{"id":"n185978394","loc":[-85.634726,41.955921],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:24Z","tags":{}},"n185978399":{"id":"n185978399","loc":[-85.6347861,41.9606613],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185978402":{"id":"n185978402","loc":[-85.634806,41.961485],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:24Z","tags":{}},"n185978406":{"id":"n185978406","loc":[-85.6348298,41.964783],"version":"3","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:48:00Z","tags":{}},"n185978410":{"id":"n185978410","loc":[-85.6348766,41.9677088],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185978414":{"id":"n185978414","loc":[-85.634938,41.971566],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:25Z","tags":{}},"n185978415":{"id":"n185978415","loc":[-85.634942,41.971611],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:25Z","tags":{}},"n185978417":{"id":"n185978417","loc":[-85.634952,41.971655],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:25Z","tags":{}},"n185978419":{"id":"n185978419","loc":[-85.634989,41.971741],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:25Z","tags":{}},"n185978420":{"id":"n185978420","loc":[-85.635063,41.971864],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:25Z","tags":{}},"n185978787":{"id":"n185978787","loc":[-85.627936,41.954693],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185978790":{"id":"n185978790","loc":[-85.626832,41.954677],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185978967":{"id":"n185978967","loc":[-85.632278,41.948613],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:39Z","tags":{}},"n185980735":{"id":"n185980735","loc":[-85.628639,41.953725],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:47Z","tags":{}},"n185982163":{"id":"n185982163","loc":[-85.636233,41.952398],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:31Z","tags":{}},"n185982193":{"id":"n185982193","loc":[-85.6313855,41.9499125],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185982195":{"id":"n185982195","loc":[-85.6304857,41.9511945],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185982196":{"id":"n185982196","loc":[-85.626336,41.957291],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:32Z","tags":{}},"n185982197":{"id":"n185982197","loc":[-85.625578,41.958664],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:32Z","tags":{}},"n185982198":{"id":"n185982198","loc":[-85.624619,41.960145],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:32Z","tags":{}},"n185982200":{"id":"n185982200","loc":[-85.624494,41.960338],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:32Z","tags":{}},"n185984017":{"id":"n185984017","loc":[-85.636163,41.947382],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:46Z","tags":{}},"n185984020":{"id":"n185984020","loc":[-85.636188,41.9498803],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185984022":{"id":"n185984022","loc":[-85.636276,41.955919],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:47Z","tags":{}},"n185984024":{"id":"n185984024","loc":[-85.636279,41.956901],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:47Z","tags":{}},"n185988036":{"id":"n185988036","loc":[-85.631422,41.948294],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:30Z","tags":{}},"n185988867":{"id":"n185988867","loc":[-85.63102,41.948805],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988869":{"id":"n185988869","loc":[-85.630773,41.949209],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988871":{"id":"n185988871","loc":[-85.63005,41.95016],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988872":{"id":"n185988872","loc":[-85.629423,41.951016],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988873":{"id":"n185988873","loc":[-85.629252,41.951256],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988875":{"id":"n185988875","loc":[-85.629126,41.951489],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988877":{"id":"n185988877","loc":[-85.628991,41.951704],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988878":{"id":"n185988878","loc":[-85.628689,41.952112],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988879":{"id":"n185988879","loc":[-85.628313,41.952666],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988880":{"id":"n185988880","loc":[-85.627687,41.953529],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988882":{"id":"n185988882","loc":[-85.627394,41.953947],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988884":{"id":"n185988884","loc":[-85.627287,41.954128],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:14Z","tags":{}},"n1819858502":{"id":"n1819858502","loc":[-85.6328435,41.9455473],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858510":{"id":"n1819858510","loc":[-85.6324841,41.9453438],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858515":{"id":"n1819858515","loc":[-85.6318511,41.9446409],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858520":{"id":"n1819858520","loc":[-85.6326558,41.9454708],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858522":{"id":"n1819858522","loc":[-85.6319048,41.9447407],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1819858524":{"id":"n1819858524","loc":[-85.6317718,41.9443666],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1819858530":{"id":"n1819858530","loc":[-85.632055,41.9449128],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n2139795768":{"id":"n2139795768","loc":[-85.6243023,41.9606102],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:55Z","tags":{}},"n2139832645":{"id":"n2139832645","loc":[-85.6324455,41.9448607],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832649":{"id":"n2139832649","loc":[-85.6328043,41.9454773],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832651":{"id":"n2139832651","loc":[-85.6322547,41.9449621],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832675":{"id":"n2139832675","loc":[-85.6327356,41.944757],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832677":{"id":"n2139832677","loc":[-85.6325433,41.9448599],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832680":{"id":"n2139832680","loc":[-85.6328885,41.9455614],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832682":{"id":"n2139832682","loc":[-85.6320913,41.9449492],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832684":{"id":"n2139832684","loc":[-85.6325366,41.9447133],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832688":{"id":"n2139832688","loc":[-85.6322786,41.94485],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832718":{"id":"n2139832718","loc":[-85.6327486,41.9432475],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832719":{"id":"n2139832719","loc":[-85.6327926,41.9431773],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832720":{"id":"n2139832720","loc":[-85.6329033,41.943153],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832727":{"id":"n2139832727","loc":[-85.6328975,41.9430783],"version":"2","changeset":"14892929","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:11:47Z","tags":{}},"n2139844839":{"id":"n2139844839","loc":[-85.6326261,41.9432308],"version":"1","changeset":"14892929","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:11:47Z","tags":{}},"n2189015992":{"id":"n2189015992","loc":[-85.6347706,41.9593383],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189153179":{"id":"n2189153179","loc":[-85.6340476,41.9472565],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153182":{"id":"n2189153182","loc":[-85.6342638,41.9472522],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153241":{"id":"n2189153241","loc":[-85.6354184,41.9473091],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153258":{"id":"n2189153258","loc":[-85.6354611,41.9472366],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153277":{"id":"n2189153277","loc":[-85.6328948,41.9462374],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n2199109755":{"id":"n2199109755","loc":[-85.6336729,41.9472417],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"w203970139":{"id":"w203970139","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824793","n2139824787","n2139824773","n2139824778","n2139824793"]},"w203970098":{"id":"w203970098","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824748","n2139824712","n2139824726","n2139824760","n2139824748"]},"w208643132":{"id":"w208643132","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:14Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153195","n2189153196","n2189153197","n2189153198","n2189153195"]},"w203970094":{"id":"w203970094","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824755","n2139824753","n2139824759","n2139824764","n2139824763","n2139824767","n2139824770","n2139824782","n2139824772","n2139824756","n2139824751","n2139824754","n2139824755"]},"w208643138":{"id":"w208643138","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189153231","n2189153232","n2189153240","n2189153244","n2189153236","n2189153238","n2189153237","n2189153239","n2189153252","n2189153235","n2189153234","n2189153253","n2189153233","n2189153231"]},"w203970125":{"id":"w203970125","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824735","n2139824738","n2139824757","n2139824749","n2139824735"]},"w170848823":{"id":"w170848823","version":"2","changeset":"14893390","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:53:39Z","tags":{"name":"Rocky River","source":"Bing","waterway":"river"},"nodes":["n1819849189","n1819858516","n1819858519","n1819858504","n1819858525","n1819858506","n1819858513"]},"w203970898":{"id":"w203970898","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139832645","n2139832647","n2139832649","n2139832651","n2139832645"]},"w203970134":{"id":"w203970134","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824796","n2139824803","n2139824797","n2139824788","n2139824796"]},"w203970104":{"id":"w203970104","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824733","n2139824730","n2139824714","n2139824721","n2139824733"]},"w206805245":{"id":"w206805245","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544780","n2168544781","n2139824796","n2139824803","n2168544780"]},"w206805252":{"id":"w206805252","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544838","n2168544839","n2168544840","n2168544841","n2168544842","n2168544843","n2168544844","n2168544845","n2168544846","n2168544847","n2168544838"]},"w203970099":{"id":"w203970099","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824783","n2139824795","n2139824790","n2139824779","n2139824783"]},"w17967730":{"id":"w17967730","version":"2","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:18Z","tags":{"highway":"residential","name":"Water St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Water","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185963451","n2189153277","n185988036","n185988867","n185988869","n185988871","n185988872","n185988873","n185988875","n185988877","n185988878","n185988879","n185988880","n185988882","n185988884","n185978790"]},"w208643133":{"id":"w208643133","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:14Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153199","n2189153200","n2189153201","n2189153202","n2189153199"]},"w203970127":{"id":"w203970127","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824794","n2139824783","n2139824789","n2139824797","n2139824794"]},"w208643139":{"id":"w208643139","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"highway":"service"},"nodes":["n185988237","n2189153242","n2189153247","n2189153241"]},"w203988297":{"id":"w203988297","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2140006423","n2140006441","n2140006425","n2140006426","n2140006440","n2140006427","n2140006428","n2140006429","n2140006430","n2140006423"]},"w206805250":{"id":"w206805250","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544827","n2168544823","n2168544825","n2168544800","n2168544829","n2168544827"]},"w208643140":{"id":"w208643140","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153242","n2189153254","n2189153243","n2189153244","n2189153251","n2189153257","n2189153245","n2189153252","n2189153246"]},"w203974055":{"id":"w203974055","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"bridge":"yes","highway":"path","name":"Riverwalk Trail"},"nodes":["n2139870376","n2139870377"]},"w206805247":{"id":"w206805247","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544785","n2168544786","n2168544783","n2168544787","n2168544788","n2168544789","n2168544785"]},"w17964996":{"id":"w17964996","version":"3","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:51Z","tags":{"highway":"residential","name":"Foster St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Foster","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312360","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n1819858524","n1819858515","n1819858522","n1819858530","n2139832682","n1819858510","n1819858520","n1819858502","n2139832680","n185963451","n1819858527","n185963452","n185963453","n185963454","n185963455","n185963456"]},"w208643144":{"id":"w208643144","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153264","n2189153265","n2189153266","n2189153267","n2189153268","n2189153269","n2189153270","n2189153264"]},"w203970914":{"id":"w203970914","version":"2","changeset":"14892929","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:11:47Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139832722","n2139832723","n2139832724","n2139832725","n2139832726","n2139832727","n2139844839","n2139832722"]},"w208643143":{"id":"w208643143","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153258","n2189153259","n2189153260","n2189153261","n2189153262","n2189153263","n2189153258"]},"w203049590":{"id":"w203049590","version":"3","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2130304152","n2130304153","n2140006403","n2130304154","n2130304156","n2130304155","n2130304160","n2130304152"]},"w203974054":{"id":"w203974054","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"path","name":"Riverwalk Trail"},"nodes":["n2139858971","n2139870373","n2139870374"]},"w203049595":{"id":"w203049595","version":"2","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:51Z","tags":{"highway":"service"},"nodes":["n2130304158","n2130304159","n2130304160","n2139832635","n2139832639"]},"w203970913":{"id":"w203970913","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:51Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2139832715","n2139832716","n2139832717","n2139832718","n2139832719","n2139832720","n2139832721","n2139832716"]},"w208643134":{"id":"w208643134","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153203","n2189153204","n2189153205","n2189153206","n2189153207","n2189153208","n2189153209","n2189153210","n2189153211","n2189153212","n2189153213","n2189153214","n2189153203"]},"w134150808":{"id":"w134150808","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:53Z","tags":{"bridge":"yes","highway":"residential","name":"Moore St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Moore","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15328392:15312870:15312967","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185988239","n185984009","n185988241","n1475284019"]},"w203970115":{"id":"w203970115","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824761","n2139824727","n2139824736","n2139824771","n2139824761"]},"w208643130":{"id":"w208643130","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:14Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153183","n2189153184","n2189153185","n2189153186","n2189153187","n2189153188","n2189153189","n2189153190","n2189153183"]},"w206805246":{"id":"w206805246","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544782","n2168544780","n2168544781","n2168544783","n2168544787","n2168544784","n2168544782"]},"w203970138":{"id":"w203970138","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824729","n2139824720","n2139824702","n2139824707","n2139824729"]},"w203970133":{"id":"w203970133","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824748","n2139824737","n2139824717","n2139824728","n2139824748"]},"w203970907":{"id":"w203970907","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2139832700","n2139832701","n2139832702"]},"w203974056":{"id":"w203974056","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"path","name":"Riverwalk Trail"},"nodes":["n2139870377","n2139870378"]},"w203970897":{"id":"w203970897","version":"2","changeset":"15117845","user":"rolandg","uid":"8703","visible":"true","timestamp":"2013-02-21T23:02:38Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2130304156","n2166205688","n2139832635","n2139832636","n2139832637","n2139832639","n2139832641","n2166205688"]},"w203974057":{"id":"w203974057","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"path","name":"Riverwalk Trail"},"nodes":["n2139870375","n2139870376"]},"w203049594":{"id":"w203049594","version":"3","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"service"},"nodes":["n2130304156","n2139870378","n2139832706","n2139832704","n2130304157"]},"w203970122":{"id":"w203970122","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824757","n2139824740","n2139824747","n2139824762","n2139824757"]},"w208643136":{"id":"w208643136","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153219","n2189153220","n2189153221","n2189153222","n2189153223","n2189153224","n2189153225","n2189153226","n2189153219"]},"w203970128":{"id":"w203970128","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824732","n2139824752","n2139824744","n2139824724","n2139824732"]},"w203970097":{"id":"w203970097","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824737","n2139824733","n2139824710","n2139824716","n2139824737"]},"w203970137":{"id":"w203970137","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824765","n2139824774","n2139824758","n2139824746","n2139824765"]},"w134150840":{"id":"w134150840","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:56Z","tags":{"highway":"residential","name":"Moore St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Moore","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15328392:15312870:15312967","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n1475284019","n185988243","n185988244","n185988245"]},"w17967628":{"id":"w17967628","version":"3","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:51Z","tags":{"highway":"residential","name":"Moore St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Moore","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15328392:15312870:15312967","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185978388","n2139832709","n185988237","n185988239"]},"w203988292":{"id":"w203988292","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"bridge":"yes","highway":"footway"},"nodes":["n2140006407","n2140006405"]},"w203970118":{"id":"w203970118","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824775","n2139824785","n2139824780","n2139824768","n2139824775"]},"w203970121":{"id":"w203970121","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824768","n2139824781","n2139824776","n2139824765","n2139824768"]},"w17967752":{"id":"w17967752","version":"5","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:00Z","tags":{"highway":"residential","name":"Railroad Drive","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Railroad","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185964980","n2139832699","n2139832700","n2130304158","n185988969","n185988971","n185988972","n1475284011"]},"w203970136":{"id":"w203970136","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824798","n2139824793","n2139824777","n2139824784","n2139824798"]},"w203970142":{"id":"w203970142","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824808","n2139824809","n2139824807","n2139824806","n2139824801","n2139824800","n2139824804","n2139824805","n2139824808"]},"w208643137":{"id":"w208643137","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189153227","n2189153248","n2189153228","n2189153234","n2189153235","n2189153229","n2189153249","n2189153230","n2189153227"]},"w208643129":{"id":"w208643129","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:14Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153179","n2189153180","n2189153181","n2189153182","n2189153179"]},"w203970909":{"id":"w203970909","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139832703","n2139832704","n2139832706","n2139832708","n2139832703"]},"w203970905":{"id":"w203970905","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2139832688","n2139832691"]},"w203988298":{"id":"w203988298","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"highway":"service"},"nodes":["n2140006431","n2140006433","n2140006435","n2140006436","n2140006437","n2140006438","n2140006439","n2140006440"]},"w203970106":{"id":"w203970106","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824798","n2139824791","n2139824799","n2139824802","n2139824798"]},"w203970129":{"id":"w203970129","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824787","n2139824782","n2139824766","n2139824769","n2139824787"]},"w208643131":{"id":"w208643131","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:14Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153191","n2189153192","n2189153193","n2189153194","n2189153191"]},"w206805249":{"id":"w206805249","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544800","n2168544801","n2168544802","n2168544805","n2168544807","n2168544809","n2168544811","n2168544813","n2168544815","n2168544817","n2168544819","n2168544821","n2168544823","n2168544825","n2168544800"]},"w134150800":{"id":"w134150800","version":"3","changeset":"13675000","user":"NE2","uid":"207745","visible":"true","timestamp":"2012-10-29T15:08:54Z","tags":{"bridge":"yes","highway":"primary","name":"W Michigan Ave","old_ref":"US 131","ref":"US 131 Business;M 60","tiger:cfcc":"A21","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_base_2":"US Hwy 131 (Bus)","tiger:name_direction_prefix":"W","tiger:name_type":"Ave","tiger:reviewed":"no"},"nodes":["n185964972","n185964976"]},"w17966984":{"id":"w17966984","version":"4","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:21Z","tags":{"highway":"residential","name":"Portage Avenue","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Portage","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185978375","n185963456","n2189153218","n185966937","n185978967","n185967422","n185982193","n185968100","n185982195","n185960195","n185980735","n185978787","n185966948","n185982196","n185982197","n185982198","n185982200","n2139795768","n185972155"]},"w203988294":{"id":"w203988294","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"amenity":"shelter","area":"yes","building":"yes","shelter_type":"picnic_shelter"},"nodes":["n2140006409","n2140006411","n2140006413","n2140006415","n2140006409"]},"w203970912":{"id":"w203970912","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139832711","n2139832712","n2139832713","n2139832714","n2139832711"]},"w203970119":{"id":"w203970119","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824713","n2139824705","n2139824683","n2139824689","n2139824713"]},"w203970114":{"id":"w203970114","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824735","n2139824750","n2139824745","n2139824732","n2139824735"]},"w208643142":{"id":"w208643142","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153254","n2189153255","n2189153256","n2189153257"]},"w206805253":{"id":"w206805253","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544848","n2168544849","n2168544850","n2168544851","n2168544852","n2168544853","n2168544854","n2168544855","n2168544848"]},"w143497377":{"id":"w143497377","version":"7","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:59Z","tags":{"highway":"primary","name":"North Main Street","old_ref":"US 131","ref":"US 131 Business","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Main","tiger:name_base_1":"US Hwy 131 (Bus)","tiger:name_direction_prefix":"N","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_left_1":"49093","tiger:zip_right":"49093","tiger:zip_right_1":"49093"},"nodes":["n185962625","n185978420","n185978419","n185978417","n185978415","n185978414","n185975735","n1475293254","n185978410","n185978406","n185970515","n185978402","n185978399","n185965399","n2189015992","n185961396","n185967917","n185978394","n185971631","n185960796","n185978392","n185974583","n185978390","n185971578","n185965289","n2189153215","n185978388","n185978383","n185978381","n185978379","n185978377","n185978375","n185964982"]},"w134150811":{"id":"w134150811","version":"6","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:58Z","tags":{"highway":"primary","name":"West Michigan Avenue","old_ref":"US 131","ref":"US 131 Business;M 60","tiger:cfcc":"A21","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_base_2":"US Hwy 131 (Bus)","tiger:name_direction_prefix":"W","tiger:name_type":"Ave","tiger:reviewed":"no"},"nodes":["n185964976","n2130304157","n1475284023","n2139832715","n185964980","n185964982"]},"w208643135":{"id":"w208643135","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153215","n2189153216","n2189153217","n2189153218"]},"w17967183":{"id":"w17967183","version":"4","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:23Z","tags":{"highway":"residential","name":"West Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"West","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n1475284011","n185984011","n185984013","n185984015","n2189153246","n2189153250","n185965291","n185984017","n185971580","n185984020","n185974585","n185982163","n185975064","n185971632","n185984022","n185984024","n185967918"]},"w134150778":{"id":"w134150778","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:48Z","tags":{"bridge":"yes","highway":"residential","name":"Moore St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Moore","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15328392:15312870:15312967","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185988245","n1475283992","n185975911"]},"w206805248":{"id":"w206805248","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544790","n2168544791","n2168544792","n2168544793","n2168544795","n2168544797","n2168544798","n2168544799","n2168544802","n2168544801","n2168544790"]},"w203974058":{"id":"w203974058","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"bridge":"yes","highway":"path","name":"Riverwalk Trail"},"nodes":["n2139870374","n2139870375"]},"w203970902":{"id":"w203970902","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"highway":"service"},"nodes":["n2139832678","n2139832691","n2139832680"]},"w203988296":{"id":"w203988296","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"highway":"path"},"nodes":["n2139858967","n2140006421","n2139858935"]},"w206805251":{"id":"w206805251","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544830","n2168544831","n2168544832","n2168544833","n2168544834","n2168544835","n2168544836","n2168544837","n2168544830"]},"w203970906":{"id":"w203970906","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139832693","n2139832694","n2139832696","n2139832697","n2139832698","n2139832693"]},"w203049598":{"id":"w203049598","version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{"area":"yes","leisure":"pitch","sport":"tennis"},"nodes":["n2130304162","n2130304163","n2130304164","n2130304165","n2130304162"]},"w203970911":{"id":"w203970911","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"highway":"service"},"nodes":["n2139832709","n2139832714","n2139832713","n2139832710","n185988971"]},"w203970105":{"id":"w203970105","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824779","n2139824792","n2139824786","n2139824775","n2139824779"]},"w203988290":{"id":"w203988290","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"highway":"footway"},"nodes":["n2140006403","n2140006407"]},"w203970900":{"id":"w203970900","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139832653","n2139832663","n2139832665","n2139832667","n2139832669","n2139832671","n2139832673","n2139832675","n2139832677","n2139832653"]},"w209717048":{"id":"w209717048","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109755","n2199109756","n2199109757","n2199109758","n2199109759","n2199109760","n2199109755"]},"w208643141":{"id":"w208643141","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153247","n2189153248","n2189153249","n2189153250"]},"w203970903":{"id":"w203970903","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2139832682","n2139832688","n2139832684","n2139832678","n2139832686"]},"n354002527":{"id":"n354002527","loc":[-85.6236039,41.9458813],"version":"1","changeset":"698464","user":"iandees","uid":"4732","visible":"true","timestamp":"2009-02-28T21:20:07Z","tags":{"amenity":"school","ele":"246","gnis:county_id":"149","gnis:created":"04/14/1980","gnis:edited":"02/21/2008","gnis:feature_id":"1624371","gnis:state_id":"26","name":"Barrows School"}},"n185963396":{"id":"n185963396","loc":[-85.627401,41.943496],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:52Z","tags":{}},"n185963397":{"id":"n185963397","loc":[-85.627403,41.943625],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:52Z","tags":{}},"n185965101":{"id":"n185965101","loc":[-85.626409,41.943215],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:44Z","tags":{}},"n185971474":{"id":"n185971474","loc":[-85.624884,41.943508],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:03Z","tags":{}},"n185971475":{"id":"n185971475","loc":[-85.625191,41.943509],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:03Z","tags":{}},"n185971482":{"id":"n185971482","loc":[-85.624882,41.94382],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:03Z","tags":{}},"n185983135":{"id":"n185983135","loc":[-85.624893,41.945616],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:01Z","tags":{}},"n185983137":{"id":"n185983137","loc":[-85.624912,41.946524],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:01Z","tags":{}},"n185988027":{"id":"n185988027","loc":[-85.622721,41.946535],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:30Z","tags":{}},"n185963398":{"id":"n185963398","loc":[-85.6273993,41.9446899],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185983238":{"id":"n185983238","loc":[-85.6227157,41.9456321],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185980374":{"id":"n185980374","loc":[-85.6248856,41.9447242],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185980373":{"id":"n185980373","loc":[-85.6226744,41.9447371],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n2196831342":{"id":"n2196831342","loc":[-85.6250924,41.945063],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831343":{"id":"n2196831343","loc":[-85.6252335,41.9450636],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831344":{"id":"n2196831344","loc":[-85.6252286,41.9448707],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831345":{"id":"n2196831345","loc":[-85.6250661,41.9448707],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831346":{"id":"n2196831346","loc":[-85.6250243,41.9449012],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831347":{"id":"n2196831347","loc":[-85.6250251,41.9449244],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831348":{"id":"n2196831348","loc":[-85.6250867,41.9449257],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831349":{"id":"n2196831349","loc":[-85.625349,41.9445058],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831350":{"id":"n2196831350","loc":[-85.6253471,41.9443882],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831351":{"id":"n2196831351","loc":[-85.6251516,41.94439],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831352":{"id":"n2196831352","loc":[-85.6251522,41.9444308],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831353":{"id":"n2196831353","loc":[-85.6251344,41.9444309],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831354":{"id":"n2196831354","loc":[-85.6251356,41.9445077],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831355":{"id":"n2196831355","loc":[-85.6232357,41.9463406],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831356":{"id":"n2196831356","loc":[-85.6232409,41.9460668],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831357":{"id":"n2196831357","loc":[-85.6232072,41.9460665],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831358":{"id":"n2196831358","loc":[-85.6232117,41.9458272],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831359":{"id":"n2196831359","loc":[-85.6229808,41.9458248],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831360":{"id":"n2196831360","loc":[-85.6229763,41.9460627],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831361":{"id":"n2196831361","loc":[-85.623006,41.946063],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831362":{"id":"n2196831362","loc":[-85.6230023,41.9462557],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831363":{"id":"n2196831363","loc":[-85.6230755,41.9462565],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831364":{"id":"n2196831364","loc":[-85.6230739,41.9463389],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n185947349":{"id":"n185947349","loc":[-85.618327,41.945607],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947359":{"id":"n185947359","loc":[-85.615453,41.945597],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947378":{"id":"n185947378","loc":[-85.617231,41.945603],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:12Z","tags":{}},"n185947474":{"id":"n185947474","loc":[-85.616136,41.945602],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:14Z","tags":{}},"n185948972":{"id":"n185948972","loc":[-85.615273,41.945637],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:02Z","tags":{}},"n185955019":{"id":"n185955019","loc":[-85.620172,41.945627],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:37Z","tags":{}},"n185960682":{"id":"n185960682","loc":[-85.622759,41.951845],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:21Z","tags":{}},"n185961369":{"id":"n185961369","loc":[-85.622758,41.947444],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:38Z","tags":{}},"n185961371":{"id":"n185961371","loc":[-85.624908,41.947416],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:38Z","tags":{}},"n185963392":{"id":"n185963392","loc":[-85.6270462,41.9409953],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185963393":{"id":"n185963393","loc":[-85.627295,41.941304],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:51Z","tags":{}},"n185963394":{"id":"n185963394","loc":[-85.627352,41.94148],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:52Z","tags":{}},"n185963395":{"id":"n185963395","loc":[-85.62737,41.942261],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:52Z","tags":{}},"n185965099":{"id":"n185965099","loc":[-85.6264,41.942263],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:44Z","tags":{}},"n185965108":{"id":"n185965108","loc":[-85.622769,41.949224],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:44Z","tags":{}},"n185965110":{"id":"n185965110","loc":[-85.624937,41.949237],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:44Z","tags":{}},"n185966295":{"id":"n185966295","loc":[-85.6299942,41.9446689],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n185966342":{"id":"n185966342","loc":[-85.624873,41.942022],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185970222":{"id":"n185970222","loc":[-85.622761,41.948357],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:17Z","tags":{}},"n185970224":{"id":"n185970224","loc":[-85.624924,41.9483338],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:05Z","tags":{}},"n185971477":{"id":"n185971477","loc":[-85.620051,41.94383],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:03Z","tags":{}},"n185971478":{"id":"n185971478","loc":[-85.621219,41.943801],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:03Z","tags":{}},"n185971481":{"id":"n185971481","loc":[-85.621812,41.943807],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:03Z","tags":{}},"n185973866":{"id":"n185973866","loc":[-85.627629,41.946498],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:03Z","tags":{}},"n185974699":{"id":"n185974699","loc":[-85.6227688,41.950119],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:05Z","tags":{}},"n185978800":{"id":"n185978800","loc":[-85.623953,41.954684],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185980372":{"id":"n185980372","loc":[-85.621459,41.944756],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:37Z","tags":{}},"n185980378":{"id":"n185980378","loc":[-85.6286375,41.9446764],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185980380":{"id":"n185980380","loc":[-85.630139,41.944661],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980382":{"id":"n185980382","loc":[-85.630298,41.944635],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980384":{"id":"n185980384","loc":[-85.630759,41.94454],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980386":{"id":"n185980386","loc":[-85.6312369,41.9444548],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185983133":{"id":"n185983133","loc":[-85.6248672,41.9415903],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{}},"n185983139":{"id":"n185983139","loc":[-85.624951,41.950239],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:01Z","tags":{}},"n185983140":{"id":"n185983140","loc":[-85.624934,41.950681],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:01Z","tags":{}},"n185983141":{"id":"n185983141","loc":[-85.624813,41.950983],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:02Z","tags":{}},"n185983143":{"id":"n185983143","loc":[-85.6246225,41.951591],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:03Z","tags":{}},"n185983144":{"id":"n185983144","loc":[-85.623908,41.9539165],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:03Z","tags":{}},"n185983145":{"id":"n185983145","loc":[-85.6238903,41.9540956],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:03Z","tags":{}},"n185983146":{"id":"n185983146","loc":[-85.623898,41.95431],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:02Z","tags":{}},"n185983236":{"id":"n185983236","loc":[-85.628481,41.945611],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:05Z","tags":{}},"n185985914":{"id":"n185985914","loc":[-85.620072,41.946538],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185986812":{"id":"n185986812","loc":[-85.6227785,41.9510005],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:05Z","tags":{}},"n185988028":{"id":"n185988028","loc":[-85.6281401,41.9469632],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185988030":{"id":"n185988030","loc":[-85.6282451,41.9470314],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185988032":{"id":"n185988032","loc":[-85.6283312,41.9470656],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"w17964989":{"id":"w17964989","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:33:37Z","tags":{"highway":"residential","name":"Middle St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Middle","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312433:15328741:15312403:15312465","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185963392","n185963393","n185963394","n185963395","n185963396","n185963397","n185963398"]},"w17965158":{"id":"w17965158","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:34:55Z","tags":{"access":"private","highway":"service","name":"Battle St","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Battle","tiger:name_type":"St","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313281","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185965099","n185965101"]},"w41074896":{"id":"w41074896","version":"4","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:58Z","tags":{"highway":"secondary","name":"East Michigan Avenue","name_1":"State Highway 60","ref":"M 60","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_direction_prefix":"E","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980372","n185980373","n185980374","n185963398","n185980378","n185966295","n185980380","n185980382","n185980384","n185980386"]},"w17965846":{"id":"w17965846","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:40:12Z","tags":{"highway":"residential","name":"2nd Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"2nd","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313726","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185971477","n185971478","n185971481","n185971482"]},"w209470306":{"id":"w209470306","version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:41Z","tags":{"area":"yes","building":"yes"},"nodes":["n2196831349","n2196831350","n2196831351","n2196831352","n2196831353","n2196831354","n2196831349"]},"w17965845":{"id":"w17965845","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:40:12Z","tags":{"highway":"residential","name":"2nd Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"2nd","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15335065","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185971474","n185971475","n185963396"]},"w209470307":{"id":"w209470307","version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:41Z","tags":{"area":"yes","building":"yes"},"nodes":["n2196831355","n2196831356","n2196831357","n2196831358","n2196831359","n2196831360","n2196831361","n2196831362","n2196831363","n2196831364","n2196831355"]},"w17968192":{"id":"w17968192","version":"2","changeset":"15473162","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:43:17Z","tags":{"highway":"residential","name":"Washington St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Washington","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980373","n185983238","n185988027","n185961369","n185970222","n185965108","n185974699","n185986812","n185960682"]},"w17967603":{"id":"w17967603","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:23Z","tags":{"highway":"residential","name":"5th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"5th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312324:15312811:15314055:15314056:15313692:15328995:15313188","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185985914","n185988027","n185983137","n185973866","n185988028","n185988030","n185988032"]},"w209470305":{"id":"w209470305","version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:41Z","tags":{"area":"yes","building":"yes"},"nodes":["n2196831342","n2196831343","n2196831344","n2196831345","n2196831346","n2196831347","n2196831348","n2196831342"]},"w17967092":{"id":"w17967092","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:49:18Z","tags":{"highway":"residential","name":"Wood St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Wood","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313653:15313659:15313679:15314060","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185983133","n185966342","n185971474","n185971482","n185980374","n185983135","n185983137","n185961371","n185970224","n185965110","n185983139","n185983140","n185983141","n185983143","n185983144","n185983145","n185983146","n185978800"]},"w17967107":{"id":"w17967107","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:49:23Z","tags":{"highway":"residential","name":"4th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"4th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314053:15314054:15313697:15313698:15313700:15313701:15313699:15314427","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185983236","n185983135","n185983238","n185955019","n185947349","n185947378","n185947474","n185947359","n185948972"]},"n354030330":{"id":"n354030330","loc":[-85.6297222,41.9444444],"version":"1","changeset":"698464","user":"iandees","uid":"4732","visible":"true","timestamp":"2009-02-28T22:10:58Z","tags":{"ele":"243","gnis:county_id":"149","gnis:created":"03/21/2008","gnis:feature_id":"2401246","gnis:state_id":"26","leisure":"park","name":"Scouter Park"}},"n185966296":{"id":"n185966296","loc":[-85.629998,41.944078],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966298":{"id":"n185966298","loc":[-85.629972,41.943927],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966300":{"id":"n185966300","loc":[-85.629948,41.943783],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185980391":{"id":"n185980391","loc":[-85.6322992,41.9442766],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185980393":{"id":"n185980393","loc":[-85.6324925,41.9442136],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185980389":{"id":"n185980389","loc":[-85.6320272,41.9443281],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185980388":{"id":"n185980388","loc":[-85.6315778,41.9443959],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n354031320":{"id":"n354031320","loc":[-85.6280556,41.9447222],"version":"3","changeset":"3908860","user":"Geogast","uid":"51045","visible":"true","timestamp":"2010-02-18T13:28:21Z","tags":{"amenity":"place_of_worship","ele":"245","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417881","gnis:state_id":"26","name":"Riverside Church","religion":"christian"}},"n185987309":{"id":"n185987309","loc":[-85.6286497,41.9453531],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{}},"n185987311":{"id":"n185987311","loc":[-85.6285942,41.9454805],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{}},"n185988034":{"id":"n185988034","loc":[-85.6285815,41.9471692],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185988896":{"id":"n185988896","loc":[-85.6318433,41.9437929],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185977764":{"id":"n185977764","loc":[-85.6322988,41.943472],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n1819848852":{"id":"n1819848852","loc":[-85.6315188,41.9448808],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848912":{"id":"n1819848912","loc":[-85.6284289,41.9472189],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848925":{"id":"n1819848925","loc":[-85.6314501,41.9451617],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848949":{"id":"n1819848949","loc":[-85.6309394,41.9455192],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848951":{"id":"n1819848951","loc":[-85.6290297,41.9457187],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848963":{"id":"n1819848963","loc":[-85.630521,41.9455591],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848981":{"id":"n1819848981","loc":[-85.6292936,41.9455846],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848989":{"id":"n1819848989","loc":[-85.6298451,41.9455431],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848998":{"id":"n1819848998","loc":[-85.6314973,41.9446254],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849018":{"id":"n1819849018","loc":[-85.6302807,41.9455527],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849043":{"id":"n1819849043","loc":[-85.6285533,41.9469731],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849087":{"id":"n1819849087","loc":[-85.6314501,41.9453532],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849090":{"id":"n1819849090","loc":[-85.628843,41.9461033],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849109":{"id":"n1819849109","loc":[-85.6311926,41.9454729],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849116":{"id":"n1819849116","loc":[-85.6288967,41.9459437],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849177":{"id":"n1819849177","loc":[-85.6287894,41.9464544],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819858529":{"id":"n1819858529","loc":[-85.6325485,41.9445625],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n2189112797":{"id":"n2189112797","loc":[-85.6275271,41.944555],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112798":{"id":"n2189112798","loc":[-85.6275196,41.9437258],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112799":{"id":"n2189112799","loc":[-85.6278937,41.943723],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112800":{"id":"n2189112800","loc":[-85.6278969,41.9439191],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112801":{"id":"n2189112801","loc":[-85.6279907,41.9439345],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112802":{"id":"n2189112802","loc":[-85.6280817,41.9439663],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112803":{"id":"n2189112803","loc":[-85.6281768,41.9440145],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112804":{"id":"n2189112804","loc":[-85.6281933,41.9440483],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112805":{"id":"n2189112805","loc":[-85.6281671,41.9440535],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112806":{"id":"n2189112806","loc":[-85.6281933,41.9440935],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112807":{"id":"n2189112807","loc":[-85.6282126,41.9441437],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112808":{"id":"n2189112808","loc":[-85.628214,41.9441991],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112809":{"id":"n2189112809","loc":[-85.6283298,41.944196],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112810":{"id":"n2189112810","loc":[-85.6283285,41.9442616],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112811":{"id":"n2189112811","loc":[-85.6281727,41.9442616],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112812":{"id":"n2189112812","loc":[-85.6281713,41.9442934],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112813":{"id":"n2189112813","loc":[-85.6280386,41.9442963],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112814":{"id":"n2189112814","loc":[-85.6280405,41.9443292],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112815":{"id":"n2189112815","loc":[-85.627829,41.9443349],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112816":{"id":"n2189112816","loc":[-85.6278347,41.9445495],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189153271":{"id":"n2189153271","loc":[-85.6321053,41.9460342],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153272":{"id":"n2189153272","loc":[-85.632278,41.9457841],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153273":{"id":"n2189153273","loc":[-85.632823,41.9459936],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153274":{"id":"n2189153274","loc":[-85.6326845,41.9461963],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153275":{"id":"n2189153275","loc":[-85.6325664,41.9461507],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n2189153276":{"id":"n2189153276","loc":[-85.6325323,41.946198],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n2189153278":{"id":"n2189153278","loc":[-85.6321916,41.9459733],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n2189153279":{"id":"n2189153279","loc":[-85.6322598,41.9458703],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n2189153280":{"id":"n2189153280","loc":[-85.6327208,41.9460358],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n2189153281":{"id":"n2189153281","loc":[-85.6326413,41.9461422],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n185959079":{"id":"n185959079","loc":[-85.6293702,41.9474668],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185966301":{"id":"n185966301","loc":[-85.629692,41.943136],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966304":{"id":"n185966304","loc":[-85.629565,41.942916],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966308":{"id":"n185966308","loc":[-85.629501,41.942751],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966315":{"id":"n185966315","loc":[-85.629472,41.942578],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966319":{"id":"n185966319","loc":[-85.629444,41.942414],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966321":{"id":"n185966321","loc":[-85.629391,41.94205],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966323":{"id":"n185966323","loc":[-85.629369,41.941858],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966327":{"id":"n185966327","loc":[-85.629297,41.941604],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966331":{"id":"n185966331","loc":[-85.629233,41.941549],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966336":{"id":"n185966336","loc":[-85.628504,41.941364],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966338":{"id":"n185966338","loc":[-85.628275,41.941303],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966340":{"id":"n185966340","loc":[-85.6269038,41.9410983],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n185973867":{"id":"n185973867","loc":[-85.626843,41.947333],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:03Z","tags":{}},"n185977762":{"id":"n185977762","loc":[-85.6318441,41.9429453],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n1819848853":{"id":"n1819848853","loc":[-85.625854,41.9492218],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848861":{"id":"n1819848861","loc":[-85.6251459,41.9552376],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848874":{"id":"n1819848874","loc":[-85.6267445,41.9482961],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848882":{"id":"n1819848882","loc":[-85.6257209,41.9552396],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848883":{"id":"n1819848883","loc":[-85.624706,41.9523173],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848907":{"id":"n1819848907","loc":[-85.62609,41.9561471],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848908":{"id":"n1819848908","loc":[-85.6244013,41.9549284],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848911":{"id":"n1819848911","loc":[-85.6265578,41.9553672],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848923":{"id":"n1819848923","loc":[-85.6246802,41.9550959],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848936":{"id":"n1819848936","loc":[-85.6241588,41.9539291],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848940":{"id":"n1819848940","loc":[-85.62506,41.9511129],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848944":{"id":"n1819848944","loc":[-85.624942,41.9515912],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848950":{"id":"n1819848950","loc":[-85.6273989,41.9475461],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848957":{"id":"n1819848957","loc":[-85.627695,41.947404],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819849009":{"id":"n1819849009","loc":[-85.6259248,41.94896],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849037":{"id":"n1819849037","loc":[-85.6257252,41.9502112],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849061":{"id":"n1819849061","loc":[-85.6270084,41.9479626],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849073":{"id":"n1819849073","loc":[-85.6243734,41.9534583],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849091":{"id":"n1819849091","loc":[-85.6241373,41.9543918],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849130":{"id":"n1819849130","loc":[-85.6282572,41.9473067],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849143":{"id":"n1819849143","loc":[-85.625281,41.9506596],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849153":{"id":"n1819849153","loc":[-85.6258647,41.9498043],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849168":{"id":"n1819849168","loc":[-85.6265084,41.9559317],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849173":{"id":"n1819849173","loc":[-85.6263325,41.9552156],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849175":{"id":"n1819849175","loc":[-85.6266372,41.9556764],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849178":{"id":"n1819849178","loc":[-85.6242232,41.9545993],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849181":{"id":"n1819849181","loc":[-85.6262187,41.9486712],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849188":{"id":"n1819849188","loc":[-85.6245558,41.9530434],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849190":{"id":"n1819849190","loc":[-85.6255982,41.9563017],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n2168544738":{"id":"n2168544738","loc":[-85.6245707,41.9529711],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"w208643145":{"id":"w208643145","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189153271","n2189153272","n2189153273","n2189153274","n2189153275","n2189153276","n2189153271"]},"w17967561":{"id":"w17967561","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:21Z","tags":{"highway":"residential","name":"Garden St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Garden","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312361:15322884:15322885","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980378","n185987309","n185987311","n185983236","n185973866"]},"w134150802":{"id":"w134150802","version":"2","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:58Z","tags":{"bridge":"yes","highway":"secondary","name":"East Michigan Avenue","name_1":"State Highway 60","ref":"M 60","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_direction_prefix":"E","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980386","n185980388"]},"w208639462":{"id":"w208639462","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112797","n2189112798","n2189112799","n2189112800","n2189112801","n2189112802","n2189112803","n2189112804","n2189112805","n2189112806","n2189112807","n2189112808","n2189112809","n2189112810","n2189112811","n2189112812","n2189112813","n2189112814","n2189112815","n2189112816","n2189112797"]},"w134150830":{"id":"w134150830","version":"3","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:00Z","tags":{"bridge":"yes","highway":"secondary","name":"South Main Street","old_ref":"US 131","ref":"M 86","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Main","tiger:name_base_1":"State Highway 86","tiger:name_direction_prefix":"S","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185977762","n185977764"]},"w134150801":{"id":"w134150801","version":"3","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:00Z","tags":{"highway":"secondary","name":"South Main Street","old_ref":"US 131","ref":"M 86","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Main","tiger:name_base_1":"State Highway 86","tiger:name_direction_prefix":"S","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185977764","n185964982"]},"w208643146":{"id":"w208643146","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:16Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153277","n2189153281","n2189153278","n2189153279","n2189153280","n2189153281"]},"w17966061":{"id":"w17966061","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:42:00Z","tags":{"highway":"residential","name":"John Glenn Ct","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"John Glenn","tiger:name_type":"Ct","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313190","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185973866","n185973867"]},"w134150772":{"id":"w134150772","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:48Z","tags":{"highway":"residential","name":"5th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"5th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312324:15312811:15314055:15314056:15313692:15328995:15313188","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185988034","n185959079","n185988036","n185978967"]},"w134150836":{"id":"w134150836","version":"3","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:58Z","tags":{"highway":"secondary","name":"East Michigan Avenue","name_1":"State Highway 60","ref":"M 60","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_direction_prefix":"E","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980388","n1819858524","n185980389","n185980391","n185980393","n185964982"]},"w17967734":{"id":"w17967734","version":"3","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:00Z","tags":{"highway":"residential","name":"Water Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Water","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185988896","n185980391","n1819858529"]},"w17965305":{"id":"w17965305","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:35:57Z","tags":{"highway":"residential","name":"River Dr","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"River","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312440:15338837","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185966295","n185966296","n185966298","n185966300","n185966301","n185966304","n185966308","n185966315","n185966319","n185966321","n185966323","n185966327","n185966331","n185966336","n185966338","n185963392","n185966340","n185966342"]},"w134150826":{"id":"w134150826","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:55Z","tags":{"bridge":"yes","highway":"residential","name":"5th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"5th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312324:15312811:15314055:15314056:15313692:15328995:15313188","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185988032","n185988034"]},"w170848330":{"id":"w170848330","version":"3","changeset":"15306846","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-09T19:50:50Z","tags":{"name":"Portage River","source":"Bing","waterway":"river"},"nodes":["n1819849190","n1819848907","n1819849168","n1819849175","n1819848911","n1819849173","n1819848882","n1819848861","n1819848923","n1819848908","n1819849178","n1819849091","n1819848936","n1819849073","n1819849188","n2168544738","n1819848883","n1819848944","n1819848940","n1819849143","n1819849037","n1819849153","n1819848853","n1819849009","n1819849181","n1819848874","n1819849061","n1819848950","n1819848957","n1819849130","n1819848912","n1819849043","n1819849177","n1819849090","n1819849116","n1819848951","n1819848981","n1819848989","n1819849018","n1819848963","n1819848949","n1819849109","n1819849087","n1819848925","n1819848852","n1819848998","n1819849057"]},"r270264":{"id":"r270264","version":"8","changeset":"13611326","user":"migurski","uid":"8287","visible":"true","timestamp":"2012-10-23T23:35:16Z","tags":{"network":"US:MI","ref":"86","route":"road","state_id":"MI","type":"route","url":"http://en.wikipedia.org/wiki/M-86_%28Michigan_highway%29"},"members":[{"id":"w17737723","type":"way","role":""},{"id":"w17735949","type":"way","role":""},{"id":"w17740404","type":"way","role":""},{"id":"w17966273","type":"way","role":""},{"id":"w17964745","type":"way","role":""},{"id":"w151538068","type":"way","role":""},{"id":"w151538067","type":"way","role":""},{"id":"w17964960","type":"way","role":""},{"id":"w17966099","type":"way","role":""},{"id":"w17968009","type":"way","role":""},{"id":"w41259499","type":"way","role":""},{"id":"w151540401","type":"way","role":""},{"id":"w151540418","type":"way","role":""},{"id":"w17967997","type":"way","role":""},{"id":"w17966029","type":"way","role":""},{"id":"w17964801","type":"way","role":""},{"id":"w41259496","type":"way","role":""},{"id":"w151540399","type":"way","role":""},{"id":"w17968004","type":"way","role":""},{"id":"w17966462","type":"way","role":""},{"id":"w134150830","type":"way","role":""},{"id":"w134150801","type":"way","role":""},{"id":"w17732295","type":"way","role":""}]},"n185980093":{"id":"n185980093","loc":[-85.6271414,41.9407274],"version":"4","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185964330":{"id":"n185964330","loc":[-85.6235688,41.9399111],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185964328":{"id":"n185964328","loc":[-85.6235609,41.9391301],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185958034":{"id":"n185958034","loc":[-85.627102,41.939125],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:00Z","tags":{}},"n185964331":{"id":"n185964331","loc":[-85.623571,41.940124],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185964329":{"id":"n185964329","loc":[-85.623562,41.9392411],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185972756":{"id":"n185972756","loc":[-85.623802,41.939102],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:35Z","tags":{}},"n185972757":{"id":"n185972757","loc":[-85.623584,41.93913],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:35Z","tags":{}},"n185975325":{"id":"n185975325","loc":[-85.624835,41.939318],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975326":{"id":"n185975326","loc":[-85.624811,41.939435],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975327":{"id":"n185975327","loc":[-85.624635,41.939703],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975328":{"id":"n185975328","loc":[-85.624366,41.940055],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975330":{"id":"n185975330","loc":[-85.624287,41.940113],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975332":{"id":"n185975332","loc":[-85.624215,41.940134],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185980088":{"id":"n185980088","loc":[-85.627127,41.940086],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185988943":{"id":"n185988943","loc":[-85.622643,41.940128],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:15Z","tags":{}},"n185988961":{"id":"n185988961","loc":[-85.627263,41.940082],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:16Z","tags":{}},"n185990192":{"id":"n185990192","loc":[-85.622933,41.939224],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990194":{"id":"n185990194","loc":[-85.621976,41.939203],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185991378":{"id":"n185991378","loc":[-85.622643,41.940635],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:15:34Z","tags":{}},"n1475283999":{"id":"n1475283999","loc":[-85.6271165,41.9408429],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n185980090":{"id":"n185980090","loc":[-85.6271315,41.9402001],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185958036":{"id":"n185958036","loc":[-85.6248366,41.9391615],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n1819800188":{"id":"n1819800188","loc":[-85.6246947,41.9401644],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800199":{"id":"n1819800199","loc":[-85.6233686,41.9430896],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800204":{"id":"n1819800204","loc":[-85.6223236,41.9408587],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800213":{"id":"n1819800213","loc":[-85.6247526,41.9414138],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800216":{"id":"n1819800216","loc":[-85.6230961,41.9407151],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800218":{"id":"n1819800218","loc":[-85.621991,41.9429336],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800221":{"id":"n1819800221","loc":[-85.6246088,41.9424708],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800227":{"id":"n1819800227","loc":[-85.6241368,41.9403081],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800230":{"id":"n1819800230","loc":[-85.6226776,41.9431012],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800231":{"id":"n1819800231","loc":[-85.6243728,41.9401644],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800232":{"id":"n1819800232","loc":[-85.6249629,41.9408907],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800248":{"id":"n1819800248","loc":[-85.6238685,41.9405555],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800266":{"id":"n1819800266","loc":[-85.6246882,41.9418367],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800271":{"id":"n1819800271","loc":[-85.62492,41.9413695],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800294":{"id":"n1819800294","loc":[-85.6243556,41.9427465],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800304":{"id":"n1819800304","loc":[-85.6251453,41.94117],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800325":{"id":"n1819800325","loc":[-85.6248234,41.9405714],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800362":{"id":"n1819800362","loc":[-85.6239544,41.9429416],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800368":{"id":"n1819800368","loc":[-85.6243406,41.9402283],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800375":{"id":"n1819800375","loc":[-85.6226562,41.940755],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800377":{"id":"n1819800377","loc":[-85.6232033,41.9406512],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n185945133":{"id":"n185945133","loc":[-85.623501,41.933232],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:52:24Z","tags":{}},"n185945135":{"id":"n185945135","loc":[-85.624776,41.933205],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:52:24Z","tags":{}},"n185945395":{"id":"n185945395","loc":[-85.624741,41.93019],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:52:30Z","tags":{}},"n185952239":{"id":"n185952239","loc":[-85.615166,41.9382],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:12Z","tags":{}},"n185954490":{"id":"n185954490","loc":[-85.624721,41.929278],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:27Z","tags":{}},"n185957831":{"id":"n185957831","loc":[-85.625041,41.938662],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:57:55Z","tags":{}},"n185958030":{"id":"n185958030","loc":[-85.629033,41.93913],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:00Z","tags":{}},"n185958032":{"id":"n185958032","loc":[-85.628429,41.939143],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:00Z","tags":{}},"n185958498":{"id":"n185958498","loc":[-85.621605,41.940143],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:27Z","tags":{}},"n185961186":{"id":"n185961186","loc":[-85.624792,41.935214],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:34Z","tags":{}},"n185963099":{"id":"n185963099","loc":[-85.6204461,41.9401485],"version":"3","changeset":"15379124","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:38:37Z","tags":{}},"n185963698":{"id":"n185963698","loc":[-85.6297342,41.9400783],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185964320":{"id":"n185964320","loc":[-85.623511,41.934216],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185964322":{"id":"n185964322","loc":[-85.6235312,41.9362084],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185964324":{"id":"n185964324","loc":[-85.6235488,41.9371726],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185964326":{"id":"n185964326","loc":[-85.6235512,41.9381718],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185967077":{"id":"n185967077","loc":[-85.617359,41.940161],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:54Z","tags":{}},"n185967634":{"id":"n185967634","loc":[-85.6248039,41.9362012],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185970833":{"id":"n185970833","loc":[-85.6248019,41.9381684],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:00Z","tags":{}},"n185972752":{"id":"n185972752","loc":[-85.624582,41.938848],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:35Z","tags":{}},"n185972754":{"id":"n185972754","loc":[-85.6242,41.939008],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:35Z","tags":{}},"n185973251":{"id":"n185973251","loc":[-85.602727,41.936012],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:49Z","tags":{}},"n185974509":{"id":"n185974509","loc":[-85.62478,41.93217],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:19Z","tags":{}},"n185975315":{"id":"n185975315","loc":[-85.624703,41.925597],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:56Z","tags":{}},"n185975316":{"id":"n185975316","loc":[-85.624716,41.927359],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975317":{"id":"n185975317","loc":[-85.62475,41.93119],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975318":{"id":"n185975318","loc":[-85.624782,41.934218],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975320":{"id":"n185975320","loc":[-85.6247949,41.9371708],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:58Z","tags":{}},"n185977754":{"id":"n185977754","loc":[-85.6276,41.937412],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185980075":{"id":"n185980075","loc":[-85.627451,41.937549],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185980077":{"id":"n185980077","loc":[-85.627375,41.937618],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185980078":{"id":"n185980078","loc":[-85.627278,41.937728],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185980079":{"id":"n185980079","loc":[-85.627199,41.937842],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185980081":{"id":"n185980081","loc":[-85.627141,41.937981],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185980083":{"id":"n185980083","loc":[-85.627109,41.938153],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185980085":{"id":"n185980085","loc":[-85.627101,41.938699],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185981173":{"id":"n185981173","loc":[-85.61433,41.940167],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:02Z","tags":{}},"n185987021":{"id":"n185987021","loc":[-85.628311,41.942261],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:07Z","tags":{}},"n185988963":{"id":"n185988963","loc":[-85.628439,41.940086],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:16Z","tags":{}},"n185990195":{"id":"n185990195","loc":[-85.621225,41.939143],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990196":{"id":"n185990196","loc":[-85.620576,41.939033],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990198":{"id":"n185990198","loc":[-85.619081,41.938804],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990200":{"id":"n185990200","loc":[-85.617593,41.938552],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990202":{"id":"n185990202","loc":[-85.617372,41.938535],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990204":{"id":"n185990204","loc":[-85.616087,41.93832],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990206":{"id":"n185990206","loc":[-85.615754,41.938289],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:57Z","tags":{}},"n185990209":{"id":"n185990209","loc":[-85.615438,41.938251],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:57Z","tags":{}},"n185990211":{"id":"n185990211","loc":[-85.613469,41.937867],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:57Z","tags":{}},"n185990212":{"id":"n185990212","loc":[-85.610172,41.937298],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:57Z","tags":{}},"n185990213":{"id":"n185990213","loc":[-85.605537,41.936497],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:57Z","tags":{}},"n185990214":{"id":"n185990214","loc":[-85.604014,41.936234],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:57Z","tags":{}},"n1819800180":{"id":"n1819800180","loc":[-85.588775,41.9455032],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800181":{"id":"n1819800181","loc":[-85.6074212,41.9408827],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800182":{"id":"n1819800182","loc":[-85.6131397,41.9427022],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800183":{"id":"n1819800183","loc":[-85.6171523,41.9416807],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800184":{"id":"n1819800184","loc":[-85.602465,41.9397415],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800185":{"id":"n1819800185","loc":[-85.6109296,41.9410583],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800186":{"id":"n1819800186","loc":[-85.6165729,41.9418004],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800189":{"id":"n1819800189","loc":[-85.5866293,41.9458224],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800191":{"id":"n1819800191","loc":[-85.5853311,41.9466603],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800201":{"id":"n1819800201","loc":[-85.6101142,41.9433406],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800202":{"id":"n1819800202","loc":[-85.600963,41.9428618],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800206":{"id":"n1819800206","loc":[-85.6154357,41.9427501],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800207":{"id":"n1819800207","loc":[-85.6040309,41.9414094],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800209":{"id":"n1819800209","loc":[-85.6113694,41.943189],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800211":{"id":"n1819800211","loc":[-85.618032,41.9416408],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800214":{"id":"n1819800214","loc":[-85.5959419,41.9402602],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800219":{"id":"n1819800219","loc":[-85.5972117,41.9420043],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800223":{"id":"n1819800223","loc":[-85.6117171,41.9430019],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800224":{"id":"n1819800224","loc":[-85.5977873,41.9395579],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800226":{"id":"n1819800226","loc":[-85.5917362,41.9432209],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800228":{"id":"n1819800228","loc":[-85.6055759,41.9419122],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800229":{"id":"n1819800229","loc":[-85.6203395,41.9425595],"version":"2","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n1819800233":{"id":"n1819800233","loc":[-85.6107579,41.9433007],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800234":{"id":"n1819800234","loc":[-85.6039773,41.9412498],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800235":{"id":"n1819800235","loc":[-85.6000977,41.9412861],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800236":{"id":"n1819800236","loc":[-85.6026689,41.9407231],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800237":{"id":"n1819800237","loc":[-85.615161,41.9428662],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800238":{"id":"n1819800238","loc":[-85.5878953,41.9454314],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800239":{"id":"n1819800239","loc":[-85.6035267,41.941569],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800240":{"id":"n1819800240","loc":[-85.5929738,41.9450208],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800241":{"id":"n1819800241","loc":[-85.6186329,41.9416488],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800242":{"id":"n1819800242","loc":[-85.5881136,41.9483963],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800243":{"id":"n1819800243","loc":[-85.5909208,41.9466922],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800244":{"id":"n1819800244","loc":[-85.5997721,41.9394941],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800245":{"id":"n1819800245","loc":[-85.6202064,41.9425712],"version":"2","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n1819800246":{"id":"n1819800246","loc":[-85.591071,41.9448808],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800247":{"id":"n1819800247","loc":[-85.5866078,41.9490622],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800250":{"id":"n1819800250","loc":[-85.602383,41.9420841],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800251":{"id":"n1819800251","loc":[-85.5957418,41.9426906],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800255":{"id":"n1819800255","loc":[-85.6157039,41.9416727],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800256":{"id":"n1819800256","loc":[-85.6080328,41.9410982],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800258":{"id":"n1819800258","loc":[-85.6192551,41.9414892],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800260":{"id":"n1819800260","loc":[-85.6104253,41.94117],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800261":{"id":"n1819800261","loc":[-85.6204503,41.9425709],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800263":{"id":"n1819800263","loc":[-85.5872194,41.9455431],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800264":{"id":"n1819800264","loc":[-85.616176,41.9418244],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800268":{"id":"n1819800268","loc":[-85.6120883,41.9426703],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800269":{"id":"n1819800269","loc":[-85.5894547,41.9474946],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800272":{"id":"n1819800272","loc":[-85.6209181,41.9425027],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800274":{"id":"n1819800274","loc":[-85.6122814,41.9412817],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800276":{"id":"n1819800276","loc":[-85.5895153,41.9452798],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800277":{"id":"n1819800277","loc":[-85.5884317,41.9455272],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800279":{"id":"n1819800279","loc":[-85.5884103,41.9480966],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800287":{"id":"n1819800287","loc":[-85.5904917,41.9453915],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800288":{"id":"n1819800288","loc":[-85.6212292,41.9412977],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800289":{"id":"n1819800289","loc":[-85.5954377,41.9406832],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800290":{"id":"n1819800290","loc":[-85.593721,41.9420957],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800291":{"id":"n1819800291","loc":[-85.6162832,41.9427102],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800292":{"id":"n1819800292","loc":[-85.605018,41.9401804],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800293":{"id":"n1819800293","loc":[-85.6086443,41.941146],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800296":{"id":"n1819800296","loc":[-85.6204675,41.9413775],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800297":{"id":"n1819800297","loc":[-85.612496,41.9424947],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800299":{"id":"n1819800299","loc":[-85.6065629,41.9423431],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800301":{"id":"n1819800301","loc":[-85.6036125,41.9398452],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800303":{"id":"n1819800303","loc":[-85.6114767,41.94117],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800306":{"id":"n1819800306","loc":[-85.592616,41.9428139],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800308":{"id":"n1819800308","loc":[-85.6023041,41.9419521],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800310":{"id":"n1819800310","loc":[-85.6218944,41.9411061],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800311":{"id":"n1819800311","loc":[-85.6097816,41.941162],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800312":{"id":"n1819800312","loc":[-85.5922549,41.9457869],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800313":{"id":"n1819800313","loc":[-85.5986027,41.9417206],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800314":{"id":"n1819800314","loc":[-85.5918687,41.946138],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800315":{"id":"n1819800315","loc":[-85.5872875,41.948883],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800316":{"id":"n1819800316","loc":[-85.594272,41.9436642],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800317":{"id":"n1819800317","loc":[-85.6176351,41.941577],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800318":{"id":"n1819800318","loc":[-85.6137834,41.9430853],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800319":{"id":"n1819800319","loc":[-85.6195383,41.942622],"version":"2","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{"leisure":"slipway"}},"n1819800320":{"id":"n1819800320","loc":[-85.5971006,41.9398053],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800321":{"id":"n1819800321","loc":[-85.601714,41.9406752],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800322":{"id":"n1819800322","loc":[-85.5908028,41.9453117],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800323":{"id":"n1819800323","loc":[-85.6062732,41.9404597],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800324":{"id":"n1819800324","loc":[-85.62124,41.9425905],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800327":{"id":"n1819800327","loc":[-85.6008664,41.942766],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800328":{"id":"n1819800328","loc":[-85.6179355,41.9428538],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800330":{"id":"n1819800330","loc":[-85.6045566,41.9415131],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800331":{"id":"n1819800331","loc":[-85.5944935,41.9414653],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800333":{"id":"n1819800333","loc":[-85.6088911,41.943181],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800334":{"id":"n1819800334","loc":[-85.5946367,41.943369],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800336":{"id":"n1819800336","loc":[-85.6150494,41.9429656],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800343":{"id":"n1819800343","loc":[-85.6096099,41.9433326],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800345":{"id":"n1819800345","loc":[-85.5915216,41.9435401],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800347":{"id":"n1819800347","loc":[-85.607786,41.9428698],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800349":{"id":"n1819800349","loc":[-85.6187616,41.9426623],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800350":{"id":"n1819800350","loc":[-85.6012527,41.9426064],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800352":{"id":"n1819800352","loc":[-85.6214867,41.9428379],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800354":{"id":"n1819800354","loc":[-85.61338,41.94293],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800355":{"id":"n1819800355","loc":[-85.5923156,41.9428139],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800357":{"id":"n1819800357","loc":[-85.5901591,41.9453197],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800359":{"id":"n1819800359","loc":[-85.6033979,41.9408827],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800360":{"id":"n1819800360","loc":[-85.6186543,41.9414653],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800363":{"id":"n1819800363","loc":[-85.6128607,41.9425665],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800365":{"id":"n1819800365","loc":[-85.614234,41.9412977],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800367":{"id":"n1819800367","loc":[-85.6089662,41.9410902],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800369":{"id":"n1819800369","loc":[-85.6197379,41.9413695],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800370":{"id":"n1819800370","loc":[-85.6037348,41.941733],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800371":{"id":"n1819800371","loc":[-85.5993467,41.9415654],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800372":{"id":"n1819800372","loc":[-85.598077,41.94196],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800373":{"id":"n1819800373","loc":[-85.5984203,41.9394781],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800374":{"id":"n1819800374","loc":[-85.6013315,41.9427066],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800376":{"id":"n1819800376","loc":[-85.5934673,41.944167],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800378":{"id":"n1819800378","loc":[-85.6011062,41.9407753],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800379":{"id":"n1819800379","loc":[-85.6150602,41.9415131],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800380":{"id":"n1819800380","loc":[-85.6132148,41.9412338],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800381":{"id":"n1819800381","loc":[-85.5889038,41.9453835],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n2139966621":{"id":"n2139966621","loc":[-85.6198719,41.9426184],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:17Z","tags":{}},"n2139966622":{"id":"n2139966622","loc":[-85.6197551,41.9426123],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:17Z","tags":{}},"n2139966623":{"id":"n2139966623","loc":[-85.6196467,41.9426279],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n2139966624":{"id":"n2139966624","loc":[-85.6191519,41.9426221],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n2139966625":{"id":"n2139966625","loc":[-85.6194153,41.9426256],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n2139966626":{"id":"n2139966626","loc":[-85.6200497,41.9425812],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n2139966629":{"id":"n2139966629","loc":[-85.6192123,41.9426229],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n2203933101":{"id":"n2203933101","loc":[-85.6030009,41.9360592],"version":"1","changeset":"15379124","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:38:36Z","tags":{}},"w17967539":{"id":"w17967539","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:52:28Z","tags":{"highway":"residential","name":"1st Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"1st","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15335113:15313280","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185965099","n185963395","n185987021"]},"w17967751":{"id":"w17967751","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:55:03Z","tags":{"highway":"residential","name":"River St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"River","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312481:15312487","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980088","n185988961","n185988963","n185963698"]},"w17965088":{"id":"w17965088","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:34:20Z","tags":{"highway":"residential","name":"9th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"9th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314207:15313759:15313772:15313802:15313796:15313781:15314179","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185945133","n185964320","n185964322","n185964324","n185964326","n185964328","n185964329","n185964330","n185964331"]},"w17964467":{"id":"w17964467","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:29:37Z","tags":{"highway":"residential","name":"Mechanic St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Mechanic","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312501:15312497:15335073","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958030","n185958032","n185958034","n185958036"]},"w134150842":{"id":"w134150842","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:56Z","tags":{"bridge":"yes","highway":"residential","name":"6th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"6th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312892:15312519","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185980090","n185980093"]},"w17966740":{"id":"w17966740","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:07Z","tags":{"highway":"residential","name":"6th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"6th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312892:15312519","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185977754","n185980075","n185980077","n185980078","n185980079","n185980081","n185980083","n185980085","n185958034","n185980088","n185980090"]},"w170844765":{"id":"w170844765","version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{"waterway":"dam"},"nodes":["n1819800304","n1819800232","n1819800325","n1819800188"]},"w17967745":{"id":"w17967745","version":"2","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:21Z","tags":{"highway":"residential","name":"River St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"River","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185981173","n185967077","n185963099","n185958498","n185988943","n185964331","n185975332"]},"w17968113":{"id":"w17968113","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:56:09Z","tags":{"highway":"residential","name":"Green St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Green","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314409","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185988943","n185991378"]},"w134150833":{"id":"w134150833","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:55Z","tags":{"highway":"residential","name":"6th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"6th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312892:15312519","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185980093","n1475283999","n185963392"]},"w17967935":{"id":"w17967935","version":"3","changeset":"15379124","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:38:37Z","tags":{"name":"Michigan Central Railroad","railway":"abandoned","tiger:cfcc":"B11","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan Central Railroad","tiger:reviewed":"no"},"nodes":["n185972757","n185990192","n185990194","n185990195","n185990196","n185990198","n185990200","n185990202","n185990204","n185990206","n185990209","n185952239","n185990211","n185990212","n185990213","n185990214","n2203933101","n185973251"]},"w17965993":{"id":"w17965993","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:19Z","tags":{"name":"Conrail Railroad","railway":"abandoned","tiger:cfcc":"B11","tiger:county":"St. Joseph, MI","tiger:name_base":"Conrail Railroad","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314180:15314177","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185957831","n185972752","n185972754","n185972756","n185972757"]},"w17966211":{"id":"w17966211","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:07Z","tags":{"highway":"residential","name":"8th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"8th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313757:15313771:15313791:15313794:15313799:15313811:15313814:15313824:15313846:15314618:15313817:15313788:15314178:15324590","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185975315","n185975316","n185954490","n185945395","n185975317","n185974509","n185945135","n185975318","n185961186","n185967634","n185975320","n185970833","n185958036","n185975325","n185975326","n185975327","n185975328","n185975330","n185975332"]},"w170844766":{"id":"w170844766","version":"2","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{"source":"Bing","waterway":"riverbank"},"nodes":["n1819800229","n1819800245","n2139966626","n2139966621","n2139966622","n2139966623","n1819800319","n2139966625","n2139966629","n2139966624","n1819800349","n1819800328","n1819800291","n1819800206","n1819800237","n1819800336","n1819800318","n1819800354","n1819800182","n1819800363","n1819800297","n1819800268","n1819800223","n1819800209","n1819800233","n1819800201","n1819800343","n1819800333","n1819800347","n1819800299","n1819800228","n1819800330","n1819800370","n1819800250","n1819800374","n1819800202","n1819800327","n1819800350","n1819800308","n1819800239","n1819800207","n1819800234","n1819800359","n1819800236","n1819800321","n1819800378","n1819800235","n1819800371","n1819800313","n1819800372","n1819800219","n1819800251","n1819800334","n1819800316","n1819800376","n1819800240","n1819800312","n1819800314","n1819800243","n1819800269","n1819800279","n1819800242","n1819800315","n1819800247","n1819800191","n1819800189","n1819800263","n1819800238","n1819800277","n1819800180","n1819800381","n1819800276","n1819800357","n1819800287","n1819800322","n1819800246","n1819800345","n1819800226","n1819800355","n1819800306","n1819800290","n1819800331","n1819800289","n1819800214","n1819800320","n1819800224","n1819800373","n1819800244","n1819800184","n1819800301","n1819800292","n1819800323","n1819800181","n1819800256","n1819800293","n1819800367","n1819800311","n1819800260","n1819800185","n1819800303","n1819800274","n1819800380","n1819800365","n1819800379","n1819800255","n1819800264","n1819800186","n1819800183","n1819800317","n1819800211","n1819800241","n1819800360","n1819800258","n1819800369","n1819800296","n1819800288","n1819800310","n1819800204","n1819800375","n1819800216","n1819800377","n1819800248","n1819800227","n1819800368","n1819800231","n1819800188","n1819800325","n1819800232","n1819800304","n1819800271","n1819800213","n1819800266","n1819800221","n1819800294","n1819800362","n1819800199","n1819800230","n1819800218","n1819800352","n1819800324","n1819800272","n1819800261","n1819800229"]},"n1875654132":{"id":"n1875654132","loc":[-85.6297439,41.939808],"version":"1","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:36Z","tags":{}},"n1475293263":{"id":"n1475293263","loc":[-85.6296235,41.939922],"version":"2","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:02Z","tags":{}},"n185947850":{"id":"n185947850","loc":[-85.631594,41.942613],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:22Z","tags":{}},"n185952745":{"id":"n185952745","loc":[-85.630986,41.941786],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:25Z","tags":{}},"n185972907":{"id":"n185972907","loc":[-85.631797,41.9420055],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185972911":{"id":"n185972911","loc":[-85.6309723,41.9411623],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185972915":{"id":"n185972915","loc":[-85.6295971,41.939267],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n1475293223":{"id":"n1475293223","loc":[-85.6313962,41.9416114],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:50Z","tags":{"railway":"level_crossing"}},"n1475293231":{"id":"n1475293231","loc":[-85.6318779,41.9415447],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:50Z","tags":{}},"n1475293241":{"id":"n1475293241","loc":[-85.6304613,41.9405499],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293246":{"id":"n1475293246","loc":[-85.6297512,41.9395393],"version":"2","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:02Z","tags":{"railway":"level_crossing"}},"n1475293251":{"id":"n1475293251","loc":[-85.6316633,41.9415128],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n2139982404":{"id":"n2139982404","loc":[-85.6313283,41.9413748],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982407":{"id":"n2139982407","loc":[-85.6325545,41.9417787],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982408":{"id":"n2139982408","loc":[-85.6324499,41.9417693],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982409":{"id":"n2139982409","loc":[-85.6324753,41.9416444],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982410":{"id":"n2139982410","loc":[-85.6325814,41.9416538],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982411":{"id":"n2139982411","loc":[-85.6319572,41.9413515],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982412":{"id":"n2139982412","loc":[-85.6322925,41.941139],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982413":{"id":"n2139982413","loc":[-85.6323153,41.941153],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982414":{"id":"n2139982414","loc":[-85.6323019,41.9412617],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982415":{"id":"n2139982415","loc":[-85.6323703,41.9412667],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982416":{"id":"n2139982416","loc":[-85.6323555,41.941538],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982417":{"id":"n2139982417","loc":[-85.6321343,41.9416777],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982418":{"id":"n2139982418","loc":[-85.6319425,41.9416866],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982419":{"id":"n2139982419","loc":[-85.6320303,41.9416941],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982420":{"id":"n2139982420","loc":[-85.6321665,41.9415554],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982421":{"id":"n2139982421","loc":[-85.632412,41.9414164],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982422":{"id":"n2139982422","loc":[-85.6324801,41.9413421],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982423":{"id":"n2139982423","loc":[-85.6325023,41.9412585],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982424":{"id":"n2139982424","loc":[-85.6324532,41.9411607],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982425":{"id":"n2139982425","loc":[-85.6323502,41.941103],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982426":{"id":"n2139982426","loc":[-85.6322362,41.9411183],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982427":{"id":"n2139982427","loc":[-85.6318941,41.9413551],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982428":{"id":"n2139982428","loc":[-85.6318592,41.9414105],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982429":{"id":"n2139982429","loc":[-85.6320111,41.9415866],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982430":{"id":"n2139982430","loc":[-85.632446,41.9413792],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982431":{"id":"n2139982431","loc":[-85.6325112,41.941416],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982432":{"id":"n2139982432","loc":[-85.6325449,41.9416345],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982433":{"id":"n2139982433","loc":[-85.6326122,41.94164],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982434":{"id":"n2139982434","loc":[-85.6325954,41.9421966],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982435":{"id":"n2139982435","loc":[-85.6325655,41.9422411],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982436":{"id":"n2139982436","loc":[-85.632515,41.9422564],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982437":{"id":"n2139982437","loc":[-85.6324495,41.94223],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982438":{"id":"n2139982438","loc":[-85.6324009,41.9421743],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982439":{"id":"n2139982439","loc":[-85.6323915,41.9421145],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982440":{"id":"n2139982440","loc":[-85.6320287,41.9418585],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982441":{"id":"n2139982441","loc":[-85.6318285,41.9416387],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n1475293258":{"id":"n1475293258","loc":[-85.6318289,41.9415077],"version":"2","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{}},"n2168544754":{"id":"n2168544754","loc":[-85.6312814,41.9431198],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544755":{"id":"n2168544755","loc":[-85.6314212,41.9430646],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544756":{"id":"n2168544756","loc":[-85.6313387,41.942949],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544757":{"id":"n2168544757","loc":[-85.6311989,41.9430041],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544758":{"id":"n2168544758","loc":[-85.6311024,41.9429313],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544759":{"id":"n2168544759","loc":[-85.6310087,41.9428087],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544760":{"id":"n2168544760","loc":[-85.6313831,41.9426504],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544761":{"id":"n2168544761","loc":[-85.6314768,41.9427729],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544762":{"id":"n2168544762","loc":[-85.6306376,41.942809],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544763":{"id":"n2168544763","loc":[-85.6307378,41.9429427],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544764":{"id":"n2168544764","loc":[-85.630841,41.9428998],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544765":{"id":"n2168544765","loc":[-85.6307408,41.9427662],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544766":{"id":"n2168544766","loc":[-85.6305404,41.9426029],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544767":{"id":"n2168544767","loc":[-85.6304976,41.9426194],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544768":{"id":"n2168544768","loc":[-85.6305673,41.9427184],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544769":{"id":"n2168544769","loc":[-85.6306164,41.9426984],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544770":{"id":"n2168544770","loc":[-85.6306418,41.9427302],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544771":{"id":"n2168544771","loc":[-85.6306861,41.9427137],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544772":{"id":"n2168544772","loc":[-85.6307146,41.9427537],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544773":{"id":"n2168544773","loc":[-85.6308999,41.9426807],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544774":{"id":"n2168544774","loc":[-85.6308429,41.9426053],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544775":{"id":"n2168544775","loc":[-85.6308999,41.9425806],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544776":{"id":"n2168544776","loc":[-85.6308318,41.9424875],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544777":{"id":"n2168544777","loc":[-85.6307732,41.9425087],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544778":{"id":"n2168544778","loc":[-85.6307178,41.9424357],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544779":{"id":"n2168544779","loc":[-85.630485,41.942524],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2189099387":{"id":"n2189099387","loc":[-85.631203,41.9393371],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099404":{"id":"n2189099404","loc":[-85.6301963,41.9391363],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099405":{"id":"n2189099405","loc":[-85.6304447,41.9391352],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099406":{"id":"n2189099406","loc":[-85.6304463,41.9393391],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099407":{"id":"n2189099407","loc":[-85.6308435,41.9393373],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099408":{"id":"n2189099408","loc":[-85.6308418,41.9391251],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099409":{"id":"n2189099409","loc":[-85.6310929,41.939124],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099410":{"id":"n2189099410","loc":[-85.6310946,41.9393376],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189112720":{"id":"n2189112720","loc":[-85.6314677,41.9412327],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112721":{"id":"n2189112721","loc":[-85.6313337,41.9411397],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112722":{"id":"n2189112722","loc":[-85.6320521,41.9405678],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112723":{"id":"n2189112723","loc":[-85.6321899,41.9406633],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112724":{"id":"n2189112724","loc":[-85.6313229,41.9408344],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112725":{"id":"n2189112725","loc":[-85.6311223,41.9410018],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112726":{"id":"n2189112726","loc":[-85.6313205,41.9411333],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112727":{"id":"n2189112727","loc":[-85.6315211,41.9409659],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112728":{"id":"n2189112728","loc":[-85.6311035,41.9402529],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112729":{"id":"n2189112729","loc":[-85.631226,41.9402107],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112730":{"id":"n2189112730","loc":[-85.6315966,41.9408051],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112731":{"id":"n2189112731","loc":[-85.6314741,41.9408473],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112732":{"id":"n2189112732","loc":[-85.6318114,41.940534],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112733":{"id":"n2189112733","loc":[-85.631588,41.94061],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112734":{"id":"n2189112734","loc":[-85.6314379,41.940366],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112735":{"id":"n2189112735","loc":[-85.6316613,41.94029],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112736":{"id":"n2189112736","loc":[-85.6306214,41.9400415],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112737":{"id":"n2189112737","loc":[-85.6304362,41.9397728],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112738":{"id":"n2189112738","loc":[-85.6305899,41.9397142],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112739":{"id":"n2189112739","loc":[-85.6307751,41.9399828],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112740":{"id":"n2189112740","loc":[-85.6304695,41.9401673],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112741":{"id":"n2189112741","loc":[-85.6301298,41.9396855],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112742":{"id":"n2189112742","loc":[-85.6303016,41.9396184],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112743":{"id":"n2189112743","loc":[-85.6306413,41.9401003],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112744":{"id":"n2189112744","loc":[-85.6309656,41.9406189],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112745":{"id":"n2189112745","loc":[-85.6308738,41.940493],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112746":{"id":"n2189112746","loc":[-85.6309333,41.940469],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112747":{"id":"n2189112747","loc":[-85.6307634,41.9402358],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112748":{"id":"n2189112748","loc":[-85.6308798,41.9401889],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112749":{"id":"n2189112749","loc":[-85.6311416,41.940548],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112750":{"id":"n2189112750","loc":[-85.6309577,41.9408708],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112751":{"id":"n2189112751","loc":[-85.630874,41.9407777],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112752":{"id":"n2189112752","loc":[-85.6310622,41.9406841],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112753":{"id":"n2189112753","loc":[-85.6311459,41.9407772],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112754":{"id":"n2189112754","loc":[-85.6320308,41.9405747],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112755":{"id":"n2189112755","loc":[-85.6317769,41.9401857],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112756":{"id":"n2189112756","loc":[-85.6313462,41.9401785],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112757":{"id":"n2189112757","loc":[-85.6313423,41.9401199],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112758":{"id":"n2189112758","loc":[-85.6318308,41.9401184],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112759":{"id":"n2189112759","loc":[-85.6321154,41.9405433],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112760":{"id":"n2189112760","loc":[-85.6310307,41.941683],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112761":{"id":"n2189112761","loc":[-85.6309808,41.9416078],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112762":{"id":"n2189112762","loc":[-85.6312094,41.9415156],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112763":{"id":"n2189112763","loc":[-85.6312636,41.9415865],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112764":{"id":"n2189112764","loc":[-85.6309384,41.94155],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112765":{"id":"n2189112765","loc":[-85.631156,41.9414619],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112766":{"id":"n2189112766","loc":[-85.6311968,41.94152],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112767":{"id":"n2189112767","loc":[-85.6308946,41.9414851],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112768":{"id":"n2189112768","loc":[-85.6308237,41.9413888],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112769":{"id":"n2189112769","loc":[-85.6309858,41.9413228],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112770":{"id":"n2189112770","loc":[-85.6310567,41.9414192],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112771":{"id":"n2189112771","loc":[-85.6307774,41.9413276],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112772":{"id":"n2189112772","loc":[-85.6309068,41.9412735],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112773":{"id":"n2189112773","loc":[-85.6309531,41.9413347],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112774":{"id":"n2189112774","loc":[-85.6307975,41.9412466],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112775":{"id":"n2189112775","loc":[-85.6307006,41.9411699],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112776":{"id":"n2189112776","loc":[-85.6308289,41.941113],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112777":{"id":"n2189112777","loc":[-85.6308997,41.9412012],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112778":{"id":"n2189112778","loc":[-85.630765,41.9412062],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112779":{"id":"n2189112779","loc":[-85.630739,41.9412177],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112780":{"id":"n2189112780","loc":[-85.6305822,41.9410391],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112781":{"id":"n2189112781","loc":[-85.6304117,41.9408177],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112782":{"id":"n2189112782","loc":[-85.6305086,41.9407769],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112783":{"id":"n2189112783","loc":[-85.6306779,41.9410044],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112784":{"id":"n2189112784","loc":[-85.6307734,41.9421663],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112785":{"id":"n2189112785","loc":[-85.630708,41.9420741],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112786":{"id":"n2189112786","loc":[-85.630863,41.9420133],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112787":{"id":"n2189112787","loc":[-85.6309285,41.9421055],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112788":{"id":"n2189112788","loc":[-85.6307014,41.9420263],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112789":{"id":"n2189112789","loc":[-85.6306648,41.941971],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112790":{"id":"n2189112790","loc":[-85.6307927,41.9419178],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112791":{"id":"n2189112791","loc":[-85.6308366,41.9419696],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112792":{"id":"n2189112792","loc":[-85.6307574,41.9418708],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112793":{"id":"n2189112793","loc":[-85.6306288,41.9419231],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112794":{"id":"n2189112794","loc":[-85.6306943,41.9417835],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112795":{"id":"n2189112795","loc":[-85.6305344,41.9418474],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112796":{"id":"n2189112796","loc":[-85.6305981,41.9419355],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189123410":{"id":"n2189123410","loc":[-85.6315476,41.9393801],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123412":{"id":"n2189123412","loc":[-85.6315247,41.9399188],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{}},"n2189123415":{"id":"n2189123415","loc":[-85.6316484,41.9400433],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{}},"n185945138":{"id":"n185945138","loc":[-85.627073,41.93319],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:52:24Z","tags":{}},"n185945142":{"id":"n185945142","loc":[-85.6296891,41.9331674],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:00Z","tags":{}},"n185945401":{"id":"n185945401","loc":[-85.6269,41.930199],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:52:30Z","tags":{}},"n185945405":{"id":"n185945405","loc":[-85.6296598,41.9301676],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:00Z","tags":{}},"n185956891":{"id":"n185956891","loc":[-85.6251617,41.9255049],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185959979":{"id":"n185959979","loc":[-85.626333,41.928347],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:03Z","tags":{}},"n185959983":{"id":"n185959983","loc":[-85.6296419,41.9283288],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185961192":{"id":"n185961192","loc":[-85.627053,41.9352031],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185961200":{"id":"n185961200","loc":[-85.6297088,41.9351902],"version":"4","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185963655":{"id":"n185963655","loc":[-85.6296112,41.9273948],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:00Z","tags":{}},"n185963665":{"id":"n185963665","loc":[-85.626047,41.92737],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:01Z","tags":{}},"n185963688":{"id":"n185963688","loc":[-85.6296503,41.9292199],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185963689":{"id":"n185963689","loc":[-85.6296694,41.931157],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185963690":{"id":"n185963690","loc":[-85.6296791,41.9321485],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185963691":{"id":"n185963691","loc":[-85.6296991,41.9341973],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185967638":{"id":"n185967638","loc":[-85.627089,41.9361884],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185972917":{"id":"n185972917","loc":[-85.6293759,41.9388605],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185972919":{"id":"n185972919","loc":[-85.6290337,41.9380234],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185972921":{"id":"n185972921","loc":[-85.628424,41.936212],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:40Z","tags":{}},"n185972923":{"id":"n185972923","loc":[-85.628367,41.936029],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:40Z","tags":{}},"n185974511":{"id":"n185974511","loc":[-85.627064,41.932169],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:19Z","tags":{}},"n185977728":{"id":"n185977728","loc":[-85.625605,41.925842],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:03Z","tags":{}},"n185977729":{"id":"n185977729","loc":[-85.625685,41.926163],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:03Z","tags":{}},"n185977731":{"id":"n185977731","loc":[-85.6257845,41.9264872],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185977733":{"id":"n185977733","loc":[-85.62663,41.929251],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:03Z","tags":{}},"n185977734":{"id":"n185977734","loc":[-85.627008,41.930642],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:03Z","tags":{}},"n185977736":{"id":"n185977736","loc":[-85.627029,41.930775],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:03Z","tags":{}},"n185977738":{"id":"n185977738","loc":[-85.627041,41.930946],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:03Z","tags":{}},"n185977739":{"id":"n185977739","loc":[-85.6270379,41.9311746],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185977742":{"id":"n185977742","loc":[-85.627055,41.934206],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977744":{"id":"n185977744","loc":[-85.627084,41.936804],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977746":{"id":"n185977746","loc":[-85.627104,41.936914],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977748":{"id":"n185977748","loc":[-85.627156,41.937026],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977750":{"id":"n185977750","loc":[-85.6272406,41.9371672],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185977752":{"id":"n185977752","loc":[-85.627317,41.93723],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977753":{"id":"n185977753","loc":[-85.627422,41.937312],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977755":{"id":"n185977755","loc":[-85.627754,41.937504],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977757":{"id":"n185977757","loc":[-85.627883,41.937623],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977761":{"id":"n185977761","loc":[-85.627984,41.93773],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n1475283996":{"id":"n1475283996","loc":[-85.6270514,41.9317122],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{"railway":"level_crossing"}},"n1475284004":{"id":"n1475284004","loc":[-85.6278177,41.9342117],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{"railway":"level_crossing"}},"n1475284014":{"id":"n1475284014","loc":[-85.6251877,41.9255913],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{"railway":"level_crossing"}},"n1475284017":{"id":"n1475284017","loc":[-85.6274992,41.9331816],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{"railway":"level_crossing"}},"n1475284021":{"id":"n1475284021","loc":[-85.6297108,41.9353939],"version":"2","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:02Z","tags":{"railway":"level_crossing"}},"n1475284027":{"id":"n1475284027","loc":[-85.62811,41.935198],"version":"2","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:03Z","tags":{"railway":"level_crossing"}},"n1475284035":{"id":"n1475284035","loc":[-85.626888,41.9311757],"version":"2","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:03Z","tags":{"railway":"level_crossing"}},"n1475293245":{"id":"n1475293245","loc":[-85.6286047,41.9367881],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1875654302":{"id":"n1875654302","loc":[-85.6296367,41.927491],"version":"1","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:43Z","tags":{}},"n2189099388":{"id":"n2189099388","loc":[-85.6312007,41.9389988],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099389":{"id":"n2189099389","loc":[-85.6311003,41.9389992],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099390":{"id":"n2189099390","loc":[-85.6310988,41.9387847],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099391":{"id":"n2189099391","loc":[-85.6312165,41.9387843],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099392":{"id":"n2189099392","loc":[-85.6312152,41.9385857],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099393":{"id":"n2189099393","loc":[-85.6310877,41.9385862],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099394":{"id":"n2189099394","loc":[-85.6310858,41.9383161],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099395":{"id":"n2189099395","loc":[-85.6302002,41.9383196],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099396":{"id":"n2189099396","loc":[-85.6302011,41.9384472],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099397":{"id":"n2189099397","loc":[-85.6301018,41.9384476],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099398":{"id":"n2189099398","loc":[-85.6301025,41.9385419],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099399":{"id":"n2189099399","loc":[-85.6299275,41.9385427],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099400":{"id":"n2189099400","loc":[-85.62993,41.9388653],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099401":{"id":"n2189099401","loc":[-85.630107,41.9388645],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099402":{"id":"n2189099402","loc":[-85.6301079,41.9389908],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099403":{"id":"n2189099403","loc":[-85.6301951,41.9389904],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189123382":{"id":"n2189123382","loc":[-85.6336279,41.9354365],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123384":{"id":"n2189123384","loc":[-85.6328492,41.9355177],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123387":{"id":"n2189123387","loc":[-85.6323762,41.9357396],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123388":{"id":"n2189123388","loc":[-85.6315174,41.9358966],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123389":{"id":"n2189123389","loc":[-85.6304331,41.936124],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123390":{"id":"n2189123390","loc":[-85.6302075,41.9364271],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123391":{"id":"n2189123391","loc":[-85.6303458,41.9367953],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123392":{"id":"n2189123392","loc":[-85.6299601,41.9369739],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123393":{"id":"n2189123393","loc":[-85.6299164,41.9374882],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123394":{"id":"n2189123394","loc":[-85.6299455,41.9378022],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123395":{"id":"n2189123395","loc":[-85.6299771,41.9379053],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123396":{"id":"n2189123396","loc":[-85.6301597,41.9379091],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123397":{"id":"n2189123397","loc":[-85.6308042,41.9377913],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123398":{"id":"n2189123398","loc":[-85.6316885,41.9378082],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123399":{"id":"n2189123399","loc":[-85.6316848,41.9380079],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123400":{"id":"n2189123400","loc":[-85.6318449,41.9381161],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123401":{"id":"n2189123401","loc":[-85.6320705,41.9381811],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123402":{"id":"n2189123402","loc":[-85.6321433,41.9383706],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123404":{"id":"n2189123404","loc":[-85.632056,41.9384355],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123406":{"id":"n2189123406","loc":[-85.6317867,41.9384572],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123409":{"id":"n2189123409","loc":[-85.6316572,41.9387281],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123417":{"id":"n2189123417","loc":[-85.6315946,41.93775],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{}},"n2189123419":{"id":"n2189123419","loc":[-85.6302641,41.9378393],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{}},"w208640158":{"id":"w208640158","version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{"area":"yes","natural":"wetland"},"nodes":["n2189123379","n2189123382","n2189123384","n2189123387","n2189123388","n2189123389","n2189123390","n2189123391","n2189123392","n2189123393","n2189123394","n2189123395","n2189123396","n2189123419","n2189123397","n2189123417","n2189123398","n2189123399","n2189123400","n2189123401","n2189123402","n2189123404","n2189123406","n2189123409","n2189123410","n2189123412","n2189123415","n1819805722","n1819805861","n1819805887","n1819805760","n1819805641","n1819805632","n2189123379"]},"w134150787":{"id":"w134150787","version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:20Z","tags":{"name":"Conrail Railroad","railway":"rail","tiger:cfcc":"B11","tiger:county":"St. Joseph, MI","tiger:name_base":"Conrail Railroad","tiger:reviewed":"no"},"nodes":["n185972905","n185972907","n1475293223","n185972911","n1475293241","n1475293246","n185972915","n185972917","n185972919","n1475293245","n185972921","n185972923","n1475284027","n1475284004","n1475284017","n1475283996","n1475284035","n1475284014","n185956891"]},"w208639443":{"id":"w208639443","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112720","n2189112721","n2189112722","n2189112723","n2189112720"]},"w17966462":{"id":"w17966462","version":"9","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:00Z","tags":{"highway":"secondary","name":"South Main Street","old_ref":"US 131","ref":"M 86","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Main","tiger:name_base_1":"State Highway 86","tiger:name_direction_prefix":"S","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185977728","n185977729","n185977731","n185963665","n185959979","n185977733","n185945401","n185977734","n185977736","n185977738","n185977739","n1475283996","n185974511","n185945138","n185977742","n185961192","n185967638","n185977744","n185977746","n185977748","n185977750","n185977752","n185977753","n185977754","n185977755","n185977757","n185977761","n185958030","n1475293263","n185963698","n185952745","n185947850","n185977762"]},"w203985741":{"id":"w203985741","version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{"area":"yes","leisure":"park","name":"Conservation Park","website":"http://www.threeriversmi.us/?page_id=53"},"nodes":["n2139982404","n2139982405","n2139982399","n2139982400","n1819805770","n2139982402","n2139982403","n2139982401","n1819805780","n1819805834","n2139982406","n2139982404"]},"w17963676":{"id":"w17963676","version":"3","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312976","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n1475293258","n2139982428","n2139982427","n2139982426","n2139982425","n2139982424","n2139982423","n2139982422","n2139982430","n2139982421","n2139982420","n2139982429","n1475293231","n1475293258","n1475293251","n1475293223","n185952745"]},"w203985745":{"id":"w203985745","version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{"highway":"footway"},"nodes":["n2139982430","n2139982431","n2139982432","n2139982433","n2139982434","n2139982435","n2139982436","n2139982437","n2139982438","n2139982439","n2139982440","n2139982441","n1475293231"]},"w208639451":{"id":"w208639451","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112754","n2189112755","n2189112756","n2189112757","n2189112758","n2189112759","n2189112754"]},"w208639452":{"id":"w208639452","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112760","n2189112761","n2189112766","n2189112762","n2189112763","n2189112760"]},"w206805244":{"id":"w206805244","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544766","n2168544767","n2168544768","n2168544769","n2168544770","n2168544771","n2168544772","n2168544773","n2168544774","n2168544775","n2168544776","n2168544777","n2168544778","n2168544779","n2168544766"]},"w208639444":{"id":"w208639444","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112724","n2189112725","n2189112726","n2189112727","n2189112724"]},"w208639450":{"id":"w208639450","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112750","n2189112751","n2189112752","n2189112753","n2189112750"]},"w208639448":{"id":"w208639448","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112740","n2189112741","n2189112742","n2189112743","n2189112740"]},"w208637859":{"id":"w208637859","version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:06Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189099387","n2189099388","n2189099389","n2189099390","n2189099391","n2189099392","n2189099393","n2189099394","n2189099395","n2189099396","n2189099397","n2189099398","n2189099399","n2189099400","n2189099401","n2189099402","n2189099403","n2189099404","n2189099405","n2189099406","n2189099407","n2189099408","n2189099409","n2189099410","n2189099387"]},"w208639453":{"id":"w208639453","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112764","n2189112765","n2189112766","n2189112761","n2189112764"]},"w208639456":{"id":"w208639456","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112774","n2189112778","n2189112779","n2189112775","n2189112776","n2189112777","n2189112774"]},"w208639445":{"id":"w208639445","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112728","n2189112729","n2189112730","n2189112731","n2189112728"]},"w17967776":{"id":"w17967776","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:54:17Z","tags":{"highway":"residential","name":"5th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"5th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312495","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185958032","n185988963"]},"w208639461":{"id":"w208639461","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112792","n2189112794","n2189112795","n2189112796","n2189112793","n2189112792"]},"w206805241":{"id":"w206805241","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544754","n2168544755","n2168544756","n2168544757","n2168544754"]},"w208639449":{"id":"w208639449","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112744","n2189112745","n2189112746","n2189112747","n2189112748","n2189112749","n2189112744"]},"w208639455":{"id":"w208639455","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112771","n2189112772","n2189112773","n2189112768","n2189112771"]},"w208639457":{"id":"w208639457","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112780","n2189112781","n2189112782","n2189112783","n2189112780"]},"w208639446":{"id":"w208639446","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112732","n2189112733","n2189112734","n2189112735","n2189112732"]},"w208639454":{"id":"w208639454","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112767","n2189112768","n2189112773","n2189112769","n2189112770","n2189112767"]},"w203985743":{"id":"w203985743","version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139982411","n2139982412","n2139982413","n2139982414","n2139982415","n2139982416","n2139982417","n2139982419","n2139982418","n2139982411"]},"w17965023":{"id":"w17965023","version":"4","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:10Z","tags":{"highway":"residential","name":"4th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"4th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313205","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185963655","n1875654302","n185959983","n185963688","n185945405","n185963689","n185963690","n185945142","n185963691","n185961200","n1475284021","n1475293246","n1875654132","n1475293263"]},"w206805242":{"id":"w206805242","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544758","n2168544759","n2168544760","n2168544761","n2168544758"]},"w208639460":{"id":"w208639460","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112792","n2189112793","n2189112789","n2189112790","n2189112792"]},"w208639447":{"id":"w208639447","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112736","n2189112737","n2189112738","n2189112739","n2189112736"]},"w208639458":{"id":"w208639458","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112784","n2189112785","n2189112786","n2189112787","n2189112784"]},"w203985744":{"id":"w203985744","version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{"highway":"service"},"nodes":["n2139982425","n2139982400"]},"w208639459":{"id":"w208639459","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112788","n2189112789","n2189112790","n2189112791","n2189112788"]},"w203985742":{"id":"w203985742","version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{"amenity":"shelter","area":"yes","shelter_type":"picnic_shelter"},"nodes":["n2139982407","n2139982408","n2139982409","n2139982410","n2139982407"]},"w206805243":{"id":"w206805243","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544762","n2168544763","n2168544764","n2168544765","n2168544762"]},"n185959081":{"id":"n185959081","loc":[-85.628469,41.948674],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:41Z","tags":{}},"n185967427":{"id":"n185967427","loc":[-85.632054,41.951174],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185967424":{"id":"n185967424","loc":[-85.6320391,41.9499109],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185968101":{"id":"n185968101","loc":[-85.6308395,41.9511969],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185960792":{"id":"n185960792","loc":[-85.632074,41.953707],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:24Z","tags":{}},"n185961389":{"id":"n185961389","loc":[-85.630935,41.959037],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:39Z","tags":{}},"n185961391":{"id":"n185961391","loc":[-85.632169,41.959025],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:39Z","tags":{}},"n185965395":{"id":"n185965395","loc":[-85.63216,41.959859],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:52Z","tags":{}},"n185966953":{"id":"n185966953","loc":[-85.630894,41.957428],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"n185966955":{"id":"n185966955","loc":[-85.632122,41.957427],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"n185967430":{"id":"n185967430","loc":[-85.632077,41.952453],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185967432":{"id":"n185967432","loc":[-85.632095,41.954685],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185967434":{"id":"n185967434","loc":[-85.632121,41.955914],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185967436":{"id":"n185967436","loc":[-85.632128,41.9583],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185967438":{"id":"n185967438","loc":[-85.632187,41.960681],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185967440":{"id":"n185967440","loc":[-85.632182,41.961493],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185968102":{"id":"n185968102","loc":[-85.630855,41.952452],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968104":{"id":"n185968104","loc":[-85.630887,41.953714],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968106":{"id":"n185968106","loc":[-85.630883,41.954692],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968108":{"id":"n185968108","loc":[-85.630904,41.955913],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968110":{"id":"n185968110","loc":[-85.630904,41.958058],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968112":{"id":"n185968112","loc":[-85.630952,41.960667],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968114":{"id":"n185968114","loc":[-85.630972,41.961495],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968116":{"id":"n185968116","loc":[-85.630962,41.961967],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185978969":{"id":"n185978969","loc":[-85.633214,41.948618],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:39Z","tags":{}},"n185985812":{"id":"n185985812","loc":[-85.633274,41.951159],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:39Z","tags":{}},"n185986155":{"id":"n185986155","loc":[-85.633258,41.949893],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:48Z","tags":{}},"n2208608826":{"id":"n2208608826","loc":[-85.6339222,41.9486225],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{}},"w17964531":{"id":"w17964531","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:30:22Z","tags":{"highway":"residential","name":"Willow Dr","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Willow","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313189","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093"},"nodes":["n185959079","n185959081"]},"w17967386":{"id":"w17967386","version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:24Z","tags":{"highway":"residential","name":"East Armitage Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Armitage","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185982195","n185968101","n185967427","n185985812","n185974583"]},"w17965502":{"id":"w17965502","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:21Z","tags":{"highway":"residential","name":"Elm Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Elm","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185968100","n185968101","n185968102","n185968104","n185968106","n185968108","n185966953","n185968110","n185961389","n185968112","n185968114","n185968116"]},"w17967844":{"id":"w17967844","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:24Z","tags":{"highway":"residential","name":"East Bennett Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Bennett","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185982193","n185967424","n185986155","n185978390"]},"w17966581":{"id":"w17966581","version":"2","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{"highway":"residential","name":"E Kelsey St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Kelsey","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185978967","n185978969","n2208608826","n185971578"]},"w17965402":{"id":"w17965402","version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:22Z","tags":{"highway":"residential","name":"Walnut Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Walnut","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185967422","n185967424","n185967427","n185967430","n185960792","n185967432","n185967434","n185966955","n185967436","n185961391","n185965395","n185967438","n185967440"]},"n2199093506":{"id":"n2199093506","loc":[-85.6251879,41.9478322],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093505":{"id":"n2199093505","loc":[-85.6252076,41.9477749],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093504":{"id":"n2199093504","loc":[-85.6252289,41.9477602],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093503":{"id":"n2199093503","loc":[-85.625201,41.9477492],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093502":{"id":"n2199093502","loc":[-85.6251682,41.9477066],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093501":{"id":"n2199093501","loc":[-85.6251715,41.947609],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093500":{"id":"n2199093500","loc":[-85.6252125,41.9475639],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093499":{"id":"n2199093499","loc":[-85.6252896,41.9475602],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093498":{"id":"n2199093498","loc":[-85.6253027,41.9475334],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093497":{"id":"n2199093497","loc":[-85.6253437,41.9474822],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093496":{"id":"n2199093496","loc":[-85.6254421,41.9474675],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093495":{"id":"n2199093495","loc":[-85.6256503,41.9474944],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093494":{"id":"n2199093494","loc":[-85.6257257,41.9476127],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093493":{"id":"n2199093493","loc":[-85.6257028,41.9477285],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093492":{"id":"n2199093492","loc":[-85.6255339,41.9478102],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093491":{"id":"n2199093491","loc":[-85.6253912,41.9478224],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093490":{"id":"n2199093490","loc":[-85.6253043,41.947859],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093489":{"id":"n2199093489","loc":[-85.6252027,41.9478846],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093458":{"id":"n2199093458","loc":[-85.6246876,41.9486617],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093457":{"id":"n2199093457","loc":[-85.6243127,41.9486583],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093456":{"id":"n2199093456","loc":[-85.624306,41.9490569],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093455":{"id":"n2199093455","loc":[-85.624681,41.9490603],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093514":{"id":"n2199093514","loc":[-85.6236228,41.9496059],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093513":{"id":"n2199093513","loc":[-85.6236231,41.9496997],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093512":{"id":"n2199093512","loc":[-85.623357,41.9497002],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093511":{"id":"n2199093511","loc":[-85.6233567,41.9496136],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093508":{"id":"n2199093508","loc":[-85.6239735,41.9494287],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093507":{"id":"n2199093507","loc":[-85.6239741,41.9496052],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093488":{"id":"n2199093488","loc":[-85.624497,41.9512286],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093487":{"id":"n2199093487","loc":[-85.6244966,41.9511259],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093486":{"id":"n2199093486","loc":[-85.6243151,41.9511263],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093485":{"id":"n2199093485","loc":[-85.6243154,41.951229],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093484":{"id":"n2199093484","loc":[-85.6241205,41.9508665],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093483":{"id":"n2199093483","loc":[-85.624115,41.9505249],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093482":{"id":"n2199093482","loc":[-85.6243149,41.9505231],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093481":{"id":"n2199093481","loc":[-85.6243203,41.9508648],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093480":{"id":"n2199093480","loc":[-85.624393,41.9508668],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093479":{"id":"n2199093479","loc":[-85.6243904,41.9505956],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093478":{"id":"n2199093478","loc":[-85.6246727,41.950594],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093477":{"id":"n2199093477","loc":[-85.624675,41.9508203],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093476":{"id":"n2199093476","loc":[-85.6245097,41.9508212],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093475":{"id":"n2199093475","loc":[-85.6245101,41.9508662],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093474":{"id":"n2199093474","loc":[-85.6241008,41.9493459],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093473":{"id":"n2199093473","loc":[-85.6242442,41.9493459],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093472":{"id":"n2199093472","loc":[-85.6242442,41.9493681],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093471":{"id":"n2199093471","loc":[-85.6243397,41.9493681],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093470":{"id":"n2199093470","loc":[-85.6243417,41.9493511],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093469":{"id":"n2199093469","loc":[-85.6247251,41.9493485],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093468":{"id":"n2199093468","loc":[-85.6247548,41.9504949],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093467":{"id":"n2199093467","loc":[-85.6241214,41.9505017],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093466":{"id":"n2199093466","loc":[-85.6254398,41.950174],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093465":{"id":"n2199093465","loc":[-85.6254412,41.9499872],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093464":{"id":"n2199093464","loc":[-85.6255363,41.9499876],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093463":{"id":"n2199093463","loc":[-85.6255374,41.9498439],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093462":{"id":"n2199093462","loc":[-85.6255638,41.949844],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093461":{"id":"n2199093461","loc":[-85.6255652,41.9496672],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093460":{"id":"n2199093460","loc":[-85.6251823,41.9496656],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093459":{"id":"n2199093459","loc":[-85.6251785,41.9501729],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093510":{"id":"n2199093510","loc":[-85.6229922,41.9496143],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093509":{"id":"n2199093509","loc":[-85.6229915,41.9494306],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n185948903":{"id":"n185948903","loc":[-85.616514,41.947449],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:45Z","tags":{}},"n185955120":{"id":"n185955120","loc":[-85.620103,41.951],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:39Z","tags":{}},"n185955143":{"id":"n185955143","loc":[-85.619784,41.94746],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:39Z","tags":{}},"n185960124":{"id":"n185960124","loc":[-85.615238,41.947468],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:07Z","tags":{}},"n185961362":{"id":"n185961362","loc":[-85.617437,41.947451],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:38Z","tags":{}},"n185961364":{"id":"n185961364","loc":[-85.61861,41.947456],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:38Z","tags":{}},"n185961367":{"id":"n185961367","loc":[-85.620088,41.947458],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:38Z","tags":{}},"n185965105":{"id":"n185965105","loc":[-85.620087,41.94924],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:44Z","tags":{}},"n185970220":{"id":"n185970220","loc":[-85.62156,41.948333],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:17Z","tags":{}},"n185974697":{"id":"n185974697","loc":[-85.6201059,41.950132],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:05Z","tags":{}},"n2138420778":{"id":"n2138420778","loc":[-85.616948,41.9474499],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"w17967535":{"id":"w17967535","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:52:19Z","tags":{"highway":"residential","name":"10th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"10th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313652:15313654","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185955120","n185986812","n185983141"]},"w209716130":{"id":"w209716130","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093485","n2199093486","n2199093487","n2199093488","n2199093485"]},"w17964788":{"id":"w17964788","version":"2","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:15Z","tags":{"highway":"residential","name":"6th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"6th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313681:15313682:15329115:15329116:15330465:15330466","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185960124","n185948903","n2138420778","n185961362","n185961364","n185955143","n185961367","n185961369","n185961371"]},"w17965159":{"id":"w17965159","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:34:55Z","tags":{"highway":"residential","name":"8th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"8th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313660","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185965105","n185965108","n185965110"]},"w209716125":{"id":"w209716125","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093459","n2199093460","n2199093461","n2199093462","n2199093463","n2199093464","n2199093465","n2199093466","n2199093459"]},"w17965699":{"id":"w17965699","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:39:03Z","tags":{"highway":"residential","name":"7th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"7th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313667:15314407","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185970220","n185970222","n185970224"]},"w209716132":{"id":"w209716132","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093507","n2199093508","n2199093509","n2199093510","n2199093511","n2199093512","n2199093513","n2199093514","n2199093507"]},"w17966129":{"id":"w17966129","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:42:41Z","tags":{"highway":"residential","name":"9th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"9th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313656","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185974697","n185974699"]},"w209716127":{"id":"w209716127","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093475","n2199093476","n2199093477","n2199093478","n2199093479","n2199093480","n2199093475"]},"w209716131":{"id":"w209716131","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:46Z","tags":{"area":"yes","natural":"water","water":"pond"},"nodes":["n2199093489","n2199093490","n2199093491","n2199093492","n2199093493","n2199093494","n2199093495","n2199093496","n2199093497","n2199093498","n2199093499","n2199093500","n2199093501","n2199093502","n2199093503","n2199093504","n2199093505","n2199093506","n2199093489"]},"w209716126":{"id":"w209716126","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093467","n2199093468","n2199093469","n2199093470","n2199093471","n2199093472","n2199093473","n2199093474","n2199093467"]},"w209716124":{"id":"w209716124","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093455","n2199093456","n2199093457","n2199093458","n2199093455"]},"w209716128":{"id":"w209716128","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093481","n2199093482","n2199093483","n2199093484","n2199093481"]},"n185949872":{"id":"n185949872","loc":[-85.643009,41.949264],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:20Z","tags":{}},"n185949875":{"id":"n185949875","loc":[-85.642598,41.94929],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:20Z","tags":{}},"n185949877":{"id":"n185949877","loc":[-85.642127,41.949382],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:20Z","tags":{}},"n185949881":{"id":"n185949881","loc":[-85.64169,41.949936],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:20Z","tags":{}},"n185988165":{"id":"n185988165","loc":[-85.642167,41.947657],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:33Z","tags":{}},"n185988167":{"id":"n185988167","loc":[-85.642347,41.947662],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:33Z","tags":{}},"n185988169":{"id":"n185988169","loc":[-85.642621,41.947659],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:33Z","tags":{}},"n185965019":{"id":"n185965019","loc":[-85.6385084,41.951127],"version":"4","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n1475293248":{"id":"n1475293248","loc":[-85.6386095,41.9512214],"version":"2","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:04Z","tags":{}},"n185962639":{"id":"n185962639","loc":[-85.649669,41.949161],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:30Z","tags":{}},"n185962810":{"id":"n185962810","loc":[-85.649907,41.949157],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:34Z","tags":{}},"n185964355":{"id":"n185964355","loc":[-85.637412,41.9511359],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185965021":{"id":"n185965021","loc":[-85.638661,41.952386],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185965023":{"id":"n185965023","loc":[-85.638654,41.953665],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185965025":{"id":"n185965025","loc":[-85.638694,41.954649],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185965027":{"id":"n185965027","loc":[-85.638724,41.955913],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185971415":{"id":"n185971415","loc":[-85.644466,41.949246],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:02Z","tags":{}},"n185971417":{"id":"n185971417","loc":[-85.647021,41.949193],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:02Z","tags":{}},"n185971420":{"id":"n185971420","loc":[-85.648476,41.949169],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:02Z","tags":{}},"n185979975":{"id":"n185979975","loc":[-85.644429,41.947633],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:24Z","tags":{}},"n185988171":{"id":"n185988171","loc":[-85.645377,41.947622],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:34Z","tags":{}},"w17963211":{"id":"w17963211","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:23:06Z","tags":{"highway":"residential","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313193","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185949870","n185949872","n185949875","n185949877","n185949881"]},"w17965839":{"id":"w17965839","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:40:10Z","tags":{"highway":"residential","name":"Arnold St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Arnold","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15327930:15324550:15312304:15324551","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185949870","n185971415","n185971417","n185971420","n185962639","n185962810"]},"w17967618":{"id":"w17967618","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:53:22Z","tags":{"highway":"residential","name":"Pierson St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Pierson","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313265:15312333:15324553","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185967777","n185988165","n185988167","n185988169","n185985824","n185979975","n185988171"]},"w17965149":{"id":"w17965149","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:56Z","tags":{"highway":"residential","name":"Oak St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Oak","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15331522","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185965019","n1475293248","n185965021","n185965023","n185965025","n185965027"]},"w17966118":{"id":"w17966118","version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:24Z","tags":{"highway":"residential","name":"West Armitage Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Armitage","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185974583","n185974585","n185964355","n185965019"]},"n2208608800":{"id":"n2208608800","loc":[-85.6354294,41.9486201],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:39Z","tags":{}},"n2199109806":{"id":"n2199109806","loc":[-85.6350474,41.9477884],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109804":{"id":"n2199109804","loc":[-85.6350476,41.9477962],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109802":{"id":"n2199109802","loc":[-85.635002,41.9477969],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109799":{"id":"n2199109799","loc":[-85.6350018,41.9477883],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109797":{"id":"n2199109797","loc":[-85.6349141,41.9477897],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109795":{"id":"n2199109795","loc":[-85.6349131,41.9477535],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109793":{"id":"n2199109793","loc":[-85.6349395,41.9477531],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109791":{"id":"n2199109791","loc":[-85.6349382,41.9477077],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109789":{"id":"n2199109789","loc":[-85.6351236,41.9477049],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109787":{"id":"n2199109787","loc":[-85.6351259,41.9477872],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109785":{"id":"n2199109785","loc":[-85.634972,41.9475992],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109783":{"id":"n2199109783","loc":[-85.6349206,41.9475997],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109770":{"id":"n2199109770","loc":[-85.6348499,41.9475461],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109768":{"id":"n2199109768","loc":[-85.6348499,41.9475084],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109765":{"id":"n2199109765","loc":[-85.6349241,41.9474569],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109763":{"id":"n2199109763","loc":[-85.634967,41.9474564],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109762":{"id":"n2199109762","loc":[-85.6350405,41.9475121],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109761":{"id":"n2199109761","loc":[-85.6350405,41.9475419],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109753":{"id":"n2199109753","loc":[-85.6342443,41.9478391],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109751":{"id":"n2199109751","loc":[-85.6342427,41.9477927],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109745":{"id":"n2199109745","loc":[-85.6342439,41.9476859],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109743":{"id":"n2199109743","loc":[-85.6342429,41.9476575],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109741":{"id":"n2199109741","loc":[-85.6344615,41.9476533],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109739":{"id":"n2199109739","loc":[-85.6344678,41.9478348],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109737":{"id":"n2199109737","loc":[-85.634416,41.9480059],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109735":{"id":"n2199109735","loc":[-85.6344145,41.9478983],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109733":{"id":"n2199109733","loc":[-85.6342749,41.9478993],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109731":{"id":"n2199109731","loc":[-85.6342753,41.9479272],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109729":{"id":"n2199109729","loc":[-85.6342498,41.9479274],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109727":{"id":"n2199109727","loc":[-85.6342505,41.9479762],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109725":{"id":"n2199109725","loc":[-85.6342743,41.947976],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109723":{"id":"n2199109723","loc":[-85.6342747,41.948007],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109721":{"id":"n2199109721","loc":[-85.6343415,41.9476355],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109719":{"id":"n2199109719","loc":[-85.6343391,41.9474973],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109717":{"id":"n2199109717","loc":[-85.6343133,41.9474798],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109715":{"id":"n2199109715","loc":[-85.6342874,41.9474737],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109709":{"id":"n2199109709","loc":[-85.6349804,41.94815],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109707":{"id":"n2199109707","loc":[-85.6348915,41.9481505],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109705":{"id":"n2199109705","loc":[-85.6348917,41.9481692],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109702":{"id":"n2199109702","loc":[-85.6348522,41.9481694],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109700":{"id":"n2199109700","loc":[-85.6348532,41.9482679],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109698":{"id":"n2199109698","loc":[-85.6348315,41.948268],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109696":{"id":"n2199109696","loc":[-85.6348318,41.9482955],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109694":{"id":"n2199109694","loc":[-85.6349653,41.9482946],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109692":{"id":"n2199109692","loc":[-85.6349656,41.9483211],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109690":{"id":"n2199109690","loc":[-85.634999,41.9483209],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109688":{"id":"n2199109688","loc":[-85.6349987,41.9482947],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109686":{"id":"n2199109686","loc":[-85.6351753,41.9482935],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109684":{"id":"n2199109684","loc":[-85.6351749,41.9482617],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109682":{"id":"n2199109682","loc":[-85.6351588,41.9482618],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109680":{"id":"n2199109680","loc":[-85.6351575,41.9481518],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109678":{"id":"n2199109678","loc":[-85.6350671,41.9481524],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109676":{"id":"n2199109676","loc":[-85.6350649,41.9479659],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109674":{"id":"n2199109674","loc":[-85.6349785,41.9479665],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109671":{"id":"n2199109671","loc":[-85.6343069,41.9483263],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109669":{"id":"n2199109669","loc":[-85.6343052,41.9482981],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109658":{"id":"n2199109658","loc":[-85.6343314,41.9480549],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109656":{"id":"n2199109656","loc":[-85.6343305,41.9480461],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109654":{"id":"n2199109654","loc":[-85.634435,41.9480468],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109652":{"id":"n2199109652","loc":[-85.6344342,41.9483746],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109650":{"id":"n2199109650","loc":[-85.6344629,41.9483727],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109648":{"id":"n2199109648","loc":[-85.6344637,41.9484561],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109645":{"id":"n2199109645","loc":[-85.63443,41.9484567],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109642":{"id":"n2199109642","loc":[-85.6344317,41.948505],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n185964352":{"id":"n185964352","loc":[-85.6373958,41.9489943],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185964351":{"id":"n185964351","loc":[-85.637113,41.9486],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n2208608825":{"id":"n2208608825","loc":[-85.6354483,41.9494241],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{}},"n2208608823":{"id":"n2208608823","loc":[-85.6360418,41.949416],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{}},"n2208608821":{"id":"n2208608821","loc":[-85.6360458,41.9495802],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{}},"n2208608811":{"id":"n2208608811","loc":[-85.6357458,41.9495843],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:39Z","tags":{}},"n2208608808":{"id":"n2208608808","loc":[-85.6357508,41.9497835],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:39Z","tags":{}},"n2208608806":{"id":"n2208608806","loc":[-85.6354573,41.9497875],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:39Z","tags":{}},"n2208608795":{"id":"n2208608795","loc":[-85.6354595,41.9498778],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:39Z","tags":{}},"n2199109638":{"id":"n2199109638","loc":[-85.6349605,41.949749],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109636":{"id":"n2199109636","loc":[-85.6349605,41.9497639],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109634":{"id":"n2199109634","loc":[-85.6349061,41.94971],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109632":{"id":"n2199109632","loc":[-85.6349048,41.9496569],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109630":{"id":"n2199109630","loc":[-85.6348835,41.9496571],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109628":{"id":"n2199109628","loc":[-85.6348829,41.9497103],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109626":{"id":"n2199109626","loc":[-85.635227,41.9497738],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109624":{"id":"n2199109624","loc":[-85.6352184,41.9497787],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109622":{"id":"n2199109622","loc":[-85.6351181,41.9497806],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109620":{"id":"n2199109620","loc":[-85.6351181,41.9497456],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109618":{"id":"n2199109618","loc":[-85.6348842,41.9497651],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109616":{"id":"n2199109616","loc":[-85.6348827,41.9496238],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109615":{"id":"n2199109615","loc":[-85.6351268,41.9496206],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109614":{"id":"n2199109614","loc":[-85.6351261,41.9495891],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109613":{"id":"n2199109613","loc":[-85.6351957,41.9495881],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109612":{"id":"n2199109612","loc":[-85.6351924,41.9494515],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109611":{"id":"n2199109611","loc":[-85.6353997,41.9494488],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109610":{"id":"n2199109610","loc":[-85.6354074,41.9497715],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2189015681":{"id":"n2189015681","loc":[-85.6344229,41.9509639],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015677":{"id":"n2189015677","loc":[-85.634424,41.9507396],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2138493843":{"id":"n2138493843","loc":[-85.6343935,41.9502836],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493840":{"id":"n2138493840","loc":[-85.634398,41.9506264],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n354002838":{"id":"n354002838","loc":[-85.6345197,41.9510631],"version":"2","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:18Z","tags":{}},"n2114807590":{"id":"n2114807590","loc":[-85.634511,41.9499767],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n185964353":{"id":"n185964353","loc":[-85.6374092,41.9498755],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n1819849180":{"id":"n1819849180","loc":[-85.6348236,41.94996],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849115":{"id":"n1819849115","loc":[-85.6354372,41.9499538],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819848921":{"id":"n1819848921","loc":[-85.6348439,41.951064],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848885":{"id":"n1819848885","loc":[-85.6354575,41.9510578],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n185984281":{"id":"n185984281","loc":[-85.638075,41.949872],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:55Z","tags":{}},"n2208608827":{"id":"n2208608827","loc":[-85.6339169,41.9473191],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{}},"n2199109749":{"id":"n2199109749","loc":[-85.6342082,41.9477934],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109747":{"id":"n2199109747","loc":[-85.6342045,41.9476867],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109713":{"id":"n2199109713","loc":[-85.6342404,41.9474746],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109711":{"id":"n2199109711","loc":[-85.6342404,41.9476355],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109673":{"id":"n2199109673","loc":[-85.6340886,41.9483282],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109667":{"id":"n2199109667","loc":[-85.6342403,41.9482988],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109665":{"id":"n2199109665","loc":[-85.6342386,41.9482116],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109662":{"id":"n2199109662","loc":[-85.6340861,41.9482135],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109660":{"id":"n2199109660","loc":[-85.6340802,41.9480562],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109640":{"id":"n2199109640","loc":[-85.6340928,41.9485063],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n354031366":{"id":"n354031366","loc":[-85.6341667,41.9477778],"version":"3","changeset":"3908860","user":"Geogast","uid":"51045","visible":"true","timestamp":"2010-02-18T13:28:25Z","tags":{"amenity":"place_of_worship","ele":"249","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417877","gnis:state_id":"26","name":"Faith Tabernacle Church","religion":"christian"}},"n2189015686":{"id":"n2189015686","loc":[-85.6337798,41.95099],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015684":{"id":"n2189015684","loc":[-85.6337794,41.9509674],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015673":{"id":"n2189015673","loc":[-85.6337501,41.9507457],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015669":{"id":"n2189015669","loc":[-85.6337501,41.9506974],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015665":{"id":"n2189015665","loc":[-85.6339034,41.9506959],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015662":{"id":"n2189015662","loc":[-85.6339015,41.950436],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015658":{"id":"n2189015658","loc":[-85.6334916,41.9504376],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015655":{"id":"n2189015655","loc":[-85.6334939,41.9507558],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015650":{"id":"n2189015650","loc":[-85.6334543,41.950756],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015649":{"id":"n2189015649","loc":[-85.633456,41.9509915],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2138493842":{"id":"n2138493842","loc":[-85.6339937,41.9502836],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493841":{"id":"n2138493841","loc":[-85.6339983,41.9506281],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2114807579":{"id":"n2114807579","loc":[-85.6333644,41.9510682],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807573":{"id":"n2114807573","loc":[-85.6333557,41.9499819],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n354031330":{"id":"n354031330","loc":[-85.6341667,41.9497222],"version":"3","changeset":"3908860","user":"Geogast","uid":"51045","visible":"true","timestamp":"2010-02-18T13:28:24Z","tags":{"amenity":"place_of_worship","ele":"250","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417879","gnis:state_id":"26","name":"Trinity Episcopal Church","religion":"christian"}},"n185960794":{"id":"n185960794","loc":[-85.633307,41.9537],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:24Z","tags":{}},"n185964357":{"id":"n185964357","loc":[-85.637432,41.952399],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185964358":{"id":"n185964358","loc":[-85.637452,41.953665],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185964359":{"id":"n185964359","loc":[-85.63746,41.954658],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185964360":{"id":"n185964360","loc":[-85.637473,41.95592],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185964361":{"id":"n185964361","loc":[-85.637468,41.956906],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185964362":{"id":"n185964362","loc":[-85.637483,41.958313],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185966957":{"id":"n185966957","loc":[-85.633361,41.957422],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"n185975351":{"id":"n185975351","loc":[-85.63334,41.9559],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:58Z","tags":{}},"n185978784":{"id":"n185978784","loc":[-85.633311,41.954679],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185986157":{"id":"n185986157","loc":[-85.633287,41.952426],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:48Z","tags":{}},"n185986158":{"id":"n185986158","loc":[-85.6333607,41.9582301],"version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:20Z","tags":{"highway":"turning_circle"}},"w17965182":{"id":"w17965182","version":"2","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:17Z","tags":{"highway":"residential","name":"W Prutzman St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Prutzman","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093"},"nodes":["n185965289","n2189153241","n185965291"]},"w208627205":{"id":"w208627205","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015649","n2189015650","n2189015655","n2189015658","n2189015662","n2189015665","n2189015669","n2189015673","n2189015677","n2189015681","n2189015684","n2189015686","n2189015649"]},"w209717042":{"id":"w209717042","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{"amenity":"place_of_worship","area":"yes","building":"yes","denomination":"presbyterian","ele":"250","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417878","gnis:state_id":"26","name":"First Presbyterian Church","religion":"christian"},"nodes":["n2199109610","n2199109611","n2199109612","n2199109613","n2199109614","n2199109615","n2199109616","n2199109630","n2199109632","n2199109634","n2199109628","n2199109618","n2199109636","n2199109638","n2199109620","n2199109622","n2199109624","n2199109626","n2199109610"]},"w209717045":{"id":"w209717045","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109711","n2199109713","n2199109715","n2199109717","n2199109719","n2199109721","n2199109711"]},"w209717047":{"id":"w209717047","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109739","n2199109741","n2199109743","n2199109745","n2199109747","n2199109749","n2199109751","n2199109753","n2199109739"]},"w209717044":{"id":"w209717044","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109674","n2199109676","n2199109678","n2199109680","n2199109682","n2199109684","n2199109686","n2199109688","n2199109690","n2199109692","n2199109694","n2199109696","n2199109698","n2199109700","n2199109702","n2199109705","n2199109707","n2199109709","n2199109674"]},"w210822776":{"id":"w210822776","version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{"highway":"service","service":"alley","surface":"unpaved"},"nodes":["n2208608795","n2208608806","n2208608825","n2208608800","n2189153241"]},"w210822778":{"id":"w210822778","version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{"highway":"service","service":"alley"},"nodes":["n2208608826","n2208608827"]},"w209717050":{"id":"w209717050","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109787","n2199109789","n2199109791","n2199109793","n2199109795","n2199109797","n2199109799","n2199109802","n2199109804","n2199109806","n2199109787"]},"w17965097":{"id":"w17965097","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:23Z","tags":{"highway":"residential","name":"Maple Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Maple","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185964351","n185964352","n185964353","n185964355","n185964357","n185964358","n185964359","n185964360","n185964361","n185964362"]},"w17965856":{"id":"w17965856","version":"2","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{"highway":"residential","name":"W Kelsey St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Kelsey","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093"},"nodes":["n185971578","n2208608800","n185971580","n185964351"]},"w17967444":{"id":"w17967444","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:22Z","tags":{"highway":"residential","name":"East Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"East","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185966937","n185978969","n185986155","n185985812","n185986157","n185960794","n185978784","n185975351","n185966957","n185986158"]},"w17967764":{"id":"w17967764","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:54:14Z","tags":{"highway":"residential","name":"Rock River Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Rock River","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312338","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185984017","n185964351"]},"w170848329":{"id":"w170848329","version":"2","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:18Z","tags":{"ele":"251","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2418164","gnis:state_id":"26","leisure":"park","name":"LaFayette Park","source":"Bing"},"nodes":["n1819849180","n1819849115","n1819848885","n1819848921","n1819849180"]},"w17967208":{"id":"w17967208","version":"4","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:24Z","tags":{"highway":"residential","name":"West Bennett Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Bennett","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185978390","n2208608795","n185984020","n185964353","n185984281"]},"w17965349":{"id":"w17965349","version":"2","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{"highway":"residential","name":"E Prutzman St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Prutzman","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093"},"nodes":["n185966937","n2208608827","n185965289"]},"w209717049":{"id":"w209717049","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109761","n2199109762","n2199109763","n2199109765","n2199109768","n2199109770","n2199109783","n2199109785","n2199109761"]},"w203841840":{"id":"w203841840","version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{"area":"yes","leisure":"playground"},"nodes":["n2138493840","n2138493841","n2138493842","n2138493843","n2138493840"]},"w209717043":{"id":"w209717043","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{"amenity":"place_of_worship","area":"yes","building":"church","denomination":"methodist","ele":"249","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417880","gnis:state_id":"26","name":"First United Methodist Church","religion":"christian"},"nodes":["n2199109640","n2199109642","n2199109645","n2199109648","n2199109650","n2199109652","n2199109654","n2199109656","n2199109658","n2199109660","n2199109662","n2199109665","n2199109667","n2199109669","n2199109671","n2199109673","n2199109640"]},"w201484341":{"id":"w201484341","version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:16Z","tags":{"amenity":"school","ele":"250","gnis:county_id":"149","gnis:created":"04/14/1980","gnis:edited":"02/22/2008","gnis:feature_id":"1624612","gnis:state_id":"26","name":"Hoppin School"},"nodes":["n354002838","n2114807579","n2114807573","n2114807590","n354002838"]},"w209717046":{"id":"w209717046","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109723","n2199109725","n2199109727","n2199109729","n2199109731","n2199109733","n2199109735","n2199109737","n2199109723"]},"w210822777":{"id":"w210822777","version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2208608806","n2208608808","n2208608811","n2208608821","n2208608823","n2208608825","n2208608806"]},"n185954965":{"id":"n185954965","loc":[-85.6191189,41.9441922],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{}},"n185954968":{"id":"n185954968","loc":[-85.6194384,41.9442405],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185954970":{"id":"n185954970","loc":[-85.6196543,41.9443252],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185954972":{"id":"n185954972","loc":[-85.6197862,41.9444539],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n354002931":{"id":"n354002931","loc":[-85.6198991,41.9455269],"version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n354030853":{"id":"n354030853","loc":[-85.6219444,41.9455556],"version":"3","changeset":"3908860","user":"Geogast","uid":"51045","visible":"true","timestamp":"2010-02-18T13:28:19Z","tags":{"amenity":"place_of_worship","ele":"246","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417869","gnis:state_id":"26","name":"Grant Chapel","religion":"christian"}},"n367815963":{"id":"n367815963","loc":[-85.6202778,41.9461111],"version":"1","changeset":"871579","user":"amillar","uid":"28145","visible":"true","timestamp":"2009-03-31T07:45:44Z","tags":{"addr:state":"MI","building":"yes","ele":"247","gnis:county_name":"St. Joseph","gnis:feature_id":"2418176","gnis:import_uuid":"57871b70-0100-4405-bb30-88b2e001a944","gnis:reviewed":"no","name":"George Washington Carver Community Center","source":"USGS Geonames"}},"n185947331":{"id":"n185947331","loc":[-85.618779,41.943269],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947333":{"id":"n185947333","loc":[-85.618795,41.943511],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947336":{"id":"n185947336","loc":[-85.618711,41.94413],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947338":{"id":"n185947338","loc":[-85.618704,41.944189],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947339":{"id":"n185947339","loc":[-85.618597,41.944337],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947340":{"id":"n185947340","loc":[-85.618485,41.944528],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947343":{"id":"n185947343","loc":[-85.618442,41.944716],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947345":{"id":"n185947345","loc":[-85.618457,41.945107],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947347":{"id":"n185947347","loc":[-85.618296,41.945338],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947374":{"id":"n185947374","loc":[-85.616748,41.944453],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947375":{"id":"n185947375","loc":[-85.616813,41.944646],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947376":{"id":"n185947376","loc":[-85.616859,41.945196],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:12Z","tags":{}},"n185947377":{"id":"n185947377","loc":[-85.616941,41.945352],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:12Z","tags":{}},"n185947406":{"id":"n185947406","loc":[-85.618184,41.944227],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947409":{"id":"n185947409","loc":[-85.617911,41.943875],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947410":{"id":"n185947410","loc":[-85.617579,41.943682],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947411":{"id":"n185947411","loc":[-85.61713,41.943589],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947412":{"id":"n185947412","loc":[-85.616549,41.943559],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947414":{"id":"n185947414","loc":[-85.616482,41.943556],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947464":{"id":"n185947464","loc":[-85.616526,41.943788],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:14Z","tags":{}},"n185947466":{"id":"n185947466","loc":[-85.616504,41.944002],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:14Z","tags":{}},"n185948863":{"id":"n185948863","loc":[-85.619017,41.943391],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:45Z","tags":{}},"n185948865":{"id":"n185948865","loc":[-85.619059,41.943368],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:45Z","tags":{}},"n185955022":{"id":"n185955022","loc":[-85.620088,41.945571],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:37Z","tags":{}},"n185955025":{"id":"n185955025","loc":[-85.620051,41.945505],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:37Z","tags":{}},"n185955028":{"id":"n185955028","loc":[-85.62001,41.94541],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:37Z","tags":{}},"n185980371":{"id":"n185980371","loc":[-85.620982,41.944742],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:37Z","tags":{}},"n185980398":{"id":"n185980398","loc":[-85.621305,41.944782],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980401":{"id":"n185980401","loc":[-85.621174,41.944819],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980403":{"id":"n185980403","loc":[-85.621029,41.944871],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980405":{"id":"n185980405","loc":[-85.620741,41.945011],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980407":{"id":"n185980407","loc":[-85.620616,41.945085],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980409":{"id":"n185980409","loc":[-85.620506,41.945172],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980411":{"id":"n185980411","loc":[-85.620394,41.945273],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980413":{"id":"n185980413","loc":[-85.620316,41.94536],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:39Z","tags":{}},"n185980415":{"id":"n185980415","loc":[-85.620257,41.945452],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:39Z","tags":{}},"n185980417":{"id":"n185980417","loc":[-85.620212,41.945535],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:39Z","tags":{}},"n185985910":{"id":"n185985910","loc":[-85.620101,41.945811],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:41Z","tags":{}},"n185985912":{"id":"n185985912","loc":[-85.620081,41.945937],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n1475283972":{"id":"n1475283972","loc":[-85.6198991,41.9437179],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:45Z","tags":{}},"n1475283982":{"id":"n1475283982","loc":[-85.6195022,41.9433463],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475284007":{"id":"n1475284007","loc":[-85.6193037,41.9433383],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284040":{"id":"n1475284040","loc":[-85.6197329,41.9434121],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284044":{"id":"n1475284044","loc":[-85.6198756,41.9435363],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284050":{"id":"n1475284050","loc":[-85.6199689,41.9432106],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:48Z","tags":{}},"n1475284053":{"id":"n1475284053","loc":[-85.6198943,41.9432921],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:48Z","tags":{}},"n185954974":{"id":"n185954974","loc":[-85.6198296,41.94473],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185954977":{"id":"n185954977","loc":[-85.6200474,41.9447384],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n2196831365":{"id":"n2196831365","loc":[-85.6202259,41.9460883],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831366":{"id":"n2196831366","loc":[-85.6202245,41.9458642],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831367":{"id":"n2196831367","loc":[-85.6205184,41.9458631],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831368":{"id":"n2196831368","loc":[-85.6205189,41.9459437],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831369":{"id":"n2196831369","loc":[-85.6203879,41.9459441],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831370":{"id":"n2196831370","loc":[-85.6203888,41.9460878],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831371":{"id":"n2196831371","loc":[-85.6184046,41.9465663],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831372":{"id":"n2196831372","loc":[-85.6191563,41.9465618],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831373":{"id":"n2196831373","loc":[-85.6191536,41.946319],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831374":{"id":"n2196831374","loc":[-85.6187356,41.9463216],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831375":{"id":"n2196831375","loc":[-85.6187334,41.9461197],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831376":{"id":"n2196831376","loc":[-85.6193167,41.9461162],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831377":{"id":"n2196831377","loc":[-85.6193156,41.9460229],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831378":{"id":"n2196831378","loc":[-85.619622,41.946021],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831379":{"id":"n2196831379","loc":[-85.6196237,41.9461712],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831380":{"id":"n2196831380","loc":[-85.6197702,41.9461703],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831381":{"id":"n2196831381","loc":[-85.6197685,41.9460202],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831382":{"id":"n2196831382","loc":[-85.6197323,41.9460204],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831383":{"id":"n2196831383","loc":[-85.6197305,41.9458563],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831384":{"id":"n2196831384","loc":[-85.6196165,41.945857],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831385":{"id":"n2196831385","loc":[-85.6196156,41.9457764],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831386":{"id":"n2196831386","loc":[-85.6194472,41.9457775],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831387":{"id":"n2196831387","loc":[-85.6194151,41.9457777],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831388":{"id":"n2196831388","loc":[-85.6183779,41.9457883],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831389":{"id":"n2196831389","loc":[-85.6183842,41.9461317],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831390":{"id":"n2196831390","loc":[-85.6185026,41.9461304],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831391":{"id":"n2196831391","loc":[-85.6185061,41.9463194],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831392":{"id":"n2196831392","loc":[-85.6184001,41.9463205],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831393":{"id":"n2196831393","loc":[-85.6182482,41.9464163],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831394":{"id":"n2196831394","loc":[-85.6182467,41.9463193],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831395":{"id":"n2196831395","loc":[-85.6180389,41.946321],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831397":{"id":"n2196831397","loc":[-85.6180404,41.946418],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n185947303":{"id":"n185947303","loc":[-85.611074,41.943389],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947304":{"id":"n185947304","loc":[-85.611332,41.943267],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947305":{"id":"n185947305","loc":[-85.611635,41.943218],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947306":{"id":"n185947306","loc":[-85.612762,41.943311],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947308":{"id":"n185947308","loc":[-85.613027,41.943327],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947310":{"id":"n185947310","loc":[-85.615377,41.942996],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947312":{"id":"n185947312","loc":[-85.615701,41.943007],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947314":{"id":"n185947314","loc":[-85.61604,41.943067],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947315":{"id":"n185947315","loc":[-85.61626,41.943083],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947316":{"id":"n185947316","loc":[-85.616507,41.943048],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947319":{"id":"n185947319","loc":[-85.616702,41.94299],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947321":{"id":"n185947321","loc":[-85.617078,41.942918],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947322":{"id":"n185947322","loc":[-85.617366,41.942973],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947323":{"id":"n185947323","loc":[-85.617601,41.943033],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947325":{"id":"n185947325","loc":[-85.617799,41.943027],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947327":{"id":"n185947327","loc":[-85.618264,41.942961],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947328":{"id":"n185947328","loc":[-85.618508,41.942972],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947329":{"id":"n185947329","loc":[-85.618707,41.943076],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947361":{"id":"n185947361","loc":[-85.615356,41.944922],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947363":{"id":"n185947363","loc":[-85.61536,41.944893],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947365":{"id":"n185947365","loc":[-85.615406,41.944547],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947367":{"id":"n185947367","loc":[-85.61548,41.944351],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947369":{"id":"n185947369","loc":[-85.615805,41.94419],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947371":{"id":"n185947371","loc":[-85.616166,41.944156],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947373":{"id":"n185947373","loc":[-85.616411,41.944197],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947416":{"id":"n185947416","loc":[-85.616335,41.94343],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947417":{"id":"n185947417","loc":[-85.616069,41.943293],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947419":{"id":"n185947419","loc":[-85.615803,41.943249],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947420":{"id":"n185947420","loc":[-85.615524,41.943342],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947421":{"id":"n185947421","loc":[-85.615311,41.94353],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947422":{"id":"n185947422","loc":[-85.614338,41.943558],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947423":{"id":"n185947423","loc":[-85.61422,41.94369],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947425":{"id":"n185947425","loc":[-85.614221,41.944224],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947427":{"id":"n185947427","loc":[-85.614198,41.944888],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947429":{"id":"n185947429","loc":[-85.614221,41.945439],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947468":{"id":"n185947468","loc":[-85.615908,41.944756],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:14Z","tags":{}},"n185947470":{"id":"n185947470","loc":[-85.615871,41.944888],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:14Z","tags":{}},"n185947472":{"id":"n185947472","loc":[-85.615878,41.94507],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:14Z","tags":{}},"n185955153":{"id":"n185955153","loc":[-85.620087,41.947701],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:39Z","tags":{}},"n185960690":{"id":"n185960690","loc":[-85.620141,41.951901],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:21Z","tags":{}},"n185978817":{"id":"n185978817","loc":[-85.617193,41.954706],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:35Z","tags":{}},"n185985916":{"id":"n185985916","loc":[-85.620088,41.94758],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985918":{"id":"n185985918","loc":[-85.620133,41.951538],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985919":{"id":"n185985919","loc":[-85.62013,41.952104],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985920":{"id":"n185985920","loc":[-85.620104,41.952305],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985921":{"id":"n185985921","loc":[-85.620062,41.952499],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985922":{"id":"n185985922","loc":[-85.619993,41.952702],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985925":{"id":"n185985925","loc":[-85.619879,41.952986],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985927":{"id":"n185985927","loc":[-85.619689,41.95329],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985928":{"id":"n185985928","loc":[-85.619508,41.953521],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985929":{"id":"n185985929","loc":[-85.619286,41.953728],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985930":{"id":"n185985930","loc":[-85.618925,41.954007],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985931":{"id":"n185985931","loc":[-85.618638,41.954189],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985932":{"id":"n185985932","loc":[-85.61831,41.954358],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985934":{"id":"n185985934","loc":[-85.618015,41.954485],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:43Z","tags":{}},"n185985936":{"id":"n185985936","loc":[-85.617606,41.954611],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:43Z","tags":{}},"n1475283975":{"id":"n1475283975","loc":[-85.6150935,41.9434118],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475283979":{"id":"n1475283979","loc":[-85.6193367,41.9430252],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475283989":{"id":"n1475283989","loc":[-85.6104771,41.9455269],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475283990":{"id":"n1475283990","loc":[-85.6104771,41.9437179],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475283994":{"id":"n1475283994","loc":[-85.6198042,41.9429763],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475283998":{"id":"n1475283998","loc":[-85.6192101,41.9426716],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475284000":{"id":"n1475284000","loc":[-85.6198622,41.942836],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475284002":{"id":"n1475284002","loc":[-85.6163262,41.9427688],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475284006":{"id":"n1475284006","loc":[-85.6179527,41.9429168],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284029":{"id":"n1475284029","loc":[-85.6197195,41.9427278],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284038":{"id":"n1475284038","loc":[-85.6194405,41.9427837],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284052":{"id":"n1475284052","loc":[-85.6153225,41.942841],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:48Z","tags":{}},"n1475284055":{"id":"n1475284055","loc":[-85.6129233,41.9437179],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:48Z","tags":{}},"n2139966627":{"id":"n2139966627","loc":[-85.61958,41.9427558],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"w17966773":{"id":"w17966773","version":"3","changeset":"2558583","user":"elliskev","uid":"163338","visible":"true","timestamp":"2009-09-21T16:12:43Z","tags":{"highway":"secondary","name":"E Michigan Ave","ref":"M 60","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_direction_prefix":"E","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313712","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980372","n185980398","n185980401","n185980403","n185980405","n185980407","n185980409","n185980411","n185980413","n185980415","n185980417","n185955019"]},"w17964043":{"id":"w17964043","version":"3","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:19Z","tags":{"highway":"residential","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326065:15326068","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185955019","n185955022","n185955025","n185955028","n185954977","n185971477","n1475284050","n1475284000","n1475284029","n2139966627","n1475284038"]},"w17962834":{"id":"w17962834","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:15Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313719:15313728:15331618","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185947316","n185947414","n185947464","n185947466","n185947373","n185947468","n185947470","n185947472","n185947474"]},"w209470310":{"id":"w209470310","version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:41Z","tags":{"area":"yes","building":"yes"},"nodes":["n2196831393","n2196831394","n2196831395","n2196831397","n2196831393"]},"w17963058":{"id":"w17963058","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:05Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326058:15326066:15326067","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185947333","n185948863","n185948865","n1475284007","n1475283982","n1475284040","n1475284044"]},"w17962823":{"id":"w17962823","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:14Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313714:15313704:15313720:15313721","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185947359","n185947361","n185947363","n185947365","n185947367","n185947369","n185947371","n185947373","n185947374","n185947375","n185947376","n185947377","n185947378"]},"w17962821":{"id":"w17962821","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:15Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313713:15313734:15313731:15313735:15313737:15313723","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185947303","n185947304","n185947305","n185947306","n185947308","n185947310","n185947312","n185947314","n185947315","n185947316","n185947319","n185947321","n185947322","n185947323","n185947325","n185947327","n185947328","n185947329","n185947331","n185947333","n185947336","n185947338","n185947339","n185947340","n185947343","n185947345","n185947347","n185947349"]},"w134150798":{"id":"w134150798","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:52Z","tags":{"amenity":"grave_yard","ele":"249","gnis:county_id":"149","gnis:created":"04/14/1980","gnis:feature_id":"1624862","gnis:state_id":"26","name":"Riverside Cemetery"},"nodes":["n354002931","n1475283972","n1475284053","n1475283994","n1475283979","n1475283998","n1475284006","n1475284002","n1475284052","n1475283975","n1475284055","n1475283990","n1475283989","n354002931"]},"w17964040":{"id":"w17964040","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:02Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326063:15326064","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185947336","n185954965","n185954968","n185954970","n185954972","n185954974","n185954977"]},"w209470308":{"id":"w209470308","version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:41Z","tags":{"area":"yes","building":"yes"},"nodes":["n2196831365","n2196831366","n2196831367","n2196831368","n2196831369","n2196831370","n2196831365"]},"w17962828":{"id":"w17962828","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:14Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313715:15313706:15328746:15313727:15313729","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185947340","n185947406","n185947409","n185947410","n185947411","n185947412","n185947414","n185947416","n185947417","n185947419","n185947420","n185947421","n185947422","n185947423","n185947425","n185947427","n185947429"]},"w209470309":{"id":"w209470309","version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:41Z","tags":{"area":"yes","building":"yes"},"nodes":["n2196831371","n2196831372","n2196831373","n2196831374","n2196831375","n2196831376","n2196831377","n2196831378","n2196831379","n2196831380","n2196831381","n2196831382","n2196831383","n2196831384","n2196831385","n2196831386","n2196831387","n2196831388","n2196831389","n2196831390","n2196831391","n2196831392","n2196831371"]},"w17967415":{"id":"w17967415","version":"3","changeset":"2558583","user":"elliskev","uid":"163338","visible":"true","timestamp":"2009-09-21T16:12:41Z","tags":{"highway":"secondary","name":"Jefferson St","name_1":"State Highway 60","ref":"M 60","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Jefferson","tiger:name_base_1":"State Highway 60","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313637:15313662:15313657:15328403","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093"},"nodes":["n185955019","n185985910","n185985912","n185985914","n185961367","n185985916","n185955153","n185965105","n185974697","n185955120","n185985918","n185960690","n185985919","n185985920","n185985921","n185985922","n185985925","n185985927","n185985928","n185985929","n185985930","n185985931","n185985932","n185985934","n185985936","n185978817"]},"w17966772":{"id":"w17966772","version":"4","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:07Z","tags":{"highway":"unclassified","name":"E Michigan Ave","name_1":"State Highway 60","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_direction_prefix":"E","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313710:15313711:15314052:15312385:15312378","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185954977","n185980371","n185980372"]},"n185958500":{"id":"n185958500","loc":[-85.621591,41.941075],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:27Z","tags":{}},"n185963110":{"id":"n185963110","loc":[-85.6204416,41.9408882],"version":"3","changeset":"15379124","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:38:37Z","tags":{}},"n2139966628":{"id":"n2139966628","loc":[-85.6196431,41.9426467],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{"leisure":"fishing"}},"n2139966630":{"id":"n2139966630","loc":[-85.6199354,41.9429616],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n2199127051":{"id":"n2199127051","loc":[-85.6170556,41.939696],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127052":{"id":"n2199127052","loc":[-85.6170536,41.9392909],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127053":{"id":"n2199127053","loc":[-85.6172067,41.9392905],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127054":{"id":"n2199127054","loc":[-85.6172061,41.9391853],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127055":{"id":"n2199127055","loc":[-85.6171481,41.9391854],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127060":{"id":"n2199127060","loc":[-85.6167389,41.9392896],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127061":{"id":"n2199127061","loc":[-85.6168728,41.9392892],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127062":{"id":"n2199127062","loc":[-85.6168747,41.9396965],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127071":{"id":"n2199127071","loc":[-85.620196,41.9399446],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127072":{"id":"n2199127072","loc":[-85.620193,41.9397316],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127073":{"id":"n2199127073","loc":[-85.6200381,41.9397328],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127074":{"id":"n2199127074","loc":[-85.6200412,41.9399458],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127075":{"id":"n2199127075","loc":[-85.6203606,41.9399939],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127076":{"id":"n2199127076","loc":[-85.6205527,41.9399922],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127077":{"id":"n2199127077","loc":[-85.6205482,41.9397115],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127078":{"id":"n2199127078","loc":[-85.6204132,41.9397124],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127079":{"id":"n2199127079","loc":[-85.6204144,41.9396341],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127080":{"id":"n2199127080","loc":[-85.6205699,41.9396324],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127081":{"id":"n2199127081","loc":[-85.6205722,41.939498],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127082":{"id":"n2199127082","loc":[-85.6204064,41.9394997],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127083":{"id":"n2199127083","loc":[-85.6204087,41.939561],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127084":{"id":"n2199127084","loc":[-85.6203103,41.9395618],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127085":{"id":"n2199127085","loc":[-85.620308,41.9396069],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127086":{"id":"n2199127086","loc":[-85.6200347,41.9396086],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127087":{"id":"n2199127087","loc":[-85.6200382,41.9397141],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127088":{"id":"n2199127088","loc":[-85.6202257,41.9397149],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127089":{"id":"n2199127089","loc":[-85.6202269,41.9399182],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127090":{"id":"n2199127090","loc":[-85.6203595,41.9399199],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127091":{"id":"n2199127091","loc":[-85.6212335,41.939688],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127092":{"id":"n2199127092","loc":[-85.6212328,41.939595],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127093":{"id":"n2199127093","loc":[-85.6208807,41.9395966],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127094":{"id":"n2199127094","loc":[-85.6208815,41.9396896],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127095":{"id":"n2199127095","loc":[-85.6208676,41.9396872],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127096":{"id":"n2199127096","loc":[-85.6208583,41.9393539],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127097":{"id":"n2199127097","loc":[-85.6207006,41.9393563],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127098":{"id":"n2199127098","loc":[-85.6207099,41.9396896],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n185967054":{"id":"n185967054","loc":[-85.6173384,41.9356126],"version":"3","changeset":"15379027","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:24:18Z","tags":{}},"n185967063":{"id":"n185967063","loc":[-85.617371,41.936243],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:53Z","tags":{}},"n185967065":{"id":"n185967065","loc":[-85.617337,41.936299],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:53Z","tags":{}},"n185967068":{"id":"n185967068","loc":[-85.617321,41.936373],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:53Z","tags":{}},"n185967070":{"id":"n185967070","loc":[-85.6173562,41.9366969],"version":"3","changeset":"15379027","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:24:18Z","tags":{}},"n185967074":{"id":"n185967074","loc":[-85.6173635,41.9377414],"version":"3","changeset":"15379027","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:24:18Z","tags":{}},"n185967075":{"id":"n185967075","loc":[-85.6173696,41.9381886],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:58Z","tags":{}},"n185967076":{"id":"n185967076","loc":[-85.617372,41.938535],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:54Z","tags":{}},"n2199127056":{"id":"n2199127056","loc":[-85.617147,41.9389616],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127057":{"id":"n2199127057","loc":[-85.6172136,41.9389614],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127058":{"id":"n2199127058","loc":[-85.6172123,41.9386909],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127059":{"id":"n2199127059","loc":[-85.616736,41.9386922],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2203921041":{"id":"n2203921041","loc":[-85.6173018,41.9346369],"version":"1","changeset":"15379027","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:24:18Z","tags":{}},"w203983952":{"id":"w203983952","version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{"highway":"service"},"nodes":["n2139966627","n1819800319"]},"w209718301":{"id":"w209718301","version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:21Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199127051","n2199127052","n2199127053","n2199127054","n2199127055","n2199127056","n2199127057","n2199127058","n2199127059","n2199127060","n2199127061","n2199127062","n2199127051"]},"w209718304":{"id":"w209718304","version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:21Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199127071","n2199127072","n2199127073","n2199127074","n2199127071"]},"w17964961":{"id":"w17964961","version":"2","changeset":"15379124","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:38:37Z","tags":{"highway":"residential","name":"Whipple St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Whipple","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093"},"nodes":["n185963099","n185963110"]},"w17964489":{"id":"w17964489","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:29:56Z","tags":{"highway":"residential","name":"Jackson St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Jackson","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314430","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185958498","n185958500"]},"w203983953":{"id":"w203983953","version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{"area":"yes","leisure":"park","name":"Marina Park","website":"http://www.threeriversmi.us/?page_id=53"},"nodes":["n1475283994","n1475283979","n1475283998","n2139966629","n2139966625","n1819800319","n2139966623","n2139966622","n2139966621","n2139966630","n1475283994"]},"w17965366":{"id":"w17965366","version":"2","changeset":"15379027","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:24:18Z","tags":{"highway":"residential","name":"14th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"14th","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n2203921041","n185967054","n185967063","n185967065","n185967068","n185967070","n185967074","n185967075","n185967076","n185967077"]},"w209718306":{"id":"w209718306","version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:21Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199127091","n2199127092","n2199127093","n2199127094","n2199127091"]},"w209718307":{"id":"w209718307","version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:21Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199127095","n2199127096","n2199127097","n2199127098","n2199127095"]},"w209718305":{"id":"w209718305","version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:21Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199127075","n2199127076","n2199127077","n2199127078","n2199127079","n2199127080","n2199127081","n2199127082","n2199127083","n2199127084","n2199127085","n2199127086","n2199127087","n2199127088","n2199127089","n2199127090","n2199127075"]},"n185960199":{"id":"n185960199","loc":[-85.62965,41.95469],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:08Z","tags":{}},"n185980737":{"id":"n185980737","loc":[-85.629083,41.953725],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:48Z","tags":{}},"n2114807561":{"id":"n2114807561","loc":[-85.6297681,41.9524688],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807597":{"id":"n2114807597","loc":[-85.6296517,41.952563],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n185960197":{"id":"n185960197","loc":[-85.629676,41.9537314],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185978791":{"id":"n185978791","loc":[-85.6244542,41.9547066],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"w17967573":{"id":"w17967573","version":"2","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:20Z","tags":{"highway":"residential","name":"E Wheeler St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Wheeler","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185960195","n2114807561","n185968102","n185967430","n185986157","n185978392"]},"w17966553":{"id":"w17966553","version":"5","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:22Z","tags":{"highway":"residential","name":"East Hoffman Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hoffman","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185971631","n185978784","n185967432","n185968106","n185960199","n185978787","n185978790","n185978791"]},"w17966787":{"id":"w17966787","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:23Z","tags":{"highway":"residential","name":"East Cushman Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Cushman","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185980735","n185980737","n185960197","n185968104","n185960792"]},"w17964723":{"id":"w17964723","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:22Z","tags":{"highway":"residential","name":"Cushman Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Cushman","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185960792","n185960794","n185960796"]},"w17964654":{"id":"w17964654","version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:22Z","tags":{"highway":"residential","name":"Pine Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Pine","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185960195","n2114807597","n185960197","n185960199"]},"n1819848862":{"id":"n1819848862","loc":[-85.6346087,41.9545845],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848935":{"id":"n1819848935","loc":[-85.6345948,41.9537717],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848973":{"id":"n1819848973","loc":[-85.6334247,41.9537827],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848997":{"id":"n1819848997","loc":[-85.6334386,41.9545956],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n2189015861":{"id":"n2189015861","loc":[-85.6375906,41.954836],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015865":{"id":"n2189015865","loc":[-85.6383307,41.9548291],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015867":{"id":"n2189015867","loc":[-85.6383337,41.9550072],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015868":{"id":"n2189015868","loc":[-85.6380986,41.9550094],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015869":{"id":"n2189015869","loc":[-85.6381005,41.9551226],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2199109808":{"id":"n2199109808","loc":[-85.6372702,41.9522894],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109810":{"id":"n2199109810","loc":[-85.6372677,41.9521583],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109812":{"id":"n2199109812","loc":[-85.6369505,41.9521617],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109814":{"id":"n2199109814","loc":[-85.636953,41.9522927],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n185952156":{"id":"n185952156","loc":[-85.640983,41.9546557],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185953423":{"id":"n185953423","loc":[-85.641871,41.954652],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:56Z","tags":{}},"n185971637":{"id":"n185971637","loc":[-85.641583,41.95465],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:06Z","tags":{}},"n185971639":{"id":"n185971639","loc":[-85.6421344,41.9546444],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185971642":{"id":"n185971642","loc":[-85.6428264,41.9545612],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185971648":{"id":"n185971648","loc":[-85.6436023,41.9544262],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185975066":{"id":"n185975066","loc":[-85.640532,41.953638],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:49Z","tags":{}},"n185975067":{"id":"n185975067","loc":[-85.64079,41.953638],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:49Z","tags":{}},"n185982166":{"id":"n185982166","loc":[-85.6399012,41.9523817],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n2189015858":{"id":"n2189015858","loc":[-85.6376104,41.9560138],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015870":{"id":"n2189015870","loc":[-85.6386794,41.9551172],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015871":{"id":"n2189015871","loc":[-85.6386817,41.955256],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015873":{"id":"n2189015873","loc":[-85.6385437,41.9552573],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015876":{"id":"n2189015876","loc":[-85.638555,41.9559278],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015879":{"id":"n2189015879","loc":[-85.6384954,41.9559283],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015882":{"id":"n2189015882","loc":[-85.6384965,41.9559935],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015885":{"id":"n2189015885","loc":[-85.6383533,41.9559949],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015888":{"id":"n2189015888","loc":[-85.638351,41.9558607],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015891":{"id":"n2189015891","loc":[-85.6382178,41.9558619],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015894":{"id":"n2189015894","loc":[-85.6382203,41.956008],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"w208627223":{"id":"w208627223","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015858","n2189015861","n2189015865","n2189015867","n2189015868","n2189015869","n2189015870","n2189015871","n2189015873","n2189015876","n2189015879","n2189015882","n2189015885","n2189015888","n2189015891","n2189015894","n2189015858"]},"w170848328":{"id":"w170848328","version":"2","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:18Z","tags":{"ele":"250","gnis:county_id":"149","gnis:created":"04/14/1980","gnis:feature_id":"1624408","gnis:state_id":"26","leisure":"park","name":"Bowman Park","source":"Bing"},"nodes":["n1819848935","n1819848973","n1819848997","n1819848862","n1819848935"]},"w17965866":{"id":"w17965866","version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:23Z","tags":{"highway":"residential","name":"West Hoffman Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hoffman","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185971631","n185971632","n185964359","n185965025","n1475293264","n185952156","n185971637","n185953423","n185971639","n185971642","n185971648"]},"w209717051":{"id":"w209717051","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"amenity":"place_of_worship","area":"yes","building":"yes","denomination":"baptist","ele":"251","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417886","gnis:state_id":"26","name":"Calvary Missionary Baptist Church","religion":"christian"},"nodes":["n2199109808","n2199109810","n2199109812","n2199109814","n2199109808"]},"w17966172":{"id":"w17966172","version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:23Z","tags":{"highway":"residential","name":"West Cushman Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Cushman","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185960796","n185975064","n185964358","n185965023","n1475293222","n185975066","n185975067"]},"w17966975":{"id":"w17966975","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:55:06Z","tags":{"highway":"residential","name":"W Wheeler St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Wheeler","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312250:15312254","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185978392","n185982163","n185964357","n185965021","n1475293261","n185982166"]},"n185960684":{"id":"n185960684","loc":[-85.622687,41.951885],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:21Z","tags":{}},"n185960686":{"id":"n185960686","loc":[-85.622492,41.951901],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:21Z","tags":{}},"n185978795":{"id":"n185978795","loc":[-85.6240991,41.954708],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185978803":{"id":"n185978803","loc":[-85.623348,41.954547],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185978806":{"id":"n185978806","loc":[-85.623123,41.954502],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185978808":{"id":"n185978808","loc":[-85.622923,41.954469],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185978810":{"id":"n185978810","loc":[-85.622787,41.954457],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:35Z","tags":{}},"n185978811":{"id":"n185978811","loc":[-85.622612,41.954458],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:35Z","tags":{}},"n185978813":{"id":"n185978813","loc":[-85.622368,41.954472],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:35Z","tags":{}},"n1819790545":{"id":"n1819790545","loc":[-85.6240295,41.9548949],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790621":{"id":"n1819790621","loc":[-85.6235789,41.954855],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790664":{"id":"n1819790664","loc":[-85.6238363,41.9549507],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790683":{"id":"n1819790683","loc":[-85.6224727,41.9545921],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790730":{"id":"n1819790730","loc":[-85.6227527,41.9545795],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790740":{"id":"n1819790740","loc":[-85.6240402,41.9550784],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790831":{"id":"n1819790831","loc":[-85.624126,41.9549986],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790861":{"id":"n1819790861","loc":[-85.6231712,41.9546872],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790887":{"id":"n1819790887","loc":[-85.6242762,41.955206],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n2168544739":{"id":"n2168544739","loc":[-85.6249102,41.952801],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544740":{"id":"n2168544740","loc":[-85.6251859,41.9527564],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544741":{"id":"n2168544741","loc":[-85.6255515,41.9527921],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544742":{"id":"n2168544742","loc":[-85.626001,41.9529481],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544743":{"id":"n2168544743","loc":[-85.6265284,41.9529838],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544744":{"id":"n2168544744","loc":[-85.626942,41.9528857],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544745":{"id":"n2168544745","loc":[-85.6270918,41.9526851],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544746":{"id":"n2168544746","loc":[-85.6272117,41.95244],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544747":{"id":"n2168544747","loc":[-85.6271578,41.952226],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544748":{"id":"n2168544748","loc":[-85.6270019,41.9519719],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544749":{"id":"n2168544749","loc":[-85.6268221,41.9518382],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544750":{"id":"n2168544750","loc":[-85.6265284,41.951807],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544751":{"id":"n2168544751","loc":[-85.6256534,41.9518516],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544752":{"id":"n2168544752","loc":[-85.6253477,41.9518338],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544753":{"id":"n2168544753","loc":[-85.6251139,41.9517669],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n185955747":{"id":"n185955747","loc":[-85.620674,41.954709],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:55Z","tags":{}},"n185960688":{"id":"n185960688","loc":[-85.621032,41.951913],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:21Z","tags":{}},"n185972054":{"id":"n185972054","loc":[-85.6186728,41.9547335],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185978814":{"id":"n185978814","loc":[-85.6201708,41.9547403],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:05Z","tags":{}},"n1819790532":{"id":"n1819790532","loc":[-85.6244908,41.9555731],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790536":{"id":"n1819790536","loc":[-85.6217925,41.9583135],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790538":{"id":"n1819790538","loc":[-85.6233954,41.9600014],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790539":{"id":"n1819790539","loc":[-85.6204611,41.9562117],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790546":{"id":"n1819790546","loc":[-85.6210898,41.9567657],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790548":{"id":"n1819790548","loc":[-85.6202465,41.9562237],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790550":{"id":"n1819790550","loc":[-85.6250165,41.9560677],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790551":{"id":"n1819790551","loc":[-85.6227946,41.9597023],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790553":{"id":"n1819790553","loc":[-85.6215726,41.9584571],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790556":{"id":"n1819790556","loc":[-85.6196306,41.9573002],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790557":{"id":"n1819790557","loc":[-85.6209503,41.9563109],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790558":{"id":"n1819790558","loc":[-85.6196939,41.9574085],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790561":{"id":"n1819790561","loc":[-85.621079,41.957751],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790562":{"id":"n1819790562","loc":[-85.6224255,41.9611417],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790565":{"id":"n1819790565","loc":[-85.6232506,41.9604841],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790566":{"id":"n1819790566","loc":[-85.6190835,41.9562909],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790567":{"id":"n1819790567","loc":[-85.622227,41.9593028],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790569":{"id":"n1819790569","loc":[-85.620976,41.9591039],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790571":{"id":"n1819790571","loc":[-85.6212078,41.9565303],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790572":{"id":"n1819790572","loc":[-85.6235306,41.9595102],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790581":{"id":"n1819790581","loc":[-85.6235563,41.9579351],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790584":{"id":"n1819790584","loc":[-85.6230371,41.9574598],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790586":{"id":"n1819790586","loc":[-85.6211748,41.9564272],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790588":{"id":"n1819790588","loc":[-85.6226508,41.9601086],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790591":{"id":"n1819790591","loc":[-85.6218032,41.9607468],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790593":{"id":"n1819790593","loc":[-85.6207915,41.9618735],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790596":{"id":"n1819790596","loc":[-85.6252955,41.9567858],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790598":{"id":"n1819790598","loc":[-85.6196618,41.9568939],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790600":{"id":"n1819790600","loc":[-85.6224416,41.9587084],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790602":{"id":"n1819790602","loc":[-85.6217442,41.9558641],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790603":{"id":"n1819790603","loc":[-85.6213355,41.9592116],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790604":{"id":"n1819790604","loc":[-85.622801,41.9573042],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790608":{"id":"n1819790608","loc":[-85.6199729,41.9574325],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790610":{"id":"n1819790610","loc":[-85.6195555,41.9557165],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790611":{"id":"n1819790611","loc":[-85.622978,41.9586007],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790613":{"id":"n1819790613","loc":[-85.6253963,41.9562636],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790614":{"id":"n1819790614","loc":[-85.6235252,41.9580342],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790616":{"id":"n1819790616","loc":[-85.6232988,41.9596305],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790617":{"id":"n1819790617","loc":[-85.6226776,41.9598732],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790619":{"id":"n1819790619","loc":[-85.625553,41.9561794],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790620":{"id":"n1819790620","loc":[-85.6235574,41.959231],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790624":{"id":"n1819790624","loc":[-85.6228429,41.9573726],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790626":{"id":"n1819790626","loc":[-85.6193785,41.9556766],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790628":{"id":"n1819790628","loc":[-85.620092,41.9554253],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790630":{"id":"n1819790630","loc":[-85.6226658,41.9604402],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790638":{"id":"n1819790638","loc":[-85.6219964,41.9602561],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790640":{"id":"n1819790640","loc":[-85.6232731,41.9599969],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790643":{"id":"n1819790643","loc":[-85.6247698,41.9568895],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790650":{"id":"n1819790650","loc":[-85.6216412,41.9550149],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790652":{"id":"n1819790652","loc":[-85.6224952,41.9603918],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790656":{"id":"n1819790656","loc":[-85.61918,41.9555649],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790661":{"id":"n1819790661","loc":[-85.6200169,41.955505],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790662":{"id":"n1819790662","loc":[-85.6217389,41.9563149],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790666":{"id":"n1819790666","loc":[-85.6229566,41.9598373],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790667":{"id":"n1819790667","loc":[-85.6209117,41.9609189],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790669":{"id":"n1819790669","loc":[-85.6252311,41.9562353],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790670":{"id":"n1819790670","loc":[-85.6209758,41.961868],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790672":{"id":"n1819790672","loc":[-85.6209557,41.9589078],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790673":{"id":"n1819790673","loc":[-85.6190352,41.9561393],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790675":{"id":"n1819790675","loc":[-85.6236432,41.9586685],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790676":{"id":"n1819790676","loc":[-85.6194901,41.9565389],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790678":{"id":"n1819790678","loc":[-85.6219266,41.9582417],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790680":{"id":"n1819790680","loc":[-85.6208258,41.9557211],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790681":{"id":"n1819790681","loc":[-85.6212024,41.9613212],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790682":{"id":"n1819790682","loc":[-85.624877,41.9559401],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790684":{"id":"n1819790684","loc":[-85.6206499,41.9583693],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790699":{"id":"n1819790699","loc":[-85.6215243,41.956279],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790701":{"id":"n1819790701","loc":[-85.6246625,41.9559321],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790703":{"id":"n1819790703","loc":[-85.6230478,41.9585089],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790708":{"id":"n1819790708","loc":[-85.6211102,41.9575402],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790710":{"id":"n1819790710","loc":[-85.6215082,41.9548468],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790711":{"id":"n1819790711","loc":[-85.6206552,41.9586007],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790713":{"id":"n1819790713","loc":[-85.6215404,41.9549705],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790715":{"id":"n1819790715","loc":[-85.6216906,41.955521],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790717":{"id":"n1819790717","loc":[-85.6215404,41.9547391],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790722":{"id":"n1819790722","loc":[-85.6219964,41.9599131],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790723":{"id":"n1819790723","loc":[-85.622286,41.9606989],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790725":{"id":"n1819790725","loc":[-85.6228439,41.9572005],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790727":{"id":"n1819790727","loc":[-85.6202518,41.9554458],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790728":{"id":"n1819790728","loc":[-85.623434,41.9575276],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790729":{"id":"n1819790729","loc":[-85.6234287,41.9568576],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790732":{"id":"n1819790732","loc":[-85.6229566,41.9571369],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790733":{"id":"n1819790733","loc":[-85.6225543,41.9590275],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790734":{"id":"n1819790734","loc":[-85.6232892,41.9583135],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790736":{"id":"n1819790736","loc":[-85.622977,41.9608551],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790737":{"id":"n1819790737","loc":[-85.624008,41.9569533],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790741":{"id":"n1819790741","loc":[-85.6212775,41.9608545],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790742":{"id":"n1819790742","loc":[-85.6231282,41.9569932],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790743":{"id":"n1819790743","loc":[-85.6224523,41.9591831],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790744":{"id":"n1819790744","loc":[-85.6210951,41.9610819],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790745":{"id":"n1819790745","loc":[-85.6220114,41.960544],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790755":{"id":"n1819790755","loc":[-85.6216369,41.9553854],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790757":{"id":"n1819790757","loc":[-85.6209986,41.9592709],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790758":{"id":"n1819790758","loc":[-85.6200437,41.9563468],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790764":{"id":"n1819790764","loc":[-85.6219363,41.9596823],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790765":{"id":"n1819790765","loc":[-85.6237612,41.9568496],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790769":{"id":"n1819790769","loc":[-85.6212389,41.9593433],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790771":{"id":"n1819790771","loc":[-85.6210726,41.9560123],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790772":{"id":"n1819790772","loc":[-85.6212711,41.9561838],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790776":{"id":"n1819790776","loc":[-85.6234437,41.9577795],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790777":{"id":"n1819790777","loc":[-85.6212502,41.9618599],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790783":{"id":"n1819790783","loc":[-85.6216895,41.9610585],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790784":{"id":"n1819790784","loc":[-85.6200115,41.9556367],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790785":{"id":"n1819790785","loc":[-85.6210576,41.9573002],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790786":{"id":"n1819790786","loc":[-85.621138,41.9576632],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790788":{"id":"n1819790788","loc":[-85.6207733,41.9578946],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790789":{"id":"n1819790789","loc":[-85.6200705,41.9571566],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790790":{"id":"n1819790790","loc":[-85.6245337,41.9558443],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790792":{"id":"n1819790792","loc":[-85.621932,41.9608066],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790793":{"id":"n1819790793","loc":[-85.6233578,41.9581385],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790794":{"id":"n1819790794","loc":[-85.6204557,41.9555136],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790797":{"id":"n1819790797","loc":[-85.6235038,41.9576074],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790800":{"id":"n1819790800","loc":[-85.6214438,41.9607508],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790801":{"id":"n1819790801","loc":[-85.623492,41.9602129],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790802":{"id":"n1819790802","loc":[-85.6216691,41.9546553],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790803":{"id":"n1819790803","loc":[-85.6231057,41.9586851],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790804":{"id":"n1819790804","loc":[-85.6209224,41.9578673],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790813":{"id":"n1819790813","loc":[-85.620092,41.9572962],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790814":{"id":"n1819790814","loc":[-85.6216691,41.9552218],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790816":{"id":"n1819790816","loc":[-85.6216144,41.9609668],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790818":{"id":"n1819790818","loc":[-85.6216906,41.9557324],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790820":{"id":"n1819790820","loc":[-85.6192069,41.9564186],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790823":{"id":"n1819790823","loc":[-85.6211155,41.9566027],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790825":{"id":"n1819790825","loc":[-85.6233106,41.9569294],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790839":{"id":"n1819790839","loc":[-85.625671,41.9564986],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790842":{"id":"n1819790842","loc":[-85.6235252,41.9567379],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790844":{"id":"n1819790844","loc":[-85.6253813,41.9566342],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790847":{"id":"n1819790847","loc":[-85.6200963,41.9567702],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790849":{"id":"n1819790849","loc":[-85.6238031,41.9587449],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790851":{"id":"n1819790851","loc":[-85.6234984,41.9584571],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790856":{"id":"n1819790856","loc":[-85.6242226,41.9570092],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790865":{"id":"n1819790865","loc":[-85.6200265,41.9569458],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790869":{"id":"n1819790869","loc":[-85.6230049,41.9601245],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790871":{"id":"n1819790871","loc":[-85.6190727,41.9558322],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790873":{"id":"n1819790873","loc":[-85.6217442,41.9550104],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790875":{"id":"n1819790875","loc":[-85.6208044,41.9587808],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790879":{"id":"n1819790879","loc":[-85.6198444,41.9574484],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790883":{"id":"n1819790883","loc":[-85.623713,41.9588719],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790885":{"id":"n1819790885","loc":[-85.6223289,41.9605075],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790889":{"id":"n1819790889","loc":[-85.6208044,41.9562437],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790893":{"id":"n1819790893","loc":[-85.6218183,41.9559684],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790906":{"id":"n1819790906","loc":[-85.6214052,41.958697],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790913":{"id":"n1819790913","loc":[-85.6209981,41.9609957],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790917":{"id":"n1819790917","loc":[-85.6216208,41.9604436],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790919":{"id":"n1819790919","loc":[-85.6209406,41.9616373],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790920":{"id":"n1819790920","loc":[-85.6221948,41.9583334],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790922":{"id":"n1819790922","loc":[-85.6216681,41.9615292],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790924":{"id":"n1819790924","loc":[-85.6210147,41.9570489],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:02Z","tags":{}},"n1819790929":{"id":"n1819790929","loc":[-85.6193678,41.955521],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:02Z","tags":{}},"w17964707":{"id":"w17964707","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:31:34Z","tags":{"highway":"residential","name":"11th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"11th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314405","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185960682","n185960684","n185960686","n185960688","n185960690"]},"w201484345":{"id":"w201484345","version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:16Z","tags":{"bridge":"yes","highway":"residential","name":"E Hoffman St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hoffman","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185978791","n185978795"]},"w201484348":{"id":"w201484348","version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:16Z","tags":{"highway":"residential","name":"E Hoffman St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hoffman","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185978795","n185978800","n185978803","n185978806","n185978808","n185978810","n185978811","n185978813","n185955747","n185978814","n185972054","n185978817"]},"w170843845":{"id":"w170843845","version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:23Z","tags":{"ele":"244","gnis:county_id":"149","gnis:created":"04/14/1980","gnis:feature_id":"1624607","gnis:state_id":"26","landuse":"reservoir","name":"Hoffman Pond","natural":"water","source":"Bing"},"nodes":["n1819790732","n1819790742","n1819790825","n1819790729","n1819790842","n1819790765","n1819790737","n1819790856","n1819790643","n1819790596","n1819790844","n1819790839","n1819849190","n1819790619","n1819790613","n1819790669","n1819790550","n1819790682","n1819790701","n1819790790","n1819790532","n1819790887","n1819790740","n1819790831","n1819790545","n1819790664","n1819790621","n1819790861","n1819790730","n1819790683","n1819790802","n1819790717","n1819790710","n1819790713","n1819790650","n1819790873","n1819790814","n1819790755","n1819790715","n1819790818","n1819790602","n1819790893","n1819790662","n1819790699","n1819790772","n1819790771","n1819790680","n1819790794","n1819790727","n1819790628","n1819790661","n1819790784","n1819790610","n1819790626","n1819790929","n1819790656","n1819790871","n1819790673","n1819790566","n1819790820","n1819790676","n1819790598","n1819790556","n1819790558","n1819790879","n1819790608","n1819790813","n1819790789","n1819790865","n1819790847","n1819790758","n1819790548","n1819790539","n1819790889","n1819790557","n1819790586","n1819790571","n1819790823","n1819790546","n1819790924","n1819790785","n1819790708","n1819790786","n1819790561","n1819790804","n1819790788","n1819790684","n1819790711","n1819790875","n1819790672","n1819790569","n1819790757","n1819790769","n1819790603","n1819790906","n1819790553","n1819790536","n1819790678","n1819790920","n1819790600","n1819790733","n1819790743","n1819790567","n1819790764","n1819790722","n1819790638","n1819790917","n1819790800","n1819790741","n1819790667","n1819790913","n1819790744","n1819790816","n1819790591","n1819790745","n1819790885","n1819790652","n1819790588","n1819790617","n1819790551","n1819790666","n1819790869","n1819790630","n1819790723","n1819790792","n1819790783","n1819790681","n1819790919","n1819790593","n1819790670","n1819790777","n1819790922","n1819790562","n1819790736","n1819790565","n1819790801","n1819790538","n1819790640","n1819790616","n1819790572","n1819790620","n1819790883","n1819790849","n1819790675","n1819790851","n1819790803","n1819790611","n1819790703","n1819790734","n1819790793","n1819790614","n1819790581","n1819790776","n1819790797","n1819790728","n1819790584","n1819790624","n1819790604","n1819790725","n1819790732"]},"w206805240":{"id":"w206805240","version":"2","changeset":"15306846","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-09T19:50:50Z","tags":{"waterway":"river"},"nodes":["n2168544738","n2168544739","n2168544740","n2168544741","n2168544742","n2168544743","n2168544744","n2168544745","n2168544746","n2168544747","n2168544748","n2168544749","n2168544750","n2168544751","n2168544752","n2168544753","n1819848944"]},"n394490429":{"id":"n394490429","loc":[-85.643883,41.954365],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n185953421":{"id":"n185953421","loc":[-85.641876,41.954946],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:56Z","tags":{}},"n185953417":{"id":"n185953417","loc":[-85.6418306,41.9551597],"version":"3","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:55Z","tags":{}},"n185977233":{"id":"n185977233","loc":[-85.642987,41.95486],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:49Z","tags":{}},"n185977232":{"id":"n185977232","loc":[-85.642894,41.9547842],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n1475293244":{"id":"n1475293244","loc":[-85.63974,41.9521543],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1819848890":{"id":"n1819848890","loc":[-85.6410004,41.9552822],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848965":{"id":"n1819848965","loc":[-85.6409795,41.9553892],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n2189015846":{"id":"n2189015846","loc":[-85.6420457,41.9549528],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015849":{"id":"n2189015849","loc":[-85.6425867,41.9551392],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015852":{"id":"n2189015852","loc":[-85.6426877,41.9549771],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2199109816":{"id":"n2199109816","loc":[-85.6399215,41.9540925],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109818":{"id":"n2199109818","loc":[-85.6399182,41.9538236],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109820":{"id":"n2199109820","loc":[-85.6402201,41.9538216],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109822":{"id":"n2199109822","loc":[-85.640222,41.9539771],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109825":{"id":"n2199109825","loc":[-85.6402904,41.9539766],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109827":{"id":"n2199109827","loc":[-85.6402918,41.95409],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109829":{"id":"n2199109829","loc":[-85.6395845,41.9544626],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109831":{"id":"n2199109831","loc":[-85.6395792,41.9540671],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109833":{"id":"n2199109833","loc":[-85.6397173,41.9540661],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109835":{"id":"n2199109835","loc":[-85.6397226,41.9544616],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109837":{"id":"n2199109837","loc":[-85.6399641,41.9545058],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109839":{"id":"n2199109839","loc":[-85.6399637,41.9541859],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109841":{"id":"n2199109841","loc":[-85.6401098,41.9541858],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109843":{"id":"n2199109843","loc":[-85.64011,41.9543272],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109845":{"id":"n2199109845","loc":[-85.6400783,41.9543273],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109847":{"id":"n2199109847","loc":[-85.6400785,41.9545058],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109853":{"id":"n2199109853","loc":[-85.6396184,41.9554049],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109855":{"id":"n2199109855","loc":[-85.6396825,41.9553713],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n185949745":{"id":"n185949745","loc":[-85.6442727,41.9553112],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185949748":{"id":"n185949748","loc":[-85.6448804,41.9555238],"version":"3","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:55Z","tags":{}},"n185949755":{"id":"n185949755","loc":[-85.6420011,41.9603536],"version":"3","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{}},"n185949763":{"id":"n185949763","loc":[-85.6408843,41.9555822],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185949765":{"id":"n185949765","loc":[-85.6414548,41.9557751],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185952158":{"id":"n185952158","loc":[-85.640066,41.956854],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:10Z","tags":{}},"n185952160":{"id":"n185952160","loc":[-85.639848,41.957229],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:10Z","tags":{}},"n185952161":{"id":"n185952161","loc":[-85.6396089,41.9576192],"version":"3","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:55Z","tags":{}},"n185952163":{"id":"n185952163","loc":[-85.63892,41.957957],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:10Z","tags":{}},"n185953413":{"id":"n185953413","loc":[-85.64162,41.955475],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:56Z","tags":{}},"n185971651":{"id":"n185971651","loc":[-85.6440766,41.9543462],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185977234":{"id":"n185977234","loc":[-85.645044,41.955581],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:49Z","tags":{}},"n394490395":{"id":"n394490395","loc":[-85.657336,41.936762],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490396":{"id":"n394490396","loc":[-85.653896,41.936978],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490397":{"id":"n394490397","loc":[-85.653732,41.937386],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490398":{"id":"n394490398","loc":[-85.65182,41.937378],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490399":{"id":"n394490399","loc":[-85.651843,41.938445],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490400":{"id":"n394490400","loc":[-85.652536,41.938447],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490401":{"id":"n394490401","loc":[-85.652533,41.938901],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490402":{"id":"n394490402","loc":[-85.652084,41.9389],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490403":{"id":"n394490403","loc":[-85.6521,41.939627],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490404":{"id":"n394490404","loc":[-85.652301,41.939628],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490405":{"id":"n394490405","loc":[-85.652302,41.939755],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490406":{"id":"n394490406","loc":[-85.652783,41.939747],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490407":{"id":"n394490407","loc":[-85.652835,41.94112],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490408":{"id":"n394490408","loc":[-85.651968,41.941123],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490409":{"id":"n394490409","loc":[-85.651983,41.941969],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490410":{"id":"n394490410","loc":[-85.652908,41.941961],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490411":{"id":"n394490411","loc":[-85.65292,41.94278],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490412":{"id":"n394490412","loc":[-85.651698,41.942816],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490413":{"id":"n394490413","loc":[-85.651509,41.942823],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490414":{"id":"n394490414","loc":[-85.651272,41.942837],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490415":{"id":"n394490415","loc":[-85.651272,41.943325],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490416":{"id":"n394490416","loc":[-85.65122,41.944053],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490417":{"id":"n394490417","loc":[-85.651193,41.944449],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490418":{"id":"n394490418","loc":[-85.651088,41.944969],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490419":{"id":"n394490419","loc":[-85.650949,41.945554],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490420":{"id":"n394490420","loc":[-85.650907,41.945719],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490421":{"id":"n394490421","loc":[-85.650808,41.946016],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490422":{"id":"n394490422","loc":[-85.650712,41.946516],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490423":{"id":"n394490423","loc":[-85.650493,41.947166],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490424":{"id":"n394490424","loc":[-85.650626,41.947213],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490425":{"id":"n394490425","loc":[-85.650201,41.948109],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490426":{"id":"n394490426","loc":[-85.649868,41.948797],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490427":{"id":"n394490427","loc":[-85.649669,41.949161],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490428":{"id":"n394490428","loc":[-85.64659,41.954067],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490430":{"id":"n394490430","loc":[-85.644034,41.95444],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490431":{"id":"n394490431","loc":[-85.644248,41.954507],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490432":{"id":"n394490432","loc":[-85.64491,41.954481],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490433":{"id":"n394490433","loc":[-85.645213,41.954433],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490434":{"id":"n394490434","loc":[-85.645426,41.954477],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490435":{"id":"n394490435","loc":[-85.6458,41.954704],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490436":{"id":"n394490436","loc":[-85.64605,41.954804],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490437":{"id":"n394490437","loc":[-85.646125,41.954817],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490438":{"id":"n394490438","loc":[-85.646002,41.954997],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490439":{"id":"n394490439","loc":[-85.645764,41.955366],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490440":{"id":"n394490440","loc":[-85.645525,41.955734],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490441":{"id":"n394490441","loc":[-85.64443,41.957424],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490442":{"id":"n394490442","loc":[-85.641712,41.961723],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490443":{"id":"n394490443","loc":[-85.640747,41.963246],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490444":{"id":"n394490444","loc":[-85.637803,41.967894],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490445":{"id":"n394490445","loc":[-85.637673,41.967861],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490446":{"id":"n394490446","loc":[-85.636637,41.969275],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490447":{"id":"n394490447","loc":[-85.634923,41.969269],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490448":{"id":"n394490448","loc":[-85.634893,41.968537],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490449":{"id":"n394490449","loc":[-85.634544,41.96927],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490450":{"id":"n394490450","loc":[-85.630835,41.969274],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490451":{"id":"n394490451","loc":[-85.630834,41.968348],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490452":{"id":"n394490452","loc":[-85.630857,41.968179],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490453":{"id":"n394490453","loc":[-85.630924,41.968044],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490454":{"id":"n394490454","loc":[-85.631004,41.967925],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490455":{"id":"n394490455","loc":[-85.631143,41.967811],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490456":{"id":"n394490456","loc":[-85.631311,41.967736],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490457":{"id":"n394490457","loc":[-85.631595,41.967693],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490458":{"id":"n394490458","loc":[-85.63325,41.967702],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490459":{"id":"n394490459","loc":[-85.633247,41.967021],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490460":{"id":"n394490460","loc":[-85.634858,41.967021],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490461":{"id":"n394490461","loc":[-85.634865,41.967711],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490462":{"id":"n394490462","loc":[-85.634884,41.968231],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490463":{"id":"n394490463","loc":[-85.636559,41.963867],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490464":{"id":"n394490464","loc":[-85.634832,41.963866],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490465":{"id":"n394490465","loc":[-85.63481,41.961899],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490466":{"id":"n394490466","loc":[-85.637219,41.961842],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490467":{"id":"n394490467","loc":[-85.637837,41.960019],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490468":{"id":"n394490468","loc":[-85.637459,41.960022],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490469":{"id":"n394490469","loc":[-85.635295,41.959987],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490470":{"id":"n394490470","loc":[-85.634783,41.959979],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490471":{"id":"n394490471","loc":[-85.634776,41.959834],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490472":{"id":"n394490472","loc":[-85.634767,41.959009],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490473":{"id":"n394490473","loc":[-85.634763,41.958292],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490474":{"id":"n394490474","loc":[-85.633346,41.958287],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490475":{"id":"n394490475","loc":[-85.632128,41.9583],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490476":{"id":"n394490476","loc":[-85.631414,41.958318],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490477":{"id":"n394490477","loc":[-85.63137,41.959033],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490478":{"id":"n394490478","loc":[-85.631325,41.959753],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490479":{"id":"n394490479","loc":[-85.631494,41.95977],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490480":{"id":"n394490480","loc":[-85.631456,41.960673],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490481":{"id":"n394490481","loc":[-85.631421,41.961494],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490482":{"id":"n394490482","loc":[-85.631404,41.961887],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490483":{"id":"n394490483","loc":[-85.631401,41.961968],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490484":{"id":"n394490484","loc":[-85.630962,41.961967],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490485":{"id":"n394490485","loc":[-85.6299,41.961973],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490486":{"id":"n394490486","loc":[-85.624929,41.962002],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490487":{"id":"n394490487","loc":[-85.623333,41.961987],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490488":{"id":"n394490488","loc":[-85.621894,41.963956],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490489":{"id":"n394490489","loc":[-85.62131,41.963727],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490490":{"id":"n394490490","loc":[-85.621216,41.963868],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490491":{"id":"n394490491","loc":[-85.620356,41.965119],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490492":{"id":"n394490492","loc":[-85.620848,41.965341],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490493":{"id":"n394490493","loc":[-85.620684,41.965558],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490494":{"id":"n394490494","loc":[-85.620621,41.965658],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490495":{"id":"n394490495","loc":[-85.618165,41.965759],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490496":{"id":"n394490496","loc":[-85.618071,41.965759],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490497":{"id":"n394490497","loc":[-85.617986,41.965759],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490498":{"id":"n394490498","loc":[-85.605673,41.965764],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490499":{"id":"n394490499","loc":[-85.605668,41.963548],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490500":{"id":"n394490500","loc":[-85.605664,41.962094],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490501":{"id":"n394490501","loc":[-85.595828,41.962159],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490502":{"id":"n394490502","loc":[-85.587869,41.962169],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490503":{"id":"n394490503","loc":[-85.586289,41.962179],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490504":{"id":"n394490504","loc":[-85.583774,41.962178],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490505":{"id":"n394490505","loc":[-85.583774,41.961789],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490506":{"id":"n394490506","loc":[-85.581303,41.961783],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490507":{"id":"n394490507","loc":[-85.581304,41.961616],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490508":{"id":"n394490508","loc":[-85.581292,41.961616],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490509":{"id":"n394490509","loc":[-85.581247,41.959244],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490510":{"id":"n394490510","loc":[-85.581245,41.958394],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490511":{"id":"n394490511","loc":[-85.581276,41.958372],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490512":{"id":"n394490512","loc":[-85.581302,41.958353],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490513":{"id":"n394490513","loc":[-85.581376,41.9583],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490514":{"id":"n394490514","loc":[-85.582256,41.957663],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490515":{"id":"n394490515","loc":[-85.585299,41.955483],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490516":{"id":"n394490516","loc":[-85.585588,41.955331],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490517":{"id":"n394490517","loc":[-85.586053,41.955163],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490518":{"id":"n394490518","loc":[-85.58632,41.955076],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490519":{"id":"n394490519","loc":[-85.586478,41.955025],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490520":{"id":"n394490520","loc":[-85.58692,41.954947],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490521":{"id":"n394490521","loc":[-85.587327,41.954914],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490522":{"id":"n394490522","loc":[-85.587345,41.954913],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490523":{"id":"n394490523","loc":[-85.587358,41.954913],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490524":{"id":"n394490524","loc":[-85.58963,41.954877],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490525":{"id":"n394490525","loc":[-85.591077,41.954865],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490526":{"id":"n394490526","loc":[-85.594824,41.954843],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490527":{"id":"n394490527","loc":[-85.594804,41.95331],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490528":{"id":"n394490528","loc":[-85.599336,41.95331],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490529":{"id":"n394490529","loc":[-85.599336,41.954825],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490530":{"id":"n394490530","loc":[-85.597828,41.954839],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490531":{"id":"n394490531","loc":[-85.597833,41.95614],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490532":{"id":"n394490532","loc":[-85.596586,41.956151],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490533":{"id":"n394490533","loc":[-85.596586,41.956394],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490534":{"id":"n394490534","loc":[-85.595933,41.956394],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490535":{"id":"n394490535","loc":[-85.595933,41.958176],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490536":{"id":"n394490536","loc":[-85.597635,41.958179],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490537":{"id":"n394490537","loc":[-85.597717,41.958177],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490538":{"id":"n394490538","loc":[-85.601671,41.958194],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490539":{"id":"n394490539","loc":[-85.605619,41.958194],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490540":{"id":"n394490540","loc":[-85.608054,41.958187],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490542":{"id":"n394490542","loc":[-85.6080762,41.9547864],"version":"2","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:47:47Z","tags":{}},"n394490545":{"id":"n394490545","loc":[-85.6104354,41.9548263],"version":"2","changeset":"12747630","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-16T08:22:38Z","tags":{}},"n394490546":{"id":"n394490546","loc":[-85.610274,41.951106],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490547":{"id":"n394490547","loc":[-85.610278,41.950829],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490548":{"id":"n394490548","loc":[-85.610309,41.948377],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490549":{"id":"n394490549","loc":[-85.610314,41.947986],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490550":{"id":"n394490550","loc":[-85.610464,41.947985],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490551":{"id":"n394490551","loc":[-85.610447,41.947468],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490552":{"id":"n394490552","loc":[-85.612469,41.947471],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490553":{"id":"n394490553","loc":[-85.612494,41.945576],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490554":{"id":"n394490554","loc":[-85.610292,41.94558],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490555":{"id":"n394490555","loc":[-85.608412,41.945625],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490556":{"id":"n394490556","loc":[-85.608412,41.943036],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490557":{"id":"n394490557","loc":[-85.608702,41.943087],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490558":{"id":"n394490558","loc":[-85.609196,41.943224],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490559":{"id":"n394490559","loc":[-85.609571,41.943263],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490560":{"id":"n394490560","loc":[-85.610116,41.943295],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490561":{"id":"n394490561","loc":[-85.610273,41.943275],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490562":{"id":"n394490562","loc":[-85.611339,41.943075],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490563":{"id":"n394490563","loc":[-85.611575,41.942997],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490564":{"id":"n394490564","loc":[-85.611847,41.942849],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490565":{"id":"n394490565","loc":[-85.612164,41.942568],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490566":{"id":"n394490566","loc":[-85.612341,41.942529],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490567":{"id":"n394490567","loc":[-85.612562,41.942524],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490568":{"id":"n394490568","loc":[-85.612768,41.942546],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490569":{"id":"n394490569","loc":[-85.612938,41.942633],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490570":{"id":"n394490570","loc":[-85.6131,41.942782],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490571":{"id":"n394490571","loc":[-85.613299,41.942919],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490572":{"id":"n394490572","loc":[-85.613498,41.942996],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490573":{"id":"n394490573","loc":[-85.614698,41.942842],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490574":{"id":"n394490574","loc":[-85.615288,41.942698],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490575":{"id":"n394490575","loc":[-85.616054,41.942693],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490576":{"id":"n394490576","loc":[-85.61603,41.942175],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490577":{"id":"n394490577","loc":[-85.616004,41.941741],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490578":{"id":"n394490578","loc":[-85.615994,41.940156],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490579":{"id":"n394490579","loc":[-85.615144,41.940159],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490580":{"id":"n394490580","loc":[-85.614915,41.940161],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490582":{"id":"n394490582","loc":[-85.614875,41.938532],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490583":{"id":"n394490583","loc":[-85.616167,41.938787],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490585":{"id":"n394490585","loc":[-85.616176,41.938589],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490586":{"id":"n394490586","loc":[-85.614537,41.938282],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490588":{"id":"n394490588","loc":[-85.610141,41.937459],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490589":{"id":"n394490589","loc":[-85.610172,41.937298],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490590":{"id":"n394490590","loc":[-85.609918,41.935495],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490592":{"id":"n394490592","loc":[-85.610092,41.935451],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490594":{"id":"n394490594","loc":[-85.610681,41.935247],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490595":{"id":"n394490595","loc":[-85.611446,41.934955],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490596":{"id":"n394490596","loc":[-85.612057,41.934696],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490598":{"id":"n394490598","loc":[-85.613256,41.934084],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490599":{"id":"n394490599","loc":[-85.613948,41.933682],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490601":{"id":"n394490601","loc":[-85.61436,41.933417],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490602":{"id":"n394490602","loc":[-85.614638,41.933212],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490604":{"id":"n394490604","loc":[-85.615249,41.9332],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490605":{"id":"n394490605","loc":[-85.618218,41.933223],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490607":{"id":"n394490607","loc":[-85.618241,41.933479],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490608":{"id":"n394490608","loc":[-85.618257,41.93365],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490609":{"id":"n394490609","loc":[-85.618298,41.935067],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490611":{"id":"n394490611","loc":[-85.619791,41.935067],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490612":{"id":"n394490612","loc":[-85.619794,41.933301],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490613":{"id":"n394490613","loc":[-85.619795,41.932692],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490614":{"id":"n394490614","loc":[-85.619729,41.929517],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490615":{"id":"n394490615","loc":[-85.619801,41.929305],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490616":{"id":"n394490616","loc":[-85.619809,41.927391],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490617":{"id":"n394490617","loc":[-85.620883,41.927378],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490618":{"id":"n394490618","loc":[-85.620988,41.927368],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490619":{"id":"n394490619","loc":[-85.621076,41.927368],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490620":{"id":"n394490620","loc":[-85.621156,41.927376],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490621":{"id":"n394490621","loc":[-85.621685,41.92737],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490622":{"id":"n394490622","loc":[-85.624716,41.927359],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490623":{"id":"n394490623","loc":[-85.625308,41.92737],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490624":{"id":"n394490624","loc":[-85.625655,41.927377],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490625":{"id":"n394490625","loc":[-85.625093,41.925591],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490626":{"id":"n394490626","loc":[-85.625174,41.92559],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490627":{"id":"n394490627","loc":[-85.625249,41.925597],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490628":{"id":"n394490628","loc":[-85.625532,41.925604],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490629":{"id":"n394490629","loc":[-85.625761,41.925597],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490630":{"id":"n394490630","loc":[-85.625955,41.926153],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490631":{"id":"n394490631","loc":[-85.626209,41.926155],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490632":{"id":"n394490632","loc":[-85.627757,41.926151],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490633":{"id":"n394490633","loc":[-85.627825,41.926298],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490634":{"id":"n394490634","loc":[-85.627994,41.926315],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490635":{"id":"n394490635","loc":[-85.628049,41.927196],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490636":{"id":"n394490636","loc":[-85.62949,41.927221],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490637":{"id":"n394490637","loc":[-85.629602,41.927277],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490638":{"id":"n394490638","loc":[-85.6297102,41.9273279],"version":"2","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:02Z","tags":{}},"n394490639":{"id":"n394490639","loc":[-85.630958,41.927398],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490699":{"id":"n394490699","loc":[-85.632741,41.927388],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490700":{"id":"n394490700","loc":[-85.632997,41.927391],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490701":{"id":"n394490701","loc":[-85.633149,41.927393],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490702":{"id":"n394490702","loc":[-85.633334,41.927393],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490703":{"id":"n394490703","loc":[-85.633468,41.927561],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490704":{"id":"n394490704","loc":[-85.633563,41.927755],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490705":{"id":"n394490705","loc":[-85.633662,41.928192],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490706":{"id":"n394490706","loc":[-85.633679,41.928807],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490707":{"id":"n394490707","loc":[-85.633687,41.929107],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490708":{"id":"n394490708","loc":[-85.633927,41.929109],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490709":{"id":"n394490709","loc":[-85.634126,41.929111],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490710":{"id":"n394490710","loc":[-85.634207,41.92911],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490711":{"id":"n394490711","loc":[-85.634323,41.929111],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490712":{"id":"n394490712","loc":[-85.636712,41.929128],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490713":{"id":"n394490713","loc":[-85.63808,41.9291],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490714":{"id":"n394490714","loc":[-85.639213,41.929088],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490715":{"id":"n394490715","loc":[-85.639189,41.92852],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490716":{"id":"n394490716","loc":[-85.639204,41.925488],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490717":{"id":"n394490717","loc":[-85.644204,41.925452],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490718":{"id":"n394490718","loc":[-85.651425,41.925406],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490719":{"id":"n394490719","loc":[-85.651449,41.926321],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490720":{"id":"n394490720","loc":[-85.651451,41.926969],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490721":{"id":"n394490721","loc":[-85.651458,41.928052],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490722":{"id":"n394490722","loc":[-85.651446,41.928892],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490723":{"id":"n394490723","loc":[-85.651456,41.929447],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490724":{"id":"n394490724","loc":[-85.651707,41.929454],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490725":{"id":"n394490725","loc":[-85.652369,41.929473],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490726":{"id":"n394490726","loc":[-85.6525,41.929452],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490727":{"id":"n394490727","loc":[-85.654066,41.92946],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490728":{"id":"n394490728","loc":[-85.654816,41.92946],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490729":{"id":"n394490729","loc":[-85.654816,41.930337],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490730":{"id":"n394490730","loc":[-85.654587,41.930337],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490731":{"id":"n394490731","loc":[-85.654548,41.931072],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490732":{"id":"n394490732","loc":[-85.654538,41.931701],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490733":{"id":"n394490733","loc":[-85.654898,41.931689],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490734":{"id":"n394490734","loc":[-85.654898,41.932505],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490735":{"id":"n394490735","loc":[-85.654854,41.932514],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490736":{"id":"n394490736","loc":[-85.655497,41.932499],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490737":{"id":"n394490737","loc":[-85.656405,41.932493],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490738":{"id":"n394490738","loc":[-85.656422,41.933416],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490739":{"id":"n394490739","loc":[-85.657322,41.933438],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n1475293233":{"id":"n1475293233","loc":[-85.6385522,41.9585167],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:50Z","tags":{}},"n1475293242":{"id":"n1475293242","loc":[-85.64609,41.9540815],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293249":{"id":"n1475293249","loc":[-85.6358079,41.9692721],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293256":{"id":"n1475293256","loc":[-85.6387369,41.9581583],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293259":{"id":"n1475293259","loc":[-85.6455882,41.9541138],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:52Z","tags":{}},"n1475293266":{"id":"n1475293266","loc":[-85.6451008,41.9541821],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:52Z","tags":{}},"n1819800253":{"id":"n1819800253","loc":[-85.6134286,41.9429692],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n2114807558":{"id":"n2114807558","loc":[-85.6365609,41.963866],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{"railway":"level_crossing"}},"n2189015728":{"id":"n2189015728","loc":[-85.6383956,41.9590576],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015838":{"id":"n2189015838","loc":[-85.6435144,41.9563705],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015842":{"id":"n2189015842","loc":[-85.6415782,41.9557035],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015855":{"id":"n2189015855","loc":[-85.6440829,41.9554577],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2199109849":{"id":"n2199109849","loc":[-85.6393434,41.9565591],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109851":{"id":"n2199109851","loc":[-85.6393208,41.9565002],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109857":{"id":"n2199109857","loc":[-85.6401986,41.955545],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109859":{"id":"n2199109859","loc":[-85.6402362,41.955587],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109861":{"id":"n2199109861","loc":[-85.6395958,41.9565675],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109863":{"id":"n2199109863","loc":[-85.639528,41.9566011],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"w209717053":{"id":"w209717053","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109829","n2199109831","n2199109833","n2199109835","n2199109829"]},"w17966415":{"id":"w17966415","version":"2","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:55Z","tags":{"access":"private","highway":"service","name":"Manufacturing Way","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Manufacturing","tiger:name_type":"Way","tiger:reviewed":"no"},"nodes":["n185971642","n185977232","n185977233","n185949745","n185949748","n185977234"]},"w209717054":{"id":"w209717054","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109837","n2199109839","n2199109841","n2199109843","n2199109845","n2199109847","n2199109837"]},"w208627214":{"id":"w208627214","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no"},"nodes":["n185949755","n2189015728","n1475293233","n1475293256","n185952163","n185952161","n185952160","n185952158","n185949763","n1819848965","n1819848890","n185952156"]},"w17963817":{"id":"w17963817","version":"2","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:55Z","tags":{"access":"private","highway":"service","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:reviewed":"no"},"nodes":["n185949765","n185953413","n185953417","n185953421","n185953423"]},"w34369809":{"id":"w34369809","version":"7","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:19Z","tags":{"admin_level":"8","boundary":"administrative","landuse":"residential","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394490395","n394490396","n394490397","n394490398","n394490399","n394490400","n394490401","n394490402","n394490403","n394490404","n394490405","n394490406","n394490407","n394490408","n394490409","n394490410","n394490411","n394490412","n394490413","n394490414","n394490415","n394490416","n394490417","n394490418","n394490419","n394490420","n394490421","n394490422","n394490423","n394490424","n394490425","n394490426","n394490427","n394490428","n1475293242","n1475293259","n1475293266","n394490429","n394490430","n394490431","n394490432","n394490433","n394490434","n394490435","n394490436","n394490437","n394490438","n394490439","n394490440","n394490441","n394490442","n394490443","n394490444","n394490445","n394490446","n1475293249","n394490447","n394490448","n394490449","n394490450","n394490451","n394490452","n394490453","n394490454","n394490455","n394490456","n394490457","n394490458","n394490459","n394490460","n394490461","n394490462","n2114807558","n394490463","n1475293226","n394490464","n394490465","n394490466","n394490467","n394490468","n394490469","n394490470","n394490471","n394490472","n394490473","n394490474","n394490475","n394490476","n394490477","n394490478","n394490479","n394490480","n394490481","n394490482","n394490483","n394490484","n394490485","n394490486","n394490487","n394490488","n394490489","n394490490","n394490491","n394490492","n394490493","n394490494","n394490495","n394490496","n394490497","n394490498","n394490499","n394490500","n394490501","n394490502","n394490503","n394490504","n394490505","n394490506","n394490507","n394490508","n394490509","n394490510","n394490511","n394490512","n394490513","n394490514","n394490515","n394490516","n394490517","n394490518","n394490519","n394490520","n394490521","n394490522","n394490523","n394490524","n394490525","n394490526","n394490527","n394490528","n394490529","n394490530","n394490531","n394490532","n394490533","n394490534","n394490535","n394490536","n394490537","n394490538","n394490539","n394490540","n394490542","n394490545","n394490546","n394490547","n394490548","n394490549","n394490550","n394490551","n394490552","n394490553","n394490554","n394490555","n394490556","n394490557","n394490558","n394490559","n394490560","n394490561","n394490562","n394490563","n394490564","n394490565","n394490566","n394490567","n394490568","n394490569","n394490570","n394490571","n1819800253","n394490572","n394490573","n394490574","n394490575","n394490576","n394490577","n394490578","n394490579","n394490580","n394490582","n394490583","n394490585","n394490586","n394490588","n394490589","n394490590","n394490592","n394490594","n394490595","n394490596","n394490598","n394490599","n394490601","n394490602","n394490604","n394490605","n394490607","n394490608","n394490609","n394490611","n394490612","n394490613","n394490614","n394490615","n394490616","n394490617","n394490618","n394490619","n394490620","n394490621","n394490622","n394490623","n394490624","n394490625","n394490626","n394490627","n394490628","n394490629","n394490630","n394490631","n394490632","n394490633","n394490634","n394490635","n394490636","n394490637","n394490638","n394490639","n394490699","n394490700","n394490701","n394490702","n394490703","n394490704","n394490705","n394490706","n394490707","n394490708","n394490709","n394490710","n394490711","n394490712","n394490713","n394490714","n394490715","n394490716","n394490717","n394490718","n394490719","n394490720","n394490721","n394490722","n394490723","n394490724","n394490725","n394490726","n394490727","n394490728","n394490729","n394490730","n394490731","n394490732","n394490733","n394490734","n394490735","n394490736","n394490737","n394490738","n394490739","n394490395"]},"w208627221":{"id":"w208627221","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189015838","n2189015842","n2189015846","n2189015849","n2189015852","n2189015855","n2189015838"]},"w209717052":{"id":"w209717052","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109816","n2199109818","n2199109820","n2199109822","n2199109825","n2199109827","n2199109816"]},"w134151784":{"id":"w134151784","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:52Z","tags":{"bridge":"yes","highway":"residential","name":"W Hoffman St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hoffman","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312195:15312958:15312207:15313273:15328372:15328373","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185971648","n185971651"]},"w209717055":{"id":"w209717055","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","landuse":"basin"},"nodes":["n2199109849","n2199109851","n2199109853","n2199109855","n2199109857","n2199109859","n2199109861","n2199109863","n2199109849"]},"w17967763":{"id":"w17967763","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:55:04Z","tags":{"highway":"residential","name":"Rock River Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Rock River","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312230:15312252:15335064:15333550","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093"},"nodes":["n1475293244","n185982166","n185975067","n185971637"]},"r134949":{"id":"r134949","version":"2","changeset":"14979874","user":"malenki","uid":"39504","visible":"true","timestamp":"2013-02-10T12:18:08Z","tags":{"admin_level":"8","border_type":"city","boundary":"administrative","is_in":"USA, Michigan","is_in:country":"USA","is_in:country_code":"US","is_in:iso_3166_2":"US:MI","is_in:state":"Michigan","is_in:state_code":"MI","name":"Three Rivers","place":"city","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)","tiger:CLASSFP":"C5","tiger:CPI":"Y","tiger:FUNCSTAT":"A","tiger:LSAD":"25","tiger:MTFCC":"G4110","tiger:NAME":"Three Rivers","tiger:NAMELSAD":"Three Rivers city","tiger:PCICBSA":"N","tiger:PCINECTA":"N","tiger:PLACEFP":"79760","tiger:PLACENS":"01627164","tiger:PLCIDFP":"2679760","tiger:STATEFP":"26","type":"boundary","wikipedia":"en:Three Rivers, Michigan"},"members":[{"id":"w34369809","type":"way","role":"outer"},{"id":"w34369821","type":"way","role":"outer"},{"id":"w34369822","type":"way","role":"outer"},{"id":"w34369823","type":"way","role":"outer"},{"id":"w34369824","type":"way","role":"outer"},{"id":"w34369825","type":"way","role":"outer"},{"id":"w34369826","type":"way","role":"outer"},{"id":"w34369810","type":"way","role":"inner"},{"id":"w34369811","type":"way","role":"inner"},{"id":"w34369812","type":"way","role":"inner"},{"id":"w34367079","type":"way","role":"inner"},{"id":"w34369814","type":"way","role":"inner"},{"id":"w34367080","type":"way","role":"inner"},{"id":"w34369815","type":"way","role":"inner"},{"id":"w34369820","type":"way","role":"inner"}]},"n1819848881":{"id":"n1819848881","loc":[-85.638562,41.9569965],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848947":{"id":"n1819848947","loc":[-85.6384348,41.9576565],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819849044":{"id":"n1819849044","loc":[-85.6385749,41.9573345],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n2114807547":{"id":"n2114807547","loc":[-85.6384626,41.9583756],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807564":{"id":"n2114807564","loc":[-85.638535,41.9581283],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2189015691":{"id":"n2189015691","loc":[-85.6435584,41.9565243],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015696":{"id":"n2189015696","loc":[-85.6435805,41.9566049],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015722":{"id":"n2189015722","loc":[-85.6435035,41.9567438],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015744":{"id":"n2189015744","loc":[-85.6437991,41.9569582],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015747":{"id":"n2189015747","loc":[-85.6433042,41.9567742],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015750":{"id":"n2189015750","loc":[-85.6433827,41.9566844],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015753":{"id":"n2189015753","loc":[-85.6430447,41.9565588],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015756":{"id":"n2189015756","loc":[-85.6431111,41.956451],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015759":{"id":"n2189015759","loc":[-85.6420247,41.956083],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015760":{"id":"n2189015760","loc":[-85.6419945,41.9561369],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015764":{"id":"n2189015764","loc":[-85.6413729,41.9558945],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015766":{"id":"n2189015766","loc":[-85.6412884,41.9560606],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015770":{"id":"n2189015770","loc":[-85.6411798,41.9560112],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015771":{"id":"n2189015771","loc":[-85.6410651,41.9562132],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015774":{"id":"n2189015774","loc":[-85.6409504,41.9561728],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015778":{"id":"n2189015778","loc":[-85.6407996,41.9564241],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015781":{"id":"n2189015781","loc":[-85.6406889,41.9563892],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015785":{"id":"n2189015785","loc":[-85.6404857,41.9567024],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015789":{"id":"n2189015789","loc":[-85.6406909,41.9567877],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015793":{"id":"n2189015793","loc":[-85.6405642,41.9570165],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015796":{"id":"n2189015796","loc":[-85.6415359,41.9573711],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015800":{"id":"n2189015800","loc":[-85.6411738,41.9579501],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015804":{"id":"n2189015804","loc":[-85.6411119,41.957921],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015808":{"id":"n2189015808","loc":[-85.6403186,41.9591751],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015909":{"id":"n2189015909","loc":[-85.6389293,41.9564636],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015926":{"id":"n2189015926","loc":[-85.6385431,41.9564617],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015929":{"id":"n2189015929","loc":[-85.6385457,41.9561823],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015932":{"id":"n2189015932","loc":[-85.6389319,41.9561843],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2199109865":{"id":"n2199109865","loc":[-85.6400768,41.956776],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109867":{"id":"n2199109867","loc":[-85.639902,41.9567153],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109869":{"id":"n2199109869","loc":[-85.640004,41.956553],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109871":{"id":"n2199109871","loc":[-85.6401788,41.9566137],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109873":{"id":"n2199109873","loc":[-85.6399316,41.9564506],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{"man_made":"water_tower"}},"n2199109876":{"id":"n2199109876","loc":[-85.6397689,41.9572354],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109878":{"id":"n2199109878","loc":[-85.6399229,41.9569826],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109880":{"id":"n2199109880","loc":[-85.639706,41.9569095],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109882":{"id":"n2199109882","loc":[-85.639552,41.9571623],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109884":{"id":"n2199109884","loc":[-85.6391028,41.9569517],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109886":{"id":"n2199109886","loc":[-85.6392876,41.956646],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109888":{"id":"n2199109888","loc":[-85.639484,41.9567117],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109889":{"id":"n2199109889","loc":[-85.6394322,41.9567973],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109890":{"id":"n2199109890","loc":[-85.6393718,41.9567771],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109891":{"id":"n2199109891","loc":[-85.6392387,41.9569972],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n1819848900":{"id":"n1819848900","loc":[-85.638281,41.9576578],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848978":{"id":"n1819848978","loc":[-85.6377186,41.9580867],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849039":{"id":"n1819849039","loc":[-85.6384217,41.9573405],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849050":{"id":"n1819849050","loc":[-85.6377011,41.9570042],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849088":{"id":"n1819849088","loc":[-85.6382879,41.9580817],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n2114807549":{"id":"n2114807549","loc":[-85.6362551,41.96473],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807587":{"id":"n2114807587","loc":[-85.6368694,41.9629829],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2189015725":{"id":"n2189015725","loc":[-85.644156,41.9569753],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015741":{"id":"n2189015741","loc":[-85.6419825,41.9597632],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"w208627217":{"id":"w208627217","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015741","n2189015744","n2189015747","n2189015750","n2189015753","n2189015756","n2189015759","n2189015760","n2189015764","n2189015766","n2189015770","n2189015771","n2189015774","n2189015778","n2189015781","n2189015785","n2189015789","n2189015793","n2189015796","n2189015800","n2189015804","n2189015808","n2189015741"]},"w208627212":{"id":"w208627212","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"highway":"service"},"nodes":["n2189015691","n2189015696","n2189015722","n2189015725"]},"w209717057":{"id":"w209717057","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109876","n2199109878","n2199109880","n2199109882","n2199109876"]},"w209717056":{"id":"w209717056","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109865","n2199109867","n2199109869","n2199109871","n2199109865"]},"w208627231":{"id":"w208627231","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015909","n2189015926","n2189015929","n2189015932","n2189015909"]},"w170848326":{"id":"w170848326","version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:00Z","tags":{"building":"yes","source":"Bing"},"nodes":["n1819848881","n1819849050","n1819848978","n1819849088","n1819848900","n1819848947","n1819849039","n1819849044","n1819848881"]},"w17963182":{"id":"w17963182","version":"2","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:55Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no"},"nodes":["n185949763","n185949765","n2189015691","n185949745"]},"w201484340":{"id":"w201484340","version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:16Z","tags":{"railway":"rail","service":"siding","source":"Bing"},"nodes":["n2114807565","n2114807564","n2114807547","n2114807587","n2114807558","n2114807549","n2114807593"]},"w209717058":{"id":"w209717058","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109884","n2199109886","n2199109888","n2199109889","n2199109890","n2199109891","n2199109884"]},"n185954650":{"id":"n185954650","loc":[-85.627331,41.957439],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:31Z","tags":{}},"n185966949":{"id":"n185966949","loc":[-85.626868,41.957314],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"n185989335":{"id":"n185989335","loc":[-85.62529,41.958568],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989337":{"id":"n185989337","loc":[-85.624962,41.958453],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989339":{"id":"n185989339","loc":[-85.624832,41.958399],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989340":{"id":"n185989340","loc":[-85.624707,41.958325],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989342":{"id":"n185989342","loc":[-85.624636,41.958251],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989345":{"id":"n185989345","loc":[-85.624578,41.95818],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989347":{"id":"n185989347","loc":[-85.624533,41.958099],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989349":{"id":"n185989349","loc":[-85.624507,41.957985],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989351":{"id":"n185989351","loc":[-85.624495,41.957807],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989353":{"id":"n185989353","loc":[-85.624514,41.957663],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989354":{"id":"n185989354","loc":[-85.624577,41.957593],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989356":{"id":"n185989356","loc":[-85.624685,41.95754],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989357":{"id":"n185989357","loc":[-85.624802,41.957523],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:28Z","tags":{}},"n185989359":{"id":"n185989359","loc":[-85.624996,41.957524],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:28Z","tags":{}},"n185989361":{"id":"n185989361","loc":[-85.625409,41.957515],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:28Z","tags":{}},"n185989364":{"id":"n185989364","loc":[-85.625634,41.957496],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:28Z","tags":{}},"n185989367":{"id":"n185989367","loc":[-85.625832,41.957453],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:28Z","tags":{}},"n185989368":{"id":"n185989368","loc":[-85.626044,41.957394],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:28Z","tags":{}},"n354031352":{"id":"n354031352","loc":[-85.6252778,41.9586111],"version":"3","changeset":"3908860","user":"Geogast","uid":"51045","visible":"true","timestamp":"2010-02-18T13:28:26Z","tags":{"amenity":"place_of_worship","denomination":"baptist","ele":"250","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417873","gnis:state_id":"26","name":"First Baptist Church","religion":"christian"}},"n2199109892":{"id":"n2199109892","loc":[-85.6261578,41.9589963],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109893":{"id":"n2199109893","loc":[-85.6263191,41.9586865],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109894":{"id":"n2199109894","loc":[-85.6261186,41.9586288],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109895":{"id":"n2199109895","loc":[-85.6260644,41.9587329],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109896":{"id":"n2199109896","loc":[-85.6261547,41.9587589],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109898":{"id":"n2199109898","loc":[-85.6260476,41.9589646],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n185966951":{"id":"n185966951","loc":[-85.628404,41.957438],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"w17965351":{"id":"w17965351","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:20Z","tags":{"highway":"residential","name":"Flower Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Flower","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185966948","n185966949","n185954650","n185966951","n185966953","n185966955","n185966957"]},"w17967809":{"id":"w17967809","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:21Z","tags":{"highway":"residential","name":"Azaleamum Drive","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Azaleamum","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185982197","n185989335","n185989337","n185989339","n185989340","n185989342","n185989345","n185989347","n185989349","n185989351","n185989353","n185989354","n185989356","n185989357","n185989359","n185989361","n185989364","n185989367","n185989368","n185982196"]},"w209717059":{"id":"w209717059","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109892","n2199109893","n2199109894","n2199109895","n2199109896","n2199109898","n2199109892"]},"n185961390":{"id":"n185961390","loc":[-85.63137,41.959033],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:39Z","tags":{}},"n185961393":{"id":"n185961393","loc":[-85.634315,41.959017],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:39Z","tags":{}},"w17966214":{"id":"w17966214","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:22Z","tags":{"highway":"residential","name":"East Adams Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Adams","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093"},"nodes":["n185975351","n185967434","n185968108"]},"w17964793":{"id":"w17964793","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:32:05Z","tags":{"highway":"residential","name":"Morris Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Morris","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312148:15328241:15328242","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185961389","n185961390","n185961391","n185961393","n185961396"]},"n185952166":{"id":"n185952166","loc":[-85.638174,41.95831],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:11Z","tags":{}},"n2114807552":{"id":"n2114807552","loc":[-85.6383526,41.9593788],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807591":{"id":"n2114807591","loc":[-85.6383741,41.9593968],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2189015731":{"id":"n2189015731","loc":[-85.6368404,41.9592785],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015734":{"id":"n2189015734","loc":[-85.6368404,41.9585918],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015737":{"id":"n2189015737","loc":[-85.6376009,41.9585918],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015738":{"id":"n2189015738","loc":[-85.6376009,41.9592785],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015897":{"id":"n2189015897","loc":[-85.6376839,41.9566137],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015900":{"id":"n2189015900","loc":[-85.6376831,41.9564865],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015903":{"id":"n2189015903","loc":[-85.6381161,41.9564851],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015906":{"id":"n2189015906","loc":[-85.6381168,41.9566122],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015937":{"id":"n2189015937","loc":[-85.6364789,41.9590634],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015940":{"id":"n2189015940","loc":[-85.6361137,41.9590672],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015943":{"id":"n2189015943","loc":[-85.6361169,41.9594033],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015945":{"id":"n2189015945","loc":[-85.6363456,41.9594021],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015952":{"id":"n2189015952","loc":[-85.636112,41.958892],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015955":{"id":"n2189015955","loc":[-85.6364757,41.9588894],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015957":{"id":"n2189015957","loc":[-85.6364729,41.9586747],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015958":{"id":"n2189015958","loc":[-85.6361103,41.9586765],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015959":{"id":"n2189015959","loc":[-85.6364719,41.9585562],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015960":{"id":"n2189015960","loc":[-85.6361093,41.958558],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015961":{"id":"n2189015961","loc":[-85.6355494,41.9586403],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015962":{"id":"n2189015962","loc":[-85.635549,41.9584711],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015963":{"id":"n2189015963","loc":[-85.6351831,41.9584715],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015964":{"id":"n2189015964","loc":[-85.6351834,41.9586408],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015966":{"id":"n2189015966","loc":[-85.6359579,41.9586359],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015968":{"id":"n2189015968","loc":[-85.6359561,41.9585465],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015971":{"id":"n2189015971","loc":[-85.6355476,41.9585509],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015974":{"id":"n2189015974","loc":[-85.6359516,41.9592934],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015977":{"id":"n2189015977","loc":[-85.635949,41.9586697],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015980":{"id":"n2189015980","loc":[-85.6351329,41.9586716],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015983":{"id":"n2189015983","loc":[-85.6351318,41.9583949],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015986":{"id":"n2189015986","loc":[-85.6349148,41.9583954],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015989":{"id":"n2189015989","loc":[-85.6349186,41.9592958],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015995":{"id":"n2189015995","loc":[-85.6360173,41.9593286],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015998":{"id":"n2189015998","loc":[-85.6360278,41.9583079],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2114807550":{"id":"n2114807550","loc":[-85.6383392,41.9595404],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807551":{"id":"n2114807551","loc":[-85.6375855,41.9616107],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807559":{"id":"n2114807559","loc":[-85.6373978,41.9621273],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807562":{"id":"n2114807562","loc":[-85.6373361,41.9622609],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807563":{"id":"n2114807563","loc":[-85.6376472,41.9613953],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807574":{"id":"n2114807574","loc":[-85.636974,41.9627695],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807589":{"id":"n2114807589","loc":[-85.6383017,41.9595005],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807592":{"id":"n2114807592","loc":[-85.6377169,41.9613494],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807595":{"id":"n2114807595","loc":[-85.6371081,41.962574],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2189015934":{"id":"n2189015934","loc":[-85.6364855,41.9595098],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015949":{"id":"n2189015949","loc":[-85.6363466,41.9595105],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"w208627244":{"id":"w208627244","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"highway":"service"},"nodes":["n2189015992","n2189015995","n2189015998"]},"w208627240":{"id":"w208627240","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015961","n2189015971","n2189015962","n2189015963","n2189015964","n2189015961"]},"w17967437":{"id":"w17967437","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:51:44Z","tags":{"highway":"residential","name":"Lyman St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Lyman","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313234","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185964361","n185984024"]},"w208627237":{"id":"w208627237","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015955","n2189015957","n2189015958","n2189015952","n2189015955"]},"w17967465":{"id":"w17967465","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:51:57Z","tags":{"highway":"residential","name":"W Adams St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Adams","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312177","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185978394","n185984022","n185964360"]},"w208627228":{"id":"w208627228","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015897","n2189015900","n2189015903","n2189015906","n2189015897"]},"w201484351":{"id":"w201484351","version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{"railway":"rail","service":"siding","source":"Bing"},"nodes":["n2114807587","n2114807574","n2114807595","n2114807562","n2114807559","n2114807551","n2114807563","n2114807589","n2114807552"]},"w208627239":{"id":"w208627239","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015957","n2189015959","n2189015960","n2189015958","n2189015957"]},"w208627233":{"id":"w208627233","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015934","n2189015937","n2189015940","n2189015943","n2189015945","n2189015949","n2189015934"]},"w208627241":{"id":"w208627241","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015961","n2189015966","n2189015968","n2189015971","n2189015961"]},"w17967970":{"id":"w17967970","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:55:20Z","tags":{"highway":"residential","name":"Adams St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Adams","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312180","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185975351","n185978394"]},"w208627235":{"id":"w208627235","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015940","n2189015952","n2189015955","n2189015937","n2189015940"]},"w17965468":{"id":"w17965468","version":"2","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:56Z","tags":{"highway":"residential","name":"Armstrong Blvd","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Armstrong","tiger:name_type":"Blvd","tiger:reviewed":"no"},"nodes":["n185967917","n2189015998","n185967918","n185964362","n185952166"]},"w201484346":{"id":"w201484346","version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:16Z","tags":{"railway":"rail","service":"siding","source":"Bing"},"nodes":["n2114807551","n2114807592","n2114807550","n2114807591"]},"w208627242":{"id":"w208627242","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189015974","n2189015977","n2189015980","n2189015983","n2189015986","n2189015989","n2189015974"]},"w208627216":{"id":"w208627216","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015731","n2189015734","n2189015737","n2189015738","n2189015731"]},"n185984309":{"id":"n185984309","loc":[-85.631421,41.961494],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:55Z","tags":{}},"n185987987":{"id":"n185987987","loc":[-85.631456,41.960673],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:29Z","tags":{}},"n185965397":{"id":"n185965397","loc":[-85.634603,41.959838],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:52Z","tags":{}},"w17965196":{"id":"w17965196","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:35:10Z","tags":{"highway":"residential","name":"Burke Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Burke","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312145","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185965395","n185965397","n185965399"]},"w17967215":{"id":"w17967215","version":"2","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:56Z","tags":{"highway":"residential","name":"Kellogg Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Kellogg","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185968114","n185984309","n185967440","n185978402"]},"w17967597":{"id":"w17967597","version":"2","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:20Z","tags":{"highway":"residential","name":"Barnard Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Barnard","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185968112","n185987987","n185967438","n185978399"]},"n394490857":{"id":"n394490857","loc":[-85.633952,41.960664],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:00Z","tags":{}},"n394490858":{"id":"n394490858","loc":[-85.633938,41.960227],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:00Z","tags":{}},"n394490859":{"id":"n394490859","loc":[-85.634794,41.960212],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{}},"n394490860":{"id":"n394490860","loc":[-85.634815,41.960662],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{}},"n394490861":{"id":"n394490861","loc":[-85.634103,41.961268],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{}},"n394490862":{"id":"n394490862","loc":[-85.634103,41.961001],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{}},"n394490863":{"id":"n394490863","loc":[-85.634504,41.961003],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{}},"n394490864":{"id":"n394490864","loc":[-85.634561,41.961269],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{}},"n1057629869":{"id":"n1057629869","loc":[-85.6382599,41.9612134],"version":"1","changeset":"6740055","user":"42429","uid":"42429","visible":"true","timestamp":"2010-12-22T21:14:10Z","tags":{}},"n1057629937":{"id":"n1057629937","loc":[-85.6380035,41.9616137],"version":"1","changeset":"6740055","user":"42429","uid":"42429","visible":"true","timestamp":"2010-12-22T21:14:11Z","tags":{}},"n2189016014":{"id":"n2189016014","loc":[-85.6360365,41.9626496],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016017":{"id":"n2189016017","loc":[-85.6360374,41.9623228],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016020":{"id":"n2189016020","loc":[-85.6367557,41.9623239],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016022":{"id":"n2189016022","loc":[-85.6367566,41.9619919],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016025":{"id":"n2189016025","loc":[-85.6351794,41.9619893],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016028":{"id":"n2189016028","loc":[-85.6351788,41.9622011],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016031":{"id":"n2189016031","loc":[-85.6350855,41.9622009],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016034":{"id":"n2189016034","loc":[-85.6350845,41.962527],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016037":{"id":"n2189016037","loc":[-85.6352732,41.9625273],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016039":{"id":"n2189016039","loc":[-85.6352738,41.9623178],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016042":{"id":"n2189016042","loc":[-85.6357712,41.9623186],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016044":{"id":"n2189016044","loc":[-85.6357702,41.9626492],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n1057629880":{"id":"n1057629880","loc":[-85.638817,41.9619017],"version":"1","changeset":"6740055","user":"42429","uid":"42429","visible":"true","timestamp":"2010-12-22T21:14:10Z","tags":{}},"n1057629923":{"id":"n1057629923","loc":[-85.6390733,41.9615014],"version":"1","changeset":"6740055","user":"42429","uid":"42429","visible":"true","timestamp":"2010-12-22T21:14:11Z","tags":{}},"w91092312":{"id":"w91092312","version":"1","changeset":"6740055","user":"42429","uid":"42429","visible":"true","timestamp":"2010-12-22T21:14:12Z","tags":{"power":"station"},"nodes":["n1057629923","n1057629869","n1057629937","n1057629880","n1057629923"]},"w34369826":{"id":"w34369826","version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394490861","n394490862","n394490863","n394490864","n394490861"]},"w34369825":{"id":"w34369825","version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394490857","n394490858","n394490859","n394490860","n394490857"]},"w208627248":{"id":"w208627248","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189016014","n2189016017","n2189016020","n2189016022","n2189016025","n2189016028","n2189016031","n2189016034","n2189016037","n2189016039","n2189016042","n2189016044","n2189016014"]},"n394490766":{"id":"n394490766","loc":[-85.616777,41.955642],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490768":{"id":"n394490768","loc":[-85.617239,41.955644],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490792":{"id":"n394490792","loc":[-85.619034,41.95543],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n185972055":{"id":"n185972055","loc":[-85.6185905,41.9568211],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185972057":{"id":"n185972057","loc":[-85.6186688,41.9570086],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185972059":{"id":"n185972059","loc":[-85.6186924,41.9581453],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185972060":{"id":"n185972060","loc":[-85.6187082,41.9588211],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{"highway":"turning_circle","source":"Bing"}},"n1819790724":{"id":"n1819790724","loc":[-85.6182155,41.9555703],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790735":{"id":"n1819790735","loc":[-85.6184059,41.9566188],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790799":{"id":"n1819790799","loc":[-85.6182372,41.9563771],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790896":{"id":"n1819790896","loc":[-85.6181431,41.9557227],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n185971405":{"id":"n185971405","loc":[-85.6186766,41.9577468],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185971565":{"id":"n185971565","loc":[-85.6181613,41.9560879],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185967985":{"id":"n185967985","loc":[-85.6186798,41.9585791],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185955753":{"id":"n185955753","loc":[-85.620773,41.9555854],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185955755":{"id":"n185955755","loc":[-85.6212652,41.9559891],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185955748":{"id":"n185955748","loc":[-85.620722,41.954858],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:55Z","tags":{}},"n185955751":{"id":"n185955751","loc":[-85.6206912,41.955367],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185967987":{"id":"n185967987","loc":[-85.6159351,41.9585809],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185971407":{"id":"n185971407","loc":[-85.6159142,41.9577578],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185971570":{"id":"n185971570","loc":[-85.6162248,41.95603],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185971572":{"id":"n185971572","loc":[-85.6160402,41.9560749],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185971574":{"id":"n185971574","loc":[-85.61593,41.956201],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185981301":{"id":"n185981301","loc":[-85.6158973,41.9581601],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:05Z","tags":{}},"n394490762":{"id":"n394490762","loc":[-85.617193,41.954706],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490764":{"id":"n394490764","loc":[-85.616773,41.954737],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490787":{"id":"n394490787","loc":[-85.618972,41.954737],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490790":{"id":"n394490790","loc":[-85.619046,41.954929],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490794":{"id":"n394490794","loc":[-85.619922,41.955296],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490796":{"id":"n394490796","loc":[-85.61991,41.95501],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490798":{"id":"n394490798","loc":[-85.619974,41.954751],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n1819790677":{"id":"n1819790677","loc":[-85.6187031,41.9550522],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790787":{"id":"n1819790787","loc":[-85.6186436,41.9552022],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790828":{"id":"n1819790828","loc":[-85.6185127,41.9553393],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"w17966857":{"id":"w17966857","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:47:55Z","tags":{"access":"private","highway":"service","name":"Sable River Rd","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Sable River","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326128","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185972059","n185981301"]},"w34369814":{"id":"w34369814","version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394490787","n394490790","n394490792","n394490794","n394490796","n394490798","n394490787"]},"w17964176":{"id":"w17964176","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:27:42Z","tags":{"highway":"residential","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314404","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185955747","n185955748","n185955751","n185955753","n185955755"]},"w17965838":{"id":"w17965838","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:40:09Z","tags":{"access":"private","highway":"service","name":"Pine River Rd","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Pine River","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326123","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185971405","n185971407"]},"w17965476":{"id":"w17965476","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:37:16Z","tags":{"access":"private","highway":"service","name":"Raisin River Rd","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Raisin River","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326112","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185967985","n185967987"]},"w17965913":{"id":"w17965913","version":"2","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:06Z","tags":{"access":"private","highway":"service","name":"Shiawassee River Rd","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Shiawassee River","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326124:15326125:15326111:15326113:15326119","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185972054","n1819790677","n1819790787","n1819790828","n1819790724","n1819790896","n185971565","n1819790799","n1819790735","n185972055","n185972057","n185971405","n185972059","n185967985","n185972060"]},"w34369811":{"id":"w34369811","version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394490762","n394490764","n394490766","n394490768","n394490762"]},"w17965854":{"id":"w17965854","version":"2","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:06Z","tags":{"access":"private","highway":"service","name":"Sturgeon River Rd","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Sturgeon River","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326117","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185971565","n185971570","n185971572","n185971574"]},"n2139795769":{"id":"n2139795769","loc":[-85.6250804,41.9608796],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:55Z","tags":{}},"n2139795770":{"id":"n2139795770","loc":[-85.6250315,41.9613684],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:55Z","tags":{}},"n2139795771":{"id":"n2139795771","loc":[-85.6249671,41.9614362],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:55Z","tags":{}},"n2139795772":{"id":"n2139795772","loc":[-85.6249698,41.961522],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:55Z","tags":{}},"n2139795773":{"id":"n2139795773","loc":[-85.6250798,41.9615838],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:55Z","tags":{}},"n2139795774":{"id":"n2139795774","loc":[-85.6252273,41.9615639],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795775":{"id":"n2139795775","loc":[-85.6252863,41.9614622],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795776":{"id":"n2139795776","loc":[-85.6252273,41.9613764],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795777":{"id":"n2139795777","loc":[-85.6251227,41.9613525],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795778":{"id":"n2139795778","loc":[-85.6249564,41.9612527],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795779":{"id":"n2139795779","loc":[-85.6249846,41.9610254],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795780":{"id":"n2139795780","loc":[-85.6266725,41.9599647],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795781":{"id":"n2139795781","loc":[-85.6259162,41.9599711],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795782":{"id":"n2139795782","loc":[-85.6257185,41.960019],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795783":{"id":"n2139795783","loc":[-85.6255509,41.9601213],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n185963539":{"id":"n185963539","loc":[-85.615718,41.983893],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:58Z","tags":{}},"n185964418":{"id":"n185964418","loc":[-85.616626,42.049512],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:23Z","tags":{}},"n185966614":{"id":"n185966614","loc":[-85.615514,41.976603],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:41Z","tags":{}},"n185966635":{"id":"n185966635","loc":[-85.616118,42.013017],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:42Z","tags":{}},"n185969040":{"id":"n185969040","loc":[-85.615632,41.972357],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:45Z","tags":{}},"n185969070":{"id":"n185969070","loc":[-85.619145,41.967648],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:46Z","tags":{}},"n185972156":{"id":"n185972156","loc":[-85.621894,41.963956],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972157":{"id":"n185972157","loc":[-85.621806,41.964077],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972158":{"id":"n185972158","loc":[-85.620848,41.965341],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972159":{"id":"n185972159","loc":[-85.620684,41.965558],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972160":{"id":"n185972160","loc":[-85.620621,41.965658],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972161":{"id":"n185972161","loc":[-85.617844,41.969359],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972162":{"id":"n185972162","loc":[-85.616843,41.97068],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972164":{"id":"n185972164","loc":[-85.616714,41.970839],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972166":{"id":"n185972166","loc":[-85.615879,41.971969],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972168":{"id":"n185972168","loc":[-85.615748,41.972159],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972170":{"id":"n185972170","loc":[-85.615589,41.972502],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972172":{"id":"n185972172","loc":[-85.615542,41.972733],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972175":{"id":"n185972175","loc":[-85.615524,41.972947],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972177":{"id":"n185972177","loc":[-85.615512,41.973715],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972179":{"id":"n185972179","loc":[-85.615513,41.976496],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972180":{"id":"n185972180","loc":[-85.615538,41.977246],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972181":{"id":"n185972181","loc":[-85.61558,41.982139],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972184":{"id":"n185972184","loc":[-85.61557,41.983317],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972186":{"id":"n185972186","loc":[-85.615591,41.983463],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972188":{"id":"n185972188","loc":[-85.615763,41.984146],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972190":{"id":"n185972190","loc":[-85.615814,41.98435],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972192":{"id":"n185972192","loc":[-85.615965,41.998453],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972194":{"id":"n185972194","loc":[-85.615982,42.001237],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972195":{"id":"n185972195","loc":[-85.616055,42.00555],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972197":{"id":"n185972197","loc":[-85.616134,42.014887],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972199":{"id":"n185972199","loc":[-85.616177,42.018465],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972201":{"id":"n185972201","loc":[-85.616298,42.027627],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972203":{"id":"n185972203","loc":[-85.616513,42.042212],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"w203968015":{"id":"w203968015","version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:58Z","tags":{"highway":"residential"},"nodes":["n2139795768","n2139795769"]},"w17965932":{"id":"w17965932","version":"2","changeset":"14531170","user":"bot-mode","uid":"451693","visible":"true","timestamp":"2013-01-04T21:15:18Z","tags":{"highway":"residential","name":"Buckhorn Road","name_1":"County Highway 122","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Buckhorn","tiger:name_base_1":"County Highway 122","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185972155","n185972156","n185972157","n185972158","n185972159","n185972160","n185969070","n185972161","n185972162","n185972164","n185972166","n185972168","n185969040","n185972170","n185972172","n185972175","n185972177","n185972179","n185966614","n185972180","n185972181","n185972184","n185972186","n185963539","n185972188","n185972190","n185972192","n185972194","n185972195","n185966635","n185972197","n185972199","n185972201","n185972203","n185964418"]},"w203968016":{"id":"w203968016","version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:58Z","tags":{"highway":"residential","name":"New Jersey Court"},"nodes":["n2139795770","n2139795771","n2139795772","n2139795773","n2139795774","n2139795775","n2139795776","n2139795777","n2139795770","n2139795778","n2139795779","n2139795769"]},"w203968017":{"id":"w203968017","version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:58Z","tags":{"highway":"residential","name":"Oklahoma Drive"},"nodes":["n2139795780","n2139795781","n2139795782","n2139795783","n2139795769"]},"n1819790528":{"id":"n1819790528","loc":[-85.6184827,41.960025],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790530":{"id":"n1819790530","loc":[-85.6168626,41.9605834],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790534":{"id":"n1819790534","loc":[-85.6197379,41.9617163],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790541":{"id":"n1819790541","loc":[-85.6198881,41.9620833],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790543":{"id":"n1819790543","loc":[-85.619695,41.9619397],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790547":{"id":"n1819790547","loc":[-85.6190298,41.9609504],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790555":{"id":"n1819790555","loc":[-85.6180471,41.9609788],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790559":{"id":"n1819790559","loc":[-85.6203817,41.9605436],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790583":{"id":"n1819790583","loc":[-85.6201564,41.9603282],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790590":{"id":"n1819790590","loc":[-85.617045,41.9598894],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790609":{"id":"n1819790609","loc":[-85.6177638,41.9598495],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790618":{"id":"n1819790618","loc":[-85.6195234,41.9610143],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790642":{"id":"n1819790642","loc":[-85.6181179,41.9627933],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790659":{"id":"n1819790659","loc":[-85.6174634,41.962897],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790665":{"id":"n1819790665","loc":[-85.6170343,41.9630885],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790674":{"id":"n1819790674","loc":[-85.6194697,41.9601925],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790685":{"id":"n1819790685","loc":[-85.6207722,41.9610665],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790687":{"id":"n1819790687","loc":[-85.6202315,41.9622109],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790697":{"id":"n1819790697","loc":[-85.6184505,41.9624662],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790726":{"id":"n1819790726","loc":[-85.6178926,41.9628492],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790738":{"id":"n1819790738","loc":[-85.6173347,41.9598016],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790762":{"id":"n1819790762","loc":[-85.6186221,41.9609105],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790774":{"id":"n1819790774","loc":[-85.6175922,41.9608308],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790781":{"id":"n1819790781","loc":[-85.6167768,41.9633198],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790796":{"id":"n1819790796","loc":[-85.619856,41.961461],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790811":{"id":"n1819790811","loc":[-85.6208215,41.9620195],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790833":{"id":"n1819790833","loc":[-85.618311,41.9612536],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790854":{"id":"n1819790854","loc":[-85.6183646,41.9626417],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790863":{"id":"n1819790863","loc":[-85.6204997,41.9608547],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790867":{"id":"n1819790867","loc":[-85.6184934,41.9621391],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790877":{"id":"n1819790877","loc":[-85.6206928,41.9621152],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790881":{"id":"n1819790881","loc":[-85.6170879,41.960735],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790891":{"id":"n1819790891","loc":[-85.6168304,41.9601207],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790898":{"id":"n1819790898","loc":[-85.619813,41.9612297],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790909":{"id":"n1819790909","loc":[-85.6167982,41.960376],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790912":{"id":"n1819790912","loc":[-85.6205855,41.9610462],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790544":{"id":"n1819790544","loc":[-85.612968,41.9707781],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790549":{"id":"n1819790549","loc":[-85.614395,41.9697172],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790552":{"id":"n1819790552","loc":[-85.6180535,41.9655536],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790554":{"id":"n1819790554","loc":[-85.6111227,41.9703713],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790560":{"id":"n1819790560","loc":[-85.6112729,41.9701958],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790563":{"id":"n1819790563","loc":[-85.6137512,41.9689917],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790564":{"id":"n1819790564","loc":[-85.6181072,41.9659205],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790595":{"id":"n1819790595","loc":[-85.6170021,41.9666863],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790605":{"id":"n1819790605","loc":[-85.6168948,41.9644527],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790606":{"id":"n1819790606","loc":[-85.6128071,41.9701081],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790607":{"id":"n1819790607","loc":[-85.6129251,41.9704032],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790612":{"id":"n1819790612","loc":[-85.6177638,41.9663912],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790615":{"id":"n1819790615","loc":[-85.6152533,41.9670373],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790622":{"id":"n1819790622","loc":[-85.6146739,41.9673804],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790623":{"id":"n1819790623","loc":[-85.6180428,41.9661838],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790625":{"id":"n1819790625","loc":[-85.6172918,41.9646202],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790645":{"id":"n1819790645","loc":[-85.6178067,41.965043],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790647":{"id":"n1819790647","loc":[-85.6143306,41.9712488],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790649":{"id":"n1819790649","loc":[-85.6147383,41.9707702],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790654":{"id":"n1819790654","loc":[-85.6157361,41.9668459],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790657":{"id":"n1819790657","loc":[-85.6145666,41.9710733],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790668":{"id":"n1819790668","loc":[-85.6166909,41.9642692],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790671":{"id":"n1819790671","loc":[-85.6141482,41.9696538],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790679":{"id":"n1819790679","loc":[-85.6148349,41.9705388],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790686":{"id":"n1819790686","loc":[-85.6139551,41.9695501],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790696":{"id":"n1819790696","loc":[-85.6119703,41.9699087],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790704":{"id":"n1819790704","loc":[-85.6140731,41.9684174],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790706":{"id":"n1819790706","loc":[-85.6124745,41.9699246],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790718":{"id":"n1819790718","loc":[-85.6165407,41.9636868],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790720":{"id":"n1819790720","loc":[-85.61388,41.9687365],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790731":{"id":"n1819790731","loc":[-85.6165193,41.9639421],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790739":{"id":"n1819790739","loc":[-85.6146739,41.9699964],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790753":{"id":"n1819790753","loc":[-85.6173883,41.9665747],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790760":{"id":"n1819790760","loc":[-85.6133221,41.9712089],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790767":{"id":"n1819790767","loc":[-85.6116698,41.9699246],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790779":{"id":"n1819790779","loc":[-85.6130753,41.9710573],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790791":{"id":"n1819790791","loc":[-85.6137083,41.9692869],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790795":{"id":"n1819790795","loc":[-85.6141482,41.9679627],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790798":{"id":"n1819790798","loc":[-85.6137727,41.9694305],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790836":{"id":"n1819790836","loc":[-85.6143842,41.9676037],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790915":{"id":"n1819790915","loc":[-85.6148456,41.9702756],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790926":{"id":"n1819790926","loc":[-85.6138371,41.9713525],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:02Z","tags":{}},"n1819790927":{"id":"n1819790927","loc":[-85.6141053,41.9713525],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:02Z","tags":{}},"n1819790931":{"id":"n1819790931","loc":[-85.6162832,41.966814],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:02Z","tags":{}},"n1821014625":{"id":"n1821014625","loc":[-85.5960611,41.9808498],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014627":{"id":"n1821014627","loc":[-85.5565843,42.010982],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014629":{"id":"n1821014629","loc":[-85.5971541,41.9805808],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014632":{"id":"n1821014632","loc":[-85.6061837,41.9725907],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014633":{"id":"n1821014633","loc":[-85.5247773,42.025766],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014635":{"id":"n1821014635","loc":[-85.5908938,41.9902384],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014636":{"id":"n1821014636","loc":[-85.5917682,41.9860637],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014637":{"id":"n1821014637","loc":[-85.5456556,42.0166797],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014638":{"id":"n1821014638","loc":[-85.5795749,42.0032352],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014639":{"id":"n1821014639","loc":[-85.6103988,41.9723456],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014642":{"id":"n1821014642","loc":[-85.5818816,42.0022466],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014643":{"id":"n1821014643","loc":[-85.5570604,42.0091586],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014644":{"id":"n1821014644","loc":[-85.5952886,41.9803792],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014645":{"id":"n1821014645","loc":[-85.5780366,42.0040343],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014646":{"id":"n1821014646","loc":[-85.6050505,41.9751971],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014647":{"id":"n1821014647","loc":[-85.5854435,41.9946162],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014648":{"id":"n1821014648","loc":[-85.5452278,42.0168768],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014649":{"id":"n1821014649","loc":[-85.6023254,41.9780166],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014651":{"id":"n1821014651","loc":[-85.5761899,42.0046783],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014653":{"id":"n1821014653","loc":[-85.5897351,41.9876707],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014657":{"id":"n1821014657","loc":[-85.5963601,41.9808998],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014658":{"id":"n1821014658","loc":[-85.5892952,41.9951983],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014660":{"id":"n1821014660","loc":[-85.5778328,42.0037194],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014661":{"id":"n1821014661","loc":[-85.5541475,42.0125705],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014663":{"id":"n1821014663","loc":[-85.5914047,41.9856469],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014664":{"id":"n1821014664","loc":[-85.6101681,41.9727723],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014665":{"id":"n1821014665","loc":[-85.5910172,41.9854696],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014666":{"id":"n1821014666","loc":[-85.5398688,42.0187699],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014667":{"id":"n1821014667","loc":[-85.5218752,42.0282884],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014668":{"id":"n1821014668","loc":[-85.5159582,42.0329384],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014669":{"id":"n1821014669","loc":[-85.5898102,41.9847319],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014670":{"id":"n1821014670","loc":[-85.5734809,42.0066235],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014671":{"id":"n1821014671","loc":[-85.5922939,41.980852],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014672":{"id":"n1821014672","loc":[-85.6023629,41.9781163],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014674":{"id":"n1821014674","loc":[-85.5409953,42.0191724],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014676":{"id":"n1821014676","loc":[-85.584435,41.9949909],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014677":{"id":"n1821014677","loc":[-85.5972399,41.9783835],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014678":{"id":"n1821014678","loc":[-85.5616738,42.0071337],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014681":{"id":"n1821014681","loc":[-85.5202994,42.0310755],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014682":{"id":"n1821014682","loc":[-85.5915912,41.9857767],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014684":{"id":"n1821014684","loc":[-85.6022288,41.977897],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014687":{"id":"n1821014687","loc":[-85.5933024,41.9846362],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014688":{"id":"n1821014688","loc":[-85.5846871,41.9956169],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014689":{"id":"n1821014689","loc":[-85.5898209,41.99037],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014691":{"id":"n1821014691","loc":[-85.5448939,42.0149261],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014692":{"id":"n1821014692","loc":[-85.5977763,41.9786348],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014694":{"id":"n1821014694","loc":[-85.5767706,42.0034523],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014695":{"id":"n1821014695","loc":[-85.6103559,41.9726766],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014697":{"id":"n1821014697","loc":[-85.5922134,41.9809876],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014698":{"id":"n1821014698","loc":[-85.5935277,41.9831728],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014700":{"id":"n1821014700","loc":[-85.5674674,42.0078273],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014703":{"id":"n1821014703","loc":[-85.6021,41.9778053],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014704":{"id":"n1821014704","loc":[-85.5756763,42.0053737],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014705":{"id":"n1821014705","loc":[-85.5887695,41.9895207],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014707":{"id":"n1821014707","loc":[-85.6061073,41.9746866],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014708":{"id":"n1821014708","loc":[-85.6033446,41.9751692],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014710":{"id":"n1821014710","loc":[-85.5180986,42.0322332],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014711":{"id":"n1821014711","loc":[-85.543365,42.0163569],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014712":{"id":"n1821014712","loc":[-85.6030656,41.9753646],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014713":{"id":"n1821014713","loc":[-85.6104417,41.9704792],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014714":{"id":"n1821014714","loc":[-85.5205716,42.030998],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014716":{"id":"n1821014716","loc":[-85.516382,42.032536],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014717":{"id":"n1821014717","loc":[-85.5932863,41.9820882],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014718":{"id":"n1821014718","loc":[-85.5361928,42.0194974],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014720":{"id":"n1821014720","loc":[-85.6011613,41.9773586],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014721":{"id":"n1821014721","loc":[-85.554287,42.0109124],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014722":{"id":"n1821014722","loc":[-85.5577524,42.0103425],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014725":{"id":"n1821014725","loc":[-85.5867256,41.9921004],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014726":{"id":"n1821014726","loc":[-85.5856045,41.9968807],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014727":{"id":"n1821014727","loc":[-85.5545445,42.0106454],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014728":{"id":"n1821014728","loc":[-85.5923797,41.9842534],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014729":{"id":"n1821014729","loc":[-85.5696346,42.0081462],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014730":{"id":"n1821014730","loc":[-85.5998322,41.9786884],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014735":{"id":"n1821014735","loc":[-85.5337426,42.0218266],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014736":{"id":"n1821014736","loc":[-85.5847944,41.994672],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014740":{"id":"n1821014740","loc":[-85.5315271,42.0238669],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014741":{"id":"n1821014741","loc":[-85.5248846,42.027085],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014742":{"id":"n1821014742","loc":[-85.5853376,41.997018],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014743":{"id":"n1821014743","loc":[-85.5894883,41.988811],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014745":{"id":"n1821014745","loc":[-85.6095311,41.9726226],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014746":{"id":"n1821014746","loc":[-85.5531511,42.0133416],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014747":{"id":"n1821014747","loc":[-85.5735882,42.007058],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014749":{"id":"n1821014749","loc":[-85.5428554,42.0164366],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014751":{"id":"n1821014751","loc":[-85.5395255,42.0186304],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014752":{"id":"n1821014752","loc":[-85.571378,42.0083176],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014754":{"id":"n1821014754","loc":[-85.5541918,42.0113925],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014755":{"id":"n1821014755","loc":[-85.5278029,42.0250806],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014756":{"id":"n1821014756","loc":[-85.5936725,41.9827102],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014757":{"id":"n1821014757","loc":[-85.5176266,42.0346677],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014758":{"id":"n1821014758","loc":[-85.6096692,41.9714245],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014759":{"id":"n1821014759","loc":[-85.5770321,42.0034266],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014761":{"id":"n1821014761","loc":[-85.5988921,41.9779369],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014762":{"id":"n1821014762","loc":[-85.5811788,42.0024499],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014763":{"id":"n1821014763","loc":[-85.5154003,42.0381101],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014764":{"id":"n1821014764","loc":[-85.5155827,42.0374089],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014765":{"id":"n1821014765","loc":[-85.5891249,41.9884978],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014766":{"id":"n1821014766","loc":[-85.5313863,42.0238293],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014768":{"id":"n1821014768","loc":[-85.593297,41.9833363],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014769":{"id":"n1821014769","loc":[-85.5849446,41.9957245],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014770":{"id":"n1821014770","loc":[-85.5537774,42.0130847],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014771":{"id":"n1821014771","loc":[-85.6111766,41.9706069],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014772":{"id":"n1821014772","loc":[-85.5585477,42.008989],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014774":{"id":"n1821014774","loc":[-85.5928142,41.9852623],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014777":{"id":"n1821014777","loc":[-85.5891933,41.9882608],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014778":{"id":"n1821014778","loc":[-85.5926909,41.9817532],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014779":{"id":"n1821014779","loc":[-85.5260272,42.0252201],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014781":{"id":"n1821014781","loc":[-85.5894615,41.9950468],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014782":{"id":"n1821014782","loc":[-85.5461063,42.0143242],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014783":{"id":"n1821014783","loc":[-85.5711527,42.0085886],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014784":{"id":"n1821014784","loc":[-85.5329379,42.0218624],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014786":{"id":"n1821014786","loc":[-85.583047,42.0020252],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014787":{"id":"n1821014787","loc":[-85.5758962,42.0054095],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014788":{"id":"n1821014788","loc":[-85.5626354,42.0077733],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014789":{"id":"n1821014789","loc":[-85.6029852,41.9755999],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014790":{"id":"n1821014790","loc":[-85.5892362,41.9886755],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014791":{"id":"n1821014791","loc":[-85.5157597,42.0372017],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014793":{"id":"n1821014793","loc":[-85.6054582,41.9751094],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014794":{"id":"n1821014794","loc":[-85.5986936,41.9778412],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014795":{"id":"n1821014795","loc":[-85.5880775,41.98976],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014796":{"id":"n1821014796","loc":[-85.5858727,41.9963624],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014798":{"id":"n1821014798","loc":[-85.5792543,42.0035958],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014799":{"id":"n1821014799","loc":[-85.5921665,41.9838326],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014801":{"id":"n1821014801","loc":[-85.599214,41.9782599],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014802":{"id":"n1821014802","loc":[-85.5571905,42.0090967],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014803":{"id":"n1821014803","loc":[-85.5426891,42.0173612],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014804":{"id":"n1821014804","loc":[-85.5889626,41.9896404],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014805":{"id":"n1821014805","loc":[-85.5491264,42.0141648],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014806":{"id":"n1821014806","loc":[-85.5618897,42.0072631],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014808":{"id":"n1821014808","loc":[-85.5573501,42.0109802],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014809":{"id":"n1821014809","loc":[-85.5983463,41.9778031],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014810":{"id":"n1821014810","loc":[-85.5885173,41.9895128],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014811":{"id":"n1821014811","loc":[-85.6084998,41.9721143],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014812":{"id":"n1821014812","loc":[-85.5737598,42.0056389],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014814":{"id":"n1821014814","loc":[-85.5542173,42.0118132],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014816":{"id":"n1821014816","loc":[-85.5277868,42.024451],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014817":{"id":"n1821014817","loc":[-85.5403999,42.0191724],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014819":{"id":"n1821014819","loc":[-85.5983879,41.9791452],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014820":{"id":"n1821014820","loc":[-85.5891302,41.9897578],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014822":{"id":"n1821014822","loc":[-85.5930731,41.9805108],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014824":{"id":"n1821014824","loc":[-85.515395,42.0378471],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014825":{"id":"n1821014825","loc":[-85.5352755,42.0205136],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014826":{"id":"n1821014826","loc":[-85.5502744,42.0133398],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014828":{"id":"n1821014828","loc":[-85.5701295,42.0088256],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014830":{"id":"n1821014830","loc":[-85.5888929,41.9953099],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014832":{"id":"n1821014832","loc":[-85.5880077,41.9901547],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014833":{"id":"n1821014833","loc":[-85.5451192,42.0157072],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014834":{"id":"n1821014834","loc":[-85.6096478,41.9711932],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014835":{"id":"n1821014835","loc":[-85.5806424,42.0026532],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014836":{"id":"n1821014836","loc":[-85.5911674,41.9868732],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014838":{"id":"n1821014838","loc":[-85.5930302,41.9836571],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014839":{"id":"n1821014839","loc":[-85.588925,41.9938148],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014840":{"id":"n1821014840","loc":[-85.6111874,41.9705311],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014841":{"id":"n1821014841","loc":[-85.5680843,42.0075842],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014842":{"id":"n1821014842","loc":[-85.6012793,41.9775062],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014843":{"id":"n1821014843","loc":[-85.5855562,41.9989777],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014844":{"id":"n1821014844","loc":[-85.5506137,42.0131662],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014845":{"id":"n1821014845","loc":[-85.5270049,42.025457],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014846":{"id":"n1821014846","loc":[-85.5257054,42.025244],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014847":{"id":"n1821014847","loc":[-85.6011184,41.9771832],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014848":{"id":"n1821014848","loc":[-85.515534,42.0389234],"version":"2","changeset":"15306911","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-09T19:57:21Z","tags":{}},"n1821014850":{"id":"n1821014850","loc":[-85.5847032,42.0010347],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014853":{"id":"n1821014853","loc":[-85.5361499,42.019063],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014854":{"id":"n1821014854","loc":[-85.5439176,42.0165721],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014855":{"id":"n1821014855","loc":[-85.5838825,42.0017284],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014857":{"id":"n1821014857","loc":[-85.5542173,42.0122317],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014859":{"id":"n1821014859","loc":[-85.5708201,42.0089195],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014860":{"id":"n1821014860","loc":[-85.5844833,41.9954415],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014862":{"id":"n1821014862","loc":[-85.5223204,42.0295396],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014863":{"id":"n1821014863","loc":[-85.5777898,42.0035918],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014864":{"id":"n1821014864","loc":[-85.591044,41.9898078],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014865":{"id":"n1821014865","loc":[-85.5973204,41.980182],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014866":{"id":"n1821014866","loc":[-85.5699578,42.0085825],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014867":{"id":"n1821014867","loc":[-85.5210598,42.0305278],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014868":{"id":"n1821014868","loc":[-85.5929108,41.9819008],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014869":{"id":"n1821014869","loc":[-85.5279799,42.0242995],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014870":{"id":"n1821014870","loc":[-85.5196114,42.0320539],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014871":{"id":"n1821014871","loc":[-85.5785449,42.0040883],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014872":{"id":"n1821014872","loc":[-85.588292,41.9895766],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014873":{"id":"n1821014873","loc":[-85.5160172,42.0331775],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014874":{"id":"n1821014874","loc":[-85.5688849,42.0077016],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014876":{"id":"n1821014876","loc":[-85.5857976,41.9996036],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014879":{"id":"n1821014879","loc":[-85.5990906,41.9780765],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014881":{"id":"n1821014881","loc":[-85.5483647,42.0144279],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014883":{"id":"n1821014883","loc":[-85.5691209,42.0077972],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014885":{"id":"n1821014885","loc":[-85.6076844,41.9721103],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014886":{"id":"n1821014886","loc":[-85.6015489,41.9766147],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014887":{"id":"n1821014887","loc":[-85.574822,42.0052802],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014888":{"id":"n1821014888","loc":[-85.5880024,41.9899593],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014890":{"id":"n1821014890","loc":[-85.5909421,41.9893772],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014892":{"id":"n1821014892","loc":[-85.5497326,42.0138141],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014893":{"id":"n1821014893","loc":[-85.5167106,42.0357811],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014895":{"id":"n1821014895","loc":[-85.5844404,41.9952501],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014896":{"id":"n1821014896","loc":[-85.5362465,42.0192662],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014898":{"id":"n1821014898","loc":[-85.5906095,41.9889147],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014899":{"id":"n1821014899","loc":[-85.5590667,42.0089354],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014900":{"id":"n1821014900","loc":[-85.5921598,41.9844209],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014902":{"id":"n1821014902","loc":[-85.5778971,42.0039266],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014903":{"id":"n1821014903","loc":[-85.603012,41.9761981],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014904":{"id":"n1821014904","loc":[-85.6108977,41.9706787],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014905":{"id":"n1821014905","loc":[-85.5685738,42.0076139],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014906":{"id":"n1821014906","loc":[-85.5392787,42.0186304],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014907":{"id":"n1821014907","loc":[-85.5227885,42.0274972],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014908":{"id":"n1821014908","loc":[-85.5857547,41.9961431],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014910":{"id":"n1821014910","loc":[-85.5610354,42.0072812],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014911":{"id":"n1821014911","loc":[-85.5209632,42.0308705],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014912":{"id":"n1821014912","loc":[-85.5709757,42.0087959],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014913":{"id":"n1821014913","loc":[-85.59231,41.9839344],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014914":{"id":"n1821014914","loc":[-85.5375245,42.0185865],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014916":{"id":"n1821014916","loc":[-85.5901548,41.9839841],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014917":{"id":"n1821014917","loc":[-85.5611213,42.0086405],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014918":{"id":"n1821014918","loc":[-85.5360426,42.0198122],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014919":{"id":"n1821014919","loc":[-85.5862817,41.9948691],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014921":{"id":"n1821014921","loc":[-85.5469807,42.0144438],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014922":{"id":"n1821014922","loc":[-85.5761309,42.0053838],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014924":{"id":"n1821014924","loc":[-85.516264,42.0332971],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014925":{"id":"n1821014925","loc":[-85.5277224,42.0246661],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014926":{"id":"n1821014926","loc":[-85.5980016,41.9798231],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014928":{"id":"n1821014928","loc":[-85.5924548,41.9806965],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014930":{"id":"n1821014930","loc":[-85.5899121,41.985023],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014931":{"id":"n1821014931","loc":[-85.5706015,42.0089492],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014932":{"id":"n1821014932","loc":[-85.515926,42.033046],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014933":{"id":"n1821014933","loc":[-85.5982377,41.9796796],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014936":{"id":"n1821014936","loc":[-85.5475721,42.0145253],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014938":{"id":"n1821014938","loc":[-85.5895701,41.9902323],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014939":{"id":"n1821014939","loc":[-85.6030495,41.9759947],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014942":{"id":"n1821014942","loc":[-85.6094721,41.9724989],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014944":{"id":"n1821014944","loc":[-85.5921973,41.9811112],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014945":{"id":"n1821014945","loc":[-85.5223526,42.0291332],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014946":{"id":"n1821014946","loc":[-85.5965103,41.9808998],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014948":{"id":"n1821014948","loc":[-85.517766,42.0349227],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014950":{"id":"n1821014950","loc":[-85.5889894,41.990996],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014951":{"id":"n1821014951","loc":[-85.5601932,42.0092902],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014954":{"id":"n1821014954","loc":[-85.6028135,41.9764055],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014955":{"id":"n1821014955","loc":[-85.5520621,42.0130666],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014956":{"id":"n1821014956","loc":[-85.593002,41.9839344],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014957":{"id":"n1821014957","loc":[-85.515926,42.0369666],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014960":{"id":"n1821014960","loc":[-85.5761255,42.003877],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014961":{"id":"n1821014961","loc":[-85.5716355,42.007911],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014962":{"id":"n1821014962","loc":[-85.5575378,42.0109045],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014963":{"id":"n1821014963","loc":[-85.5735667,42.0068188],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014964":{"id":"n1821014964","loc":[-85.5915214,41.9865861],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014965":{"id":"n1821014965","loc":[-85.5866344,41.9923157],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014967":{"id":"n1821014967","loc":[-85.5283138,42.0242256],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014968":{"id":"n1821014968","loc":[-85.5177875,42.0355801],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014969":{"id":"n1821014969","loc":[-85.548071,42.0144934],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014972":{"id":"n1821014972","loc":[-85.5611159,42.0088557],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014973":{"id":"n1821014973","loc":[-85.541686,42.0188757],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014974":{"id":"n1821014974","loc":[-85.5917628,41.9862631],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014975":{"id":"n1821014975","loc":[-85.5854864,41.9959478],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014977":{"id":"n1821014977","loc":[-85.609102,41.9722317],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014980":{"id":"n1821014980","loc":[-85.5761202,42.0042438],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014982":{"id":"n1821014982","loc":[-85.5465944,42.0143601],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014983":{"id":"n1821014983","loc":[-85.5173261,42.0342732],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014984":{"id":"n1821014984","loc":[-85.5897297,41.9888509],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014985":{"id":"n1821014985","loc":[-85.5856688,41.999181],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014986":{"id":"n1821014986","loc":[-85.5344011,42.0217251],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014987":{"id":"n1821014987","loc":[-85.601467,41.9768203],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014988":{"id":"n1821014988","loc":[-85.5457254,42.0165123],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014989":{"id":"n1821014989","loc":[-85.6023482,41.9784332],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014991":{"id":"n1821014991","loc":[-85.5361606,42.01823],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014992":{"id":"n1821014992","loc":[-85.5178465,42.0351139],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014995":{"id":"n1821014995","loc":[-85.5634293,42.0078092],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014996":{"id":"n1821014996","loc":[-85.573497,42.0072015],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014997":{"id":"n1821014997","loc":[-85.5976328,41.9799725],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014998":{"id":"n1821014998","loc":[-85.5210651,42.0303166],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821015003":{"id":"n1821015003","loc":[-85.5222131,42.0288064],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821015004":{"id":"n1821015004","loc":[-85.5897941,41.984405],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821015005":{"id":"n1821015005","loc":[-85.5975725,41.9776099],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821015006":{"id":"n1821015006","loc":[-85.5765708,42.0034903],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821015007":{"id":"n1821015007","loc":[-85.5250187,42.026559],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015009":{"id":"n1821015009","loc":[-85.5426998,42.0166279],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015010":{"id":"n1821015010","loc":[-85.5957606,41.9806584],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015011":{"id":"n1821015011","loc":[-85.5262753,42.0252497],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015012":{"id":"n1821015012","loc":[-85.5266455,42.0253374],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015014":{"id":"n1821015014","loc":[-85.5515632,42.0130187],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015015":{"id":"n1821015015","loc":[-85.6024058,41.9765212],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015017":{"id":"n1821015017","loc":[-85.5175032,42.0357156],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015018":{"id":"n1821015018","loc":[-85.5302718,42.0236039],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015019":{"id":"n1821015019","loc":[-85.6024005,41.9782759],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015020":{"id":"n1821015020","loc":[-85.5907758,41.9890821],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015021":{"id":"n1821015021","loc":[-85.6019445,41.9777215],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015022":{"id":"n1821015022","loc":[-85.5942854,41.9800881],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015024":{"id":"n1821015024","loc":[-85.5325826,42.0222711],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015029":{"id":"n1821015029","loc":[-85.555093,42.0105316],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015033":{"id":"n1821015033","loc":[-85.5249704,42.0270372],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015034":{"id":"n1821015034","loc":[-85.5243965,42.0272205],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015038":{"id":"n1821015038","loc":[-85.5413426,42.0190749],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015039":{"id":"n1821015039","loc":[-85.5920431,41.9848175],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015041":{"id":"n1821015041","loc":[-85.5577685,42.0106015],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015042":{"id":"n1821015042","loc":[-85.5453606,42.0158866],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015045":{"id":"n1821015045","loc":[-85.5333228,42.0217889],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015046":{"id":"n1821015046","loc":[-85.5426891,42.0175924],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015048":{"id":"n1821015048","loc":[-85.5886836,41.9936474],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015050":{"id":"n1821015050","loc":[-85.6001152,41.9786467],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015051":{"id":"n1821015051","loc":[-85.6094064,41.9723655],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015053":{"id":"n1821015053","loc":[-85.605721,41.9749738],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015055":{"id":"n1821015055","loc":[-85.6106791,41.9705048],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015057":{"id":"n1821015057","loc":[-85.5210437,42.0307071],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015059":{"id":"n1821015059","loc":[-85.5995694,41.9786725],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015060":{"id":"n1821015060","loc":[-85.5371638,42.0182938],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015062":{"id":"n1821015062","loc":[-85.6111766,41.9704593],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015065":{"id":"n1821015065","loc":[-85.577704,42.0034921],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015067":{"id":"n1821015067","loc":[-85.5570067,42.0093699],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015068":{"id":"n1821015068","loc":[-85.5920364,41.9845525],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015069":{"id":"n1821015069","loc":[-85.5252065,42.0253954],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015072":{"id":"n1821015072","loc":[-85.5664159,42.0088517],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015073":{"id":"n1821015073","loc":[-85.5880399,41.991905],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015075":{"id":"n1821015075","loc":[-85.6099871,41.9727861],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015076":{"id":"n1821015076","loc":[-85.5319603,42.0231478],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015078":{"id":"n1821015078","loc":[-85.6036088,41.9751112],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015080":{"id":"n1821015080","loc":[-85.5983128,41.9789179],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015082":{"id":"n1821015082","loc":[-85.5614069,42.0071395],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015083":{"id":"n1821015083","loc":[-85.60968,41.9709738],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015086":{"id":"n1821015086","loc":[-85.5914195,41.9837351],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015087":{"id":"n1821015087","loc":[-85.5895473,41.9948036],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015090":{"id":"n1821015090","loc":[-85.5929913,41.9851905],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015093":{"id":"n1821015093","loc":[-85.5907396,41.9838485],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015095":{"id":"n1821015095","loc":[-85.5893864,41.9880176],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015096":{"id":"n1821015096","loc":[-85.5788024,42.0039807],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015097":{"id":"n1821015097","loc":[-85.5630592,42.0078411],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015098":{"id":"n1821015098","loc":[-85.5350609,42.0211274],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015099":{"id":"n1821015099","loc":[-85.5967195,41.9808679],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015100":{"id":"n1821015100","loc":[-85.5666734,42.0088119],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015101":{"id":"n1821015101","loc":[-85.564694,42.0077675],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015103":{"id":"n1821015103","loc":[-85.6066544,41.9726527],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015104":{"id":"n1821015104","loc":[-85.6011827,41.9769838],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015105":{"id":"n1821015105","loc":[-85.5972131,41.9776697],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015106":{"id":"n1821015106","loc":[-85.5880828,41.9903341],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015107":{"id":"n1821015107","loc":[-85.5510268,42.0130626],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015108":{"id":"n1821015108","loc":[-85.6102164,41.970543],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015109":{"id":"n1821015109","loc":[-85.5905344,41.9853899],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015111":{"id":"n1821015111","loc":[-85.5888821,41.9913429],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015112":{"id":"n1821015112","loc":[-85.606295,41.9741921],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015114":{"id":"n1821015114","loc":[-85.5969556,41.9807443],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015115":{"id":"n1821015115","loc":[-85.5882223,41.9934081],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015116":{"id":"n1821015116","loc":[-85.6104471,41.9724971],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015118":{"id":"n1821015118","loc":[-85.5406091,42.0192162],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015120":{"id":"n1821015120","loc":[-85.589955,41.9888429],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015121":{"id":"n1821015121","loc":[-85.5598821,42.0092304],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015122":{"id":"n1821015122","loc":[-85.545598,42.0144097],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015123":{"id":"n1821015123","loc":[-85.5649528,42.0079965],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015125":{"id":"n1821015125","loc":[-85.5883993,41.9917814],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015126":{"id":"n1821015126","loc":[-85.5295785,42.0239967],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015129":{"id":"n1821015129","loc":[-85.5648723,42.0078809],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015132":{"id":"n1821015132","loc":[-85.564989,42.0081103],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015133":{"id":"n1821015133","loc":[-85.5946127,41.9800841],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015134":{"id":"n1821015134","loc":[-85.583448,42.0019078],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015135":{"id":"n1821015135","loc":[-85.5905934,41.9871842],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015137":{"id":"n1821015137","loc":[-85.610608,41.9704752],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015138":{"id":"n1821015138","loc":[-85.5752257,42.0052939],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015139":{"id":"n1821015139","loc":[-85.5893864,41.9943491],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015140":{"id":"n1821015140","loc":[-85.5426247,42.0169866],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015141":{"id":"n1821015141","loc":[-85.562001,42.0074526],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015142":{"id":"n1821015142","loc":[-85.5212046,42.0301094],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015143":{"id":"n1821015143","loc":[-85.602214,41.9784531],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015144":{"id":"n1821015144","loc":[-85.5858687,41.9948293],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015145":{"id":"n1821015145","loc":[-85.5608477,42.0074805],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015146":{"id":"n1821015146","loc":[-85.5651607,42.0083614],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015147":{"id":"n1821015147","loc":[-85.5288288,42.0242495],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015149":{"id":"n1821015149","loc":[-85.5450334,42.0146989],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015151":{"id":"n1821015151","loc":[-85.5578275,42.0092304],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015154":{"id":"n1821015154","loc":[-85.6056634,41.9724511],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015155":{"id":"n1821015155","loc":[-85.5902179,41.9852742],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015156":{"id":"n1821015156","loc":[-85.5156256,42.0387157],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015157":{"id":"n1821015157","loc":[-85.5734433,42.0059459],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015158":{"id":"n1821015158","loc":[-85.6050773,41.9731273],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015160":{"id":"n1821015160","loc":[-85.5223419,42.0275233],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015163":{"id":"n1821015163","loc":[-85.6053562,41.972525],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015164":{"id":"n1821015164","loc":[-85.5850412,41.9946082],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015165":{"id":"n1821015165","loc":[-85.5359031,42.0186326],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015166":{"id":"n1821015166","loc":[-85.5608745,42.0077635],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015169":{"id":"n1821015169","loc":[-85.572876,42.0073189],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015171":{"id":"n1821015171","loc":[-85.5875424,41.9919188],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015172":{"id":"n1821015172","loc":[-85.5240116,42.0272581],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015173":{"id":"n1821015173","loc":[-85.5318369,42.0236818],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015174":{"id":"n1821015174","loc":[-85.566888,42.0086923],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015175":{"id":"n1821015175","loc":[-85.5931522,41.9850669],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015176":{"id":"n1821015176","loc":[-85.5604842,42.0093199],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015177":{"id":"n1821015177","loc":[-85.5868168,41.9927543],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015178":{"id":"n1821015178","loc":[-85.6052275,41.9732549],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015179":{"id":"n1821015179","loc":[-85.5910118,41.9900431],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015182":{"id":"n1821015182","loc":[-85.5610032,42.0082897],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015183":{"id":"n1821015183","loc":[-85.5425443,42.0179431],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015184":{"id":"n1821015184","loc":[-85.5843277,42.0014055],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015186":{"id":"n1821015186","loc":[-85.5733307,42.0063564],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015188":{"id":"n1821015188","loc":[-85.5277385,42.0248694],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015189":{"id":"n1821015189","loc":[-85.5558427,42.0108168],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015190":{"id":"n1821015190","loc":[-85.5650587,42.0082618],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015191":{"id":"n1821015191","loc":[-85.5660351,42.0088278],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015192":{"id":"n1821015192","loc":[-85.5849768,41.9980049],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015194":{"id":"n1821015194","loc":[-85.5359139,42.0188199],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015195":{"id":"n1821015195","loc":[-85.593238,41.9849194],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015197":{"id":"n1821015197","loc":[-85.5850841,41.9983239],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015199":{"id":"n1821015199","loc":[-85.5983396,41.9794283],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015204":{"id":"n1821015204","loc":[-85.5452801,42.0145355],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015205":{"id":"n1821015205","loc":[-85.5340685,42.0218407],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015207":{"id":"n1821015207","loc":[-85.5773272,42.0034186],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015209":{"id":"n1821015209","loc":[-85.5535212,42.0132419],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015211":{"id":"n1821015211","loc":[-85.6107703,41.9706045],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015212":{"id":"n1821015212","loc":[-85.6030066,41.9758193],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015213":{"id":"n1821015213","loc":[-85.5359943,42.0184213],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015214":{"id":"n1821015214","loc":[-85.5922993,41.9813305],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015215":{"id":"n1821015215","loc":[-85.5672689,42.0080465],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015217":{"id":"n1821015217","loc":[-85.5160494,42.0365682],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015218":{"id":"n1821015218","loc":[-85.5401142,42.0190351],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015219":{"id":"n1821015219","loc":[-85.5607632,42.0092282],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015220":{"id":"n1821015220","loc":[-85.5866197,41.9947894],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015221":{"id":"n1821015221","loc":[-85.6017889,41.9765132],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015222":{"id":"n1821015222","loc":[-85.5595978,42.009059],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015226":{"id":"n1821015226","loc":[-85.5871494,41.9929018],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015227":{"id":"n1821015227","loc":[-85.5857708,41.9998866],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015228":{"id":"n1821015228","loc":[-85.5317135,42.0238094],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015231":{"id":"n1821015231","loc":[-85.5733521,42.0061372],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015233":{"id":"n1821015233","loc":[-85.5855991,42.0001936],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015234":{"id":"n1821015234","loc":[-85.5213924,42.029962],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015235":{"id":"n1821015235","loc":[-85.6052221,41.9726567],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015236":{"id":"n1821015236","loc":[-85.5763723,42.0035422],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015237":{"id":"n1821015237","loc":[-85.5858512,41.9966215],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015238":{"id":"n1821015238","loc":[-85.567061,42.008439],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015239":{"id":"n1821015239","loc":[-85.5250563,42.0269057],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015240":{"id":"n1821015240","loc":[-85.5347551,42.0214263],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015241":{"id":"n1821015241","loc":[-85.6098463,41.9707066],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015242":{"id":"n1821015242","loc":[-85.5676927,42.0076519],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015243":{"id":"n1821015243","loc":[-85.516775,42.0322669],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015244":{"id":"n1821015244","loc":[-85.5762275,42.0036538],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015245":{"id":"n1821015245","loc":[-85.5583639,42.0090949],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015246":{"id":"n1821015246","loc":[-85.5554041,42.0106432],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015247":{"id":"n1821015247","loc":[-85.5973364,41.9776099],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015248":{"id":"n1821015248","loc":[-85.6098945,41.9717513],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015249":{"id":"n1821015249","loc":[-85.6045315,41.9751511],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015250":{"id":"n1821015250","loc":[-85.5579938,42.0092264],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015253":{"id":"n1821015253","loc":[-85.6058873,41.9724652],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015254":{"id":"n1821015254","loc":[-85.5869456,41.9947517],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015255":{"id":"n1821015255","loc":[-85.5936565,41.9823713],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015256":{"id":"n1821015256","loc":[-85.5218269,42.0278102],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015258":{"id":"n1821015258","loc":[-85.5887802,41.9905534],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015259":{"id":"n1821015259","loc":[-85.5901924,41.9904515],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015263":{"id":"n1821015263","loc":[-85.5249222,42.0255787],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015265":{"id":"n1821015265","loc":[-85.5175206,42.0321672],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015266":{"id":"n1821015266","loc":[-85.5275722,42.0254034],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015267":{"id":"n1821015267","loc":[-85.6016226,41.9765451],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015269":{"id":"n1821015269","loc":[-85.5569316,42.011032],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015271":{"id":"n1821015271","loc":[-85.6010714,41.9785209],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015272":{"id":"n1821015272","loc":[-85.6050666,41.9729917],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015273":{"id":"n1821015273","loc":[-85.5891235,41.99529],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015274":{"id":"n1821015274","loc":[-85.515454,42.0376439],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015276":{"id":"n1821015276","loc":[-85.5776021,42.0034443],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015277":{"id":"n1821015277","loc":[-85.6041707,41.9751453],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015278":{"id":"n1821015278","loc":[-85.5444701,42.0167435],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015280":{"id":"n1821015280","loc":[-85.5923274,41.9852202],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015283":{"id":"n1821015283","loc":[-85.5893649,41.9900271],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015284":{"id":"n1821015284","loc":[-85.5933453,41.9804412],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015285":{"id":"n1821015285","loc":[-85.5247237,42.026017],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015286":{"id":"n1821015286","loc":[-85.5286182,42.0242477],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015287":{"id":"n1821015287","loc":[-85.5904003,41.9888549],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015288":{"id":"n1821015288","loc":[-85.6062146,41.9739369],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015290":{"id":"n1821015290","loc":[-85.5762596,42.0052602],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015292":{"id":"n1821015292","loc":[-85.5849715,41.9975465],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015293":{"id":"n1821015293","loc":[-85.585229,42.0006241],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015294":{"id":"n1821015294","loc":[-85.5926922,41.9805946],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015295":{"id":"n1821015295","loc":[-85.5703387,42.0089133],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015299":{"id":"n1821015299","loc":[-85.5789955,42.0038611],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015301":{"id":"n1821015301","loc":[-85.6072888,41.9721918],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015302":{"id":"n1821015302","loc":[-85.5356349,42.0200992],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015304":{"id":"n1821015304","loc":[-85.5891772,41.994066],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015306":{"id":"n1821015306","loc":[-85.606295,41.9744952],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015307":{"id":"n1821015307","loc":[-85.538871,42.0186583],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015308":{"id":"n1821015308","loc":[-85.587997,41.994971],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015311":{"id":"n1821015311","loc":[-85.606869,41.9725809],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015312":{"id":"n1821015312","loc":[-85.5171974,42.0339943],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015314":{"id":"n1821015314","loc":[-85.5327435,42.0220479],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015315":{"id":"n1821015315","loc":[-85.5383439,42.0187282],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015316":{"id":"n1821015316","loc":[-85.5248095,42.0263119],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015318":{"id":"n1821015318","loc":[-85.5732502,42.0073051],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015319":{"id":"n1821015319","loc":[-85.5924226,41.9852663],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015321":{"id":"n1821015321","loc":[-85.5179001,42.0353052],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015322":{"id":"n1821015322","loc":[-85.5456771,42.0162413],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015323":{"id":"n1821015323","loc":[-85.5936618,41.9829096],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015325":{"id":"n1821015325","loc":[-85.5656931,42.0086582],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015326":{"id":"n1821015326","loc":[-85.5448456,42.0150975],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015327":{"id":"n1821015327","loc":[-85.5220039,42.027615],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015329":{"id":"n1821015329","loc":[-85.517884,42.0354885],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015330":{"id":"n1821015330","loc":[-85.5576666,42.0101671],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015332":{"id":"n1821015332","loc":[-85.5368754,42.0181402],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015333":{"id":"n1821015333","loc":[-85.5367078,42.0181145],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015334":{"id":"n1821015334","loc":[-85.5903909,41.9904316],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015335":{"id":"n1821015335","loc":[-85.5430767,42.0163587],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015336":{"id":"n1821015336","loc":[-85.5277492,42.0252878],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015337":{"id":"n1821015337","loc":[-85.5312146,42.0236898],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015338":{"id":"n1821015338","loc":[-85.5886568,41.991614],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015339":{"id":"n1821015339","loc":[-85.5782498,42.0040883],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015341":{"id":"n1821015341","loc":[-85.562233,42.0076457],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015342":{"id":"n1821015342","loc":[-85.588626,41.9952479],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015343":{"id":"n1821015343","loc":[-85.5762865,42.005033],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015344":{"id":"n1821015344","loc":[-85.5850841,41.9971478],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015346":{"id":"n1821015346","loc":[-85.5643144,42.0076936],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015347":{"id":"n1821015347","loc":[-85.5164893,42.0359467],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015348":{"id":"n1821015348","loc":[-85.5906846,41.9903541],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015349":{"id":"n1821015349","loc":[-85.557688,42.0107769],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015350":{"id":"n1821015350","loc":[-85.5363698,42.0181424],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015351":{"id":"n1821015351","loc":[-85.5939636,41.9801918],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015352":{"id":"n1821015352","loc":[-85.5524041,42.0131644],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015354":{"id":"n1821015354","loc":[-85.5308606,42.0236221],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015355":{"id":"n1821015355","loc":[-85.5877449,41.9932367],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015356":{"id":"n1821015356","loc":[-85.519885,42.0318586],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015357":{"id":"n1821015357","loc":[-85.5454035,42.0168431],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015358":{"id":"n1821015358","loc":[-85.5970629,41.9781881],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015359":{"id":"n1821015359","loc":[-85.5932541,41.9844767],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015360":{"id":"n1821015360","loc":[-85.5970736,41.9778252],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015361":{"id":"n1821015361","loc":[-85.537031,42.0181601],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015362":{"id":"n1821015362","loc":[-85.5548355,42.0105156],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015363":{"id":"n1821015363","loc":[-85.5168648,42.0336158],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015365":{"id":"n1821015365","loc":[-85.5870435,41.9919507],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015366":{"id":"n1821015366","loc":[-85.5719681,42.0075443],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015367":{"id":"n1821015367","loc":[-85.5969985,41.9780446],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015368":{"id":"n1821015368","loc":[-85.5926761,41.98528],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015369":{"id":"n1821015369","loc":[-85.5224009,42.0293444],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015371":{"id":"n1821015371","loc":[-85.518737,42.0322651],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015372":{"id":"n1821015372","loc":[-85.6064573,41.9726465],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015373":{"id":"n1821015373","loc":[-85.5201103,42.0313088],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015375":{"id":"n1821015375","loc":[-85.5378182,42.0186844],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015376":{"id":"n1821015376","loc":[-85.6109741,41.9706882],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015377":{"id":"n1821015377","loc":[-85.5993333,41.9785488],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015378":{"id":"n1821015378","loc":[-85.5889787,41.9907368],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015380":{"id":"n1821015380","loc":[-85.6060161,41.9737375],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015381":{"id":"n1821015381","loc":[-85.5743016,42.0053679],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015382":{"id":"n1821015382","loc":[-85.6014724,41.9776099],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015383":{"id":"n1821015383","loc":[-85.5574426,42.0091644],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015385":{"id":"n1821015385","loc":[-85.5208613,42.0309302],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015386":{"id":"n1821015386","loc":[-85.5919023,41.9837789],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015387":{"id":"n1821015387","loc":[-85.5455484,42.0160221],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015392":{"id":"n1821015392","loc":[-85.5801757,42.0028964],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015395":{"id":"n1821015395","loc":[-85.5493785,42.0139974],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015396":{"id":"n1821015396","loc":[-85.5449475,42.015488],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015398":{"id":"n1821015398","loc":[-85.611123,41.9706627],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015400":{"id":"n1821015400","loc":[-85.5935706,41.9822477],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015401":{"id":"n1821015401","loc":[-85.5724254,42.0073508],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015403":{"id":"n1821015403","loc":[-85.5486812,42.0143442],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015404":{"id":"n1821015404","loc":[-85.5161835,42.0327711],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015406":{"id":"n1821015406","loc":[-85.5921705,41.9851107],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015407":{"id":"n1821015407","loc":[-85.531912,42.0234069],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015410":{"id":"n1821015410","loc":[-85.5292566,42.024176],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015411":{"id":"n1821015411","loc":[-85.5845316,41.9948315],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015413":{"id":"n1821015413","loc":[-85.5217947,42.0280413],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015414":{"id":"n1821015414","loc":[-85.5527367,42.013272],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015415":{"id":"n1821015415","loc":[-85.5191179,42.0321973],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015416":{"id":"n1821015416","loc":[-85.5540241,42.0128655],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015418":{"id":"n1821015418","loc":[-85.5272892,42.0254849],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015419":{"id":"n1821015419","loc":[-85.5449744,42.016867],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015420":{"id":"n1821015420","loc":[-85.5852665,41.9986787],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015421":{"id":"n1821015421","loc":[-85.6102701,41.972186],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015423":{"id":"n1821015423","loc":[-85.6026365,41.9764972],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015427":{"id":"n1821015427","loc":[-85.5898692,41.9841498],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015429":{"id":"n1821015429","loc":[-85.5422546,42.0183855],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015430":{"id":"n1821015430","loc":[-85.5866505,41.9925549],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015431":{"id":"n1821015431","loc":[-85.5234376,42.0273577],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015432":{"id":"n1821015432","loc":[-85.6096746,41.9727284],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015433":{"id":"n1821015433","loc":[-85.5824891,42.0021567],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015434":{"id":"n1821015434","loc":[-85.5923905,41.9841139],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015435":{"id":"n1821015435","loc":[-85.5874565,41.9948014],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015437":{"id":"n1821015437","loc":[-85.6055279,41.9734423],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015438":{"id":"n1821015438","loc":[-85.5299379,42.0237376],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015439":{"id":"n1821015439","loc":[-85.5155022,42.0383651],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015442":{"id":"n1821015442","loc":[-85.527422,42.0254711],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015443":{"id":"n1821015443","loc":[-85.5920699,41.9849291],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015444":{"id":"n1821015444","loc":[-85.5639711,42.0077494],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015445":{"id":"n1821015445","loc":[-85.5162586,42.0361777],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015446":{"id":"n1821015446","loc":[-85.5220039,42.029695],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015448":{"id":"n1821015448","loc":[-85.5176641,42.0356956],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015449":{"id":"n1821015449","loc":[-85.5930556,41.9841577],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015451":{"id":"n1821015451","loc":[-85.5320783,42.0228848],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015452":{"id":"n1821015452","loc":[-85.5170096,42.0357235],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015453":{"id":"n1821015453","loc":[-85.5571355,42.009613],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015454":{"id":"n1821015454","loc":[-85.5609979,42.009059],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015455":{"id":"n1821015455","loc":[-85.6097336,41.9708342],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015456":{"id":"n1821015456","loc":[-85.5884476,41.9904218],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"w170843846":{"id":"w170843846","version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:03Z","tags":{"source":"Bing","waterway":"river"},"nodes":["n1819790555","n1819790762","n1819790547","n1819790618","n1819790898","n1819790796","n1819790534","n1819790543","n1819790541","n1819790687","n1819790877","n1819790811","n1819790670"]},"w209083541":{"id":"w209083541","version":"1","changeset":"15306846","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-09T19:50:46Z","tags":{"name":"Portage River","source":"Bing","waterway":"river"},"nodes":["n1821014848","n1821015156","n1821015439","n1821014763","n1821014824","n1821015274","n1821014764","n1821014791","n1821014957","n1821015217","n1821015445","n1821015347","n1821014893","n1821015452","n1821015017","n1821015448","n1821014968","n1821015329","n1821015321","n1821014992","n1821014948","n1821014757","n1821014983","n1821015312","n1821015363","n1821014924","n1821014873","n1821014932","n1821014668","n1821015404","n1821014716","n1821015243","n1821015265","n1821014710","n1821015371","n1821015415","n1821014870","n1821015356","n1821015373","n1821014681","n1821014714","n1821015385","n1821014911","n1821015057","n1821014867","n1821014998","n1821015142","n1821015234","n1821015446","n1821014862","n1821015369","n1821014945","n1821015003","n1821014667","n1821015413","n1821015256","n1821015327","n1821015160","n1821014907","n1821015431","n1821015172","n1821015034","n1821014741","n1821015033","n1821015239","n1821015007","n1821015316","n1821015285","n1821014633","n1821015263","n1821015069","n1821014846","n1821014779","n1821015011","n1821015012","n1821014845","n1821015418","n1821015442","n1821015266","n1821015336","n1821014755","n1821015188","n1821014925","n1821014816","n1821014869","n1821014967","n1821015286","n1821015147","n1821015410","n1821015126","n1821015438","n1821015018","n1821015354","n1821015337","n1821014766","n1821014740","n1821015228","n1821015173","n1821015407","n1821015076","n1821015451","n1821015024","n1821015314","n1821014784","n1821015045","n1821014735","n1821015205","n1821014986","n1821015240","n1821015098","n1821014825","n1821015302","n1821014918","n1821014718","n1821014896","n1821014853","n1821015194","n1821015165","n1821015213","n1821014991","n1821015350","n1821015333","n1821015332","n1821015361","n1821015060","n1821014914","n1821015375","n1821015315","n1821015307","n1821014906","n1821014751","n1821014666","n1821015218","n1821014817","n1821015118","n1821014674","n1821015038","n1821014973","n1821015429","n1821015183","n1821015046","n1821014803","n1821015140","n1821015009","n1821014749","n1821015335","n1821014711","n1821014854","n1821015278","n1821015419","n1821014648","n1821015357","n1821014637","n1821014988","n1821015322","n1821015387","n1821015042","n1821014833","n1821015396","n1821015326","n1821014691","n1821015149","n1821015204","n1821015122","n1821014782","n1821014982","n1821014921","n1821014936","n1821014969","n1821014881","n1821015403","n1821014805","n1821015395","n1821014892","n1821014826","n1821014844","n1821015107","n1821015014","n1821014955","n1821015352","n1821015414","n1821014746","n1821015209","n1821014770","n1821015416","n1821014661","n1821014857","n1821014814","n1821014754","n1821014721","n1821014727","n1821015362","n1821015029","n1821015246","n1821015189","n1821014627","n1821015269","n1821014808","n1821014962","n1821015349","n1821015041","n1821014722","n1821015330","n1821015453","n1821015067","n1821014643","n1821014802","n1821015383","n1821015151","n1821015250","n1821015245","n1821014772","n1821014899","n1821015222","n1821015121","n1821014951","n1821015176","n1821015219","n1821015454","n1821014972","n1821014917","n1821015182","n1821015166","n1821015145","n1821014910","n1821015082","n1821014678","n1821014806","n1821015141","n1821015341","n1821014788","n1821015097","n1821014995","n1821015444","n1821015346","n1821015101","n1821015129","n1821015123","n1821015132","n1821015190","n1821015146","n1821015325","n1821015191","n1821015072","n1821015100","n1821015174","n1821015238","n1821015215","n1821014700","n1821015242","n1821014841","n1821014905","n1821014874","n1821014883","n1821014729","n1821014866","n1821014828","n1821015295","n1821014931","n1821014859","n1821014912","n1821014783","n1821014752","n1821014961","n1821015366","n1821015401","n1821015169","n1821015318","n1821014996","n1821014747","n1821014963","n1821014670","n1821015186","n1821015231","n1821015157","n1821014812","n1821015381","n1821014887","n1821015138","n1821014704","n1821014787","n1821014922","n1821015290","n1821015343","n1821014651","n1821014980","n1821014960","n1821015244","n1821015236","n1821015006","n1821014694","n1821014759","n1821015207","n1821015276","n1821015065","n1821014863","n1821014660","n1821014902","n1821014645","n1821015339","n1821014871","n1821015096","n1821015299","n1821014798","n1821014638","n1821015392","n1821014835","n1821014762","n1821014642","n1821015433","n1821014786","n1821015134","n1821014855","n1821015184","n1821014850","n1821015293","n1821015233","n1821015227","n1821014876","n1821014985","n1821014843","n1821015420","n1821015197","n1821015192","n1821015292","n1821015344","n1821014742","n1821014726","n1821015237","n1821014796","n1821014908","n1821014975","n1821014769","n1821014688","n1821014860","n1821014895","n1821014676","n1821015411","n1821014736","n1821015164","n1821014647","n1821015144","n1821014919","n1821015220","n1821015254","n1821015435","n1821015308","n1821015342","n1821014830","n1821015273","n1821014658","n1821014781","n1821015087","n1821015139","n1821015304","n1821014839","n1821015048","n1821015115","n1821015355","n1821015226","n1821015177","n1821015430","n1821014965","n1821014725","n1821015365","n1821015171","n1821015073","n1821015125","n1821015338","n1821015111","n1821014950","n1821015378","n1821015258","n1821015456","n1821015106","n1821014832","n1821014888","n1821014795","n1821014872","n1821014810","n1821014705","n1821014804","n1821014820","n1821015283","n1821014938","n1821014689","n1821015259","n1821015334","n1821015348","n1821014635","n1821015179","n1821014864","n1821014890","n1821015020","n1821014898","n1821015287","n1821015120","n1821014984","n1821014743","n1821014790","n1821014765","n1821014777","n1821015095","n1821014653","n1821015135","n1821014836","n1821014964","n1821014974","n1821014636","n1821014682","n1821014663","n1821014665","n1821015109","n1821015155","n1821014930","n1821014669","n1821015004","n1821015427","n1821014916","n1821015093","n1821015086","n1821015386","n1821014799","n1821014913","n1821015434","n1821014728","n1821014900","n1821015068","n1821015039","n1821015443","n1821015406","n1821015280","n1821015319","n1821015368","n1821014774","n1821015090","n1821015175","n1821015195","n1821014687","n1821015359","n1821015449","n1821014956","n1821014838","n1821014768","n1821014698","n1821015323","n1821014756","n1821015255","n1821015400","n1821014717","n1821014868","n1821014778","n1821015214","n1821014944","n1821014697","n1821014671","n1821014928","n1821015294","n1821014822","n1821015284","n1821015351","n1821015022","n1821015133","n1821014644","n1821015010","n1821014625","n1821014657","n1821014946","n1821015099","n1821015114","n1821014629","n1821014865","n1821014997","n1821014926","n1821014933","n1821015199","n1821014819","n1821015080","n1821014692","n1821014677","n1821015358","n1821015367","n1821015360","n1821015105","n1821015247","n1821015005","n1821014809","n1821014794","n1821014761","n1821014879","n1821014801","n1821015377","n1821015059","n1821014730","n1821015050","n1821015271","n1821015143","n1821014989","n1821015019","n1821014672","n1821014649","n1821014684","n1821014703","n1821015021","n1821015382","n1821014842","n1821014720","n1821014847","n1821015104","n1821014987","n1821014886","n1821015267","n1821015221","n1821015015","n1821015423","n1821014954","n1821014903","n1821014939","n1821015212","n1821014789","n1821014712","n1821014708","n1821015078","n1821015277","n1821015249","n1821014646","n1821014793","n1821015053","n1821014707","n1821015306","n1821015112","n1821015288","n1821015380","n1821015437","n1821015178","n1821015158","n1821015272","n1821015235","n1821015163","n1821015154","n1821015253","n1821014632","n1821015372","n1821015103","n1821015311","n1821015301","n1821014885","n1821014811","n1821014977","n1821015051","n1821014942","n1821014745","n1821015432","n1821015075","n1821014664","n1821014695","n1821015116","n1821014639","n1821015421","n1821015248","n1821014758","n1821014834","n1821015083","n1821015455","n1821015241","n1821015108","n1821014713","n1821015137","n1821015055","n1821015211","n1821014904","n1821015376","n1821015398","n1821014771","n1821014840","n1821015062","n1819790554","n1819790560","n1819790767","n1819790696","n1819790706","n1819790606","n1819790607","n1819790544","n1819790779","n1819790760","n1819790926","n1819790927","n1819790647","n1819790657","n1819790649","n1819790679","n1819790915","n1819790739","n1819790549","n1819790671","n1819790686","n1819790798","n1819790791","n1819790563","n1819790720","n1819790704","n1819790795","n1819790836","n1819790622","n1819790615","n1819790654","n1819790931","n1819790595","n1819790753","n1819790612","n1819790623","n1819790564","n1819790552","n1819790645","n1819790625","n1819790605","n1819790668","n1819790731","n1819790718","n1819790781","n1819790665","n1819790659","n1819790726","n1819790642","n1819790854","n1819790697","n1819790867","n1819790833","n1819790555","n1819790774","n1819790881","n1819790530","n1819790909","n1819790891","n1819790590","n1819790738","n1819790609","n1819790528","n1819790674","n1819790583","n1819790559","n1819790863","n1819790912","n1819790685","n1819790913"]},"n185955128":{"id":"n185955128","loc":[-85.6189367,41.9519432],"version":"3","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{}},"n185948818":{"id":"n185948818","loc":[-85.616755,41.952231],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:44Z","tags":{}},"n185978819":{"id":"n185978819","loc":[-85.616773,41.954737],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:35Z","tags":{}},"n185978821":{"id":"n185978821","loc":[-85.616699,41.954742],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:35Z","tags":{}},"n2138420714":{"id":"n2138420714","loc":[-85.6176304,41.9515154],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420715":{"id":"n2138420715","loc":[-85.6177355,41.9515717],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420716":{"id":"n2138420716","loc":[-85.6192901,41.951573],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420718":{"id":"n2138420718","loc":[-85.6171481,41.9513579],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420719":{"id":"n2138420719","loc":[-85.6165981,41.9519199],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420720":{"id":"n2138420720","loc":[-85.6165719,41.9519922],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420721":{"id":"n2138420721","loc":[-85.6165832,41.9520757],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420722":{"id":"n2138420722","loc":[-85.6166355,41.9521453],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420723":{"id":"n2138420723","loc":[-85.6169161,41.9522788],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420724":{"id":"n2138420724","loc":[-85.6170882,41.9522538],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420725":{"id":"n2138420725","loc":[-85.6189204,41.9514674],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420726":{"id":"n2138420726","loc":[-85.6180346,41.9514735],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420727":{"id":"n2138420727","loc":[-85.6180362,41.9515719],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420728":{"id":"n2138420728","loc":[-85.6189204,41.9515727],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420744":{"id":"n2138420744","loc":[-85.618919,41.9519571],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420745":{"id":"n2138420745","loc":[-85.6194575,41.9522374],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420746":{"id":"n2138420746","loc":[-85.6181777,41.9536179],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420747":{"id":"n2138420747","loc":[-85.6176582,41.9533658],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420748":{"id":"n2138420748","loc":[-85.6179871,41.9530242],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420749":{"id":"n2138420749","loc":[-85.618429,41.9532476],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420750":{"id":"n2138420750","loc":[-85.6185538,41.9531194],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420751":{"id":"n2138420751","loc":[-85.6180765,41.9528677],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420752":{"id":"n2138420752","loc":[-85.6180394,41.9528855],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420753":{"id":"n2138420753","loc":[-85.6193752,41.9521695],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420754":{"id":"n2138420754","loc":[-85.6181374,41.9535376],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420755":{"id":"n2138420755","loc":[-85.6179898,41.9535545],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420756":{"id":"n2138420756","loc":[-85.6177286,41.9534228],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420757":{"id":"n2138420757","loc":[-85.6181011,41.9530292],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420759":{"id":"n2138420759","loc":[-85.6185158,41.9531194],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420760":{"id":"n2138420760","loc":[-85.6191318,41.9520425],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420761":{"id":"n2138420761","loc":[-85.6182348,41.9529815],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420762":{"id":"n2138420762","loc":[-85.6184853,41.9524248],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420763":{"id":"n2138420763","loc":[-85.6186764,41.9525193],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420764":{"id":"n2138420764","loc":[-85.6189421,41.9526483],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420765":{"id":"n2138420765","loc":[-85.6182875,41.9531222],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420766":{"id":"n2138420766","loc":[-85.6179141,41.9535163],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420767":{"id":"n2138420767","loc":[-85.6178363,41.9535735],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n185948824":{"id":"n185948824","loc":[-85.6165667,41.9529715],"version":"3","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{}},"n2138420758":{"id":"n2138420758","loc":[-85.6184408,41.953201],"version":"2","changeset":"14970854","user":"oldtopos","uid":"169004","visible":"true","timestamp":"2013-02-09T18:25:47Z","tags":{}},"n2138422349":{"id":"n2138422349","loc":[-85.6175136,41.9533346],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422350":{"id":"n2138422350","loc":[-85.6171867,41.9531679],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422351":{"id":"n2138422351","loc":[-85.61722,41.9531305],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422352":{"id":"n2138422352","loc":[-85.6171889,41.9531158],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422353":{"id":"n2138422353","loc":[-85.6171733,41.9531284],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422354":{"id":"n2138422354","loc":[-85.616765,41.9529207],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422355":{"id":"n2138422355","loc":[-85.6167565,41.9529355],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422356":{"id":"n2138422356","loc":[-85.6164772,41.9527911],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422357":{"id":"n2138422357","loc":[-85.6168227,41.9524261],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422358":{"id":"n2138422358","loc":[-85.6171913,41.9526158],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422359":{"id":"n2138422359","loc":[-85.6172403,41.9525589],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422360":{"id":"n2138422360","loc":[-85.6172097,41.952542],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422361":{"id":"n2138422361","loc":[-85.6173948,41.9523512],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422362":{"id":"n2138422362","loc":[-85.6174256,41.9523678],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422363":{"id":"n2138422363","loc":[-85.6174831,41.9523086],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422364":{"id":"n2138422364","loc":[-85.6173316,41.9522289],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422365":{"id":"n2138422365","loc":[-85.6174507,41.9521024],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422366":{"id":"n2138422366","loc":[-85.6174773,41.9521155],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422367":{"id":"n2138422367","loc":[-85.6176577,41.9519232],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422368":{"id":"n2138422368","loc":[-85.6176336,41.9519105],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422369":{"id":"n2138422369","loc":[-85.617747,41.9517861],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422370":{"id":"n2138422370","loc":[-85.6182675,41.9520559],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422371":{"id":"n2138422371","loc":[-85.6182105,41.9521219],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422372":{"id":"n2138422372","loc":[-85.6183863,41.9522203],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422373":{"id":"n2138422373","loc":[-85.6180984,41.9525266],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422374":{"id":"n2138422374","loc":[-85.6179159,41.9524295],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422375":{"id":"n2138422375","loc":[-85.617854,41.9524979],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422376":{"id":"n2138422376","loc":[-85.6177686,41.9524531],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422377":{"id":"n2138422377","loc":[-85.6174716,41.9527765],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422378":{"id":"n2138422378","loc":[-85.6178545,41.9529756],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138425424":{"id":"n2138425424","loc":[-85.6171736,41.9536385],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425425":{"id":"n2138425425","loc":[-85.6180159,41.9535782],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425426":{"id":"n2138425426","loc":[-85.6181068,41.9536282],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425427":{"id":"n2138425427","loc":[-85.6180673,41.9542678],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425428":{"id":"n2138425428","loc":[-85.6178636,41.9542634],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425429":{"id":"n2138425429","loc":[-85.6176204,41.9542046],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425430":{"id":"n2138425430","loc":[-85.6174366,41.9541031],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425431":{"id":"n2138425431","loc":[-85.6172942,41.9539781],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425432":{"id":"n2138425432","loc":[-85.6172171,41.9538399],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425433":{"id":"n2138425433","loc":[-85.6168138,41.9543266],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425434":{"id":"n2138425434","loc":[-85.6167779,41.9538098],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425435":{"id":"n2138425435","loc":[-85.6165849,41.9537073],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425441":{"id":"n2138425441","loc":[-85.616458,41.9543184],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425442":{"id":"n2138425442","loc":[-85.6166428,41.954345],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425445":{"id":"n2138425445","loc":[-85.6181332,41.9514117],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425446":{"id":"n2138425446","loc":[-85.6183263,41.9514111],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425447":{"id":"n2138425447","loc":[-85.6185033,41.9514102],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425449":{"id":"n2138425449","loc":[-85.6186809,41.9514093],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425451":{"id":"n2138425451","loc":[-85.6188681,41.9514082],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138436008":{"id":"n2138436008","loc":[-85.6170474,41.9513604],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436009":{"id":"n2138436009","loc":[-85.6164937,41.9519586],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436010":{"id":"n2138436010","loc":[-85.616497,41.9520725],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436011":{"id":"n2138436011","loc":[-85.6165654,41.9521645],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436012":{"id":"n2138436012","loc":[-85.6166631,41.9522178],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436013":{"id":"n2138436013","loc":[-85.6167327,41.9522554],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436014":{"id":"n2138436014","loc":[-85.6172383,41.9525125],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138439319":{"id":"n2138439319","loc":[-85.6170432,41.9524057],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439320":{"id":"n2138439320","loc":[-85.617691,41.9517107],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439321":{"id":"n2138439321","loc":[-85.6177727,41.9516794],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439322":{"id":"n2138439322","loc":[-85.619085,41.9516811],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439323":{"id":"n2138439323","loc":[-85.6179432,41.952895],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439324":{"id":"n2138439324","loc":[-85.6180389,41.9529384],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439325":{"id":"n2138439325","loc":[-85.6176303,41.9533604],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439326":{"id":"n2138439326","loc":[-85.6175538,41.9534396],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439327":{"id":"n2138439327","loc":[-85.6173806,41.9523658],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439328":{"id":"n2138439328","loc":[-85.6171841,41.9522542],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439329":{"id":"n2138439329","loc":[-85.6172077,41.9524958],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439330":{"id":"n2138439330","loc":[-85.6171235,41.9525809],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439331":{"id":"n2138439331","loc":[-85.6180938,41.9527349],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439332":{"id":"n2138439332","loc":[-85.6177023,41.9525253],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439333":{"id":"n2138439333","loc":[-85.6175543,41.9526865],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439334":{"id":"n2138439334","loc":[-85.6179589,41.9528783],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n185948820":{"id":"n185948820","loc":[-85.6163249,41.952701],"version":"3","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{}},"n185948822":{"id":"n185948822","loc":[-85.6163757,41.952855],"version":"3","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{}},"n185955123":{"id":"n185955123","loc":[-85.6198103,41.9510408],"version":"3","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{}},"n185958839":{"id":"n185958839","loc":[-85.611651,41.954761],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185965033":{"id":"n185965033","loc":[-85.614195,41.954754],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185976502":{"id":"n185976502","loc":[-85.617375,41.947559],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:32Z","tags":{}},"n185976504":{"id":"n185976504","loc":[-85.6174164,41.9510804],"version":"3","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{}},"n185978828":{"id":"n185978828","loc":[-85.613542,41.954756],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:36Z","tags":{}},"n185978830":{"id":"n185978830","loc":[-85.610373,41.954774],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:36Z","tags":{}},"n2138420713":{"id":"n2138420713","loc":[-85.6174641,41.9506942],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:11Z","tags":{}},"n2138420717":{"id":"n2138420717","loc":[-85.6173027,41.9512895],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420768":{"id":"n2138420768","loc":[-85.61745,41.9501974],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420773":{"id":"n2138420773","loc":[-85.6174135,41.9489136],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138425436":{"id":"n2138425436","loc":[-85.6159148,41.9538036],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425437":{"id":"n2138425437","loc":[-85.6159534,41.9539677],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425438":{"id":"n2138425438","loc":[-85.6160306,41.9540846],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425439":{"id":"n2138425439","loc":[-85.6161354,41.954181],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425440":{"id":"n2138425440","loc":[-85.6162733,41.954263],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425443":{"id":"n2138425443","loc":[-85.6183273,41.9510826],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425444":{"id":"n2138425444","loc":[-85.6181354,41.9510835],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425448":{"id":"n2138425448","loc":[-85.6185033,41.9510816],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425450":{"id":"n2138425450","loc":[-85.6186816,41.9510808],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425452":{"id":"n2138425452","loc":[-85.6188641,41.9510818],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138435984":{"id":"n2138435984","loc":[-85.6167607,41.9501009],"version":"2","changeset":"14970854","user":"oldtopos","uid":"169004","visible":"true","timestamp":"2013-02-09T18:25:47Z","tags":{}},"n2138436000":{"id":"n2138436000","loc":[-85.6173169,41.947558],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436001":{"id":"n2138436001","loc":[-85.6173362,41.948883],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436002":{"id":"n2138436002","loc":[-85.6167791,41.9492952],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436003":{"id":"n2138436003","loc":[-85.6167543,41.949349],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436004":{"id":"n2138436004","loc":[-85.6167648,41.9509125],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436005":{"id":"n2138436005","loc":[-85.6168832,41.9510412],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436006":{"id":"n2138436006","loc":[-85.6170045,41.9511417],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436007":{"id":"n2138436007","loc":[-85.6170624,41.9512483],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436017":{"id":"n2138436017","loc":[-85.6168094,41.9492729],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436021":{"id":"n2138436021","loc":[-85.6167553,41.9494886],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436023":{"id":"n2138436023","loc":[-85.6167585,41.9499707],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436025":{"id":"n2138436025","loc":[-85.6167567,41.9497018],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"w203838284":{"id":"w203838284","version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:42Z","tags":{"area":"yes","leisure":"pitch","sport":"baseball"},"nodes":["n2138425424","n2138425425","n2138425426","n2138425427","n2138425428","n2138425429","n2138425430","n2138425431","n2138425432","n2138425424"]},"w203837928":{"id":"w203837928","version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{"highway":"service"},"nodes":["n2138420717","n2138420718","n2138420719","n2138420720","n2138420721","n2138420722","n185948818","n2138420723","n2138420724","n2138420715"]},"w203839364":{"id":"w203839364","version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{"highway":"footway"},"nodes":["n2138439331","n2138439332"]},"w203837932":{"id":"w203837932","version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2138420744","n2138420745","n2138420746","n2138420747","n2138420748","n2138420749","n2138420750","n2138420751","n2138420744"]},"w203839362":{"id":"w203839362","version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{"highway":"footway"},"nodes":["n2138439327","n2138439328"]},"w203839363":{"id":"w203839363","version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{"highway":"footway"},"nodes":["n2138439329","n2138439330"]},"w203837933":{"id":"w203837933","version":"2","changeset":"14970854","user":"oldtopos","uid":"169004","visible":"true","timestamp":"2013-02-09T18:25:42Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n185955128","n2138420760","n2138420753","n2138420764","n2138420759","n2138420758","n2138420754","n2138420755","n2138420766","n2138420756"]},"w203837936":{"id":"w203837936","version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2138420765","n2138420766"]},"w17966364":{"id":"w17966364","version":"2","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{"access":"private","highway":"service","name":"Collins Dr","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Collins","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313686","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185961362","n185976502","n2138420773","n2138420768","n2138420713","n185976504","n2138420717","n2138420714","n2138420715","n2138420727","n2138420728","n2138420716"]},"w203838040":{"id":"w203838040","version":"3","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:19Z","tags":{"amenity":"school","area":"yes","building":"yes","name":"Three Rivers Middle School"},"nodes":["n2138422349","n2138422350","n2138422351","n2138422352","n2138422353","n2138422354","n2138422355","n2138422356","n2138422357","n2138439330","n2138422358","n2138422359","n2138422360","n2138436014","n2138439327","n2138422361","n2138422362","n2138422363","n2138422364","n2138422365","n2138422366","n2138422367","n2138422368","n2138422369","n2138422370","n2138422371","n2138422372","n2138422373","n2138422374","n2138422375","n2138422376","n2138439332","n2138439333","n2138422377","n2138422378","n2138422349"]},"w17964049":{"id":"w17964049","version":"3","changeset":"14970854","user":"oldtopos","uid":"169004","visible":"true","timestamp":"2013-02-09T18:25:46Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15335181","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185955120","n185955123","n2138420716","n185955128","n2138420762","n2138420752","n2138420761","n2138420759"]},"w41074899":{"id":"w41074899","version":"4","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:18Z","tags":{"highway":"secondary","name":"E Hoffman St","ref":"M 60","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hoffman","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185978817","n185978819","n185978821","n185965033","n185978828","n185958839","n185978830"]},"w203839365":{"id":"w203839365","version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{"highway":"footway"},"nodes":["n2138439333","n2138439334"]},"w203837935":{"id":"w203837935","version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2138420762","n2138420763","n2138420764"]},"w203838287":{"id":"w203838287","version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:42Z","tags":{"area":"yes","leisure":"pitch","sport":"tennis"},"nodes":["n2138425446","n2138425447","n2138425448","n2138425443","n2138425446"]},"w203837934":{"id":"w203837934","version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2138420760","n2138420763","n2138420761"]},"w203838289":{"id":"w203838289","version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:42Z","tags":{"area":"yes","leisure":"pitch","sport":"tennis"},"nodes":["n2138425449","n2138425451","n2138425452","n2138425450","n2138425449"]},"w17963047":{"id":"w17963047","version":"4","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:19Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15331535","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185948818","n2138436013","n185948820","n185948822","n185948824","n2138439326","n2138420767","n2138420766"]},"w203839091":{"id":"w203839091","version":"3","changeset":"14970854","user":"oldtopos","uid":"169004","visible":"true","timestamp":"2013-02-09T18:25:44Z","tags":{"highway":"footway"},"nodes":["n185976502","n2138436000","n2138436001","n2138436017","n2138436002","n2138436003","n2138436021","n2138436025","n2138436023","n2138435984","n2138436004","n2138436005","n2138436006","n2138436007","n2138436008","n2138436009","n2138436010","n2138436011","n2138436012","n2138436013","n2138439319","n2138439329","n2138436014"]},"w204830797":{"id":"w204830797","version":"1","changeset":"14970854","user":"oldtopos","uid":"169004","visible":"true","timestamp":"2013-02-09T18:25:37Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2138420756","n2138420757","n2138420765","n2138420758"]},"w203838288":{"id":"w203838288","version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:42Z","tags":{"area":"yes","leisure":"pitch","sport":"tennis"},"nodes":["n2138425447","n2138425449","n2138425450","n2138425448","n2138425447"]},"w203838285":{"id":"w203838285","version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:42Z","tags":{"area":"yes","leisure":"pitch","sport":"baseball"},"nodes":["n2138425433","n2138425434","n2138425435","n2138425436","n2138425437","n2138425438","n2138425439","n2138425440","n2138425441","n2138425442","n2138425433"]},"w203838286":{"id":"w203838286","version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:42Z","tags":{"area":"yes","leisure":"pitch","sport":"tennis"},"nodes":["n2138425443","n2138425444","n2138425445","n2138425446","n2138425443"]},"w203837929":{"id":"w203837929","version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2138420725","n2138420726","n2138420727","n2138420728","n2138420725"]},"w203839361":{"id":"w203839361","version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{"highway":"footway"},"nodes":["n2138439319","n2138439328","n2138439320","n2138439321","n2138439322","n2138439331","n2138439334","n2138439323","n2138439324","n2138439325","n2138439326"]},"n394381698":{"id":"n394381698","loc":[-85.614471,41.954755],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381699":{"id":"n394381699","loc":[-85.6152,41.954744],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381700":{"id":"n394381700","loc":[-85.615201,41.954081],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381701":{"id":"n394381701","loc":[-85.614426,41.954042],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381702":{"id":"n394381702","loc":[-85.616319,41.954749],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381704":{"id":"n394381704","loc":[-85.616152,41.954752],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381706":{"id":"n394381706","loc":[-85.615201,41.95483],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394490775":{"id":"n394490775","loc":[-85.613971,41.954839],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490782":{"id":"n394490782","loc":[-85.614372,41.954841],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n185958835":{"id":"n185958835","loc":[-85.611615,41.953704],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958837":{"id":"n185958837","loc":[-85.611636,41.953938],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958842":{"id":"n185958842","loc":[-85.611187,41.951686],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958844":{"id":"n185958844","loc":[-85.611087,41.951741],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958845":{"id":"n185958845","loc":[-85.611034,41.951852],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958847":{"id":"n185958847","loc":[-85.611016,41.95196],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958849":{"id":"n185958849","loc":[-85.610989,41.95328],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958851":{"id":"n185958851","loc":[-85.611021,41.953484],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958852":{"id":"n185958852","loc":[-85.611091,41.953603],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958853":{"id":"n185958853","loc":[-85.6112,41.953661],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958855":{"id":"n185958855","loc":[-85.611364,41.953686],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185965031":{"id":"n185965031","loc":[-85.614204,41.953696],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185965032":{"id":"n185965032","loc":[-85.6142,41.953978],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185965062":{"id":"n185965062","loc":[-85.614617,41.951639],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:43Z","tags":{}},"n185965064":{"id":"n185965064","loc":[-85.61463,41.951852],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:43Z","tags":{}},"n185965066":{"id":"n185965066","loc":[-85.614642,41.953436],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:43Z","tags":{}},"n185965068":{"id":"n185965068","loc":[-85.6146,41.953551],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:43Z","tags":{}},"n185965071":{"id":"n185965071","loc":[-85.614487,41.95363],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:43Z","tags":{}},"n185965073":{"id":"n185965073","loc":[-85.614354,41.953672],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:43Z","tags":{}},"n185966288":{"id":"n185966288","loc":[-85.61179,41.953695],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966290":{"id":"n185966290","loc":[-85.612232,41.953685],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966293":{"id":"n185966293","loc":[-85.613438,41.953677],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966349":{"id":"n185966349","loc":[-85.611323,41.951653],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966351":{"id":"n185966351","loc":[-85.611892,41.951642],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966352":{"id":"n185966352","loc":[-85.612216,41.951641],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966353":{"id":"n185966353","loc":[-85.613111,41.951639],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966354":{"id":"n185966354","loc":[-85.613396,41.95164],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966355":{"id":"n185966355","loc":[-85.614221,41.95164],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185973839":{"id":"n185973839","loc":[-85.61341,41.951919],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:03Z","tags":{}},"n185973840":{"id":"n185973840","loc":[-85.613438,41.953308],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:03Z","tags":{}},"n185980222":{"id":"n185980222","loc":[-85.613781,41.955164],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:33Z","tags":{}},"n185980223":{"id":"n185980223","loc":[-85.613815,41.955237],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:33Z","tags":{}},"n185980225":{"id":"n185980225","loc":[-85.613837,41.955316],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:33Z","tags":{}},"n185990345":{"id":"n185990345","loc":[-85.612211,41.951977],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:15:01Z","tags":{}},"n185955743":{"id":"n185955743","loc":[-85.613873,41.95635],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:55Z","tags":{}},"n185980227":{"id":"n185980227","loc":[-85.613851,41.955415],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:33Z","tags":{}},"n185980229":{"id":"n185980229","loc":[-85.613918,41.957134],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:33Z","tags":{}},"n394381703":{"id":"n394381703","loc":[-85.616287,41.955674],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381705":{"id":"n394381705","loc":[-85.615164,41.955676],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394490777":{"id":"n394490777","loc":[-85.613973,41.955979],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490780":{"id":"n394490780","loc":[-85.614364,41.955987],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"w17965307":{"id":"w17965307","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:35:58Z","tags":{"highway":"residential","name":"Bates Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Bates","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313640:15313641","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958842","n185966349","n185966351","n185966352","n185966353","n185966354","n185966355","n185965062"]},"w17967957":{"id":"w17967957","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:55:16Z","tags":{"highway":"residential","name":"Krum Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Krum","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313643","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185966352","n185990345","n185966290"]},"w17964508":{"id":"w17964508","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:30:11Z","tags":{"highway":"residential","name":"Blossom Dr","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Blossom","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15324628","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958842","n185958844","n185958845","n185958847","n185958849","n185958851","n185958852","n185958853","n185958855","n185958835"]},"w17964507":{"id":"w17964507","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:30:10Z","tags":{"highway":"residential","name":"Blossom Dr","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Blossom","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313629","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958835","n185958837","n185958839"]},"w34367080":{"id":"w34367080","version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394381699","n394381706","n394381705","n394381703","n394381702","n394381704","n394381699"]},"w17965302":{"id":"w17965302","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:35:55Z","tags":{"highway":"residential","name":"Clausen Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Clausen","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313630:15313631:15313632","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958835","n185966288","n185966290","n185966293","n185965031"]},"w17965156":{"id":"w17965156","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:34:54Z","tags":{"highway":"residential","name":"Orchard Dr","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Orchard","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15327962","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185965062","n185965064","n185965066","n185965068","n185965071","n185965073","n185965031"]},"w34369812":{"id":"w34369812","version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394490775","n394490777","n394490780","n394490782","n394490775"]},"w17965151":{"id":"w17965151","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:34:52Z","tags":{"highway":"residential","name":"Orchard Dr","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Orchard","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313628","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185965031","n185965032","n185965033"]},"w17966756":{"id":"w17966756","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:47:10Z","tags":{"access":"private","highway":"service","name":"Lockport Dr","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Lockport","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313621:15314402","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185978828","n185980222","n185980223","n185980225","n185980227","n185955743","n185980229"]},"w17966056":{"id":"w17966056","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:41:57Z","tags":{"highway":"residential","name":"Angell Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Angell","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313639","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185966354","n185973839","n185973840","n185966293"]},"w34367079":{"id":"w34367079","version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394381700","n394381701","n394381698","n394381699","n394381700"]},"n185955744":{"id":"n185955744","loc":[-85.611753,41.956208],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:55Z","tags":{}},"n185988932":{"id":"n185988932","loc":[-85.6159,41.956336],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185988934":{"id":"n185988934","loc":[-85.6159158,41.9590646],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185988935":{"id":"n185988935","loc":[-85.6157358,41.959364],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{"highway":"turning_circle","source":"Bing"}},"n2138447007":{"id":"n2138447007","loc":[-85.6130784,41.9590689],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447008":{"id":"n2138447008","loc":[-85.6133328,41.9593805],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447003":{"id":"n2138447003","loc":[-85.610238,41.9547745],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447004":{"id":"n2138447004","loc":[-85.6102652,41.9566041],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447005":{"id":"n2138447005","loc":[-85.610325,41.9568823],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447006":{"id":"n2138447006","loc":[-85.6105644,41.9571383],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447009":{"id":"n2138447009","loc":[-85.6135946,41.959948],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447010":{"id":"n2138447010","loc":[-85.6136071,41.9629372],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447011":{"id":"n2138447011","loc":[-85.6134392,41.9633182],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447012":{"id":"n2138447012","loc":[-85.6130151,41.9636073],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447013":{"id":"n2138447013","loc":[-85.6122729,41.9637125],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447014":{"id":"n2138447014","loc":[-85.6056682,41.963752],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"w17964174":{"id":"w17964174","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:27:41Z","tags":{"access":"private","highway":"service","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314401","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185955743","n185955744"]},"w17967743":{"id":"w17967743","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:54:06Z","tags":{"access":"private","highway":"service","name":"Manistee River Rd","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Manistee River","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326121:15326126:15326127:15326116","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185971574","n185988932","n185971407","n185981301","n185967987","n185988934","n185988935"]},"w203839666":{"id":"w203839666","version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{"highway":"residential","name":"Hov Aire Drive"},"nodes":["n2138447003","n2138447004","n2138447005","n2138447006","n2138447007","n2138447008","n2138447009","n2138447010","n2138447011","n2138447012","n2138447013","n2138447014"]}}';iD.data = {
- "deprecated": [
- {
- "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": {
- "shop": "organic"
- },
- "replace": {
- "shop": "supermarket",
- "organic": "only"
- }
- },
- {
- "old": {
- "power_source": "*"
- },
- "replace": {
- "generator:source": "$1"
- }
- },
- {
- "old": {
- "power_rating": "*"
- },
- "replace": {
- "generator:output": "$1"
- }
- }
- ],
- "discarded": [
- "created_by",
- "tiger:upload_uuid",
- "tiger:tlid",
- "tiger:source",
- "tiger:separated",
- "geobase:datasetName",
- "geobase:uuid",
- "sub_sea:type",
- "odbl",
- "odbl:note",
- "yh:LINE_NAME",
- "yh:LINE_NUM",
- "yh:STRUCTURE",
- "yh:TOTYUMONO",
- "yh:TYPE",
- "yh:WIDTH_RANK"
- ],
- "imagery": [
- {
- "name": "Bing aerial imagery",
- "template": "http://ecn.t{t}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z",
- "description": "Satellite imagery.",
- "scaleExtent": [
- 0,
- 20
- ],
- "subdomains": [
- "0",
- "1",
- "2",
- "3"
- ],
- "default": "yes",
- "sourcetag": "Bing",
- "logo": "bing_maps.png",
- "logo_url": "http://www.bing.com/maps",
- "terms_url": "http://opengeodata.org/microsoft-imagery-details"
- },
- {
- "name": "MapBox Satellite",
- "template": "http://{t}.tiles.mapbox.com/v3/openstreetmap.map-4wvf9l0l/{z}/{x}/{y}.png",
- "description": "Satellite and aerial imagery.",
- "scaleExtent": [
- 0,
- 16
- ],
- "subdomains": [
- "a",
- "b",
- "c"
- ],
- "terms_url": "http://mapbox.com/tos/"
- },
- {
- "name": "OpenStreetMap",
- "template": "http://{t}.tile.openstreetmap.org/{z}/{x}/{y}.png",
- "description": "The default OpenStreetMap layer.",
- "scaleExtent": [
- 0,
- 18
- ],
- "subdomains": [
- "a",
- "b",
- "c"
- ]
- },
- {
- "name": " TIGER 2012 Roads Overlay",
- "template": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png",
- "overlay": true,
- "scaleExtent": [
- 16,
- 19
- ],
- "subdomains": [
- "a",
- "b",
- "c"
- ],
- "extent": [
- [
- -124.81,
- 24.055
- ],
- [
- -66.865,
- 49.386
- ]
- ]
- },
- {
- "name": " TIGER 2012 Roads Overlay",
- "template": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png",
- "subdomains": [
- "a",
- "b",
- "c"
- ],
- "extent": [
- [
- -179.754,
- 50.858
- ],
- [
- -129.899,
- 71.463
- ]
- ]
- },
- {
- "name": " TIGER 2012 Roads Overlay",
- "template": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png",
- "subdomains": [
- "a",
- "b",
- "c"
- ],
- "extent": [
- [
- -174.46,
- 18.702
- ],
- [
- -154.516,
- 26.501
- ]
- ]
- },
- {
- "name": " USGS Topographic Maps",
- "template": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png",
- "subdomains": [
- "a",
- "b",
- "c"
- ],
- "extent": [
- [
- -125.991,
- 24.005
- ],
- [
- -65.988,
- 50.009
- ]
- ]
- },
- {
- "name": " USGS Topographic Maps",
- "template": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png",
- "subdomains": [
- "a",
- "b",
- "c"
- ],
- "extent": [
- [
- -160.579,
- 18.902
- ],
- [
- -154.793,
- 22.508
- ]
- ]
- },
- {
- "name": " USGS Topographic Maps",
- "template": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png",
- "subdomains": [
- "a",
- "b",
- "c"
- ],
- "extent": [
- [
- -178.001,
- 51.255
- ],
- [
- -130.004,
- 71.999
- ]
- ]
- },
- {
- "name": " USGS Large Scale Aerial Imagery",
- "template": "http://{t}.tile.openstreetmap.us/usgs_large_scale/{z}/{x}/{y}.jpg",
- "subdomains": [
- "a",
- "b",
- "c"
- ],
- "extent": [
- [
- -124.819,
- 24.496
- ],
- [
- -66.931,
- 49.443
- ]
- ]
- },
- {
- "name": "British Columbia bc_mosaic",
- "template": "http://{t}.imagery.paulnorman.ca/tiles/bc_mosaic/{z}/{x}/{y}.png",
- "subdomains": [
- "a",
- "b",
- "c",
- "d"
- ],
- "extent": [
- [
- -123.441,
- 48.995
- ],
- [
- -121.346,
- 50.426
- ]
- ],
- "sourcetag": "bc_mosaic",
- "terms_url": "http://imagery.paulnorman.ca/tiles/about.html"
- },
- {
- "name": "OS OpenData Streetview",
- "template": "http://os.openstreetmap.org/sv/{z}/{x}/{y}.png",
- "extent": [
- [
- -8.72,
- 49.86
- ],
- [
- 1.84,
- 60.92
- ]
- ],
- "sourcetag": "OS_OpenData_StreetView"
- },
- {
- "name": "OS OpenData Locator",
- "template": "http://tiles.itoworld.com/os_locator/{z}/{x}/{y}.png",
- "extent": [
- [
- -9,
- 49.8
- ],
- [
- 1.9,
- 61.1
- ]
- ],
- "sourcetag": "OS_OpenData_Locator"
- },
- {
- "name": "OS 1:25k historic (OSM)",
- "template": "http://ooc.openstreetmap.org/os1/{z}/{x}/{y}.jpg",
- "extent": [
- [
- -9,
- 49.8
- ],
- [
- 1.9,
- 61.1
- ]
- ],
- "sourcetag": "OS 1:25k"
- },
- {
- "name": "OS 1:25k historic (NLS)",
- "template": "http://geo.nls.uk/mapdata2/os/25000/{z}/{x}/{y}.png",
- "extent": [
- [
- -9,
- 49.8
- ],
- [
- 1.9,
- 61.1
- ]
- ],
- "sourcetag": "OS 1:25k",
- "logo": "icons/logo_nls70-nq8.png",
- "logo_url": "http://geo.nls.uk/maps/"
- },
- {
- "name": "OS 7th Series historic (OSM)",
- "template": "http://ooc.openstreetmap.org/os7/{z}/{x}/{y}.jpg",
- "extent": [
- [
- -9,
- 49.8
- ],
- [
- 1.9,
- 61.1
- ]
- ],
- "sourcetag": "OS7"
- },
- {
- "name": "OS 7th Series historic (NLS)",
- "template": "http://geo.nls.uk/mapdata2/os/seventh/{z}/{x}/{y}.png",
- "extent": [
- [
- -9,
- 49.8
- ],
- [
- 1.9,
- 61.1
- ]
- ],
- "sourcetag": "OS7",
- "logo": "icons/logo_nls70-nq8.png",
- "logo_url": "http://geo.nls.uk/maps/"
- },
- {
- "name": "OS New Popular Edition historic",
- "template": "http://ooc.openstreetmap.org/npe/{z}/{x}/{y}.png",
- "extent": [
- [
- -5.8,
- 49.8
- ],
- [
- 1.9,
- 55.8
- ]
- ],
- "sourcetag": "NPE"
- },
- {
- "name": "OS Scottish Popular historic",
- "template": "http://ooc.openstreetmap.org/npescotland/tiles/{z}/{x}/{y}.jpg",
- "extent": [
- [
- -7.8,
- 54.5
- ],
- [
- -1.1,
- 61.1
- ]
- ],
- "sourcetag": "NPE"
- },
- {
- "name": "Surrey aerial",
- "template": "http://gravitystorm.dev.openstreetmap.org/surrey/{z}/{x}/{y}.png",
- "extent": [
- [
- -0.856,
- 51.071
- ],
- [
- 0.062,
- 51.473
- ]
- ],
- "sourcetag": "Surrey aerial"
- },
- {
- "name": "Haiti - GeoEye Jan 13",
- "template": "http://gravitystorm.dev.openstreetmap.org/imagery/haiti/{z}/{x}/{y}.jpg",
- "extent": [
- [
- -74.5,
- 17.95
- ],
- [
- -71.58,
- 20.12
- ]
- ],
- "sourcetag": "Haiti GeoEye"
- },
- {
- "name": "Haiti - GeoEye Jan 13+",
- "template": "http://maps.nypl.org/tilecache/1/geoeye/{z}/{x}/{y}.jpg",
- "extent": [
- [
- -74.5,
- 17.95
- ],
- [
- -71.58,
- 20.12
- ]
- ],
- "sourcetag": "Haiti GeoEye"
- },
- {
- "name": "Haiti - DigitalGlobe",
- "template": "http://maps.nypl.org/tilecache/1/dg_crisis/{z}/{x}/{y}.jpg",
- "extent": [
- [
- -74.5,
- 17.95
- ],
- [
- -71.58,
- 20.12
- ]
- ],
- "sourcetag": "Haiti DigitalGlobe"
- },
- {
- "name": "Haiti - Street names",
- "template": "http://hypercube.telascience.org/tiles/1.0.0/haiti-city/{z}/{x}/{y}.jpg",
- "extent": [
- [
- -74.5,
- 17.95
- ],
- [
- -71.58,
- 20.12
- ]
- ],
- "sourcetag": "Haiti streetnames"
- },
- {
- "name": "NAIP",
- "template": "http://cube.telascience.org/tilecache/tilecache.py/NAIP_ALL/{z}/{x}/{y}.png",
- "description": "National Agriculture Imagery Program",
- "extent": [
- [
- -125.8,
- 24.2
- ],
- [
- -62.3,
- 49.5
- ]
- ],
- "sourcetag": "NAIP"
- },
- {
- "name": "NAIP",
- "template": "http://cube.telascience.org/tilecache/tilecache.py/NAIP_ALL/{z}/{x}/{y}.png",
- "description": "National Agriculture Imagery Program",
- "extent": [
- [
- -168.5,
- 55.3
- ],
- [
- -140,
- 71.5
- ]
- ],
- "sourcetag": "NAIP"
- },
- {
- "name": "Ireland - NLS Historic Maps",
- "template": "http://geo.nls.uk/maps/ireland/gsgs4136/{z}/{x}/{y}.png",
- "extent": [
- [
- -10.71,
- 51.32
- ],
- [
- -5.37,
- 55.46
- ]
- ],
- "sourcetag": "NLS Historic Maps",
- "logo": "icons/logo_nls70-nq8.png",
- "logo_url": "http://geo.nls.uk/maps/"
- },
- {
- "name": "Denmark - Fugro Aerial Imagery",
- "template": "http://tile.openstreetmap.dk/fugro2005/{z}/{x}/{y}.jpg",
- "extent": [
- [
- 7.81,
- 54.44
- ],
- [
- 15.49,
- 57.86
- ]
- ],
- "sourcetag": "Fugro (2005)"
- },
- {
- "name": "Denmark - Stevns Kommune",
- "template": "http://tile.openstreetmap.dk/stevns/2009/{z}/{x}/{y}.jpg",
- "extent": [
- [
- 12.09144,
- 55.23403
- ],
- [
- 12.47712,
- 55.43647
- ]
- ],
- "sourcetag": "Stevns Kommune (2009)"
- },
- {
- "name": "Austria - geoimage.at",
- "template": "http://geoimage.openstreetmap.at/4d80de696cd562a63ce463a58a61488d/{z}/{x}/{y}.jpg",
- "extent": [
- [
- 9.36,
- 46.33
- ],
- [
- 17.28,
- 49.09
- ]
- ],
- "sourcetag": "geoimage.at"
- },
- {
- "name": "Russia - Kosmosnimki.ru IRS Satellite",
- "template": "http://irs.gis-lab.info/?layers=irs&request=GetTile&z={z}&x={x}&y={y}",
- "extent": [
- [
- 19.02,
- 40.96
- ],
- [
- 77.34,
- 70.48
- ]
- ],
- "sourcetag": "Kosmosnimki.ru IRS"
- },
- {
- "name": "Belarus - Kosmosnimki.ru SPOT4 Satellite",
- "template": "http://irs.gis-lab.info/?layers=spot&request=GetTile&z={z}&x={x}&y={y}",
- "extent": [
- [
- 23.16,
- 51.25
- ],
- [
- 32.83,
- 56.19
- ]
- ],
- "sourcetag": "Kosmosnimki.ru SPOT4"
- },
- {
- "name": "Australia - Geographic Reference Image",
- "template": "http://agri.openstreetmap.org/{z}/{x}/{y}.png",
- "extent": [
- [
- 96,
- -44
- ],
- [
- 168,
- -9
- ]
- ],
- "sourcetag": "AGRI"
- },
- {
- "name": "Switzerland - Canton Aargau - AGIS 25cm 2011",
- "template": "http://tiles.poole.ch/AGIS/OF2011/{z}/{x}/{y}.png",
- "extent": [
- [
- 7.69,
- 47.13
- ],
- [
- 8.48,
- 47.63
- ]
- ],
- "sourcetag": "AGIS OF2011"
- },
- {
- "name": "Switzerland - Canton Solothurn - SOGIS 2007",
- "template": "http://mapproxy.sosm.ch:8080/tiles/sogis2007/EPSG900913/{z}/{x}/{y}.png?origin=nw",
- "extent": [
- [
- 7.33,
- 47.06
- ],
- [
- 8.04,
- 47.5
- ]
- ],
- "sourcetag": "Orthofoto 2007 WMS Solothurn"
- },
- {
- "name": "Poland - Media-Lab fleet GPS masstracks",
- "template": "http://masstracks.media-lab.com.pl/{z}/{x}/{y}.png",
- "extent": [
- [
- 14,
- 48.9
- ],
- [
- 24.2,
- 55
- ]
- ],
- "sourcetag": "masstracks"
- },
- {
- "name": "South Africa - CD:NGI Aerial",
- "template": "http://{t}.aerial.openstreetmap.org.za/ngi-aerial/{z}/{x}/{y}.jpg",
- "subdomains": [
- "a",
- "b",
- "c"
- ],
- "extent": [
- [
- 17.64,
- -34.95
- ],
- [
- 32.87,
- -22.05
- ]
- ],
- "sourcetag": "ngi-aerial"
- }
- ],
- "wikipedia": [
- [
- "English",
- "English",
- "en"
- ],
- [
- "German",
- "Deutsch",
- "de"
- ],
- [
- "Dutch",
- "Nederlands",
- "nl"
- ],
- [
- "French",
- "Français",
- "fr"
- ],
- [
- "Italian",
- "Italiano",
- "it"
- ],
- [
- "Russian",
- "Русский",
- "ru"
- ],
- [
- "Spanish",
- "Español",
- "es"
- ],
- [
- "Polish",
- "Polski",
- "pl"
- ],
- [
- "Swedish",
- "Svenska",
- "sv"
- ],
- [
- "Japanese",
- "日本語",
- "ja"
- ],
- [
- "Portuguese",
- "Português",
- "pt"
- ],
- [
- "Chinese",
- "中文",
- "zh"
- ],
- [
- "Vietnamese",
- "Tiếng Việt",
- "vi"
- ],
- [
- "Ukrainian",
- "Українська",
- "uk"
- ],
- [
- "Catalan",
- "Català",
- "ca"
- ],
- [
- "Norwegian (Bokmål)",
- "Norsk (Bokmål)",
- "no"
- ],
- [
- "Waray-Waray",
- "Winaray",
- "war"
- ],
- [
- "Cebuano",
- "Sinugboanong Binisaya",
- "ceb"
- ],
- [
- "Finnish",
- "Suomi",
- "fi"
- ],
- [
- "Persian",
- "فارسی",
- "fa"
- ],
- [
- "Czech",
- "Čeština",
- "cs"
- ],
- [
- "Hungarian",
- "Magyar",
- "hu"
- ],
- [
- "Korean",
- "한국어",
- "ko"
- ],
- [
- "Romanian",
- "Română",
- "ro"
- ],
- [
- "Arabic",
- "العربية",
- "ar"
- ],
- [
- "Turkish",
- "Türkçe",
- "tr"
- ],
- [
- "Indonesian",
- "Bahasa Indonesia",
- "id"
- ],
- [
- "Kazakh",
- "Қазақша",
- "kk"
- ],
- [
- "Malay",
- "Bahasa Melayu",
- "ms"
- ],
- [
- "Serbian",
- "Српски / Srpski",
- "sr"
- ],
- [
- "Slovak",
- "Slovenčina",
- "sk"
- ],
- [
- "Esperanto",
- "Esperanto",
- "eo"
- ],
- [
- "Danish",
- "Dansk",
- "da"
- ],
- [
- "Lithuanian",
- "Lietuvių",
- "lt"
- ],
- [
- "Basque",
- "Euskara",
- "eu"
- ],
- [
- "Bulgarian",
- "Български",
- "bg"
- ],
- [
- "Hebrew",
- "עברית",
- "he"
- ],
- [
- "Slovenian",
- "Slovenščina",
- "sl"
- ],
- [
- "Croatian",
- "Hrvatski",
- "hr"
- ],
- [
- "Volapük",
- "Volapük",
- "vo"
- ],
- [
- "Estonian",
- "Eesti",
- "et"
- ],
- [
- "Hindi",
- "हिन्दी",
- "hi"
- ],
- [
- "Uzbek",
- "O‘zbek",
- "uz"
- ],
- [
- "Galician",
- "Galego",
- "gl"
- ],
- [
- "Norwegian (Nynorsk)",
- "Nynorsk",
- "nn"
- ],
- [
- "Simple English",
- "Simple English",
- "simple"
- ],
- [
- "Azerbaijani",
- "Azərbaycanca",
- "az"
- ],
- [
- "Latin",
- "Latina",
- "la"
- ],
- [
- "Greek",
- "Ελληνικά",
- "el"
- ],
- [
- "Thai",
- "ไทย",
- "th"
- ],
- [
- "Serbo-Croatian",
- "Srpskohrvatski / Српскохрватски",
- "sh"
- ],
- [
- "Georgian",
- "ქართული",
- "ka"
- ],
- [
- "Occitan",
- "Occitan",
- "oc"
- ],
- [
- "Macedonian",
- "Македонски",
- "mk"
- ],
- [
- "Newar / Nepal Bhasa",
- "नेपाल भाषा",
- "new"
- ],
- [
- "Tagalog",
- "Tagalog",
- "tl"
- ],
- [
- "Piedmontese",
- "Piemontèis",
- "pms"
- ],
- [
- "Belarusian",
- "Беларуская",
- "be"
- ],
- [
- "Haitian",
- "Krèyol ayisyen",
- "ht"
- ],
- [
- "Tamil",
- "தமிழ்",
- "ta"
- ],
- [
- "Telugu",
- "తెలుగు",
- "te"
- ],
- [
- "Belarusian (Taraškievica)",
- "Беларуская (тарашкевіца)",
- "be-x-old"
- ],
- [
- "Latvian",
- "Latviešu",
- "lv"
- ],
- [
- "Breton",
- "Brezhoneg",
- "br"
- ],
- [
- "Malagasy",
- "Malagasy",
- "mg"
- ],
- [
- "Albanian",
- "Shqip",
- "sq"
- ],
- [
- "Armenian",
- "Հայերեն",
- "hy"
- ],
- [
- "Tatar",
- "Tatarça / Татарча",
- "tt"
- ],
- [
- "Javanese",
- "Basa Jawa",
- "jv"
- ],
- [
- "Welsh",
- "Cymraeg",
- "cy"
- ],
- [
- "Marathi",
- "मराठी",
- "mr"
- ],
- [
- "Luxembourgish",
- "Lëtzebuergesch",
- "lb"
- ],
- [
- "Icelandic",
- "Íslenska",
- "is"
- ],
- [
- "Bosnian",
- "Bosanski",
- "bs"
- ],
- [
- "Burmese",
- "မြန်မာဘာသာ",
- "my"
- ],
- [
- "Yoruba",
- "Yorùbá",
- "yo"
- ],
- [
- "Bashkir",
- "Башҡорт",
- "ba"
- ],
- [
- "Malayalam",
- "മലയാളം",
- "ml"
- ],
- [
- "Aragonese",
- "Aragonés",
- "an"
- ],
- [
- "Lombard",
- "Lumbaart",
- "lmo"
- ],
- [
- "Afrikaans",
- "Afrikaans",
- "af"
- ],
- [
- "West Frisian",
- "Frysk",
- "fy"
- ],
- [
- "Western Panjabi",
- "شاہ مکھی پنجابی (Shāhmukhī Pañjābī)",
- "pnb"
- ],
- [
- "Bengali",
- "বাংলা",
- "bn"
- ],
- [
- "Swahili",
- "Kiswahili",
- "sw"
- ],
- [
- "Bishnupriya Manipuri",
- "ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী",
- "bpy"
- ],
- [
- "Ido",
- "Ido",
- "io"
- ],
- [
- "Kirghiz",
- "Кыргызча",
- "ky"
- ],
- [
- "Urdu",
- "اردو",
- "ur"
- ],
- [
- "Nepali",
- "नेपाली",
- "ne"
- ],
- [
- "Sicilian",
- "Sicilianu",
- "scn"
- ],
- [
- "Gujarati",
- "ગુજરાતી",
- "gu"
- ],
- [
- "Cantonese",
- "粵語",
- "zh-yue"
- ],
- [
- "Low Saxon",
- "Plattdüütsch",
- "nds"
- ],
- [
- "Kurdish",
- "Kurdî / كوردی",
- "ku"
- ],
- [
- "Irish",
- "Gaeilge",
- "ga"
- ],
- [
- "Asturian",
- "Asturianu",
- "ast"
- ],
- [
- "Quechua",
- "Runa Simi",
- "qu"
- ],
- [
- "Sundanese",
- "Basa Sunda",
- "su"
- ],
- [
- "Chuvash",
- "Чăваш",
- "cv"
- ],
- [
- "Scots",
- "Scots",
- "sco"
- ],
- [
- "Interlingua",
- "Interlingua",
- "ia"
- ],
- [
- "Alemannic",
- "Alemannisch",
- "als"
- ],
- [
- "Buginese",
- "Basa Ugi",
- "bug"
- ],
- [
- "Neapolitan",
- "Nnapulitano",
- "nap"
- ],
- [
- "Samogitian",
- "Žemaitėška",
- "bat-smg"
- ],
- [
- "Kannada",
- "ಕನ್ನಡ",
- "kn"
- ],
- [
- "Banyumasan",
- "Basa Banyumasan",
- "map-bms"
- ],
- [
- "Walloon",
- "Walon",
- "wa"
- ],
- [
- "Amharic",
- "አማርኛ",
- "am"
- ],
- [
- "Sorani",
- "Soranî / کوردی",
- "ckb"
- ],
- [
- "Scottish Gaelic",
- "Gàidhlig",
- "gd"
- ],
- [
- "Fiji Hindi",
- "Fiji Hindi",
- "hif"
- ],
- [
- "Min Nan",
- "Bân-lâm-gú",
- "zh-min-nan"
- ],
- [
- "Tajik",
- "Тоҷикӣ",
- "tg"
- ],
- [
- "Mazandarani",
- "مَزِروني",
- "mzn"
- ],
- [
- "Egyptian Arabic",
- "مصرى (Maṣrī)",
- "arz"
- ],
- [
- "Yiddish",
- "ייִדיש",
- "yi"
- ],
- [
- "Venetian",
- "Vèneto",
- "vec"
- ],
- [
- "Mongolian",
- "Монгол",
- "mn"
- ],
- [
- "Tarantino",
- "Tarandíne",
- "roa-tara"
- ],
- [
- "Sanskrit",
- "संस्कृतम्",
- "sa"
- ],
- [
- "Nahuatl",
- "Nāhuatl",
- "nah"
- ],
- [
- "Ossetian",
- "Иронау",
- "os"
- ],
- [
- "Sakha",
- "Саха тыла (Saxa Tyla)",
- "sah"
- ],
- [
- "Kapampangan",
- "Kapampangan",
- "pam"
- ],
- [
- "Upper Sorbian",
- "Hornjoserbsce",
- "hsb"
- ],
- [
- "Sinhalese",
- "සිංහල",
- "si"
- ],
- [
- "Northern Sami",
- "Sámegiella",
- "se"
- ],
- [
- "Limburgish",
- "Limburgs",
- "li"
- ],
- [
- "Maori",
- "Māori",
- "mi"
- ],
- [
- "Bavarian",
- "Boarisch",
- "bar"
- ],
- [
- "Corsican",
- "Corsu",
- "co"
- ],
- [
- "Ilokano",
- "Ilokano",
- "ilo"
- ],
- [
- "Gan",
- "贛語",
- "gan"
- ],
- [
- "Tibetan",
- "བོད་སྐད",
- "bo"
- ],
- [
- "Gilaki",
- "گیلکی",
- "glk"
- ],
- [
- "Faroese",
- "Føroyskt",
- "fo"
- ],
- [
- "Rusyn",
- "русиньскый язык",
- "rue"
- ],
- [
- "Punjabi",
- "ਪੰਜਾਬੀ",
- "pa"
- ],
- [
- "Central_Bicolano",
- "Bikol",
- "bcl"
- ],
- [
- "Hill Mari",
- "Кырык Мары (Kyryk Mary) ",
- "mrj"
- ],
- [
- "Võro",
- "Võro",
- "fiu-vro"
- ],
- [
- "Dutch Low Saxon",
- "Nedersaksisch",
- "nds-nl"
- ],
- [
- "Turkmen",
- "تركمن / Туркмен",
- "tk"
- ],
- [
- "Pashto",
- "پښتو",
- "ps"
- ],
- [
- "West Flemish",
- "West-Vlams",
- "vls"
- ],
- [
- "Mingrelian",
- "მარგალური (Margaluri)",
- "xmf"
- ],
- [
- "Manx",
- "Gaelg",
- "gv"
- ],
- [
- "Zazaki",
- "Zazaki",
- "diq"
- ],
- [
- "Pangasinan",
- "Pangasinan",
- "pag"
- ],
- [
- "Komi",
- "Коми",
- "kv"
- ],
- [
- "Zeelandic",
- "Zeêuws",
- "zea"
- ],
- [
- "Divehi",
- "ދިވެހިބަސް",
- "dv"
- ],
- [
- "Oriya",
- "ଓଡ଼ିଆ",
- "or"
- ],
- [
- "Khmer",
- "ភាសាខ្មែរ",
- "km"
- ],
- [
- "Norman",
- "Nouormand/Normaund",
- "nrm"
- ],
- [
- "Romansh",
- "Rumantsch",
- "rm"
- ],
- [
- "Komi-Permyak",
- "Перем Коми (Perem Komi)",
- "koi"
- ],
- [
- "Udmurt",
- "Удмурт кыл",
- "udm"
- ],
- [
- "Meadow Mari",
- "Олык Марий (Olyk Marij)",
- "mhr"
- ],
- [
- "Ladino",
- "Dzhudezmo",
- "lad"
- ],
- [
- "North Frisian",
- "Nordfriisk",
- "frr"
- ],
- [
- "Kashubian",
- "Kaszëbsczi",
- "csb"
- ],
- [
- "Ligurian",
- "Líguru",
- "lij"
- ],
- [
- "Wu",
- "吴语",
- "wuu"
- ],
- [
- "Friulian",
- "Furlan",
- "fur"
- ],
- [
- "Vepsian",
- "Vepsän",
- "vep"
- ],
- [
- "Classical Chinese",
- "古文 / 文言文",
- "zh-classical"
- ],
- [
- "Uyghur",
- "ئۇيغۇر تىلى",
- "ug"
- ],
- [
- "Saterland Frisian",
- "Seeltersk",
- "stq"
- ],
- [
- "Sardinian",
- "Sardu",
- "sc"
- ],
- [
- "Aromanian",
- "Armãneashce",
- "roa-rup"
- ],
- [
- "Pali",
- "पाऴि",
- "pi"
- ],
- [
- "Somali",
- "Soomaaliga",
- "so"
- ],
- [
- "Bihari",
- "भोजपुरी",
- "bh"
- ],
- [
- "Maltese",
- "Malti",
- "mt"
- ],
- [
- "Aymara",
- "Aymar",
- "ay"
- ],
- [
- "Ripuarian",
- "Ripoarisch",
- "ksh"
- ],
- [
- "Novial",
- "Novial",
- "nov"
- ],
- [
- "Anglo-Saxon",
- "Englisc",
- "ang"
- ],
- [
- "Cornish",
- "Kernewek/Karnuack",
- "kw"
- ],
- [
- "Navajo",
- "Diné bizaad",
- "nv"
- ],
- [
- "Picard",
- "Picard",
- "pcd"
- ],
- [
- "Hakka",
- "Hak-kâ-fa / 客家話",
- "hak"
- ],
- [
- "Guarani",
- "Avañe'ẽ",
- "gn"
- ],
- [
- "Extremaduran",
- "Estremeñu",
- "ext"
- ],
- [
- "Franco-Provençal/Arpitan",
- "Arpitan",
- "frp"
- ],
- [
- "Assamese",
- "অসমীয়া",
- "as"
- ],
- [
- "Silesian",
- "Ślůnski",
- "szl"
- ],
- [
- "Gagauz",
- "Gagauz",
- "gag"
- ],
- [
- "Interlingue",
- "Interlingue",
- "ie"
- ],
- [
- "Lingala",
- "Lingala",
- "ln"
- ],
- [
- "Emilian-Romagnol",
- "Emiliàn e rumagnòl",
- "eml"
- ],
- [
- "Chechen",
- "Нохчийн",
- "ce"
- ],
- [
- "Kalmyk",
- "Хальмг",
- "xal"
- ],
- [
- "Palatinate German",
- "Pfälzisch",
- "pfl"
- ],
- [
- "Hawaiian",
- "Hawai`i",
- "haw"
- ],
- [
- "Karachay-Balkar",
- "Къарачай-Малкъар (Qarachay-Malqar)",
- "krc"
- ],
- [
- "Pennsylvania German",
- "Deitsch",
- "pdc"
- ],
- [
- "Kinyarwanda",
- "Ikinyarwanda",
- "rw"
- ],
- [
- "Crimean Tatar",
- "Qırımtatarca",
- "crh"
- ],
- [
- "Acehnese",
- "Bahsa Acèh",
- "ace"
- ],
- [
- "Tongan",
- "faka Tonga",
- "to"
- ],
- [
- "Greenlandic",
- "Kalaallisut",
- "kl"
- ],
- [
- "Lower Sorbian",
- "Dolnoserbski",
- "dsb"
- ],
- [
- "Aramaic",
- "ܐܪܡܝܐ",
- "arc"
- ],
- [
- "Erzya",
- "Эрзянь (Erzjanj Kelj)",
- "myv"
- ],
- [
- "Lezgian",
- "Лезги чІал (Lezgi č’al)",
- "lez"
- ],
- [
- "Banjar",
- "Bahasa Banjar",
- "bjn"
- ],
- [
- "Shona",
- "chiShona",
- "sn"
- ],
- [
- "Papiamentu",
- "Papiamentu",
- "pap"
- ],
- [
- "Kabyle",
- "Taqbaylit",
- "kab"
- ],
- [
- "Tok Pisin",
- "Tok Pisin",
- "tpi"
- ],
- [
- "Lak",
- "Лакку",
- "lbe"
- ],
- [
- "Buryat (Russia)",
- "Буряад",
- "bxr"
- ],
- [
- "Lojban",
- "Lojban",
- "jbo"
- ],
- [
- "Wolof",
- "Wolof",
- "wo"
- ],
- [
- "Moksha",
- "Мокшень (Mokshanj Kälj)",
- "mdf"
- ],
- [
- "Zamboanga Chavacano",
- "Chavacano de Zamboanga",
- "cbk-zam"
- ],
- [
- "Avar",
- "Авар",
- "av"
- ],
- [
- "Sranan",
- "Sranantongo",
- "srn"
- ],
- [
- "Mirandese",
- "Mirandés",
- "mwl"
- ],
- [
- "Kabardian Circassian",
- "Адыгэбзэ (Adighabze)",
- "kbd"
- ],
- [
- "Tahitian",
- "Reo Mā`ohi",
- "ty"
- ],
- [
- "Lao",
- "ລາວ",
- "lo"
- ],
- [
- "Abkhazian",
- "Аҧсуа",
- "ab"
- ],
- [
- "Tetum",
- "Tetun",
- "tet"
- ],
- [
- "Latgalian",
- "Latgaļu",
- "ltg"
- ],
- [
- "Nauruan",
- "dorerin Naoero",
- "na"
- ],
- [
- "Kongo",
- "KiKongo",
- "kg"
- ],
- [
- "Igbo",
- "Igbo",
- "ig"
- ],
- [
- "Northern Sotho",
- "Sesotho sa Leboa",
- "nso"
- ],
- [
- "Zhuang",
- "Cuengh",
- "za"
- ],
- [
- "Karakalpak",
- "Qaraqalpaqsha",
- "kaa"
- ],
- [
- "Zulu",
- "isiZulu",
- "zu"
- ],
- [
- "Cheyenne",
- "Tsetsêhestâhese",
- "chy"
- ],
- [
- "Romani",
- "romani - रोमानी",
- "rmy"
- ],
- [
- "Old Church Slavonic",
- "Словѣньскъ",
- "cu"
- ],
- [
- "Tswana",
- "Setswana",
- "tn"
- ],
- [
- "Cherokee",
- "ᏣᎳᎩ",
- "chr"
- ],
- [
- "Bislama",
- "Bislama",
- "bi"
- ],
- [
- "Min Dong",
- "Mìng-dĕ̤ng-ngṳ̄",
- "cdo"
- ],
- [
- "Gothic",
- "𐌲𐌿𐍄𐌹𐍃𐌺",
- "got"
- ],
- [
- "Samoan",
- "Gagana Samoa",
- "sm"
- ],
- [
- "Moldovan",
- "Молдовеняскэ",
- "mo"
- ],
- [
- "Bambara",
- "Bamanankan",
- "bm"
- ],
- [
- "Inuktitut",
- "ᐃᓄᒃᑎᑐᑦ",
- "iu"
- ],
- [
- "Norfolk",
- "Norfuk",
- "pih"
- ],
- [
- "Pontic",
- "Ποντιακά",
- "pnt"
- ],
- [
- "Sindhi",
- "سنڌي، سندھی ، सिन्ध",
- "sd"
- ],
- [
- "Swati",
- "SiSwati",
- "ss"
- ],
- [
- "Kikuyu",
- "Gĩkũyũ",
- "ki"
- ],
- [
- "Ewe",
- "Eʋegbe",
- "ee"
- ],
- [
- "Hausa",
- "هَوُسَ",
- "ha"
- ],
- [
- "Oromo",
- "Oromoo",
- "om"
- ],
- [
- "Fijian",
- "Na Vosa Vakaviti",
- "fj"
- ],
- [
- "Tigrinya",
- "ትግርኛ",
- "ti"
- ],
- [
- "Tsonga",
- "Xitsonga",
- "ts"
- ],
- [
- "Kashmiri",
- "कश्मीरी / كشميري",
- "ks"
- ],
- [
- "Venda",
- "Tshivenda",
- "ve"
- ],
- [
- "Sango",
- "Sängö",
- "sg"
- ],
- [
- "Kirundi",
- "Kirundi",
- "rn"
- ],
- [
- "Sesotho",
- "Sesotho",
- "st"
- ],
- [
- "Dzongkha",
- "ཇོང་ཁ",
- "dz"
- ],
- [
- "Cree",
- "Nehiyaw",
- "cr"
- ],
- [
- "Akan",
- "Akana",
- "ak"
- ],
- [
- "Tumbuka",
- "chiTumbuka",
- "tum"
- ],
- [
- "Luganda",
- "Luganda",
- "lg"
- ],
- [
- "Chichewa",
- "Chi-Chewa",
- "ny"
- ],
- [
- "Fula",
- "Fulfulde",
- "ff"
- ],
- [
- "Inupiak",
- "Iñupiak",
- "ik"
- ],
- [
- "Chamorro",
- "Chamoru",
- "ch"
- ],
- [
- "Twi",
- "Twi",
- "tw"
- ],
- [
- "Xhosa",
- "isiXhosa",
- "xh"
- ],
- [
- "Ndonga",
- "Oshiwambo",
- "ng"
- ],
- [
- "Sichuan Yi",
- "ꆇꉙ",
- "ii"
- ],
- [
- "Choctaw",
- "Choctaw",
- "cho"
- ],
- [
- "Marshallese",
- "Ebon",
- "mh"
- ],
- [
- "Afar",
- "Afar",
- "aa"
- ],
- [
- "Kuanyama",
- "Kuanyama",
- "kj"
- ],
- [
- "Hiri Motu",
- "Hiri Motu",
- "ho"
- ],
- [
- "Muscogee",
- "Muskogee",
- "mus"
- ],
- [
- "Kanuri",
- "Kanuri",
- "kr"
- ],
- [
- "Herero",
- "Otsiherero",
- "hz"
- ]
- ],
- "presets": {
- "presets": {
- "aeroway": {
- "icon": "airport",
- "fields": [
- "aeroway"
- ],
- "geometry": [
- "point",
- "vertex",
- "line",
- "area"
- ],
- "tags": {
- "aeroway": "*"
- },
- "name": "Aeroway"
- },
- "aeroway/aerodrome": {
- "icon": "airport",
- "geometry": [
- "point",
- "area"
- ],
- "terms": [
- "airplane",
- "airport",
- "aerodrome"
- ],
- "fields": [
- "ref",
- "iata",
- "icao",
- "operator"
- ],
- "tags": {
- "aeroway": "aerodrome"
- },
- "name": "Airport"
- },
- "aeroway/apron": {
- "icon": "airport",
- "geometry": [
- "area"
- ],
- "terms": [
- "ramp"
- ],
- "fields": [
- "ref",
- "surface"
- ],
- "tags": {
- "aeroway": "apron"
- },
- "name": "Apron"
- },
- "aeroway/gate": {
- "icon": "airport",
- "geometry": [
- "point"
- ],
- "fields": [
- "ref"
- ],
- "tags": {
- "aeroway": "gate"
- },
- "name": "Airport gate"
- },
- "aeroway/hangar": {
- "geometry": [
- "area"
- ],
- "fields": [
- "building_area"
- ],
- "tags": {
- "aeroway": "hangar"
- },
- "name": "Hangar"
- },
- "aeroway/helipad": {
- "icon": "heliport",
- "geometry": [
- "point",
- "area"
- ],
- "terms": [
- "helicopter",
- "helipad",
- "heliport"
- ],
- "tags": {
- "aeroway": "helipad"
- },
- "name": "Helipad"
- },
- "aeroway/runway": {
- "geometry": [
- "line",
- "area"
- ],
- "terms": [
- "landing strip"
- ],
- "fields": [
- "ref",
- "surface"
- ],
- "tags": {
- "aeroway": "runway"
- },
- "name": "Runway"
- },
- "aeroway/taxiway": {
- "geometry": [
- "line"
- ],
- "fields": [
- "ref",
- "surface"
- ],
- "tags": {
- "aeroway": "taxiway"
- },
- "name": "Taxiway"
- },
- "aeroway/terminal": {
- "geometry": [
- "point",
- "area"
- ],
- "terms": [
- "airport",
- "aerodrome"
- ],
- "fields": [
- "operator",
- "building_area"
- ],
- "tags": {
- "aeroway": "terminal"
- },
- "name": "Airport terminal"
- },
- "amenity": {
- "fields": [
- "amenity"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "*"
- },
- "name": "Amenity"
- },
- "amenity/bank": {
- "icon": "bank",
- "fields": [
- "atm",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "coffer",
- "countinghouse",
- "credit union",
- "depository",
- "exchequer",
- "fund",
- "hoard",
- "investment firm",
- "repository",
- "reserve",
- "reservoir",
- "safe",
- "savings",
- "stock",
- "stockpile",
- "store",
- "storehouse",
- "thrift",
- "treasury",
- "trust company",
- "vault"
- ],
- "tags": {
- "amenity": "bank"
- },
- "name": "Bank"
- },
- "amenity/bar": {
- "icon": "bar",
- "fields": [
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "bar"
- },
- "terms": [],
- "name": "Bar"
- },
- "amenity/bench": {
- "geometry": [
- "point",
- "vertex",
- "line"
- ],
- "tags": {
- "amenity": "bench"
- },
- "name": "Bench"
- },
- "amenity/bicycle_parking": {
- "icon": "bicycle",
- "fields": [
- "bicycle_parking",
- "capacity",
- "operator"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "bicycle_parking"
- },
- "name": "Bicycle Parking"
- },
- "amenity/bicycle_rental": {
- "icon": "bicycle",
- "fields": [
- "capacity",
- "network",
- "operator"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "bicycle_rental"
- },
- "name": "Bicycle Rental"
- },
- "amenity/cafe": {
- "icon": "cafe",
- "fields": [
- "cuisine",
- "internet_access",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "coffee",
- "tea",
- "coffee shop"
- ],
- "tags": {
- "amenity": "cafe"
- },
- "name": "Cafe"
- },
- "amenity/car_wash": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "amenity": "car_wash"
- },
- "fields": [
- "building_area"
- ],
- "name": "Car Wash"
- },
- "amenity/cinema": {
- "icon": "cinema",
- "fields": [
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "big screen",
- "bijou",
- "cine",
- "drive-in",
- "film",
- "flicks",
- "motion pictures",
- "movie house",
- "movie theater",
- "moving pictures",
- "nabes",
- "photoplay",
- "picture show",
- "pictures",
- "playhouse",
- "show",
- "silver screen"
- ],
- "tags": {
- "amenity": "cinema"
- },
- "name": "Cinema"
- },
- "amenity/college": {
- "icon": "college",
- "fields": [
- "operator",
- "address"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "amenity": "college"
- },
- "terms": [],
- "name": "College"
- },
- "amenity/courthouse": {
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "courthouse"
- },
- "name": "Courthouse"
- },
- "amenity/embassy": {
- "geometry": [
- "area",
- "point"
- ],
- "tags": {
- "amenity": "embassy"
- },
- "fields": [
- "country",
- "building_area"
- ],
- "icon": "embassy",
- "name": "Embassy"
- },
- "amenity/fast_food": {
- "icon": "fast-food",
- "fields": [
- "cuisine",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "fast_food"
- },
- "terms": [],
- "name": "Fast Food"
- },
- "amenity/fire_station": {
- "icon": "fire-station",
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "fire_station"
- },
- "terms": [],
- "name": "Fire Station"
- },
- "amenity/fountain": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "amenity": "fountain"
- },
- "name": "Fountain"
- },
- "amenity/fuel": {
- "icon": "fuel",
- "fields": [
- "operator",
- "address",
- "building_yes"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "fuel"
- },
- "name": "Gas Station"
- },
- "amenity/grave_yard": {
- "icon": "cemetery",
- "fields": [
- "religion"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "grave_yard"
- },
- "name": "Graveyard"
- },
- "amenity/hospital": {
- "icon": "hospital",
- "fields": [
- "emergency",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "clinic",
- "emergency room",
- "health service",
- "hospice",
- "infirmary",
- "institution",
- "nursing home",
- "rest home",
- "sanatorium",
- "sanitarium",
- "sick bay",
- "surgery",
- "ward"
- ],
- "tags": {
- "amenity": "hospital"
- },
- "name": "Hospital"
- },
- "amenity/kindergarten": {
- "icon": "school",
- "fields": [
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "preschool",
- "nursery",
- "childcare",
- "playgroup"
- ],
- "tags": {
- "amenity": "kindergarten"
- },
- "name": "Kindergarten"
- },
- "amenity/library": {
- "icon": "library",
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "library"
- },
- "terms": [],
- "name": "Library"
- },
- "amenity/marketplace": {
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "marketplace"
- },
- "fields": [
- "building"
- ],
- "name": "Marketplace"
- },
- "amenity/parking": {
- "icon": "parking",
- "fields": [
- "parking",
- "capacity",
- "fee",
- "supervised",
- "park_ride",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "parking"
- },
- "terms": [],
- "name": "Parking"
- },
- "amenity/pharmacy": {
- "icon": "pharmacy",
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "pharmacy"
- },
- "terms": [],
- "name": "Pharmacy"
- },
- "amenity/place_of_worship": {
- "icon": "place-of-worship",
- "fields": [
- "religion",
- "denomination",
- "building",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "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/christian": {
- "icon": "religious-christian",
- "fields": [
- "denomination",
- "building_yes",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "christian",
- "abbey",
- "basilica",
- "bethel",
- "cathedral",
- "chancel",
- "chantry",
- "chapel",
- "church",
- "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"
- },
- "name": "Church"
- },
- "amenity/place_of_worship/jewish": {
- "icon": "religious-jewish",
- "fields": [
- "denomination",
- "building_yes",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "jewish",
- "synagogue"
- ],
- "tags": {
- "amenity": "place_of_worship",
- "religion": "jewish"
- },
- "name": "Synagogue"
- },
- "amenity/place_of_worship/muslim": {
- "icon": "religious-muslim",
- "fields": [
- "denomination",
- "building_yes",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "muslim",
- "mosque"
- ],
- "tags": {
- "amenity": "place_of_worship",
- "religion": "muslim"
- },
- "name": "Mosque"
- },
- "amenity/police": {
- "icon": "police",
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "badge",
- "bear",
- "blue",
- "bluecoat",
- "bobby",
- "boy scout",
- "bull",
- "constable",
- "constabulary",
- "cop",
- "copper",
- "corps",
- "county mounty",
- "detective",
- "fed",
- "flatfoot",
- "force",
- "fuzz",
- "gendarme",
- "gumshoe",
- "heat",
- "law",
- "law enforcement",
- "man",
- "narc",
- "officers",
- "patrolman",
- "police"
- ],
- "tags": {
- "amenity": "police"
- },
- "name": "Police"
- },
- "amenity/post_box": {
- "icon": "post",
- "fields": [
- "operator",
- "collection_times"
- ],
- "geometry": [
- "point",
- "vertex"
- ],
- "tags": {
- "amenity": "post_box"
- },
- "terms": [
- "letter drop",
- "letterbox",
- "mail drop",
- "mailbox",
- "pillar box",
- "postbox"
- ],
- "name": "Mailbox"
- },
- "amenity/post_office": {
- "icon": "post",
- "fields": [
- "operator",
- "collection_times",
- "building_area"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "post_office"
- },
- "name": "Post Office"
- },
- "amenity/pub": {
- "icon": "beer",
- "fields": [
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "pub"
- },
- "terms": [],
- "name": "Pub"
- },
- "amenity/restaurant": {
- "icon": "restaurant",
- "fields": [
- "cuisine",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "bar",
- "cafeteria",
- "café",
- "canteen",
- "chophouse",
- "coffee shop",
- "diner",
- "dining room",
- "dive*",
- "doughtnut shop",
- "drive-in",
- "eatery",
- "eating house",
- "eating place",
- "fast-food place",
- "greasy spoon",
- "grill",
- "hamburger stand",
- "hashery",
- "hideaway",
- "hotdog stand",
- "inn",
- "joint*",
- "luncheonette",
- "lunchroom",
- "night club",
- "outlet*",
- "pizzeria",
- "saloon",
- "soda fountain",
- "watering hole"
- ],
- "tags": {
- "amenity": "restaurant"
- },
- "name": "Restaurant"
- },
- "amenity/school": {
- "icon": "school",
- "fields": [
- "operator",
- "building",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "academy",
- "alma mater",
- "blackboard",
- "college",
- "department",
- "discipline",
- "establishment",
- "faculty",
- "hall",
- "halls of ivy",
- "institute",
- "institution",
- "jail*",
- "schoolhouse",
- "seminary",
- "university"
- ],
- "tags": {
- "amenity": "school"
- },
- "name": "School"
- },
- "amenity/swimming_pool": {
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "swimming_pool"
- },
- "icon": "swimming",
- "searchable": false,
- "name": "Swimming Pool"
- },
- "amenity/telephone": {
- "icon": "telephone",
- "geometry": [
- "point",
- "vertex"
- ],
- "tags": {
- "amenity": "telephone"
- },
- "name": "Telephone"
- },
- "amenity/theatre": {
- "icon": "theatre",
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "theatre",
- "performance",
- "play",
- "musical"
- ],
- "tags": {
- "amenity": "theatre"
- },
- "name": "Theater"
- },
- "amenity/toilets": {
- "fields": [
- "operator",
- "building"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [],
- "tags": {
- "amenity": "toilets"
- },
- "icon": "toilets",
- "name": "Toilets"
- },
- "amenity/townhall": {
- "icon": "town-hall",
- "fields": [
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "village hall",
- "city government",
- "courthouse",
- "municipal building",
- "municipal center"
- ],
- "tags": {
- "amenity": "townhall"
- },
- "name": "Town Hall"
- },
- "amenity/university": {
- "icon": "college",
- "fields": [
- "operator",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "amenity": "university"
- },
- "terms": [
- "college"
- ],
- "name": "University"
- },
- "amenity/waste_basket": {
- "icon": "waste-basket",
- "geometry": [
- "point",
- "vertex"
- ],
- "tags": {
- "amenity": "waste_basket"
- },
- "terms": [
- "rubbish bin",
- "litter bin",
- "trash can",
- "garbage can"
- ],
- "name": "Waste Basket"
- },
- "barrier": {
- "geometry": [
- "point",
- "vertex",
- "line",
- "area"
- ],
- "tags": {
- "barrier": "*"
- },
- "fields": [
- "barrier"
- ],
- "name": "Barrier"
- },
- "barrier/block": {
- "fields": [
- "access"
- ],
- "geometry": [
- "point",
- "vertex"
- ],
- "tags": {
- "barrier": "block"
- },
- "name": "Block"
- },
- "barrier/bollard": {
- "fields": [
- "access"
- ],
- "geometry": [
- "point",
- "vertex",
- "line"
- ],
- "tags": {
- "barrier": "bollard"
- },
- "name": "Bollard"
- },
- "barrier/cattle_grid": {
- "geometry": [
- "vertex"
- ],
- "tags": {
- "barrier": "cattle_grid"
- },
- "name": "Cattle Grid"
- },
- "barrier/city_wall": {
- "geometry": [
- "line",
- "area"
- ],
- "tags": {
- "barrier": "city_wall"
- },
- "name": "City Wall"
- },
- "barrier/cycle_barrier": {
- "fields": [
- "access"
- ],
- "geometry": [
- "vertex"
- ],
- "tags": {
- "barrier": "cycle_barrier"
- },
- "name": "Cycle Barrier"
- },
- "barrier/ditch": {
- "geometry": [
- "line",
- "area"
- ],
- "tags": {
- "barrier": "ditch"
- },
- "name": "Ditch"
- },
- "barrier/entrance": {
- "geometry": [
- "vertex"
- ],
- "tags": {
- "barrier": "entrance"
- },
- "name": "Entrance"
- },
- "barrier/fence": {
- "geometry": [
- "line",
- "area"
- ],
- "tags": {
- "barrier": "fence"
- },
- "name": "Fence"
- },
- "barrier/gate": {
- "fields": [
- "access"
- ],
- "geometry": [
- "point",
- "vertex",
- "line"
- ],
- "tags": {
- "barrier": "gate"
- },
- "name": "Gate"
- },
- "barrier/hedge": {
- "geometry": [
- "line",
- "area"
- ],
- "tags": {
- "barrier": "hedge"
- },
- "name": "Hedge"
- },
- "barrier/kissing_gate": {
- "fields": [
- "access"
- ],
- "geometry": [
- "vertex"
- ],
- "tags": {
- "barrier": "kissing_gate"
- },
- "name": "Kissing Gate"
- },
- "barrier/lift_gate": {
- "fields": [
- "access"
- ],
- "geometry": [
- "point",
- "vertex"
- ],
- "tags": {
- "barrier": "lift_gate"
- },
- "name": "Lift Gate"
- },
- "barrier/retaining_wall": {
- "geometry": [
- "line",
- "area"
- ],
- "tags": {
- "barrier": "retaining_wall"
- },
- "name": "Retaining Wall"
- },
- "barrier/stile": {
- "fields": [
- "access"
- ],
- "geometry": [
- "point",
- "vertex"
- ],
- "tags": {
- "barrier": "stile"
- },
- "name": "Stile"
- },
- "barrier/toll_booth": {
- "fields": [
- "access"
- ],
- "geometry": [
- "vertex"
- ],
- "tags": {
- "barrier": "toll_booth"
- },
- "name": "Toll Booth"
- },
- "barrier/wall": {
- "geometry": [
- "line",
- "area"
- ],
- "tags": {
- "barrier": "wall"
- },
- "name": "Wall"
- },
- "boundary/administrative": {
- "name": "Administrative Boundary",
- "geometry": [
- "line",
- "area"
- ],
- "tags": {
- "boundary": "administrative"
- },
- "fields": [
- "admin_level"
- ]
- },
- "building": {
- "icon": "building",
- "fields": [
- "building_yes",
- "levels",
- "address"
- ],
- "geometry": [
- "area"
- ],
- "tags": {
- "building": "*"
- },
- "terms": [],
- "name": "Building"
- },
- "building/apartments": {
- "icon": "commercial",
- "fields": [
- "address",
- "levels"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "building": "apartments"
- },
- "name": "Apartments"
- },
- "building/entrance": {
- "geometry": [
- "vertex"
- ],
- "tags": {
- "building": "entrance"
- },
- "name": "Entrance",
- "searchable": false
- },
- "building/house": {
- "fields": [
- "address",
- "levels"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "building": "house"
- },
- "name": "House"
- },
- "emergency/phone": {
- "icon": "emergency-telephone",
- "fields": [
- "operator"
- ],
- "geometry": [
- "point",
- "vertex"
- ],
- "tags": {
- "emergency": "phone"
- },
- "name": "Emergency Phone"
- },
- "entrance": {
- "geometry": [
- "vertex"
- ],
- "tags": {
- "entrance": "*"
- },
- "fields": [
- "entrance"
- ],
- "name": "Entrance"
- },
- "highway": {
- "fields": [
- "highway"
- ],
- "geometry": [
- "point",
- "vertex",
- "line",
- "area"
- ],
- "tags": {
- "highway": "*"
- },
- "name": "Highway"
- },
- "highway/bridleway": {
- "fields": [
- "access",
- "surface",
- "structure"
- ],
- "icon": "highway-bridleway",
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "bridleway"
- },
- "terms": [
- "bridleway",
- "equestrian trail",
- "horse riding path",
- "bridle road",
- "horse trail"
- ],
- "name": "Bridle Path"
- },
- "highway/bus_stop": {
- "icon": "bus",
- "fields": [
- "operator",
- "shelter"
- ],
- "geometry": [
- "point",
- "vertex"
- ],
- "tags": {
- "highway": "bus_stop"
- },
- "terms": [],
- "name": "Bus Stop"
- },
- "highway/crossing": {
- "fields": [
- "crossing"
- ],
- "geometry": [
- "vertex"
- ],
- "tags": {
- "highway": "crossing"
- },
- "terms": [
- "crosswalk",
- "zebra crossing"
- ],
- "name": "Crossing"
- },
- "highway/cycleway": {
- "icon": "highway-cycleway",
- "fields": [
- "oneway",
- "structure",
- "access",
- "surface"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "cycleway"
- },
- "terms": [],
- "name": "Cycle Path"
- },
- "highway/footway": {
- "icon": "highway-footway",
- "fields": [
- "structure",
- "access",
- "surface"
- ],
- "geometry": [
- "line",
- "area"
- ],
- "terms": [
- "beaten path",
- "boulevard",
- "clearing",
- "course",
- "cut*",
- "drag*",
- "footpath",
- "highway",
- "lane",
- "line",
- "orbit",
- "passage",
- "pathway",
- "rail",
- "rails",
- "road",
- "roadway",
- "route",
- "street",
- "thoroughfare",
- "trackway",
- "trail",
- "trajectory",
- "walk"
- ],
- "tags": {
- "highway": "footway"
- },
- "name": "Foot Path"
- },
- "highway/living_street": {
- "icon": "highway-residential",
- "fields": [
- "oneway",
- "structure",
- "access",
- "maxspeed",
- "surface"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "living_street"
- },
- "name": "Living Street"
- },
- "highway/mini_roundabout": {
- "geometry": [
- "vertex"
- ],
- "tags": {
- "highway": "mini_roundabout"
- },
- "fields": [
- "clock_direction"
- ],
- "name": "Mini-Roundabout"
- },
- "highway/motorway": {
- "icon": "highway-motorway",
- "fields": [
- "oneway",
- "structure",
- "access",
- "lanes",
- "maxspeed",
- "surface",
- "ref"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "motorway"
- },
- "terms": [],
- "name": "Motorway"
- },
- "highway/motorway_junction": {
- "geometry": [
- "vertex"
- ],
- "tags": {
- "highway": "motorway_junction"
- },
- "fields": [
- "ref"
- ],
- "name": "Motorway Junction"
- },
- "highway/motorway_link": {
- "icon": "highway-motorway-link",
- "fields": [
- "oneway_yes",
- "structure",
- "access",
- "maxspeed",
- "surface",
- "ref"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "motorway_link"
- },
- "terms": [
- "ramp",
- "on ramp",
- "off ramp"
- ],
- "name": "Motorway Link"
- },
- "highway/path": {
- "icon": "highway-path",
- "fields": [
- "structure",
- "access",
- "sac_scale",
- "surface",
- "incline",
- "trail_visibility",
- "ref"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "path"
- },
- "terms": [],
- "name": "Path"
- },
- "highway/pedestrian": {
- "fields": [
- "access",
- "oneway",
- "surface"
- ],
- "geometry": [
- "line",
- "area"
- ],
- "tags": {
- "highway": "pedestrian"
- },
- "terms": [],
- "name": "Pedestrian"
- },
- "highway/primary": {
- "icon": "highway-primary",
- "fields": [
- "oneway",
- "structure",
- "access",
- "lanes",
- "maxspeed",
- "surface",
- "ref"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "primary"
- },
- "terms": [],
- "name": "Primary Road"
- },
- "highway/primary_link": {
- "icon": "highway-primary-link",
- "fields": [
- "oneway",
- "structure",
- "access",
- "maxspeed",
- "surface",
- "ref"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "primary_link"
- },
- "terms": [
- "ramp",
- "on ramp",
- "off ramp"
- ],
- "name": "Primary Link"
- },
- "highway/residential": {
- "icon": "highway-residential",
- "fields": [
- "oneway",
- "structure",
- "access",
- "maxspeed",
- "surface"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "residential"
- },
- "terms": [],
- "name": "Residential Road"
- },
- "highway/road": {
- "icon": "highway-road",
- "fields": [
- "oneway",
- "structure",
- "access",
- "maxspeed",
- "surface"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "road"
- },
- "terms": [],
- "name": "Unknown Road"
- },
- "highway/secondary": {
- "icon": "highway-secondary",
- "fields": [
- "oneway",
- "structure",
- "access",
- "lanes",
- "maxspeed",
- "surface",
- "ref"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "secondary"
- },
- "terms": [],
- "name": "Secondary Road"
- },
- "highway/secondary_link": {
- "icon": "highway-secondary-link",
- "fields": [
- "oneway",
- "structure",
- "access",
- "maxspeed",
- "surface",
- "ref"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "secondary_link"
- },
- "terms": [
- "ramp",
- "on ramp",
- "off ramp"
- ],
- "name": "Secondary Link"
- },
- "highway/service": {
- "icon": "highway-service",
- "fields": [
- "service",
- "oneway",
- "structure",
- "access",
- "maxspeed",
- "surface"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "service"
- },
- "terms": [],
- "name": "Service Road"
- },
- "highway/service/alley": {
- "icon": "highway-service",
- "fields": [
- "oneway",
- "access",
- "surface"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "service",
- "service": "alley"
- },
- "name": "Alley"
- },
- "highway/service/drive-through": {
- "icon": "highway-service",
- "fields": [
- "oneway",
- "access",
- "surface"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "service",
- "service": "drive-through"
- },
- "name": "Drive-Through"
- },
- "highway/service/driveway": {
- "icon": "highway-service",
- "fields": [
- "oneway",
- "access",
- "surface"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "service",
- "service": "driveway"
- },
- "name": "Driveway"
- },
- "highway/service/emergency_access": {
- "icon": "highway-service",
- "fields": [
- "oneway",
- "access",
- "surface"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "service",
- "service": "emergency_access"
- },
- "name": "Emergency Access"
- },
- "highway/service/parking_aisle": {
- "icon": "highway-service",
- "fields": [
- "oneway",
- "access",
- "surface"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "service",
- "service": "parking_aisle"
- },
- "name": "Parking Aisle"
- },
- "highway/steps": {
- "fields": [
- "access",
- "surface"
- ],
- "icon": "highway-steps",
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "steps"
- },
- "terms": [
- "stairs",
- "staircase"
- ],
- "name": "Steps"
- },
- "highway/tertiary": {
- "icon": "highway-tertiary",
- "fields": [
- "oneway",
- "structure",
- "access",
- "lanes",
- "maxspeed",
- "surface",
- "ref"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "tertiary"
- },
- "terms": [],
- "name": "Tertiary Road"
- },
- "highway/tertiary_link": {
- "icon": "highway-tertiary-link",
- "fields": [
- "oneway",
- "structure",
- "access",
- "maxspeed",
- "surface",
- "ref"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "tertiary_link"
- },
- "terms": [
- "ramp",
- "on ramp",
- "off ramp"
- ],
- "name": "Tertiary Link"
- },
- "highway/track": {
- "icon": "highway-track",
- "fields": [
- "tracktype",
- "oneway",
- "structure",
- "access",
- "maxspeed",
- "surface"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "track"
- },
- "terms": [],
- "name": "Track"
- },
- "highway/traffic_signals": {
- "geometry": [
- "vertex"
- ],
- "tags": {
- "highway": "traffic_signals"
- },
- "terms": [
- "light",
- "stoplight",
- "traffic light"
- ],
- "name": "Traffic Signals"
- },
- "highway/trunk": {
- "icon": "highway-trunk",
- "fields": [
- "oneway",
- "structure",
- "access",
- "lanes",
- "maxspeed",
- "surface",
- "ref"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "trunk"
- },
- "terms": [],
- "name": "Trunk Road"
- },
- "highway/trunk_link": {
- "icon": "highway-trunk-link",
- "fields": [
- "oneway",
- "structure",
- "access",
- "maxspeed",
- "surface",
- "ref"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "trunk_link"
- },
- "terms": [
- "ramp",
- "on ramp",
- "off ramp"
- ],
- "name": "Trunk Link"
- },
- "highway/turning_circle": {
- "icon": "circle",
- "geometry": [
- "vertex"
- ],
- "tags": {
- "highway": "turning_circle"
- },
- "terms": [],
- "name": "Turning Circle"
- },
- "highway/unclassified": {
- "icon": "highway-unclassified",
- "fields": [
- "oneway",
- "structure",
- "access",
- "maxspeed",
- "surface"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "highway": "unclassified"
- },
- "terms": [],
- "name": "Unclassified Road"
- },
- "historic": {
- "fields": [
- "historic"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "historic": "*"
- },
- "name": "Historic Site"
- },
- "historic/archaeological_site": {
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "historic": "archaeological_site"
- },
- "name": "Archaeological Site"
- },
- "historic/boundary_stone": {
- "geometry": [
- "point",
- "vertex"
- ],
- "tags": {
- "historic": "boundary_stone"
- },
- "name": "Boundary Stone"
- },
- "historic/castle": {
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "historic": "castle"
- },
- "name": "Castle"
- },
- "historic/memorial": {
- "icon": "monument",
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "historic": "memorial"
- },
- "name": "Memorial"
- },
- "historic/monument": {
- "icon": "monument",
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "historic": "monument"
- },
- "name": "Monument"
- },
- "historic/ruins": {
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "historic": "ruins"
- },
- "name": "Ruins"
- },
- "historic/wayside_cross": {
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "historic": "wayside_cross"
- },
- "name": "Wayside Cross"
- },
- "historic/wayside_shrine": {
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "historic": "wayside_shrine"
- },
- "name": "Wayside Shrine"
- },
- "landuse": {
- "fields": [
- "landuse"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "landuse": "*"
- },
- "name": "Landuse"
- },
- "landuse/allotments": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "allotments"
- },
- "terms": [],
- "name": "Allotments"
- },
- "landuse/basin": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "basin"
- },
- "terms": [],
- "name": "Basin"
- },
- "landuse/cemetery": {
- "icon": "cemetery",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "cemetery"
- },
- "terms": [],
- "name": "Cemetery"
- },
- "landuse/commercial": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "commercial"
- },
- "terms": [],
- "name": "Commercial"
- },
- "landuse/construction": {
- "fields": [
- "construction",
- "operator"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "construction"
- },
- "terms": [],
- "name": "Construction"
- },
- "landuse/farm": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "farm"
- },
- "terms": [],
- "name": "Farm"
- },
- "landuse/farmyard": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "farmyard"
- },
- "terms": [],
- "name": "Farmyard"
- },
- "landuse/forest": {
- "fields": [
- "wood"
- ],
- "icon": "park2",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "forest"
- },
- "terms": [],
- "name": "Forest"
- },
- "landuse/grass": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "grass"
- },
- "terms": [],
- "name": "Grass"
- },
- "landuse/industrial": {
- "icon": "industrial",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "industrial"
- },
- "terms": [],
- "name": "Industrial"
- },
- "landuse/meadow": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "meadow"
- },
- "terms": [],
- "name": "Meadow"
- },
- "landuse/orchard": {
- "icon": "park2",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "orchard"
- },
- "terms": [],
- "name": "Orchard"
- },
- "landuse/quarry": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "quarry"
- },
- "terms": [],
- "name": "Quarry"
- },
- "landuse/residential": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "residential"
- },
- "terms": [],
- "name": "Residential"
- },
- "landuse/retail": {
- "icon": "shop",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "retail"
- },
- "name": "Retail"
- },
- "landuse/vineyard": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "landuse": "vineyard"
- },
- "terms": [],
- "name": "Vineyard"
- },
- "leisure": {
- "fields": [
- "leisure"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "leisure": "*"
- },
- "name": "Leisure"
- },
- "leisure/garden": {
- "icon": "garden",
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "leisure": "garden"
- },
- "name": "Garden"
- },
- "leisure/golf_course": {
- "icon": "golf",
- "fields": [
- "operator",
- "address"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "leisure": "golf_course"
- },
- "terms": [],
- "name": "Golf Course"
- },
- "leisure/marina": {
- "icon": "harbor",
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "leisure": "marina"
- },
- "name": "Marina"
- },
- "leisure/park": {
- "icon": "park",
- "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/pitch": {
- "icon": "pitch",
- "fields": [
- "sport",
- "surface"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "leisure": "pitch"
- },
- "terms": [],
- "name": "Sport Pitch"
- },
- "leisure/pitch/american_football": {
- "icon": "america-football",
- "fields": [
- "surface"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "leisure": "pitch",
- "sport": "american_football"
- },
- "terms": [],
- "name": "American Football Field"
- },
- "leisure/pitch/baseball": {
- "icon": "baseball",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "leisure": "pitch",
- "sport": "baseball"
- },
- "terms": [],
- "name": "Baseball Diamond"
- },
- "leisure/pitch/basketball": {
- "icon": "basketball",
- "fields": [
- "surface"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "leisure": "pitch",
- "sport": "basketball"
- },
- "terms": [],
- "name": "Basketball Court"
- },
- "leisure/pitch/soccer": {
- "icon": "soccer",
- "fields": [
- "surface"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "leisure": "pitch",
- "sport": "soccer"
- },
- "terms": [],
- "name": "Soccer Field"
- },
- "leisure/pitch/tennis": {
- "icon": "tennis",
- "fields": [
- "surface"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "leisure": "pitch",
- "sport": "tennis"
- },
- "terms": [],
- "name": "Tennis Court"
- },
- "leisure/pitch/volleyball": {
- "icon": "pitch",
- "fields": [
- "surface"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "leisure": "pitch",
- "sport": "volleyball"
- },
- "terms": [],
- "name": "Volleyball Court"
- },
- "leisure/playground": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "leisure": "playground"
- },
- "name": "Playground"
- },
- "leisure/slipway": {
- "geometry": [
- "point",
- "line"
- ],
- "tags": {
- "leisure": "slipway"
- },
- "name": "Slipway"
- },
- "leisure/stadium": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "leisure": "stadium"
- },
- "fields": [
- "sport"
- ],
- "name": "Stadium"
- },
- "leisure/swimming_pool": {
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "leisure": "swimming_pool"
- },
- "icon": "swimming",
- "name": "Swimming Pool"
- },
- "man_made": {
- "fields": [
- "man_made"
- ],
- "geometry": [
- "point",
- "vertex",
- "line",
- "area"
- ],
- "tags": {
- "man_made": "*"
- },
- "name": "Man Made"
- },
- "man_made/breakwater": {
- "geometry": [
- "line",
- "area"
- ],
- "tags": {
- "man_made": "breakwater"
- },
- "name": "Breakwater"
- },
- "man_made/cutline": {
- "geometry": [
- "line"
- ],
- "tags": {
- "man_made": "cutline"
- },
- "name": "Cut line"
- },
- "man_made/lighthouse": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "man_made": "lighthouse"
- },
- "name": "Lighthouse"
- },
- "man_made/pier": {
- "geometry": [
- "line",
- "area"
- ],
- "tags": {
- "man_made": "pier"
- },
- "name": "Pier"
- },
- "man_made/pipeline": {
- "geometry": [
- "line"
- ],
- "tags": {
- "man_made": "pipeline"
- },
- "fields": [
- "location",
- "operator"
- ],
- "name": "Pipeline"
- },
- "man_made/survey_point": {
- "icon": "monument",
- "geometry": [
- "point",
- "vertex"
- ],
- "tags": {
- "man_made": "survey_point"
- },
- "fields": [
- "ref"
- ],
- "name": "Survey Point"
- },
- "man_made/tower": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "man_made": "tower"
- },
- "fields": [
- "towertype"
- ],
- "name": "Tower"
- },
- "man_made/wastewater_plant": {
- "icon": "water",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "man_made": "wastewater_plant"
- },
- "name": "Wastewater Plant",
- "terms": [
- "sewage works",
- "sewage treatment plant",
- "water treatment plant",
- "reclamation plant"
- ]
- },
- "man_made/water_tower": {
- "icon": "water",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "man_made": "water_tower"
- },
- "name": "Water Tower"
- },
- "man_made/water_well": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "man_made": "water_well"
- },
- "name": "Water well"
- },
- "man_made/water_works": {
- "icon": "water",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "man_made": "water_works"
- },
- "name": "Water Works"
- },
- "natural": {
- "fields": [
- "natural"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "natural": "*"
- },
- "name": "Natural"
- },
- "natural/bay": {
- "geometry": [
- "point",
- "area"
- ],
- "terms": [],
- "tags": {
- "natural": "bay"
- },
- "name": "Bay"
- },
- "natural/beach": {
- "fields": [
- "surface"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "terms": [],
- "tags": {
- "natural": "beach"
- },
- "name": "Beach"
- },
- "natural/cliff": {
- "geometry": [
- "point",
- "vertex",
- "line",
- "area"
- ],
- "terms": [],
- "tags": {
- "natural": "cliff"
- },
- "name": "Cliff"
- },
- "natural/coastline": {
- "geometry": [
- "line"
- ],
- "terms": [
- "shore"
- ],
- "tags": {
- "natural": "coastline"
- },
- "name": "Coastline"
- },
- "natural/glacier": {
- "geometry": [
- "area"
- ],
- "terms": [],
- "tags": {
- "natural": "glacier"
- },
- "name": "Glacier"
- },
- "natural/grassland": {
- "geometry": [
- "point",
- "area"
- ],
- "terms": [],
- "tags": {
- "natural": "grassland"
- },
- "name": "Grassland"
- },
- "natural/heath": {
- "geometry": [
- "area"
- ],
- "terms": [],
- "tags": {
- "natural": "heath"
- },
- "name": "Heath"
- },
- "natural/peak": {
- "icon": "triangle",
- "fields": [
- "elevation"
- ],
- "geometry": [
- "point",
- "vertex"
- ],
- "tags": {
- "natural": "peak"
- },
- "terms": [
- "acme",
- "aiguille",
- "alp",
- "climax",
- "crest",
- "crown",
- "hill",
- "mount",
- "mountain",
- "pinnacle",
- "summit",
- "tip",
- "top"
- ],
- "name": "Peak"
- },
- "natural/scrub": {
- "geometry": [
- "area"
- ],
- "tags": {
- "natural": "scrub"
- },
- "terms": [],
- "name": "Scrub"
- },
- "natural/spring": {
- "geometry": [
- "point",
- "vertex"
- ],
- "terms": [],
- "tags": {
- "natural": "spring"
- },
- "name": "Spring"
- },
- "natural/tree": {
- "fields": [
- "denotation"
- ],
- "icon": "park",
- "geometry": [
- "point",
- "vertex"
- ],
- "terms": [],
- "tags": {
- "natural": "tree"
- },
- "name": "Tree"
- },
- "natural/water": {
- "fields": [
- "water"
- ],
- "geometry": [
- "area"
- ],
- "tags": {
- "natural": "water"
- },
- "icon": "water",
- "name": "Water"
- },
- "natural/water/lake": {
- "geometry": [
- "area"
- ],
- "tags": {
- "natural": "water",
- "water": "lake"
- },
- "terms": [
- "lakelet",
- "loch",
- "mere"
- ],
- "icon": "water",
- "name": "Lake"
- },
- "natural/water/pond": {
- "geometry": [
- "area"
- ],
- "tags": {
- "natural": "water",
- "water": "pond"
- },
- "terms": [
- "lakelet",
- "millpond",
- "tarn",
- "pool",
- "mere"
- ],
- "icon": "water",
- "name": "Pond"
- },
- "natural/water/reservoir": {
- "geometry": [
- "area"
- ],
- "tags": {
- "natural": "water",
- "water": "reservoir"
- },
- "icon": "water",
- "name": "Reservoir"
- },
- "natural/wetland": {
- "icon": "wetland",
- "fields": [
- "wetland"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "natural": "wetland"
- },
- "terms": [],
- "name": "Wetland"
- },
- "natural/wood": {
- "fields": [
- "wood"
- ],
- "icon": "park2",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "natural": "wood"
- },
- "terms": [],
- "name": "Wood"
- },
- "office": {
- "icon": "commercial",
- "fields": [
- "office",
- "address",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "office": "*"
- },
- "terms": [],
- "name": "Office"
- },
- "other": {
- "name": "Other",
- "tags": {},
- "geometry": [
- "point",
- "vertex",
- "line",
- "area",
- "relation"
- ],
- "fields": []
- },
- "other_area": {
- "name": "Other",
- "tags": {
- "area": "yes"
- },
- "geometry": [
- "area"
- ],
- "fields": []
- },
- "place": {
- "fields": [
- "place"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "place": "*"
- },
- "name": "Place"
- },
- "place/city": {
- "icon": "square",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "place": "city"
- },
- "name": "City"
- },
- "place/hamlet": {
- "icon": "triangle-stroked",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "place": "hamlet"
- },
- "name": "Hamlet"
- },
- "place/island": {
- "geometry": [
- "point",
- "area"
- ],
- "terms": [
- "archipelago",
- "atoll",
- "bar",
- "cay",
- "isle",
- "islet",
- "key",
- "reef"
- ],
- "tags": {
- "place": "island"
- },
- "name": "Island"
- },
- "place/isolated_dwelling": {
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "place": "isolated_dwelling"
- },
- "name": "Isolated Dwelling"
- },
- "place/locality": {
- "icon": "marker",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "place": "locality"
- },
- "name": "Locality"
- },
- "place/town": {
- "icon": "square-stroked",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "place": "town"
- },
- "name": "Town"
- },
- "place/village": {
- "icon": "triangle",
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "place": "village"
- },
- "name": "Village"
- },
- "power": {
- "geometry": [
- "point",
- "vertex",
- "line",
- "area"
- ],
- "tags": {
- "power": "*"
- },
- "fields": [
- "power"
- ],
- "name": "Power"
- },
- "power/generator": {
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "power": "generator"
- },
- "name": "Power Plant"
- },
- "power/line": {
- "geometry": [
- "line"
- ],
- "tags": {
- "power": "line"
- },
- "name": "Power Line",
- "icon": "power-line"
- },
- "power/pole": {
- "geometry": [
- "vertex"
- ],
- "tags": {
- "power": "pole"
- },
- "name": "Power Pole"
- },
- "power/sub_station": {
- "fields": [
- "operator",
- "building"
- ],
- "geometry": [
- "point",
- "area"
- ],
- "tags": {
- "power": "sub_station"
- },
- "name": "Substation"
- },
- "power/tower": {
- "geometry": [
- "vertex"
- ],
- "tags": {
- "power": "tower"
- },
- "name": "High-Voltage Tower"
- },
- "power/transformer": {
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "power": "transformer"
- },
- "name": "Transformer"
- },
- "railway": {
- "fields": [
- "railway"
- ],
- "geometry": [
- "point",
- "vertex",
- "line",
- "area"
- ],
- "tags": {
- "railway": "*"
- },
- "name": "Railway"
- },
- "railway/abandoned": {
- "icon": "railway-abandoned",
- "geometry": [
- "line"
- ],
- "tags": {
- "railway": "abandoned"
- },
- "fields": [
- "structure"
- ],
- "terms": [],
- "name": "Abandoned Railway"
- },
- "railway/disused": {
- "icon": "railway-disused",
- "geometry": [
- "line"
- ],
- "tags": {
- "railway": "disused"
- },
- "fields": [
- "structure"
- ],
- "terms": [],
- "name": "Disused Railway"
- },
- "railway/level_crossing": {
- "icon": "cross",
- "geometry": [
- "vertex"
- ],
- "tags": {
- "railway": "level_crossing"
- },
- "terms": [
- "crossing",
- "railroad crossing",
- "railway crossing",
- "grade crossing",
- "road through railroad",
- "train crossing"
- ],
- "name": "Level Crossing"
- },
- "railway/monorail": {
- "icon": "railway-monorail",
- "geometry": [
- "line"
- ],
- "tags": {
- "railway": "monorail"
- },
- "fields": [
- "structure"
- ],
- "terms": [],
- "name": "Monorail"
- },
- "railway/platform": {
- "geometry": [
- "point",
- "vertex",
- "line",
- "area"
- ],
- "tags": {
- "railway": "platform"
- },
- "name": "Railway Platform"
- },
- "railway/rail": {
- "icon": "railway-rail",
- "geometry": [
- "line"
- ],
- "tags": {
- "railway": "rail"
- },
- "fields": [
- "structure"
- ],
- "terms": [],
- "name": "Rail"
- },
- "railway/station": {
- "icon": "rail",
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "railway": "station"
- },
- "name": "Railway Station"
- },
- "railway/subway": {
- "icon": "railway-subway",
- "fields": [
- "structure"
- ],
- "geometry": [
- "line"
- ],
- "tags": {
- "railway": "subway"
- },
- "terms": [],
- "name": "Subway"
- },
- "railway/subway_entrance": {
- "icon": "rail-underground",
- "geometry": [
- "point"
- ],
- "tags": {
- "railway": "subway_entrance"
- },
- "terms": [],
- "name": "Subway Entrance"
- },
- "railway/tram": {
- "icon": "railway-light-rail",
- "geometry": [
- "line"
- ],
- "tags": {
- "railway": "tram"
- },
- "fields": [
- "structure"
- ],
- "terms": [
- "streetcar"
- ],
- "name": "Tram"
- },
- "shop": {
- "icon": "shop",
- "fields": [
- "shop",
- "address",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "*"
- },
- "terms": [],
- "name": "Shop"
- },
- "shop/alcohol": {
- "icon": "alcohol-shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "alcohol"
- },
- "terms": [
- "alcohol"
- ],
- "name": "Liquor Store"
- },
- "shop/bakery": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "bakery"
- },
- "name": "Bakery"
- },
- "shop/beauty": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "beauty"
- },
- "name": "Beauty Shop"
- },
- "shop/beverages": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "beverages"
- },
- "name": "Beverage Store"
- },
- "shop/bicycle": {
- "icon": "bicycle",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "bicycle"
- },
- "name": "Bicycle Shop"
- },
- "shop/books": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "books"
- },
- "name": "Bookstore"
- },
- "shop/boutique": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "boutique"
- },
- "name": "Boutique"
- },
- "shop/butcher": {
- "icon": "slaughterhouse",
- "fields": [
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [],
- "tags": {
- "shop": "butcher"
- },
- "name": "Butcher"
- },
- "shop/car": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "car"
- },
- "name": "Car Dealership"
- },
- "shop/car_parts": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "car_parts"
- },
- "name": "Car Parts Store"
- },
- "shop/car_repair": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "car_repair"
- },
- "name": "Car Repair Shop"
- },
- "shop/chemist": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "chemist"
- },
- "name": "Chemist"
- },
- "shop/clothes": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "clothes"
- },
- "name": "Clothing Store"
- },
- "shop/computer": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "computer"
- },
- "name": "Computer Store"
- },
- "shop/confectionery": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "confectionery"
- },
- "name": "Confectionery"
- },
- "shop/convenience": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "convenience"
- },
- "name": "Convenience Store"
- },
- "shop/deli": {
- "icon": "restaurant",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "deli"
- },
- "name": "Deli"
- },
- "shop/department_store": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "department_store"
- },
- "name": "Department Store"
- },
- "shop/doityourself": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "doityourself"
- },
- "name": "DIY Store"
- },
- "shop/dry_cleaning": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "dry_cleaning"
- },
- "name": "Dry Cleaners"
- },
- "shop/electronics": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "electronics"
- },
- "name": "Electronics Store"
- },
- "shop/fishmonger": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "fishmonger"
- },
- "name": "Fishmonger"
- },
- "shop/florist": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "florist"
- },
- "name": "Florist"
- },
- "shop/furniture": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "furniture"
- },
- "name": "Furniture Store"
- },
- "shop/garden_centre": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "garden_centre"
- },
- "name": "Garden Center"
- },
- "shop/gift": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "gift"
- },
- "name": "Gift Shop"
- },
- "shop/greengrocer": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "greengrocer"
- },
- "name": "Greengrocer"
- },
- "shop/hairdresser": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "hairdresser"
- },
- "name": "Hairdresser"
- },
- "shop/hardware": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "hardware"
- },
- "name": "Hardware Store"
- },
- "shop/hifi": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "hifi"
- },
- "name": "Hifi Store"
- },
- "shop/jewelry": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "jewelry"
- },
- "name": "Jeweler"
- },
- "shop/kiosk": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "kiosk"
- },
- "name": "Kiosk"
- },
- "shop/laundry": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "laundry"
- },
- "name": "Laundry"
- },
- "shop/mall": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "mall"
- },
- "name": "Mall"
- },
- "shop/mobile_phone": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "mobile_phone"
- },
- "name": "Mobile Phone Store"
- },
- "shop/motorcycle": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "motorcycle"
- },
- "name": "Motorcycle Dealership"
- },
- "shop/music": {
- "icon": "music",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "music"
- },
- "name": "Music Store"
- },
- "shop/newsagent": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "newsagent"
- },
- "name": "Newsagent"
- },
- "shop/optician": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "optician"
- },
- "name": "Optician"
- },
- "shop/outdoor": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "outdoor"
- },
- "name": "Outdoor Store"
- },
- "shop/pet": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "pet"
- },
- "name": "Pet Store"
- },
- "shop/shoes": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "shoes"
- },
- "name": "Shoe Store"
- },
- "shop/sports": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "sports"
- },
- "name": "Sporting Goods Store"
- },
- "shop/stationery": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "stationery"
- },
- "name": "Stationery Store"
- },
- "shop/supermarket": {
- "icon": "grocery",
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "bazaar",
- "boutique",
- "chain",
- "co-op",
- "cut-rate store",
- "discount store",
- "five-and-dime",
- "flea market",
- "galleria",
- "mall",
- "mart",
- "outlet",
- "outlet store",
- "shop",
- "shopping center",
- "shopping plaza",
- "stand",
- "store",
- "supermarket",
- "thrift shop"
- ],
- "tags": {
- "shop": "supermarket"
- },
- "name": "Supermarket"
- },
- "shop/toys": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "toys"
- },
- "name": "Toy Store"
- },
- "shop/travel_agency": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "travel_agency"
- },
- "name": "Travel Agency"
- },
- "shop/tyres": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "tyres"
- },
- "name": "Tire Store"
- },
- "shop/vacant": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "vacant"
- },
- "name": "Vacant Shop"
- },
- "shop/variety_store": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "variety_store"
- },
- "name": "Variety Store"
- },
- "shop/video": {
- "icon": "shop",
- "fields": [
- "address",
- "building_area",
- "opening_hours"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "shop": "video"
- },
- "name": "Video Store"
- },
- "tourism": {
- "fields": [
- "tourism"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "tourism": "*"
- },
- "name": "Tourism"
- },
- "tourism/alpine_hut": {
- "icon": "lodging",
- "fields": [
- "operator",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "tourism": "alpine_hut"
- },
- "name": "Alpine Hut"
- },
- "tourism/artwork": {
- "icon": "art-gallery",
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "tourism": "artwork"
- },
- "name": "Artwork"
- },
- "tourism/attraction": {
- "icon": "monument",
- "fields": [
- "operator",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "tourism": "attraction"
- },
- "name": "Tourist Attraction"
- },
- "tourism/camp_site": {
- "icon": "campsite",
- "fields": [
- "operator",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [],
- "tags": {
- "tourism": "camp_site"
- },
- "name": "Camp Site"
- },
- "tourism/caravan_site": {
- "fields": [
- "operator",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "tourism": "caravan_site"
- },
- "name": "RV Park"
- },
- "tourism/chalet": {
- "icon": "lodging",
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "tourism": "chalet"
- },
- "name": "Chalet"
- },
- "tourism/guest_house": {
- "icon": "lodging",
- "fields": [
- "operator",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "tourism": "guest_house"
- },
- "terms": [
- "B&B",
- "Bed & Breakfast",
- "Bed and Breakfast"
- ],
- "name": "Guest House"
- },
- "tourism/hostel": {
- "icon": "lodging",
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "tourism": "hostel"
- },
- "name": "Hostel"
- },
- "tourism/hotel": {
- "icon": "lodging",
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [],
- "tags": {
- "tourism": "hotel"
- },
- "name": "Hotel"
- },
- "tourism/information": {
- "fields": [
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "tourism": "information"
- },
- "name": "Information"
- },
- "tourism/motel": {
- "icon": "lodging",
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "tourism": "motel"
- },
- "name": "Motel"
- },
- "tourism/museum": {
- "icon": "museum",
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [
- "exhibition",
- "exhibits archive",
- "foundation",
- "gallery",
- "hall",
- "institution",
- "library",
- "menagerie",
- "repository",
- "salon",
- "storehouse",
- "treasury",
- "vault"
- ],
- "tags": {
- "tourism": "museum"
- },
- "name": "Museum"
- },
- "tourism/picnic_site": {
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "terms": [],
- "tags": {
- "tourism": "picnic_site"
- },
- "name": "Picnic Site"
- },
- "tourism/theme_park": {
- "fields": [
- "operator",
- "building_area",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "tourism": "theme_park"
- },
- "name": "Theme Park"
- },
- "tourism/viewpoint": {
- "geometry": [
- "point",
- "vertex"
- ],
- "tags": {
- "tourism": "viewpoint"
- },
- "name": "Viewpoint"
- },
- "tourism/zoo": {
- "icon": "zoo",
- "fields": [
- "operator",
- "address"
- ],
- "geometry": [
- "point",
- "vertex",
- "area"
- ],
- "tags": {
- "tourism": "zoo"
- },
- "name": "Zoo"
- },
- "waterway": {
- "fields": [
- "waterway"
- ],
- "geometry": [
- "point",
- "vertex",
- "line",
- "area"
- ],
- "tags": {
- "waterway": "*"
- },
- "name": "Waterway"
- },
- "waterway/canal": {
- "icon": "waterway-canal",
- "geometry": [
- "line"
- ],
- "tags": {
- "waterway": "canal"
- },
- "name": "Canal"
- },
- "waterway/dam": {
- "icon": "dam",
- "geometry": [
- "point",
- "vertex",
- "line",
- "area"
- ],
- "tags": {
- "waterway": "dam"
- },
- "name": "Dam"
- },
- "waterway/ditch": {
- "icon": "waterway-ditch",
- "geometry": [
- "line"
- ],
- "tags": {
- "waterway": "ditch"
- },
- "name": "Ditch"
- },
- "waterway/drain": {
- "icon": "waterway-stream",
- "geometry": [
- "line"
- ],
- "tags": {
- "waterway": "drain"
- },
- "name": "Drain"
- },
- "waterway/river": {
- "icon": "waterway-river",
- "geometry": [
- "line"
- ],
- "terms": [
- "beck",
- "branch",
- "brook",
- "course",
- "creek",
- "estuary",
- "rill",
- "rivulet",
- "run",
- "runnel",
- "stream",
- "tributary",
- "watercourse"
- ],
- "tags": {
- "waterway": "river"
- },
- "name": "River"
- },
- "waterway/riverbank": {
- "icon": "water",
- "geometry": [
- "area"
- ],
- "tags": {
- "waterway": "riverbank"
- },
- "name": "Riverbank"
- },
- "waterway/stream": {
- "icon": "waterway-stream",
- "fields": [
- "layer"
- ],
- "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/weir": {
- "icon": "dam",
- "geometry": [
- "vertex",
- "line"
- ],
- "tags": {
- "waterway": "weir"
- },
- "name": "Weir"
- }
- },
- "defaults": {
- "area": [
- "category-landuse",
- "building",
- "leisure/park",
- "natural/water",
- "amenity/hospital",
- "amenity/place_of_worship",
- "amenity/cafe",
- "amenity/restaurant",
- "other_area"
- ],
- "line": [
- "category-road",
- "category-rail",
- "category-path",
- "category-water",
- "power/line",
- "other"
- ],
- "point": [
- "leisure/park",
- "amenity/hospital",
- "amenity/place_of_worship",
- "amenity/cafe",
- "amenity/restaurant",
- "amenity/bar",
- "amenity/bank",
- "shop/supermarket",
- "other"
- ],
- "vertex": [
- "highway/crossing",
- "railway/level_crossing",
- "highway/traffic_signals",
- "highway/turning_circle",
- "highway/mini_roundabout",
- "highway/motorway_junction",
- "other"
- ]
- },
- "categories": {
- "category-landuse": {
- "geometry": "area",
- "name": "Land Use",
- "icon": "category-landuse",
- "members": [
- "landuse/residential",
- "landuse/industrial",
- "landuse/commercial",
- "landuse/retail",
- "landuse/farm",
- "landuse/farmyard",
- "landuse/forest",
- "landuse/meadow",
- "landuse/cemetery"
- ]
- },
- "category-path": {
- "geometry": "line",
- "name": "Path",
- "icon": "category-path",
- "members": [
- "highway/footway",
- "highway/cycleway",
- "highway/bridleway",
- "highway/path",
- "highway/steps"
- ]
- },
- "category-rail": {
- "geometry": "line",
- "name": "Rail",
- "icon": "category-rail",
- "members": [
- "railway/rail",
- "railway/subway",
- "railway/tram",
- "railway/monorail",
- "railway/disused",
- "railway/abandoned"
- ]
- },
- "category-road": {
- "geometry": "line",
- "name": "Road",
- "icon": "category-roads",
- "members": [
- "highway/residential",
- "highway/motorway",
- "highway/trunk",
- "highway/primary",
- "highway/secondary",
- "highway/tertiary",
- "highway/service",
- "highway/motorway_link",
- "highway/trunk_link",
- "highway/primary_link",
- "highway/secondary_link",
- "highway/tertiary_link",
- "highway/unclassified",
- "highway/track",
- "highway/road"
- ]
- },
- "category-water": {
- "geometry": "line",
- "name": "Water",
- "icon": "category-water",
- "members": [
- "waterway/river",
- "waterway/stream",
- "waterway/canal",
- "waterway/ditch"
- ]
- }
- },
- "fields": {
- "access": {
- "keys": [
- "access",
- "foot",
- "motor_vehicle",
- "bicycle",
- "horse"
- ],
- "type": "access",
- "label": "Access",
- "strings": {
- "types": {
- "access": "General",
- "foot": "Foot",
- "motor_vehicle": "Motor Vehicles",
- "bicycle": "Bicycles",
- "horse": "Horses"
- },
- "options": {
- "yes": {
- "title": "Allowed",
- "description": "Access permitted by law; a right of way"
- },
- "no": {
- "title": "Prohibited",
- "description": "Access not permitted to the general public"
- },
- "permissive": {
- "title": "Permissive",
- "description": "Access permitted until such time as the owner revokes the permission"
- },
- "private": {
- "title": "Private",
- "description": "Access permitted only with permission of the owner on an individual basis"
- },
- "designated": {
- "title": "Designated",
- "description": "Access permitted according to signs or specific local laws"
- },
- "destination": {
- "title": "Destination",
- "description": "Access permitted only to reach a destination"
- }
- }
- }
- },
- "address": {
- "type": "address",
- "keys": [
- "addr:housename",
- "addr:housenumber",
- "addr:street",
- "addr:city",
- "addr:postcode"
- ],
- "icon": "address",
- "universal": true,
- "label": "Address",
- "strings": {
- "placeholders": {
- "housename": "Housename",
- "number": "123",
- "street": "Street",
- "city": "City",
- "postcode": "Postal code"
- }
- }
- },
- "admin_level": {
- "key": "admin_level",
- "type": "number",
- "label": "Admin Level"
- },
- "aeroway": {
- "key": "aeroway",
- "type": "combo",
- "label": "Type"
- },
- "amenity": {
- "key": "amenity",
- "type": "combo",
- "label": "Type"
- },
- "atm": {
- "key": "atm",
- "type": "check",
- "label": "ATM"
- },
- "barrier": {
- "key": "barrier",
- "type": "combo",
- "label": "Type"
- },
- "bicycle_parking": {
- "key": "bicycle_parking",
- "type": "combo",
- "label": "Type"
- },
- "building": {
- "key": "building",
- "type": "combo",
- "label": "Building"
- },
- "building_area": {
- "key": "building",
- "type": "check",
- "default": "yes",
- "geometry": "area",
- "label": "Building"
- },
- "building_yes": {
- "key": "building",
- "type": "combo",
- "default": "yes",
- "label": "Building"
- },
- "capacity": {
- "key": "capacity",
- "type": "text",
- "label": "Capacity"
- },
- "cardinal_direction": {
- "key": "direction",
- "type": "combo",
- "options": [
- "N",
- "E",
- "S",
- "W",
- "NE",
- "SE",
- "SW",
- "NNE",
- "ENE",
- "ESE",
- "SSE",
- "SSW",
- "WSW",
- "WNW",
- "NNW"
- ],
- "label": "Direction"
- },
- "clock_direction": {
- "key": "direction",
- "type": "combo",
- "options": [
- "clockwise",
- "anticlockwise"
- ],
- "label": "Direction",
- "strings": {
- "options": {
- "clockwise": "Clockwise",
- "anticlockwise": "Counterclockwise"
- }
- }
- },
- "collection_times": {
- "key": "collection_times",
- "type": "text",
- "label": "Collection Times"
- },
- "construction": {
- "key": "construction",
- "type": "combo",
- "label": "Type"
- },
- "country": {
- "key": "country",
- "type": "combo",
- "label": "Country"
- },
- "crossing": {
- "key": "crossing",
- "type": "combo",
- "label": "Type"
- },
- "cuisine": {
- "key": "cuisine",
- "type": "combo",
- "indexed": true,
- "label": "Cuisine"
- },
- "denomination": {
- "key": "denomination",
- "type": "combo",
- "label": "Denomination"
- },
- "denotation": {
- "key": "denotation",
- "type": "combo",
- "label": "Denotation"
- },
- "elevation": {
- "key": "ele",
- "type": "number",
- "icon": "elevation",
- "universal": true,
- "label": "Elevation"
- },
- "emergency": {
- "key": "emergency",
- "type": "check",
- "label": "Emergency"
- },
- "entrance": {
- "key": "entrance",
- "type": "combo",
- "label": "Type"
- },
- "fax": {
- "key": "fax",
- "type": "tel",
- "label": "Fax"
- },
- "fee": {
- "key": "fee",
- "type": "check",
- "label": "Fee"
- },
- "highway": {
- "key": "highway",
- "type": "combo",
- "label": "Type"
- },
- "historic": {
- "key": "historic",
- "type": "combo",
- "label": "Type"
- },
- "iata": {
- "key": "iata",
- "type": "text",
- "label": "IATA"
- },
- "icao": {
- "key": "icao",
- "type": "text",
- "label": "ICAO"
- },
- "incline": {
- "key": "incline",
- "type": "combo",
- "label": "Incline"
- },
- "internet_access": {
- "key": "internet_access",
- "type": "combo",
- "options": [
- "yes",
- "no",
- "wlan",
- "wired",
- "terminal"
- ],
- "label": "Internet Access",
- "strings": {
- "options": {
- "yes": "Yes",
- "no": "No",
- "wlan": "Wifi",
- "wired": "Wired",
- "terminal": "Terminal"
- }
- }
- },
- "landuse": {
- "key": "landuse",
- "type": "combo",
- "label": "Type"
- },
- "lanes": {
- "key": "lanes",
- "type": "number",
- "label": "Lanes"
- },
- "layer": {
- "key": "layer",
- "type": "combo",
- "label": "Layer"
- },
- "leisure": {
- "key": "leisure",
- "type": "combo",
- "label": "Type"
- },
- "levels": {
- "key": "building:levels",
- "type": "number",
- "label": "Levels"
- },
- "location": {
- "key": "location",
- "type": "combo",
- "label": "Location"
- },
- "man_made": {
- "key": "man_made",
- "type": "combo",
- "label": "Type"
- },
- "maxspeed": {
- "key": "maxspeed",
- "type": "maxspeed",
- "label": "Speed Limit"
- },
- "name": {
- "key": "name",
- "type": "localized",
- "label": "Name"
- },
- "natural": {
- "key": "natural",
- "type": "combo",
- "label": "Natural"
- },
- "network": {
- "key": "network",
- "type": "text",
- "label": "Network"
- },
- "note": {
- "key": "note",
- "type": "textarea",
- "universal": true,
- "icon": "note",
- "label": "Note"
- },
- "office": {
- "key": "office",
- "type": "combo",
- "label": "Type"
- },
- "oneway": {
- "key": "oneway",
- "type": "check",
- "label": "One Way"
- },
- "oneway_yes": {
- "key": "oneway",
- "type": "check",
- "default": "yes",
- "label": "One Way"
- },
- "opening_hours": {
- "key": "opening_hours",
- "type": "text",
- "label": "Hours"
- },
- "operator": {
- "key": "operator",
- "type": "text",
- "label": "Operator"
- },
- "park_ride": {
- "key": "park_ride",
- "type": "check",
- "label": "Park and Ride"
- },
- "parking": {
- "key": "parking",
- "type": "combo",
- "options": [
- "surface",
- "multi-storey",
- "underground",
- "sheds",
- "carports",
- "garage_boxes",
- "lane"
- ],
- "label": "Type"
- },
- "phone": {
- "key": "phone",
- "type": "tel",
- "icon": "telephone",
- "universal": true,
- "label": "Phone"
- },
- "place": {
- "key": "place",
- "type": "combo",
- "label": "Type"
- },
- "power": {
- "key": "power",
- "type": "combo",
- "label": "Type"
- },
- "railway": {
- "key": "railway",
- "type": "combo",
- "label": "Type"
- },
- "ref": {
- "key": "ref",
- "type": "text",
- "label": "Reference"
- },
- "religion": {
- "key": "religion",
- "type": "combo",
- "options": [
- "christian",
- "muslim",
- "buddhist",
- "jewish",
- "hindu",
- "shinto",
- "taoist"
- ],
- "label": "Religion",
- "strings": {
- "options": {
- "christian": "Christian",
- "muslim": "Muslim",
- "buddhist": "Buddhist",
- "jewish": "Jewish",
- "hindu": "Hindu",
- "shinto": "Shinto",
- "taoist": "Taoist"
- }
- }
- },
- "sac_scale": {
- "key": "sac_scale",
- "type": "combo",
- "label": "Path Difficulty"
- },
- "service": {
- "key": "service",
- "type": "combo",
- "options": [
- "parking_aisle",
- "driveway",
- "alley",
- "drive-through",
- "emergency_access"
- ],
- "label": "Type"
- },
- "shelter": {
- "key": "shelter",
- "type": "check",
- "label": "Shelter"
- },
- "shop": {
- "key": "shop",
- "type": "combo",
- "label": "Type"
- },
- "source": {
- "key": "source",
- "type": "text",
- "icon": "source",
- "universal": true,
- "label": "Source"
- },
- "sport": {
- "key": "sport",
- "type": "combo",
- "label": "Sport"
- },
- "structure": {
- "type": "radio",
- "keys": [
- "bridge",
- "tunnel",
- "embankment",
- "cutting"
- ],
- "label": "Structure",
- "strings": {
- "options": {
- "bridge": "Bridge",
- "tunnel": "Tunnel",
- "embankment": "Embankment",
- "cutting": "Cutting"
- }
- }
- },
- "supervised": {
- "key": "supervised",
- "type": "check",
- "label": "Supervised"
- },
- "surface": {
- "key": "surface",
- "type": "combo",
- "label": "Surface"
- },
- "tourism": {
- "key": "tourism",
- "type": "combo",
- "label": "Type"
- },
- "towertype": {
- "key": "tower:type",
- "type": "combo",
- "label": "Tower type"
- },
- "tracktype": {
- "key": "tracktype",
- "type": "combo",
- "label": "Type"
- },
- "trail_visibility": {
- "key": "trail_visibility",
- "type": "combo",
- "label": "Trail Visibility"
- },
- "water": {
- "key": "water",
- "type": "combo",
- "label": "Type"
- },
- "waterway": {
- "key": "waterway",
- "type": "combo",
- "label": "Type"
- },
- "website": {
- "key": "website",
- "type": "url",
- "icon": "website",
- "placeholder": "http://example.com/",
- "universal": true,
- "label": "Website"
- },
- "wetland": {
- "key": "wetland",
- "type": "combo",
- "label": "Type"
- },
- "wheelchair": {
- "key": "wheelchair",
- "type": "radio",
- "options": [
- "yes",
- "limited",
- "no"
- ],
- "icon": "wheelchair",
- "universal": true,
- "label": "Wheelchair Access"
- },
- "wikipedia": {
- "key": "wikipedia",
- "type": "wikipedia",
- "icon": "wikipedia",
- "universal": true,
- "label": "Wikipedia"
- },
- "wood": {
- "key": "wood",
- "type": "combo",
- "label": "Type"
- }
- }
- },
- "imperial": {
- "type": "FeatureCollection",
- "features": [
- {
- "type": "Feature",
- "properties": {
- "id": 0
- },
- "geometry": {
- "type": "MultiPolygon",
- "coordinates": [
- [
- [
- [
- -1.426496,
- 50.639342
- ],
- [
- -1.445953,
- 50.648139
- ],
- [
- -1.452789,
- 50.654283
- ],
- [
- -1.485951,
- 50.669338
- ],
- [
- -1.497426,
- 50.672309
- ],
- [
- -1.535146,
- 50.669379
- ],
- [
- -1.551503,
- 50.665107
- ],
- [
- -1.569488,
- 50.658026
- ],
- [
- -1.545318,
- 50.686103
- ],
- [
- -1.50593,
- 50.707709
- ],
- [
- -1.418691,
- 50.733791
- ],
- [
- -1.420888,
- 50.730455
- ],
- [
- -1.423451,
- 50.7237
- ],
- [
- -1.425364,
- 50.72012
- ],
- [
- -1.400868,
- 50.721991
- ],
- [
- -1.377553,
- 50.734198
- ],
- [
- -1.343495,
- 50.761054
- ],
- [
- -1.318512,
- 50.772162
- ],
- [
- -1.295766,
- 50.773179
- ],
- [
- -1.144276,
- 50.733791
- ],
- [
- -1.119537,
- 50.734198
- ],
- [
- -1.10912,
- 50.732856
- ],
- [
- -1.097035,
- 50.726955
- ],
- [
- -1.096425,
- 50.724433
- ],
- [
- -1.097646,
- 50.71601
- ],
- [
- -1.097035,
- 50.713324
- ],
- [
- -1.094228,
- 50.712633
- ],
- [
- -1.085561,
- 50.714016
- ],
- [
- -1.082753,
- 50.713324
- ],
- [
- -1.062327,
- 50.692816
- ],
- [
- -1.062327,
- 50.685289
- ],
- [
- -1.066965,
- 50.685248
- ],
- [
- -1.069651,
- 50.683498
- ],
- [
- -1.071889,
- 50.680976
- ],
- [
- -1.075307,
- 50.678534
- ],
- [
- -1.112701,
- 50.671454
- ],
- [
- -1.128651,
- 50.666449
- ],
- [
- -1.156361,
- 50.650784
- ],
- [
- -1.162221,
- 50.645982
- ],
- [
- -1.164703,
- 50.640937
- ],
- [
- -1.164666,
- 50.639543
- ],
- [
- -1.426496,
- 50.639342
- ]
- ]
- ],
- [
- [
- [
- -7.240314,
- 55.050389
- ],
- [
- -7.013736,
- 55.1615
- ],
- [
- -6.958913,
- 55.20349
- ],
- [
- -6.571562,
- 55.268366
- ],
- [
- -6.509633,
- 55.31398
- ],
- [
- -6.226158,
- 55.344406
- ],
- [
- -6.07105,
- 55.25001
- ],
- [
- -5.712696,
- 55.017635
- ],
- [
- -5.242021,
- 54.415204
- ],
- [
- -5.695554,
- 54.14284
- ],
- [
- -5.72473,
- 54.07455
- ],
- [
- -6.041633,
- 54.006238
- ],
- [
- -6.153953,
- 54.054931
- ],
- [
- -6.220539,
- 54.098803
- ],
- [
- -6.242502,
- 54.099758
- ],
- [
- -6.263661,
- 54.104682
- ],
- [
- -6.269887,
- 54.097927
- ],
- [
- -6.28465,
- 54.105226
- ],
- [
- -6.299585,
- 54.104037
- ],
- [
- -6.313796,
- 54.099696
- ],
- [
- -6.327128,
- 54.097888
- ],
- [
- -6.338962,
- 54.102952
- ],
- [
- -6.346662,
- 54.109877
- ],
- [
- -6.354827,
- 54.110652
- ],
- [
- -6.368108,
- 54.097319
- ],
- [
- -6.369348,
- 54.091118
- ],
- [
- -6.367643,
- 54.083418
- ],
- [
- -6.366919,
- 54.075098
- ],
- [
- -6.371157,
- 54.066778
- ],
- [
- -6.377513,
- 54.063264
- ],
- [
- -6.401026,
- 54.060887
- ],
- [
- -6.426761,
- 54.05541
- ],
- [
- -6.433892,
- 54.055306
- ],
- [
- -6.4403,
- 54.057993
- ],
- [
- -6.446243,
- 54.062438
- ],
- [
- -6.450222,
- 54.066675
- ],
- [
- -6.450894,
- 54.068432
- ],
- [
- -6.47854,
- 54.067709
- ],
- [
- -6.564013,
- 54.04895
- ],
- [
- -6.571868,
- 54.049519
- ],
- [
- -6.587164,
- 54.053343
- ],
- [
- -6.595071,
- 54.052412
- ],
- [
- -6.60029,
- 54.04895
- ],
- [
- -6.605217,
- 54.044475
- ],
- [
- -6.610987,
- 54.039235
- ],
- [
- -6.616465,
- 54.037271
- ],
- [
- -6.630624,
- 54.041819
- ],
- [
- -6.657289,
- 54.061146
- ],
- [
- -6.672534,
- 54.068432
- ],
- [
- -6.657082,
- 54.091945
- ],
- [
- -6.655791,
- 54.103314
- ],
- [
- -6.666436,
- 54.114786
- ],
- [
- -6.643957,
- 54.131839
- ],
- [
- -6.634552,
- 54.150133
- ],
- [
- -6.640339,
- 54.168013
- ],
- [
- -6.648448,
- 54.173665
- ],
- [
- -6.663025,
- 54.183826
- ],
- [
- -6.683954,
- 54.194368
- ],
- [
- -6.694651,
- 54.197985
- ],
- [
- -6.706537,
- 54.198915
- ],
- [
- -6.717234,
- 54.195143
- ],
- [
- -6.724779,
- 54.188631
- ],
- [
- -6.73284,
- 54.183567
- ],
- [
- -6.744777,
- 54.184187
- ],
- [
- -6.766481,
- 54.192352
- ],
- [
- -6.787824,
- 54.202998
- ],
- [
- -6.807358,
- 54.21633
- ],
- [
- -6.823946,
- 54.23235
- ],
- [
- -6.829733,
- 54.242375
- ],
- [
- -6.833196,
- 54.25209
- ],
- [
- -6.837743,
- 54.260513
- ],
- [
- -6.846683,
- 54.266456
- ],
- [
- -6.882185,
- 54.277257
- ],
- [
- -6.864667,
- 54.282734
- ],
- [
- -6.856657,
- 54.292811
- ],
- [
- -6.858414,
- 54.307332
- ],
- [
- -6.870015,
- 54.326001
- ],
- [
- -6.879705,
- 54.341594
- ],
- [
- -6.885957,
- 54.345624
- ],
- [
- -6.897895,
- 54.346193
- ],
- [
- -6.905956,
- 54.349035
- ],
- [
- -6.915051,
- 54.365933
- ],
- [
- -6.922028,
- 54.372703
- ],
- [
- -6.984091,
- 54.403089
- ],
- [
- -7.017836,
- 54.413166
- ],
- [
- -7.049255,
- 54.411512
- ],
- [
- -7.078504,
- 54.394717
- ],
- [
- -7.127028,
- 54.349759
- ],
- [
- -7.159894,
- 54.335186
- ],
- [
- -7.168059,
- 54.335031
- ],
- [
- -7.185629,
- 54.336943
- ],
- [
- -7.18947,
- 54.335692
- ],
- [
- -7.19245,
- 54.334721
- ],
- [
- -7.193949,
- 54.329967
- ],
- [
- -7.191468,
- 54.323869
- ],
- [
- -7.187644,
- 54.318804
- ],
- [
- -7.185009,
- 54.317254
- ],
- [
- -7.184647,
- 54.316634
- ],
- [
- -7.192399,
- 54.307384
- ],
- [
- -7.193691,
- 54.307539
- ],
- [
- -7.199168,
- 54.303457
- ],
- [
- -7.206661,
- 54.304903
- ],
- [
- -7.211467,
- 54.30418
- ],
- [
- -7.209038,
- 54.293431
- ],
- [
- -7.1755,
- 54.283664
- ],
- [
- -7.181495,
- 54.269763
- ],
- [
- -7.14589,
- 54.25209
- ],
- [
- -7.159739,
- 54.24067
- ],
- [
- -7.153331,
- 54.224237
- ],
- [
- -7.174725,
- 54.216072
- ],
- [
- -7.229502,
- 54.207545
- ],
- [
- -7.240871,
- 54.202326
- ],
- [
- -7.249088,
- 54.197416
- ],
- [
- -7.255496,
- 54.190854
- ],
- [
- -7.261128,
- 54.18088
- ],
- [
- -7.256322,
- 54.176901
- ],
- [
- -7.247021,
- 54.17225
- ],
- [
- -7.24578,
- 54.166979
- ],
- [
- -7.265366,
- 54.16114
- ],
- [
- -7.26087,
- 54.151166
- ],
- [
- -7.263505,
- 54.140986
- ],
- [
- -7.27074,
- 54.132253
- ],
- [
- -7.280042,
- 54.126155
- ],
- [
- -7.293788,
- 54.122021
- ],
- [
- -7.297353,
- 54.125896
- ],
- [
- -7.29632,
- 54.134991
- ],
- [
- -7.296423,
- 54.146515
- ],
- [
- -7.295028,
- 54.155404
- ],
- [
- -7.292134,
- 54.162638
- ],
- [
- -7.295545,
- 54.165119
- ],
- [
- -7.325982,
- 54.154577
- ],
- [
- -7.333165,
- 54.149409
- ],
- [
- -7.333165,
- 54.142743
- ],
- [
- -7.310324,
- 54.114683
- ],
- [
- -7.316489,
- 54.11428
- ],
- [
- -7.326964,
- 54.113597
- ],
- [
- -7.375488,
- 54.123312
- ],
- [
- -7.390216,
- 54.121194
- ],
- [
- -7.39466,
- 54.121917
- ],
- [
- -7.396624,
- 54.126258
- ],
- [
- -7.403962,
- 54.135043
- ],
- [
- -7.41223,
- 54.136438
- ],
- [
- -7.422255,
- 54.135456
- ],
- [
- -7.425769,
- 54.136955
- ],
- [
- -7.414659,
- 54.145688
- ],
- [
- -7.439619,
- 54.146929
- ],
- [
- -7.480753,
- 54.127653
- ],
- [
- -7.502302,
- 54.125121
- ],
- [
- -7.609014,
- 54.139901
- ],
- [
- -7.620796,
- 54.144965
- ],
- [
- -7.624052,
- 54.153336
- ],
- [
- -7.625706,
- 54.162173
- ],
- [
- -7.632682,
- 54.168529
- ],
- [
- -7.70477,
- 54.200362
- ],
- [
- -7.722599,
- 54.202326
- ],
- [
- -7.782078,
- 54.2
- ],
- [
- -7.836959,
- 54.204341
- ],
- [
- -7.856441,
- 54.211421
- ],
- [
- -7.86967,
- 54.226872
- ],
- [
- -7.873649,
- 54.271055
- ],
- [
- -7.880264,
- 54.287023
- ],
- [
- -7.894966,
- 54.293586
- ],
- [
- -7.93411,
- 54.297049
- ],
- [
- -7.942075,
- 54.298873
- ],
- [
- -7.950802,
- 54.300873
- ],
- [
- -7.96801,
- 54.31219
- ],
- [
- -7.981033,
- 54.326556
- ],
- [
- -8.002194,
- 54.357923
- ],
- [
- -8.03134,
- 54.358027
- ],
- [
- -8.05648,
- 54.365882
- ],
- [
- -8.079941,
- 54.380196
- ],
- [
- -8.122419,
- 54.415233
- ],
- [
- -8.146346,
- 54.430736
- ],
- [
- -8.156035,
- 54.439055
- ],
- [
- -8.158128,
- 54.447117
- ],
- [
- -8.161177,
- 54.454817
- ],
- [
- -8.173837,
- 54.461741
- ],
- [
- -8.168467,
- 54.463477
- ],
- [
- -8.15017,
- 54.46939
- ],
- [
- -8.097046,
- 54.478588
- ],
- [
- -8.072448,
- 54.487063
- ],
- [
- -8.060976,
- 54.493316
- ],
- [
- -8.05586,
- 54.497553
- ],
- [
- -8.043561,
- 54.512229
- ],
- [
- -8.023278,
- 54.529696
- ],
- [
- -8.002194,
- 54.543442
- ],
- [
- -7.926411,
- 54.533055
- ],
- [
- -7.887137,
- 54.532125
- ],
- [
- -7.848844,
- 54.54091
- ],
- [
- -7.749264,
- 54.596152
- ],
- [
- -7.707871,
- 54.604162
- ],
- [
- -7.707944,
- 54.604708
- ],
- [
- -7.707951,
- 54.604763
- ],
- [
- -7.710558,
- 54.624264
- ],
- [
- -7.721204,
- 54.625866
- ],
- [
- -7.736758,
- 54.619251
- ],
- [
- -7.753553,
- 54.614497
- ],
- [
- -7.769159,
- 54.618011
- ],
- [
- -7.801199,
- 54.634806
- ],
- [
- -7.814996,
- 54.639457
- ],
- [
- -7.822541,
- 54.638113
- ],
- [
- -7.838044,
- 54.63124
- ],
- [
- -7.846416,
- 54.631447
- ],
- [
- -7.85427,
- 54.636408
- ],
- [
- -7.864347,
- 54.649069
- ],
- [
- -7.872771,
- 54.652221
- ],
- [
- -7.890082,
- 54.655063
- ],
- [
- -7.906619,
- 54.661316
- ],
- [
- -7.914835,
- 54.671651
- ],
- [
- -7.907135,
- 54.686689
- ],
- [
- -7.913233,
- 54.688653
- ],
- [
- -7.929666,
- 54.696714
- ],
- [
- -7.880109,
- 54.711029
- ],
- [
- -7.845899,
- 54.731027
- ],
- [
- -7.832153,
- 54.730614
- ],
- [
- -7.803576,
- 54.716145
- ],
- [
- -7.770503,
- 54.706016
- ],
- [
- -7.736603,
- 54.707463
- ],
- [
- -7.70229,
- 54.718883
- ],
- [
- -7.667512,
- 54.738779
- ],
- [
- -7.649683,
- 54.744877
- ],
- [
- -7.61537,
- 54.739347
- ],
- [
- -7.585398,
- 54.744722
- ],
- [
- -7.566639,
- 54.738675
- ],
- [
- -7.556149,
- 54.738365
- ],
- [
- -7.543075,
- 54.741673
- ],
- [
- -7.543023,
- 54.743791
- ],
- [
- -7.548398,
- 54.747202
- ],
- [
- -7.551705,
- 54.754695
- ],
- [
- -7.549741,
- 54.779603
- ],
- [
- -7.543385,
- 54.793091
- ],
- [
- -7.470831,
- 54.845284
- ],
- [
- -7.45507,
- 54.863009
- ],
- [
- -7.444735,
- 54.884455
- ],
- [
- -7.444735,
- 54.894893
- ],
- [
- -7.448972,
- 54.920318
- ],
- [
- -7.445251,
- 54.932152
- ],
- [
- -7.436983,
- 54.938301
- ],
- [
- -7.417139,
- 54.943056
- ],
- [
- -7.415755,
- 54.944372
- ],
- [
- -7.408665,
- 54.951117
- ],
- [
- -7.407424,
- 54.959437
- ],
- [
- -7.413109,
- 54.984965
- ],
- [
- -7.409078,
- 54.992045
- ],
- [
- -7.403755,
- 54.99313
- ],
- [
- -7.40112,
- 54.994836
- ],
- [
- -7.405254,
- 55.003569
- ],
- [
- -7.376987,
- 55.02889
- ],
- [
- -7.366962,
- 55.035557
- ],
- [
- -7.355024,
- 55.040931
- ],
- [
- -7.291152,
- 55.046615
- ],
- [
- -7.282987,
- 55.051835
- ],
- [
- -7.275288,
- 55.058863
- ],
- [
- -7.266503,
- 55.065167
- ],
- [
- -7.247097,
- 55.069328
- ],
- [
- -7.2471,
- 55.069322
- ],
- [
- -7.256744,
- 55.050686
- ],
- [
- -7.240956,
- 55.050279
- ],
- [
- -7.240314,
- 55.050389
- ]
- ]
- ],
- [
- [
- [
- -13.688588,
- 57.596259
- ],
- [
- -13.690419,
- 57.596259
- ],
- [
- -13.691314,
- 57.596503
- ],
- [
- -13.691314,
- 57.597154
- ],
- [
- -13.690419,
- 57.597805
- ],
- [
- -13.688588,
- 57.597805
- ],
- [
- -13.687652,
- 57.597154
- ],
- [
- -13.687652,
- 57.596869
- ],
- [
- -13.688588,
- 57.596259
- ]
- ]
- ],
- [
- [
- [
- -4.839121,
- 54.469789
- ],
- [
- -4.979941,
- 54.457977
- ],
- [
- -5.343644,
- 54.878637
- ],
- [
- -5.308469,
- 55.176452
- ],
- [
- -6.272566,
- 55.418443
- ],
- [
- -8.690528,
- 57.833706
- ],
- [
- -6.344705,
- 59.061083
- ],
- [
- -4.204785,
- 58.63305
- ],
- [
- -2.31566,
- 60.699068
- ],
- [
- -1.695335,
- 60.76432
- ],
- [
- -1.58092,
- 60.866001
- ],
- [
- -0.17022,
- 60.897204
- ],
- [
- -0.800508,
- 59.770037
- ],
- [
- -1.292368,
- 57.732574
- ],
- [
- -1.850077,
- 55.766368
- ],
- [
- -1.73054,
- 55.782219
- ],
- [
- 1.892395,
- 52.815229
- ],
- [
- 1.742775,
- 51.364209
- ],
- [
- 1.080173,
- 50.847526
- ],
- [
- 0.000774,
- 50.664982
- ],
- [
- -0.162997,
- 50.752401
- ],
- [
- -0.725152,
- 50.731879
- ],
- [
- -0.768853,
- 50.741516
- ],
- [
- -0.770985,
- 50.736884
- ],
- [
- -0.789947,
- 50.730048
- ],
- [
- -0.812815,
- 50.734768
- ],
- [
- -0.877742,
- 50.761156
- ],
- [
- -0.942879,
- 50.758338
- ],
- [
- -0.992581,
- 50.737379
- ],
- [
- -1.18513,
- 50.766989
- ],
- [
- -1.282741,
- 50.792353
- ],
- [
- -1.375004,
- 50.772063
- ],
- [
- -1.523427,
- 50.719605
- ],
- [
- -1.630649,
- 50.695128
- ],
- [
- -1.663617,
- 50.670508
- ],
- [
- -1.498021,
- 50.40831
- ],
- [
- -4.097427,
- 49.735486
- ],
- [
- -6.825199,
- 49.700905
- ],
- [
- -5.541541,
- 51.446591
- ],
- [
- -6.03361,
- 51.732369
- ],
- [
- -4.791746,
- 52.635365
- ],
- [
- -4.969244,
- 52.637413
- ],
- [
- -5.049473,
- 53.131209
- ],
- [
- -4.787393,
- 53.409491
- ],
- [
- -4.734148,
- 53.424866
- ],
- [
- -4.917096,
- 53.508212
- ],
- [
- -4.839121,
- 54.469789
- ]
- ]
- ]
- ]
- }
- },
- {
- "type": "Feature",
- "properties": {
- "id": 0
- },
- "geometry": {
- "type": "MultiPolygon",
- "coordinates": [
- [
- [
- [
- -157.018938,
- 19.300864
- ],
- [
- -179.437336,
- 27.295312
- ],
- [
- -179.480084,
- 28.991459
- ],
- [
- -168.707465,
- 26.30325
- ],
- [
- -163.107414,
- 24.60499
- ],
- [
- -153.841679,
- 20.079306
- ],
- [
- -154.233846,
- 19.433391
- ],
- [
- -153.61725,
- 18.900587
- ],
- [
- -154.429471,
- 18.171036
- ],
- [
- -156.780638,
- 18.718492
- ],
- [
- -157.018938,
- 19.300864
- ]
- ]
- ],
- [
- [
- [
- -78.91269,
- 43.037032
- ],
- [
- -78.964351,
- 42.976393
- ],
- [
- -78.981718,
- 42.979043
- ],
- [
- -78.998055,
- 42.991111
- ],
- [
- -79.01189,
- 43.004358
- ],
- [
- -79.022046,
- 43.010539
- ],
- [
- -79.023076,
- 43.017015
- ],
- [
- -79.00983,
- 43.050867
- ],
- [
- -79.011449,
- 43.065291
- ],
- [
- -78.993051,
- 43.066174
- ],
- [
- -78.975536,
- 43.069707
- ],
- [
- -78.958905,
- 43.070884
- ],
- [
- -78.943304,
- 43.065291
- ],
- [
- -78.917399,
- 43.058521
- ],
- [
- -78.908569,
- 43.049396
- ],
- [
- -78.91269,
- 43.037032
- ]
- ]
- ],
- [
- [
- [
- -123.03529,
- 48.992515
- ],
- [
- -123.035308,
- 48.992499
- ],
- [
- -123.045277,
- 48.984361
- ],
- [
- -123.08849,
- 48.972235
- ],
- [
- -123.089345,
- 48.987982
- ],
- [
- -123.090484,
- 48.992499
- ],
- [
- -123.090488,
- 48.992515
- ],
- [
- -123.035306,
- 48.992515
- ],
- [
- -123.03529,
- 48.992515
- ]
- ]
- ],
- [
- [
- [
- -103.837038,
- 29.279906
- ],
- [
- -103.864121,
- 29.281366
- ],
- [
- -103.928122,
- 29.293019
- ],
- [
- -104.01915,
- 29.32033
- ],
- [
- -104.057313,
- 29.339037
- ],
- [
- -104.105424,
- 29.385675
- ],
- [
- -104.139789,
- 29.400584
- ],
- [
- -104.161648,
- 29.416759
- ],
- [
- -104.194514,
- 29.448927
- ],
- [
- -104.212291,
- 29.484661
- ],
- [
- -104.218698,
- 29.489829
- ],
- [
- -104.227148,
- 29.493033
- ],
- [
- -104.251022,
- 29.508588
- ],
- [
- -104.267171,
- 29.526571
- ],
- [
- -104.292751,
- 29.532824
- ],
- [
- -104.320604,
- 29.532255
- ],
- [
- -104.338484,
- 29.524013
- ],
- [
- -104.349026,
- 29.537578
- ],
- [
- -104.430443,
- 29.582795
- ],
- [
- -104.437832,
- 29.58543
- ],
- [
- -104.444008,
- 29.589203
- ],
- [
- -104.448555,
- 29.597678
- ],
- [
- -104.452069,
- 29.607109
- ],
- [
- -104.455222,
- 29.613387
- ],
- [
- -104.469381,
- 29.625402
- ],
- [
- -104.516639,
- 29.654315
- ],
- [
- -104.530824,
- 29.667906
- ],
- [
- -104.535036,
- 29.677802
- ],
- [
- -104.535191,
- 29.687853
- ],
- [
- -104.537103,
- 29.702116
- ],
- [
- -104.543666,
- 29.71643
- ],
- [
- -104.561391,
- 29.745421
- ],
- [
- -104.570279,
- 29.787511
- ],
- [
- -104.583586,
- 29.802575
- ],
- [
- -104.601207,
- 29.81477
- ],
- [
- -104.619682,
- 29.833064
- ],
- [
- -104.623764,
- 29.841487
- ],
- [
- -104.637588,
- 29.887996
- ],
- [
- -104.656346,
- 29.908201
- ],
- [
- -104.660635,
- 29.918433
- ],
- [
- -104.663478,
- 29.923084
- ],
- [
- -104.676526,
- 29.93683
- ],
- [
- -104.680479,
- 29.942308
- ],
- [
- -104.682469,
- 29.952126
- ],
- [
- -104.680117,
- 29.967784
- ],
- [
- -104.680479,
- 29.976466
- ],
- [
- -104.699108,
- 30.03145
- ],
- [
- -104.701589,
- 30.055324
- ],
- [
- -104.698592,
- 30.075271
- ],
- [
- -104.684639,
- 30.111135
- ],
- [
- -104.680479,
- 30.134131
- ],
- [
- -104.67867,
- 30.170356
- ],
- [
- -104.681564,
- 30.192939
- ],
- [
- -104.695853,
- 30.208441
- ],
- [
- -104.715231,
- 30.243995
- ],
- [
- -104.724585,
- 30.252211
- ],
- [
- -104.742155,
- 30.25986
- ],
- [
- -104.74939,
- 30.264459
- ],
- [
- -104.761689,
- 30.284199
- ],
- [
- -104.774143,
- 30.311588
- ],
- [
- -104.788767,
- 30.335927
- ],
- [
- -104.807732,
- 30.346418
- ],
- [
- -104.8129,
- 30.350707
- ],
- [
- -104.814967,
- 30.360577
- ],
- [
- -104.816001,
- 30.371997
- ],
- [
- -104.818274,
- 30.380524
- ],
- [
- -104.824269,
- 30.38719
- ],
- [
- -104.83755,
- 30.394063
- ],
- [
- -104.844939,
- 30.40104
- ],
- [
- -104.853259,
- 30.41215
- ],
- [
- -104.855016,
- 30.417473
- ],
- [
- -104.853621,
- 30.423984
- ],
- [
- -104.852432,
- 30.438867
- ],
- [
- -104.854655,
- 30.448737
- ],
- [
- -104.864473,
- 30.462018
- ],
- [
- -104.866695,
- 30.473025
- ],
- [
- -104.865248,
- 30.479898
- ],
- [
- -104.859615,
- 30.491112
- ],
- [
- -104.859254,
- 30.497261
- ],
- [
- -104.863026,
- 30.502377
- ],
- [
- -104.879718,
- 30.510852
- ],
- [
- -104.882146,
- 30.520929
- ],
- [
- -104.884007,
- 30.541858
- ],
- [
- -104.886591,
- 30.551883
- ],
- [
- -104.898166,
- 30.569401
- ],
- [
- -104.928242,
- 30.599529
- ],
- [
- -104.93434,
- 30.610536
- ],
- [
- -104.941057,
- 30.61405
- ],
- [
- -104.972735,
- 30.618029
- ],
- [
- -104.98276,
- 30.620716
- ],
- [
- -104.989117,
- 30.629553
- ],
- [
- -104.991649,
- 30.640301
- ],
- [
- -104.992941,
- 30.651464
- ],
- [
- -104.995783,
- 30.661747
- ],
- [
- -105.008495,
- 30.676992
- ],
- [
- -105.027977,
- 30.690117
- ],
- [
- -105.049475,
- 30.699264
- ],
- [
- -105.06813,
- 30.702675
- ],
- [
- -105.087043,
- 30.709806
- ],
- [
- -105.133604,
- 30.757917
- ],
- [
- -105.140425,
- 30.750476
- ],
- [
- -105.153241,
- 30.763188
- ],
- [
- -105.157788,
- 30.76572
- ],
- [
- -105.160889,
- 30.764118
- ],
- [
- -105.162698,
- 30.774919
- ],
- [
- -105.167297,
- 30.781171
- ],
- [
- -105.17479,
- 30.783962
- ],
- [
- -105.185125,
- 30.784634
- ],
- [
- -105.195306,
- 30.787941
- ],
- [
- -105.204917,
- 30.80241
- ],
- [
- -105.2121,
- 30.805718
- ],
- [
- -105.21825,
- 30.806803
- ],
- [
- -105.229257,
- 30.810214
- ],
- [
- -105.232874,
- 30.809128
- ],
- [
- -105.239851,
- 30.801532
- ],
- [
- -105.243985,
- 30.799103
- ],
- [
- -105.249049,
- 30.798845
- ],
- [
- -105.259488,
- 30.802979
- ],
- [
- -105.265844,
- 30.808405
- ],
- [
- -105.270753,
- 30.814348
- ],
- [
- -105.277006,
- 30.819412
- ],
- [
- -105.334315,
- 30.843803
- ],
- [
- -105.363771,
- 30.850366
- ],
- [
- -105.376173,
- 30.859565
- ],
- [
- -105.41555,
- 30.902456
- ],
- [
- -105.496682,
- 30.95651
- ],
- [
- -105.530789,
- 30.991701
- ],
- [
- -105.555955,
- 31.002605
- ],
- [
- -105.565722,
- 31.016661
- ],
- [
- -105.578641,
- 31.052163
- ],
- [
- -105.59094,
- 31.071438
- ],
- [
- -105.605875,
- 31.081928
- ],
- [
- -105.623496,
- 31.090351
- ],
- [
- -105.643805,
- 31.103684
- ],
- [
- -105.668042,
- 31.127869
- ],
- [
- -105.675225,
- 31.131951
- ],
- [
- -105.692278,
- 31.137635
- ],
- [
- -105.76819,
- 31.18001
- ],
- [
- -105.777854,
- 31.192722
- ],
- [
- -105.78483,
- 31.211016
- ],
- [
- -105.861983,
- 31.288376
- ],
- [
- -105.880147,
- 31.300881
- ],
- [
- -105.896994,
- 31.305997
- ],
- [
- -105.897149,
- 31.309511
- ],
- [
- -105.908802,
- 31.317004
- ],
- [
- -105.928052,
- 31.326461
- ],
- [
- -105.934563,
- 31.335504
- ],
- [
- -105.941772,
- 31.352351
- ],
- [
- -105.948515,
- 31.361239
- ],
- [
- -105.961202,
- 31.371006
- ],
- [
- -106.004739,
- 31.396948
- ],
- [
- -106.021147,
- 31.402167
- ],
- [
- -106.046261,
- 31.404648
- ],
- [
- -106.065304,
- 31.410952
- ],
- [
- -106.099385,
- 31.428884
- ],
- [
- -106.141113,
- 31.439167
- ],
- [
- -106.164316,
- 31.447797
- ],
- [
- -106.174471,
- 31.460251
- ],
- [
- -106.209249,
- 31.477305
- ],
- [
- -106.215424,
- 31.483919
- ],
- [
- -106.21744,
- 31.488725
- ],
- [
- -106.218731,
- 31.494616
- ],
- [
- -106.222891,
- 31.50459
- ],
- [
- -106.232658,
- 31.519938
- ],
- [
- -106.274749,
- 31.562622
- ],
- [
- -106.286298,
- 31.580141
- ],
- [
- -106.312292,
- 31.648612
- ],
- [
- -106.331309,
- 31.68215
- ],
- [
- -106.35849,
- 31.717548
- ],
- [
- -106.39177,
- 31.745919
- ],
- [
- -106.428951,
- 31.758476
- ],
- [
- -106.473135,
- 31.755065
- ],
- [
- -106.492797,
- 31.759044
- ],
- [
- -106.501425,
- 31.766344
- ],
- [
- -106.506052,
- 31.770258
- ],
- [
- -106.517189,
- 31.773824
- ],
- [
- -106.558969,
- 31.773876
- ],
- [
- -106.584859,
- 31.773927
- ],
- [
- -106.610697,
- 31.773979
- ],
- [
- -106.636587,
- 31.774082
- ],
- [
- -106.662477,
- 31.774134
- ],
- [
- -106.688315,
- 31.774237
- ],
- [
- -106.714205,
- 31.774237
- ],
- [
- -106.740095,
- 31.774289
- ],
- [
- -106.765933,
- 31.774392
- ],
- [
- -106.791823,
- 31.774444
- ],
- [
- -106.817713,
- 31.774496
- ],
- [
- -106.843603,
- 31.774547
- ],
- [
- -106.869441,
- 31.774599
- ],
- [
- -106.895331,
- 31.774702
- ],
- [
- -106.921221,
- 31.774702
- ],
- [
- -106.947111,
- 31.774754
- ],
- [
- -106.973001,
- 31.774857
- ],
- [
- -106.998891,
- 31.774909
- ],
- [
- -107.02478,
- 31.774961
- ],
- [
- -107.05067,
- 31.775013
- ],
- [
- -107.076509,
- 31.775064
- ],
- [
- -107.102398,
- 31.775168
- ],
- [
- -107.128288,
- 31.775168
- ],
- [
- -107.154127,
- 31.775219
- ],
- [
- -107.180016,
- 31.775374
- ],
- [
- -107.205906,
- 31.775374
- ],
- [
- -107.231796,
- 31.775426
- ],
- [
- -107.257634,
- 31.775478
- ],
- [
- -107.283524,
- 31.775529
- ],
- [
- -107.309414,
- 31.775633
- ],
- [
- -107.335252,
- 31.775684
- ],
- [
- -107.361142,
- 31.775788
- ],
- [
- -107.387032,
- 31.775788
- ],
- [
- -107.412896,
- 31.775839
- ],
- [
- -107.438786,
- 31.775943
- ],
- [
- -107.464676,
- 31.775994
- ],
- [
- -107.490566,
- 31.776098
- ],
- [
- -107.516404,
- 31.776149
- ],
- [
- -107.542294,
- 31.776201
- ],
- [
- -107.568184,
- 31.776253
- ],
- [
- -107.594074,
- 31.776304
- ],
- [
- -107.619964,
- 31.776408
- ],
- [
- -107.645854,
- 31.776459
- ],
- [
- -107.671744,
- 31.776459
- ],
- [
- -107.697633,
- 31.776563
- ],
- [
- -107.723472,
- 31.776614
- ],
- [
- -107.749362,
- 31.776666
- ],
- [
- -107.775251,
- 31.776718
- ],
- [
- -107.801141,
- 31.77677
- ],
- [
- -107.82698,
- 31.776873
- ],
- [
- -107.852869,
- 31.776925
- ],
- [
- -107.878759,
- 31.776925
- ],
- [
- -107.904598,
- 31.777028
- ],
- [
- -107.930487,
- 31.77708
- ],
- [
- -107.956377,
- 31.777131
- ],
- [
- -107.982216,
- 31.777183
- ],
- [
- -108.008105,
- 31.777235
- ],
- [
- -108.033995,
- 31.777338
- ],
- [
- -108.059885,
- 31.77739
- ],
- [
- -108.085723,
- 31.77739
- ],
- [
- -108.111613,
- 31.777545
- ],
- [
- -108.137503,
- 31.777545
- ],
- [
- -108.163341,
- 31.777648
- ],
- [
- -108.189283,
- 31.7777
- ],
- [
- -108.215121,
- 31.777751
- ],
- [
- -108.215121,
- 31.770723
- ],
- [
- -108.215121,
- 31.763695
- ],
- [
- -108.215121,
- 31.756667
- ],
- [
- -108.215121,
- 31.749639
- ],
- [
- -108.215121,
- 31.74256
- ],
- [
- -108.215121,
- 31.735583
- ],
- [
- -108.215121,
- 31.728555
- ],
- [
- -108.215121,
- 31.721476
- ],
- [
- -108.215121,
- 31.714396
- ],
- [
- -108.215121,
- 31.70742
- ],
- [
- -108.215121,
- 31.700392
- ],
- [
- -108.215121,
- 31.693312
- ],
- [
- -108.215121,
- 31.686284
- ],
- [
- -108.215121,
- 31.679256
- ],
- [
- -108.215121,
- 31.672176
- ],
- [
- -108.21507,
- 31.665148
- ],
- [
- -108.215018,
- 31.658172
- ],
- [
- -108.215018,
- 31.651092
- ],
- [
- -108.215018,
- 31.644064
- ],
- [
- -108.215018,
- 31.637036
- ],
- [
- -108.215018,
- 31.630008
- ],
- [
- -108.215018,
- 31.62298
- ],
- [
- -108.215018,
- 31.615952
- ],
- [
- -108.215018,
- 31.608873
- ],
- [
- -108.215018,
- 31.601845
- ],
- [
- -108.215018,
- 31.594817
- ],
- [
- -108.215018,
- 31.587789
- ],
- [
- -108.215018,
- 31.580761
- ],
- [
- -108.215018,
- 31.573733
- ],
- [
- -108.215018,
- 31.566653
- ],
- [
- -108.215018,
- 31.559625
- ],
- [
- -108.214966,
- 31.552597
- ],
- [
- -108.214966,
- 31.545569
- ],
- [
- -108.214966,
- 31.538489
- ],
- [
- -108.214966,
- 31.531461
- ],
- [
- -108.214966,
- 31.524485
- ],
- [
- -108.214966,
- 31.517405
- ],
- [
- -108.214966,
- 31.510378
- ],
- [
- -108.214966,
- 31.503401
- ],
- [
- -108.214966,
- 31.496322
- ],
- [
- -108.214966,
- 31.489242
- ],
- [
- -108.214966,
- 31.482214
- ],
- [
- -108.214966,
- 31.475238
- ],
- [
- -108.214966,
- 31.468158
- ],
- [
- -108.214966,
- 31.46113
- ],
- [
- -108.214966,
- 31.454102
- ],
- [
- -108.214966,
- 31.447074
- ],
- [
- -108.214915,
- 31.440046
- ],
- [
- -108.214863,
- 31.432966
- ],
- [
- -108.214863,
- 31.425938
- ],
- [
- -108.214863,
- 31.41891
- ],
- [
- -108.214863,
- 31.411882
- ],
- [
- -108.214863,
- 31.404803
- ],
- [
- -108.214863,
- 31.397826
- ],
- [
- -108.214863,
- 31.390798
- ],
- [
- -108.214863,
- 31.383719
- ],
- [
- -108.214863,
- 31.376639
- ],
- [
- -108.214863,
- 31.369663
- ],
- [
- -108.214863,
- 31.362635
- ],
- [
- -108.214863,
- 31.355555
- ],
- [
- -108.214863,
- 31.348527
- ],
- [
- -108.214863,
- 31.341551
- ],
- [
- -108.214863,
- 31.334471
- ],
- [
- -108.214811,
- 31.327443
- ],
- [
- -108.257573,
- 31.327391
- ],
- [
- -108.300336,
- 31.327391
- ],
- [
- -108.34302,
- 31.327391
- ],
- [
- -108.385731,
- 31.327391
- ],
- [
- -108.428442,
- 31.327391
- ],
- [
- -108.471152,
- 31.327391
- ],
- [
- -108.513837,
- 31.327391
- ],
- [
- -108.556547,
- 31.327391
- ],
- [
- -108.59931,
- 31.327391
- ],
- [
- -108.64202,
- 31.327391
- ],
- [
- -108.684757,
- 31.327391
- ],
- [
- -108.727467,
- 31.327391
- ],
- [
- -108.770178,
- 31.327391
- ],
- [
- -108.812914,
- 31.327391
- ],
- [
- -108.855625,
- 31.327391
- ],
- [
- -108.898335,
- 31.327391
- ],
- [
- -108.941046,
- 31.327391
- ],
- [
- -108.968282,
- 31.327391
- ],
- [
- -108.983731,
- 31.327391
- ],
- [
- -109.026493,
- 31.327391
- ],
- [
- -109.04743,
- 31.327391
- ],
- [
- -109.069203,
- 31.327391
- ],
- [
- -109.111914,
- 31.327391
- ],
- [
- -109.154599,
- 31.327391
- ],
- [
- -109.197361,
- 31.327391
- ],
- [
- -109.240072,
- 31.32734
- ],
- [
- -109.282782,
- 31.32734
- ],
- [
- -109.325519,
- 31.32734
- ],
- [
- -109.368229,
- 31.32734
- ],
- [
- -109.410914,
- 31.32734
- ],
- [
- -109.45365,
- 31.32734
- ],
- [
- -109.496387,
- 31.32734
- ],
- [
- -109.539071,
- 31.32734
- ],
- [
- -109.581808,
- 31.32734
- ],
- [
- -109.624493,
- 31.32734
- ],
- [
- -109.667177,
- 31.32734
- ],
- [
- -109.709965,
- 31.32734
- ],
- [
- -109.75265,
- 31.32734
- ],
- [
- -109.795335,
- 31.32734
- ],
- [
- -109.838123,
- 31.32734
- ],
- [
- -109.880808,
- 31.32734
- ],
- [
- -109.923596,
- 31.327288
- ],
- [
- -109.96628,
- 31.327236
- ],
- [
- -110.008965,
- 31.327236
- ],
- [
- -110.051702,
- 31.327236
- ],
- [
- -110.094386,
- 31.327236
- ],
- [
- -110.137071,
- 31.327236
- ],
- [
- -110.179807,
- 31.327236
- ],
- [
- -110.222544,
- 31.327236
- ],
- [
- -110.265229,
- 31.327236
- ],
- [
- -110.308017,
- 31.327236
- ],
- [
- -110.350753,
- 31.327236
- ],
- [
- -110.39349,
- 31.327236
- ],
- [
- -110.436174,
- 31.327236
- ],
- [
- -110.478859,
- 31.327236
- ],
- [
- -110.521595,
- 31.327236
- ],
- [
- -110.56428,
- 31.327236
- ],
- [
- -110.606965,
- 31.327236
- ],
- [
- -110.649727,
- 31.327236
- ],
- [
- -110.692438,
- 31.327236
- ],
- [
- -110.7352,
- 31.327236
- ],
- [
- -110.777885,
- 31.327236
- ],
- [
- -110.820595,
- 31.327236
- ],
- [
- -110.863358,
- 31.327236
- ],
- [
- -110.906068,
- 31.327236
- ],
- [
- -110.948753,
- 31.327185
- ],
- [
- -111.006269,
- 31.327185
- ],
- [
- -111.067118,
- 31.333644
- ],
- [
- -111.094455,
- 31.342532
- ],
- [
- -111.145924,
- 31.359069
- ],
- [
- -111.197446,
- 31.375554
- ],
- [
- -111.248864,
- 31.392142
- ],
- [
- -111.300333,
- 31.40873
- ],
- [
- -111.351803,
- 31.425318
- ],
- [
- -111.403299,
- 31.441855
- ],
- [
- -111.454768,
- 31.458339
- ],
- [
- -111.506238,
- 31.474979
- ],
- [
- -111.915464,
- 31.601431
- ],
- [
- -112.324715,
- 31.727987
- ],
- [
- -112.733967,
- 31.854543
- ],
- [
- -113.143218,
- 31.981046
- ],
- [
- -113.552444,
- 32.107602
- ],
- [
- -113.961696,
- 32.234132
- ],
- [
- -114.370921,
- 32.360687
- ],
- [
- -114.780147,
- 32.487243
- ],
- [
- -114.816785,
- 32.498534
- ],
- [
- -114.819373,
- 32.499363
- ],
- [
- -114.822108,
- 32.50024
- ],
- [
- -114.809447,
- 32.511324
- ],
- [
- -114.795546,
- 32.552226
- ],
- [
- -114.794203,
- 32.574111
- ],
- [
- -114.802678,
- 32.594497
- ],
- [
- -114.786813,
- 32.621033
- ],
- [
- -114.781542,
- 32.628061
- ],
- [
- -114.758804,
- 32.64483
- ],
- [
- -114.751156,
- 32.65222
- ],
- [
- -114.739477,
- 32.669066
- ],
- [
- -114.731209,
- 32.686636
- ],
- [
- -114.723871,
- 32.711519
- ],
- [
- -114.724284,
- 32.712835
- ],
- [
- -114.724285,
- 32.712836
- ],
- [
- -114.764541,
- 32.709839
- ],
- [
- -114.838076,
- 32.704206
- ],
- [
- -114.911612,
- 32.698703
- ],
- [
- -114.985199,
- 32.693122
- ],
- [
- -115.058734,
- 32.687567
- ],
- [
- -115.13227,
- 32.681986
- ],
- [
- -115.205806,
- 32.676456
- ],
- [
- -115.27929,
- 32.670823
- ],
- [
- -115.352851,
- 32.665346
- ],
- [
- -115.426386,
- 32.659765
- ],
- [
- -115.499922,
- 32.654209
- ],
- [
- -115.573535,
- 32.648654
- ],
- [
- -115.647019,
- 32.643073
- ],
- [
- -115.720529,
- 32.637518
- ],
- [
- -115.794064,
- 32.631963
- ],
- [
- -115.8676,
- 32.626408
- ],
- [
- -115.941213,
- 32.620827
- ],
- [
- -116.014748,
- 32.615271
- ],
- [
- -116.088232,
- 32.609664
- ],
- [
- -116.161742,
- 32.604161
- ],
- [
- -116.235329,
- 32.598554
- ],
- [
- -116.308891,
- 32.593025
- ],
- [
- -116.382426,
- 32.587469
- ],
- [
- -116.455962,
- 32.581888
- ],
- [
- -116.529472,
- 32.576333
- ],
- [
- -116.603007,
- 32.570804
- ],
- [
- -116.676543,
- 32.565223
- ],
- [
- -116.750104,
- 32.559667
- ],
- [
- -116.82364,
- 32.554086
- ],
- [
- -116.897201,
- 32.548531
- ],
- [
- -116.970737,
- 32.542976
- ],
- [
- -117.044221,
- 32.537421
- ],
- [
- -117.125121,
- 32.531669
- ],
- [
- -117.125969,
- 32.538258
- ],
- [
- -117.239623,
- 32.531308
- ],
- [
- -120.274098,
- 32.884264
- ],
- [
- -121.652736,
- 34.467248
- ],
- [
- -124.367265,
- 37.662798
- ],
- [
- -126.739806,
- 41.37928
- ],
- [
- -126.996297,
- 45.773888
- ],
- [
- -124.770704,
- 48.44258
- ],
- [
- -123.734053,
- 48.241906
- ],
- [
- -123.1663,
- 48.27837
- ],
- [
- -123.193018,
- 48.501035
- ],
- [
- -123.176987,
- 48.65482
- ],
- [
- -122.912481,
- 48.753561
- ],
- [
- -122.899122,
- 48.897797
- ],
- [
- -122.837671,
- 48.97502
- ],
- [
- -122.743986,
- 48.980582
- ],
- [
- -122.753,
- 48.992499
- ],
- [
- -122.753012,
- 48.992515
- ],
- [
- -122.653258,
- 48.992515
- ],
- [
- -122.433375,
- 48.992515
- ],
- [
- -122.213517,
- 48.992515
- ],
- [
- -121.993763,
- 48.992515
- ],
- [
- -121.773958,
- 48.992515
- ],
- [
- -121.554152,
- 48.992515
- ],
- [
- -121.33432,
- 48.992515
- ],
- [
- -121.114515,
- 48.992515
- ],
- [
- -95.396937,
- 48.99267
- ],
- [
- -95.177106,
- 48.99267
- ],
- [
- -95.168527,
- 48.995047
- ],
- [
- -95.161887,
- 49.001145
- ],
- [
- -95.159329,
- 49.01179
- ],
- [
- -95.159665,
- 49.10951
- ],
- [
- -95.160027,
- 49.223353
- ],
- [
- -95.160337,
- 49.313012
- ],
- [
- -95.160569,
- 49.369494
- ],
- [
- -95.102821,
- 49.35394
- ],
- [
- -94.982518,
- 49.356162
- ],
- [
- -94.926087,
- 49.345568
- ],
- [
- -94.856195,
- 49.318283
- ],
- [
- -94.839142,
- 49.308878
- ],
- [
- -94.827256,
- 49.292858
- ],
- [
- -94.819892,
- 49.252034
- ],
- [
- -94.810358,
- 49.229606
- ],
- [
- -94.806121,
- 49.210899
- ],
- [
- -94.811185,
- 49.166561
- ],
- [
- -94.803743,
- 49.146407
- ],
- [
- -94.792039,
- 49.12646
- ],
- [
- -94.753772,
- 49.026156
- ],
- [
- -94.711217,
- 48.914586
- ],
- [
- -94.711734,
- 48.862755
- ],
- [
- -94.712147,
- 48.842446
- ],
- [
- -94.713284,
- 48.823843
- ],
- [
- -94.710907,
- 48.807513
- ],
- [
- -94.701786,
- 48.790098
- ],
- [
- -94.688893,
- 48.778832
- ],
- [
- -94.592852,
- 48.726433
- ],
- [
- -94.519161,
- 48.70447
- ],
- [
- -94.4795,
- 48.700698
- ],
- [
- -94.311577,
- 48.713927
- ],
- [
- -94.292586,
- 48.711912
- ],
- [
- -94.284034,
- 48.709069
- ],
- [
- -94.274499,
- 48.704108
- ],
- [
- -94.265482,
- 48.697752
- ],
- [
- -94.258454,
- 48.690828
- ],
- [
- -94.255767,
- 48.683541
- ],
- [
- -94.252459,
- 48.662405
- ],
- [
- -94.251038,
- 48.65729
- ],
- [
- -94.23215,
- 48.652019
- ],
- [
- -94.03485,
- 48.643311
- ],
- [
- -93.874885,
- 48.636206
- ],
- [
- -93.835741,
- 48.617137
- ],
- [
- -93.809386,
- 48.543576
- ],
- [
- -93.778664,
- 48.519468
- ],
- [
- -93.756779,
- 48.516549
- ],
- [
- -93.616297,
- 48.531302
- ],
- [
- -93.599889,
- 48.526341
- ],
- [
- -93.566584,
- 48.538279
- ],
- [
- -93.491756,
- 48.542309
- ],
- [
- -93.459924,
- 48.557399
- ],
- [
- -93.45225,
- 48.572721
- ],
- [
- -93.453774,
- 48.586958
- ],
- [
- -93.451475,
- 48.597422
- ],
- [
- -93.417316,
- 48.604114
- ],
- [
- -93.385716,
- 48.614863
- ],
- [
- -93.25774,
- 48.630314
- ],
- [
- -93.131701,
- 48.62463
- ],
- [
- -92.97972,
- 48.61768
- ],
- [
- -92.955588,
- 48.612228
- ],
- [
- -92.884197,
- 48.579878
- ],
- [
- -92.72555,
- 48.548692
- ],
- [
- -92.648604,
- 48.536263
- ],
- [
- -92.630181,
- 48.519468
- ],
- [
- -92.627468,
- 48.502777
- ],
- [
- -92.646743,
- 48.497428
- ],
- [
- -92.691366,
- 48.489858
- ],
- [
- -92.710641,
- 48.482882
- ],
- [
- -92.718909,
- 48.459782
- ],
- [
- -92.704052,
- 48.445158
- ],
- [
- -92.677129,
- 48.441747
- ],
- [
- -92.657053,
- 48.438233
- ],
- [
- -92.570521,
- 48.446656
- ],
- [
- -92.526932,
- 48.445623
- ],
- [
- -92.490629,
- 48.433117
- ],
- [
- -92.474532,
- 48.410483
- ],
- [
- -92.467581,
- 48.394282
- ],
- [
- -92.467064,
- 48.353225
- ],
- [
- -92.462465,
- 48.329299
- ],
- [
- -92.451381,
- 48.312685
- ],
- [
- -92.41823,
- 48.282041
- ],
- [
- -92.38464,
- 48.232406
- ],
- [
- -92.371851,
- 48.222587
- ],
- [
- -92.353815,
- 48.222897
- ],
- [
- -92.327874,
- 48.229435
- ],
- [
- -92.303663,
- 48.239279
- ],
- [
- -92.291029,
- 48.249562
- ],
- [
- -92.292062,
- 48.270336
- ],
- [
- -92.301416,
- 48.290645
- ],
- [
- -92.303095,
- 48.310928
- ],
- [
- -92.281598,
- 48.33178
- ],
- [
- -92.259118,
- 48.339635
- ],
- [
- -92.154732,
- 48.350125
- ],
- [
- -92.070499,
- 48.346714
- ],
- [
- -92.043421,
- 48.334596
- ],
- [
- -92.030114,
- 48.313176
- ],
- [
- -92.021355,
- 48.287441
- ],
- [
- -92.007997,
- 48.262482
- ],
- [
- -91.992158,
- 48.247909
- ],
- [
- -91.975492,
- 48.236566
- ],
- [
- -91.957302,
- 48.228323
- ],
- [
- -91.852244,
- 48.195974
- ],
- [
- -91.764988,
- 48.187344
- ],
- [
- -91.744137,
- 48.179593
- ],
- [
- -91.727575,
- 48.168327
- ],
- [
- -91.695509,
- 48.13758
- ],
- [
- -91.716438,
- 48.112051
- ],
- [
- -91.692512,
- 48.097866
- ],
- [
- -91.618615,
- 48.089572
- ],
- [
- -91.597479,
- 48.090399
- ],
- [
- -91.589676,
- 48.088332
- ],
- [
- -91.581098,
- 48.080942
- ],
- [
- -91.579806,
- 48.070969
- ],
- [
- -91.585129,
- 48.06084
- ],
- [
- -91.586989,
- 48.052572
- ],
- [
- -91.574845,
- 48.048205
- ],
- [
- -91.487098,
- 48.053476
- ],
- [
- -91.464722,
- 48.048955
- ],
- [
- -91.446274,
- 48.040738
- ],
- [
- -91.427929,
- 48.036449
- ],
- [
- -91.3654,
- 48.057843
- ],
- [
- -91.276362,
- 48.064768
- ],
- [
- -91.23807,
- 48.082648
- ],
- [
- -91.203963,
- 48.107659
- ],
- [
- -91.071103,
- 48.170859
- ],
- [
- -91.02816,
- 48.184838
- ],
- [
- -91.008109,
- 48.194372
- ],
- [
- -90.923153,
- 48.227109
- ],
- [
- -90.873802,
- 48.234344
- ],
- [
- -90.840678,
- 48.220107
- ],
- [
- -90.837939,
- 48.210547
- ],
- [
- -90.848843,
- 48.198713
- ],
- [
- -90.849721,
- 48.189566
- ],
- [
- -90.843003,
- 48.176983
- ],
- [
- -90.83427,
- 48.171789
- ],
- [
- -90.823883,
- 48.168327
- ],
- [
- -90.812307,
- 48.160989
- ],
- [
- -90.803057,
- 48.147166
- ],
- [
- -90.796701,
- 48.117064
- ],
- [
- -90.786469,
- 48.10045
- ],
- [
- -90.750347,
- 48.083991
- ],
- [
- -90.701307,
- 48.08456
- ],
- [
- -90.611079,
- 48.103499
- ],
- [
- -90.586843,
- 48.104817
- ],
- [
- -90.573872,
- 48.097892
- ],
- [
- -90.562194,
- 48.088849
- ],
- [
- -90.542014,
- 48.083733
- ],
- [
- -90.531601,
- 48.08456
- ],
- [
- -90.501887,
- 48.094275
- ],
- [
- -90.490493,
- 48.096239
- ],
- [
- -90.483465,
- 48.094482
- ],
- [
- -90.477858,
- 48.091536
- ],
- [
- -90.470623,
- 48.089882
- ],
- [
- -90.178625,
- 48.116444
- ],
- [
- -90.120386,
- 48.115359
- ],
- [
- -90.073257,
- 48.101199
- ],
- [
- -90.061036,
- 48.091019
- ],
- [
- -90.008222,
- 48.029731
- ],
- [
- -89.995329,
- 48.018595
- ],
- [
- -89.980317,
- 48.010094
- ],
- [
- -89.92045,
- 47.98746
- ],
- [
- -89.902441,
- 47.985909
- ],
- [
- -89.803454,
- 48.013763
- ],
- [
- -89.780975,
- 48.017199
- ],
- [
- -89.763302,
- 48.017303
- ],
- [
- -89.745964,
- 48.013763
- ],
- [
- -89.724596,
- 48.005908
- ],
- [
- -89.712788,
- 48.003376
- ],
- [
- -89.678656,
- 48.008699
- ],
- [
- -89.65659,
- 48.007975
- ],
- [
- -89.593105,
- 47.996503
- ],
- [
- -89.581753,
- 47.996333
- ],
- [
- -89.586724,
- 47.992938
- ],
- [
- -89.310872,
- 47.981097
- ],
- [
- -89.072861,
- 48.046842
- ],
- [
- -88.49789,
- 48.212841
- ],
- [
- -88.286621,
- 48.156675
- ],
- [
- -85.939935,
- 47.280501
- ],
- [
- -84.784644,
- 46.770068
- ],
- [
- -84.516909,
- 46.435083
- ],
- [
- -84.489712,
- 46.446652
- ],
- [
- -84.491052,
- 46.457658
- ],
- [
- -84.478301,
- 46.466467
- ],
- [
- -84.465408,
- 46.478172
- ],
- [
- -84.448096,
- 46.489722
- ],
- [
- -84.42324,
- 46.511581
- ],
- [
- -84.389702,
- 46.520262
- ],
- [
- -84.352469,
- 46.522743
- ],
- [
- -84.30534,
- 46.501607
- ],
- [
- -84.242011,
- 46.526464
- ],
- [
- -84.197285,
- 46.546359
- ],
- [
- -84.147676,
- 46.541346
- ],
- [
- -84.110443,
- 46.526464
- ],
- [
- -84.158812,
- 46.433343
- ],
- [
- -84.147676,
- 46.399882
- ],
- [
- -84.129046,
- 46.375026
- ],
- [
- -84.10543,
- 46.347741
- ],
- [
- -84.105944,
- 46.346374
- ],
- [
- -84.117195,
- 46.347157
- ],
- [
- -84.117489,
- 46.338326
- ],
- [
- -84.122361,
- 46.331922
- ],
- [
- -84.112061,
- 46.287102
- ],
- [
- -84.092672,
- 46.227469
- ],
- [
- -84.111983,
- 46.20337
- ],
- [
- -84.015118,
- 46.149712
- ],
- [
- -83.957038,
- 46.045736
- ],
- [
- -83.676821,
- 46.15388
- ],
- [
- -83.429449,
- 46.086221
- ],
- [
- -83.523049,
- 45.892052
- ],
- [
- -83.574563,
- 45.890259
- ],
- [
- -82.551615,
- 44.857931
- ],
- [
- -82.655591,
- 43.968545
- ],
- [
- -82.440632,
- 43.096285
- ],
- [
- -82.460131,
- 43.084392
- ],
- [
- -82.458894,
- 43.083247
- ],
- [
- -82.431813,
- 43.039387
- ],
- [
- -82.424748,
- 43.02408
- ],
- [
- -82.417242,
- 43.01731
- ],
- [
- -82.416369,
- 43.01742
- ],
- [
- -82.416412,
- 43.017143
- ],
- [
- -82.414603,
- 42.983243
- ],
- [
- -82.430442,
- 42.951307
- ],
- [
- -82.453179,
- 42.918983
- ],
- [
- -82.464781,
- 42.883637
- ],
- [
- -82.468036,
- 42.863974
- ],
- [
- -82.482325,
- 42.835113
- ],
- [
- -82.485271,
- 42.818524
- ],
- [
- -82.473618,
- 42.798164
- ],
- [
- -82.470982,
- 42.790568
- ],
- [
- -82.471344,
- 42.779845
- ],
- [
- -82.476951,
- 42.761474
- ],
- [
- -82.48341,
- 42.719254
- ],
- [
- -82.511264,
- 42.646675
- ],
- [
- -82.526224,
- 42.619906
- ],
- [
- -82.549246,
- 42.590941
- ],
- [
- -82.575833,
- 42.571795
- ],
- [
- -82.608467,
- 42.561098
- ],
- [
- -82.644331,
- 42.557817
- ],
- [
- -82.644698,
- 42.557533
- ],
- [
- -82.644932,
- 42.561634
- ],
- [
- -82.637132,
- 42.568405
- ],
- [
- -82.60902,
- 42.579296
- ],
- [
- -82.616673,
- 42.582828
- ],
- [
- -82.636985,
- 42.599607
- ],
- [
- -82.625357,
- 42.616092
- ],
- [
- -82.629331,
- 42.626394
- ],
- [
- -82.638751,
- 42.633459
- ],
- [
- -82.644344,
- 42.640524
- ],
- [
- -82.644166,
- 42.641056
- ],
- [
- -82.716083,
- 42.617461
- ],
- [
- -82.777592,
- 42.408506
- ],
- [
- -82.888693,
- 42.406093
- ],
- [
- -82.889991,
- 42.403266
- ],
- [
- -82.905739,
- 42.387665
- ],
- [
- -82.923842,
- 42.374419
- ],
- [
- -82.937972,
- 42.366176
- ],
- [
- -82.947686,
- 42.363527
- ],
- [
- -82.979624,
- 42.359406
- ],
- [
- -83.042618,
- 42.340861
- ],
- [
- -83.061899,
- 42.32732
- ],
- [
- -83.081622,
- 42.30907
- ],
- [
- -83.11342,
- 42.279619
- ],
- [
- -83.145306,
- 42.066968
- ],
- [
- -83.177398,
- 41.960666
- ],
- [
- -83.21512,
- 41.794493
- ],
- [
- -82.219051,
- 41.516445
- ],
- [
- -80.345329,
- 42.13344
- ],
- [
- -80.316455,
- 42.123137
- ],
- [
- -79.270266,
- 42.591872
- ],
- [
- -79.221058,
- 42.582892
- ],
- [
- -78.871842,
- 42.860012
- ],
- [
- -78.875011,
- 42.867184
- ],
- [
- -78.896205,
- 42.897209
- ],
- [
- -78.901651,
- 42.908101
- ],
- [
- -78.90901,
- 42.952255
- ],
- [
- -78.913426,
- 42.957848
- ],
- [
- -78.932118,
- 42.9708
- ],
- [
- -78.936386,
- 42.979631
- ],
- [
- -78.927997,
- 43.002003
- ],
- [
- -78.893114,
- 43.029379
- ],
- [
- -78.887963,
- 43.051456
- ],
- [
- -78.914897,
- 43.076477
- ],
- [
- -79.026167,
- 43.086485
- ],
- [
- -79.065231,
- 43.10573
- ],
- [
- -79.065273,
- 43.105897
- ],
- [
- -79.065738,
- 43.120237
- ],
- [
- -79.061423,
- 43.130288
- ],
- [
- -79.055583,
- 43.138427
- ],
- [
- -79.051604,
- 43.146851
- ],
- [
- -79.04933,
- 43.159847
- ],
- [
- -79.048607,
- 43.170622
- ],
- [
- -79.053775,
- 43.260358
- ],
- [
- -79.058425,
- 43.277799
- ],
- [
- -79.058631,
- 43.2782
- ],
- [
- -78.990696,
- 43.286947
- ],
- [
- -78.862059,
- 43.324332
- ],
- [
- -78.767813,
- 43.336418
- ],
- [
- -78.516117,
- 43.50645
- ],
- [
- -76.363317,
- 43.943219
- ],
- [
- -76.396746,
- 44.106667
- ],
- [
- -76.364697,
- 44.111631
- ],
- [
- -76.366146,
- 44.117349
- ],
- [
- -76.357462,
- 44.131478
- ],
- [
- -76.183493,
- 44.223025
- ],
- [
- -76.162644,
- 44.229888
- ],
- [
- -76.176117,
- 44.30795
- ],
- [
- -76.046414,
- 44.354817
- ],
- [
- -75.928746,
- 44.391137
- ],
- [
- -75.852508,
- 44.381639
- ],
- [
- -75.849095,
- 44.386103
- ],
- [
- -75.847623,
- 44.392579
- ],
- [
- -75.84674,
- 44.398172
- ],
- [
- -75.845415,
- 44.40141
- ],
- [
- -75.780803,
- 44.432318
- ],
- [
- -75.770205,
- 44.446153
- ],
- [
- -75.772266,
- 44.463815
- ],
- [
- -75.779184,
- 44.48236
- ],
- [
- -75.791496,
- 44.496513
- ],
- [
- -75.791183,
- 44.496768
- ],
- [
- -75.754622,
- 44.527567
- ],
- [
- -75.69969,
- 44.581673
- ],
- [
- -75.578199,
- 44.661513
- ],
- [
- -75.455958,
- 44.741766
- ],
- [
- -75.341831,
- 44.816749
- ],
- [
- -75.270233,
- 44.863774
- ],
- [
- -75.129647,
- 44.925166
- ],
- [
- -75.075594,
- 44.935501
- ],
- [
- -75.058721,
- 44.941031
- ],
- [
- -75.0149,
- 44.96599
- ],
- [
- -74.998647,
- 44.972398
- ],
- [
- -74.940201,
- 44.987746
- ],
- [
- -74.903744,
- 45.005213
- ],
- [
- -74.88651,
- 45.009398
- ],
- [
- -74.868474,
- 45.010122
- ],
- [
- -74.741557,
- 44.998857
- ],
- [
- -74.712961,
- 44.999254
- ],
- [
- -74.695875,
- 44.99803
- ],
- [
- -74.596114,
- 44.998495
- ],
- [
- -74.496352,
- 44.999012
- ],
- [
- -74.197146,
- 45.000458
- ],
- [
- -71.703551,
- 45.012757
- ],
- [
- -71.603816,
- 45.013274
- ],
- [
- -71.505848,
- 45.013731
- ],
- [
- -71.50408,
- 45.013739
- ],
- [
- -71.506613,
- 45.037045
- ],
- [
- -71.504752,
- 45.052962
- ],
- [
- -71.497259,
- 45.066553
- ],
- [
- -71.45659,
- 45.110994
- ],
- [
- -71.451215,
- 45.121691
- ],
- [
- -71.445996,
- 45.140295
- ],
- [
- -71.441604,
- 45.150682
- ],
- [
- -71.413026,
- 45.186184
- ],
- [
- -71.406567,
- 45.204942
- ],
- [
- -71.42269,
- 45.217189
- ],
- [
- -71.449045,
- 45.226905
- ],
- [
- -71.438813,
- 45.233468
- ],
- [
- -71.394888,
- 45.241529
- ],
- [
- -71.381245,
- 45.250779
- ],
- [
- -71.3521,
- 45.278323
- ],
- [
- -71.334323,
- 45.28871
- ],
- [
- -71.311534,
- 45.294136
- ],
- [
- -71.293396,
- 45.292327
- ],
- [
- -71.20937,
- 45.254758
- ],
- [
- -71.185133,
- 45.248557
- ],
- [
- -71.160329,
- 45.245767
- ],
- [
- -71.141725,
- 45.252329
- ],
- [
- -71.111029,
- 45.287108
- ],
- [
- -71.095242,
- 45.300905
- ],
- [
- -71.085553,
- 45.304213
- ],
- [
- -71.084952,
- 45.304293
- ],
- [
- -71.064211,
- 45.307055
- ],
- [
- -71.054418,
- 45.310362
- ],
- [
- -71.036667,
- 45.323385
- ],
- [
- -71.027598,
- 45.33465
- ],
- [
- -71.016539,
- 45.343125
- ],
- [
- -70.993155,
- 45.347827
- ],
- [
- -70.968118,
- 45.34452
- ],
- [
- -70.951608,
- 45.332014
- ],
- [
- -70.906908,
- 45.246232
- ],
- [
- -70.892412,
- 45.234604
- ],
- [
- -70.874351,
- 45.245663
- ],
- [
- -70.870605,
- 45.255275
- ],
- [
- -70.872491,
- 45.274189
- ],
- [
- -70.870243,
- 45.283129
- ],
- [
- -70.862621,
- 45.290363
- ],
- [
- -70.842389,
- 45.301215
- ],
- [
- -70.835258,
- 45.309794
- ],
- [
- -70.83208,
- 45.328552
- ],
- [
- -70.835465,
- 45.373097
- ],
- [
- -70.833837,
- 45.393096
- ],
- [
- -70.825982,
- 45.410459
- ],
- [
- -70.812986,
- 45.42343
- ],
- [
- -70.794873,
- 45.430406
- ],
- [
- -70.771877,
- 45.430045
- ],
- [
- -70.75255,
- 45.422345
- ],
- [
- -70.718004,
- 45.397282
- ],
- [
- -70.696739,
- 45.388652
- ],
- [
- -70.675785,
- 45.388704
- ],
- [
- -70.65359,
- 45.395473
- ],
- [
- -70.641316,
- 45.408496
- ],
- [
- -70.650257,
- 45.427461
- ],
- [
- -70.668162,
- 45.439036
- ],
- [
- -70.707385,
- 45.4564
- ],
- [
- -70.722836,
- 45.470921
- ],
- [
- -70.732009,
- 45.491591
- ],
- [
- -70.730329,
- 45.507973
- ],
- [
- -70.686792,
- 45.572723
- ],
- [
- -70.589614,
- 45.651788
- ],
- [
- -70.572406,
- 45.662279
- ],
- [
- -70.514735,
- 45.681709
- ],
- [
- -70.484763,
- 45.699641
- ],
- [
- -70.4728,
- 45.703568
- ],
- [
- -70.450424,
- 45.703723
- ],
- [
- -70.439132,
- 45.705893
- ],
- [
- -70.419315,
- 45.716901
- ],
- [
- -70.407351,
- 45.731525
- ],
- [
- -70.402442,
- 45.749663
- ],
- [
- -70.403941,
- 45.771161
- ],
- [
- -70.408282,
- 45.781651
- ],
- [
- -70.413682,
- 45.787697
- ],
- [
- -70.41717,
- 45.793795
- ],
- [
- -70.415232,
- 45.804389
- ],
- [
- -70.409935,
- 45.810745
- ],
- [
- -70.389807,
- 45.825059
- ],
- [
- -70.312654,
- 45.867641
- ],
- [
- -70.283173,
- 45.890482
- ],
- [
- -70.262528,
- 45.923038
- ],
- [
- -70.255939,
- 45.948876
- ],
- [
- -70.263148,
- 45.956834
- ],
- [
- -70.280434,
- 45.959315
- ],
- [
- -70.303947,
- 45.968616
- ],
- [
- -70.316298,
- 45.982982
- ],
- [
- -70.316892,
- 45.999002
- ],
- [
- -70.306143,
- 46.035331
- ],
- [
- -70.303637,
- 46.038483
- ],
- [
- -70.294309,
- 46.044943
- ],
- [
- -70.29201,
- 46.048663
- ],
- [
- -70.293017,
- 46.054038
- ],
- [
- -70.296092,
- 46.057862
- ],
- [
- -70.300795,
- 46.061737
- ],
- [
- -70.304774,
- 46.065975
- ],
- [
- -70.311362,
- 46.071866
- ],
- [
- -70.312629,
- 46.079566
- ],
- [
- -70.30033,
- 46.089281
- ],
- [
- -70.26444,
- 46.106593
- ],
- [
- -70.24948,
- 46.120597
- ],
- [
- -70.244002,
- 46.141009
- ],
- [
- -70.249247,
- 46.162765
- ],
- [
- -70.263329,
- 46.183229
- ],
- [
- -70.284801,
- 46.191859
- ],
- [
- -70.280899,
- 46.211857
- ],
- [
- -70.253407,
- 46.251493
- ],
- [
- -70.236173,
- 46.288339
- ],
- [
- -70.223693,
- 46.300793
- ],
- [
- -70.201886,
- 46.305495
- ],
- [
- -70.199509,
- 46.315262
- ],
- [
- -70.197028,
- 46.336863
- ],
- [
- -70.188398,
- 46.358412
- ],
- [
- -70.167418,
- 46.368179
- ],
- [
- -70.153052,
- 46.372829
- ],
- [
- -70.074323,
- 46.419545
- ],
- [
- -70.061817,
- 46.445409
- ],
- [
- -70.050086,
- 46.511271
- ],
- [
- -70.032723,
- 46.609766
- ],
- [
- -70.023628,
- 46.661287
- ],
- [
- -70.007763,
- 46.704075
- ],
- [
- -69.989961,
- 46.721697
- ],
- [
- -69.899708,
- 46.811562
- ],
- [
- -69.809403,
- 46.901299
- ],
- [
- -69.719099,
- 46.991086
- ],
- [
- -69.628794,
- 47.080797
- ],
- [
- -69.538464,
- 47.17061
- ],
- [
- -69.448159,
- 47.260346
- ],
- [
- -69.357906,
- 47.350134
- ],
- [
- -69.267628,
- 47.439844
- ],
- [
- -69.25091,
- 47.452919
- ],
- [
- -69.237268,
- 47.45881
- ],
- [
- -69.221972,
- 47.459688
- ],
- [
- -69.069655,
- 47.431886
- ],
- [
- -69.054023,
- 47.418399
- ],
- [
- -69.054333,
- 47.389253
- ],
- [
- -69.066193,
- 47.32967
- ],
- [
- -69.065134,
- 47.296339
- ],
- [
- -69.06356,
- 47.290809
- ],
- [
- -69.057486,
- 47.269467
- ],
- [
- -69.0402,
- 47.249055
- ],
- [
- -68.906229,
- 47.190221
- ],
- [
- -68.889718,
- 47.190609
- ],
- [
- -68.761819,
- 47.23704
- ],
- [
- -68.71779,
- 47.245231
- ],
- [
- -68.668801,
- 47.243422
- ],
- [
- -68.644203,
- 47.245283
- ],
- [
- -68.6256,
- 47.255205
- ],
- [
- -68.607926,
- 47.269829
- ],
- [
- -68.58524,
- 47.28249
- ],
- [
- -68.539662,
- 47.299853
- ],
- [
- -68.518009,
- 47.304762
- ],
- [
- -68.492016,
- 47.307553
- ],
- [
- -68.466746,
- 47.305692
- ],
- [
- -68.435327,
- 47.291275
- ],
- [
- -68.422563,
- 47.293109
- ],
- [
- -68.410212,
- 47.297424
- ],
- [
- -68.385614,
- 47.301713
- ],
- [
- -68.383392,
- 47.307139
- ],
- [
- -68.384839,
- 47.315873
- ],
- [
- -68.382049,
- 47.32781
- ],
- [
- -68.347839,
- 47.358506
- ],
- [
- -68.299728,
- 47.367833
- ],
- [
- -68.24645,
- 47.360573
- ],
- [
- -68.197047,
- 47.341401
- ],
- [
- -68.184335,
- 47.333133
- ],
- [
- -68.156068,
- 47.306674
- ],
- [
- -68.145061,
- 47.301455
- ],
- [
- -68.115398,
- 47.292282
- ],
- [
- -68.101446,
- 47.286185
- ],
- [
- -68.039382,
- 47.245231
- ],
- [
- -67.993184,
- 47.223217
- ],
- [
- -67.962436,
- 47.197689
- ],
- [
- -67.953703,
- 47.18663
- ],
- [
- -67.949982,
- 47.172936
- ],
- [
- -67.943419,
- 47.164538
- ],
- [
- -67.899132,
- 47.138778
- ],
- [
- -67.870607,
- 47.107358
- ],
- [
- -67.854742,
- 47.09785
- ],
- [
- -67.813556,
- 47.081908
- ],
- [
- -67.808699,
- 47.075138
- ],
- [
- -67.805185,
- 47.035631
- ],
- [
- -67.802549,
- 46.901247
- ],
- [
- -67.800017,
- 46.766785
- ],
- [
- -67.797433,
- 46.632297
- ],
- [
- -67.794849,
- 46.497861
- ],
- [
- -67.792317,
- 46.363476
- ],
- [
- -67.789733,
- 46.229014
- ],
- [
- -67.78715,
- 46.094552
- ],
- [
- -67.784566,
- 45.960142
- ],
- [
- -67.782757,
- 45.95053
- ],
- [
- -67.776556,
- 45.942933
- ],
- [
- -67.767461,
- 45.935957
- ],
- [
- -67.759658,
- 45.928567
- ],
- [
- -67.757849,
- 45.919472
- ],
- [
- -67.769425,
- 45.903969
- ],
- [
- -67.787356,
- 45.890017
- ],
- [
- -67.799242,
- 45.875651
- ],
- [
- -67.792627,
- 45.858907
- ],
- [
- -67.776091,
- 45.840821
- ],
- [
- -67.772835,
- 45.828057
- ],
- [
- -67.779863,
- 45.815706
- ],
- [
- -67.794126,
- 45.799169
- ],
- [
- -67.80627,
- 45.781754
- ],
- [
- -67.811127,
- 45.76651
- ],
- [
- -67.810816,
- 45.762414
- ],
- [
- -67.817811,
- 45.754896
- ],
- [
- -67.821785,
- 45.740767
- ],
- [
- -67.827673,
- 45.739001
- ],
- [
- -67.868884,
- 45.744593
- ],
- [
- -67.856815,
- 45.723694
- ],
- [
- -67.835768,
- 45.703971
- ],
- [
- -67.793821,
- 45.676301
- ],
- [
- -67.733034,
- 45.651869
- ],
- [
- -67.723173,
- 45.645393
- ],
- [
- -67.711546,
- 45.642155
- ],
- [
- -67.697564,
- 45.64922
- ],
- [
- -67.66695,
- 45.620077
- ],
- [
- -67.649435,
- 45.611247
- ],
- [
- -67.603073,
- 45.605948
- ],
- [
- -67.561862,
- 45.596234
- ],
- [
- -67.54052,
- 45.593879
- ],
- [
- -67.442056,
- 45.603593
- ],
- [
- -67.440939,
- 45.604586
- ],
- [
- -67.431306,
- 45.597941
- ],
- [
- -67.422107,
- 45.568796
- ],
- [
- -67.42619,
- 45.533449
- ],
- [
- -67.443036,
- 45.522184
- ],
- [
- -67.467531,
- 45.508283
- ],
- [
- -67.493214,
- 45.493142
- ],
- [
- -67.48231,
- 45.455521
- ],
- [
- -67.428825,
- 45.38705
- ],
- [
- -67.434561,
- 45.350308
- ],
- [
- -67.459056,
- 45.318424
- ],
- [
- -67.468668,
- 45.301835
- ],
- [
- -67.475024,
- 45.282353
- ],
- [
- -67.471303,
- 45.266282
- ],
- [
- -67.427585,
- 45.236568
- ],
- [
- -67.390533,
- 45.193108
- ],
- [
- -67.356272,
- 45.165926
- ],
- [
- -67.31922,
- 45.153886
- ],
- [
- -67.284648,
- 45.169699
- ],
- [
- -67.279584,
- 45.179052
- ],
- [
- -67.279222,
- 45.187372
- ],
- [
- -67.277207,
- 45.195072
- ],
- [
- -67.267336,
- 45.202513
- ],
- [
- -67.254986,
- 45.205045
- ],
- [
- -67.242428,
- 45.202565
- ],
- [
- -67.219071,
- 45.192126
- ],
- [
- -67.206166,
- 45.189401
- ],
- [
- -67.176015,
- 45.178656
- ],
- [
- -67.191274,
- 45.180365
- ],
- [
- -67.204376,
- 45.178209
- ],
- [
- -67.204724,
- 45.177791
- ],
- [
- -67.152423,
- 45.148932
- ],
- [
- -67.048033,
- 45.043407
- ],
- [
- -66.962727,
- 45.047088
- ],
- [
- -66.857192,
- 44.968696
- ],
- [
- -66.897268,
- 44.817275
- ],
- [
- -67.2159,
- 44.593511
- ],
- [
- -67.122366,
- 44.423624
- ],
- [
- -67.68447,
- 44.192544
- ],
- [
- -67.459678,
- 40.781645
- ],
- [
- -76.607854,
- 32.495823
- ],
- [
- -76.798479,
- 32.713735
- ],
- [
- -78.561892,
- 29.037718
- ],
- [
- -78.892446,
- 29.039659
- ],
- [
- -79.762295,
- 26.719312
- ],
- [
- -80.026352,
- 24.932961
- ],
- [
- -82.368794,
- 23.994833
- ],
- [
- -83.806281,
- 29.068506
- ],
- [
- -87.460772,
- 29.089961
- ],
- [
- -87.922646,
- 28.666131
- ],
- [
- -90.461001,
- 28.246758
- ],
- [
- -91.787336,
- 29.11536
- ],
- [
- -93.311871,
- 29.12431
- ],
- [
- -96.423449,
- 26.057857
- ],
- [
- -97.129057,
- 25.991017
- ],
- [
- -97.129509,
- 25.966833
- ],
- [
- -97.139358,
- 25.965876
- ],
- [
- -97.202171,
- 25.960893
- ],
- [
- -97.202176,
- 25.960857
- ],
- [
- -97.204941,
- 25.960639
- ],
- [
- -97.253051,
- 25.963481
- ],
- [
- -97.266358,
- 25.960639
- ],
- [
- -97.2692,
- 25.944361
- ],
- [
- -97.287649,
- 25.928651
- ],
- [
- -97.310981,
- 25.922088
- ],
- [
- -97.328447,
- 25.933302
- ],
- [
- -97.351107,
- 25.918419
- ],
- [
- -97.355112,
- 25.912786
- ],
- [
- -97.35227,
- 25.894493
- ],
- [
- -97.345165,
- 25.871704
- ],
- [
- -97.345733,
- 25.852222
- ],
- [
- -97.36599,
- 25.843902
- ],
- [
- -97.376015,
- 25.846744
- ],
- [
- -97.380124,
- 25.853203
- ],
- [
- -97.383121,
- 25.860541
- ],
- [
- -97.389891,
- 25.865657
- ],
- [
- -97.397823,
- 25.865812
- ],
- [
- -97.399476,
- 25.861162
- ],
- [
- -97.39989,
- 25.855115
- ],
- [
- -97.404179,
- 25.851395
- ],
- [
- -97.425418,
- 25.854857
- ],
- [
- -97.435727,
- 25.869275
- ],
- [
- -97.441309,
- 25.884933
- ],
- [
- -97.448259,
- 25.892322
- ],
- [
- -97.469421,
- 25.892943
- ],
- [
- -97.486319,
- 25.895733
- ],
- [
- -97.502209,
- 25.901883
- ],
- [
- -97.52027,
- 25.912786
- ],
- [
- -97.565177,
- 25.954748
- ],
- [
- -97.594322,
- 25.966375
- ],
- [
- -97.604787,
- 25.979966
- ],
- [
- -97.613055,
- 25.995985
- ],
- [
- -97.622641,
- 26.00906
- ],
- [
- -97.641451,
- 26.022495
- ],
- [
- -97.659874,
- 26.03066
- ],
- [
- -97.679614,
- 26.034639
- ],
- [
- -97.766948,
- 26.039652
- ],
- [
- -97.780306,
- 26.043218
- ],
- [
- -97.782321,
- 26.058617
- ],
- [
- -97.80201,
- 26.063733
- ],
- [
- -97.878181,
- 26.063733
- ],
- [
- -97.941666,
- 26.056809
- ],
- [
- -97.999233,
- 26.064302
- ],
- [
- -98.013057,
- 26.063682
- ],
- [
- -98.044166,
- 26.048799
- ],
- [
- -98.065457,
- 26.042184
- ],
- [
- -98.075146,
- 26.046628
- ],
- [
- -98.083311,
- 26.070916
- ],
- [
- -98.103103,
- 26.074947
- ],
- [
- -98.150232,
- 26.063682
- ],
- [
- -98.185062,
- 26.065232
- ],
- [
- -98.222656,
- 26.075412
- ],
- [
- -98.300429,
- 26.111431
- ],
- [
- -98.309809,
- 26.121094
- ],
- [
- -98.333037,
- 26.15303
- ],
- [
- -98.339264,
- 26.159851
- ],
- [
- -98.365774,
- 26.160161
- ],
- [
- -98.377272,
- 26.163572
- ],
- [
- -98.377272,
- 26.173649
- ],
- [
- -98.36934,
- 26.19401
- ],
- [
- -98.397193,
- 26.201141
- ],
- [
- -98.428845,
- 26.217729
- ],
- [
- -98.456544,
- 26.225946
- ],
- [
- -98.472383,
- 26.207652
- ],
- [
- -98.49295,
- 26.230596
- ],
- [
- -98.521527,
- 26.240932
- ],
- [
- -98.552791,
- 26.248321
- ],
- [
- -98.581627,
- 26.262274
- ],
- [
- -98.640564,
- 26.24181
- ],
- [
- -98.653663,
- 26.244291
- ],
- [
- -98.664696,
- 26.250647
- ],
- [
- -98.685289,
- 26.268475
- ],
- [
- -98.693325,
- 26.270542
- ],
- [
- -98.702239,
- 26.271628
- ],
- [
- -98.704255,
- 26.27664
- ],
- [
- -98.691465,
- 26.290231
- ],
- [
- -98.701413,
- 26.299119
- ],
- [
- -98.713169,
- 26.303357
- ],
- [
- -98.726217,
- 26.30439
- ],
- [
- -98.739911,
- 26.303253
- ],
- [
- -98.735932,
- 26.320048
- ],
- [
- -98.746397,
- 26.332141
- ],
- [
- -98.780839,
- 26.351674
- ],
- [
- -98.795851,
- 26.368314
- ],
- [
- -98.801329,
- 26.372138
- ],
- [
- -98.810295,
- 26.372448
- ],
- [
- -98.817323,
- 26.368521
- ],
- [
- -98.825023,
- 26.366454
- ],
- [
- -98.836081,
- 26.372138
- ],
- [
- -98.842334,
- 26.365834
- ],
- [
- -98.850835,
- 26.364077
- ],
- [
- -98.860524,
- 26.366299
- ],
- [
- -98.870214,
- 26.372138
- ],
- [
- -98.893029,
- 26.367849
- ],
- [
- -98.9299,
- 26.39224
- ],
- [
- -98.945377,
- 26.378288
- ],
- [
- -98.954136,
- 26.393946
- ],
- [
- -98.962844,
- 26.399527
- ],
- [
- -98.986951,
- 26.400095
- ],
- [
- -99.004056,
- 26.393842
- ],
- [
- -99.010515,
- 26.392602
- ],
- [
- -99.016432,
- 26.394462
- ],
- [
- -99.022995,
- 26.403351
- ],
- [
- -99.027878,
- 26.406245
- ],
- [
- -99.047645,
- 26.406968
- ],
- [
- -99.066351,
- 26.404746
- ],
- [
- -99.085498,
- 26.40764
- ],
- [
- -99.106427,
- 26.423039
- ],
- [
- -99.108907,
- 26.434253
- ],
- [
- -99.102525,
- 26.446966
- ],
- [
- -99.09374,
- 26.459781
- ],
- [
- -99.089373,
- 26.47115
- ],
- [
- -99.091492,
- 26.484018
- ],
- [
- -99.10299,
- 26.512078
- ],
- [
- -99.115108,
- 26.525617
- ],
- [
- -99.140946,
- 26.531405
- ],
- [
- -99.164873,
- 26.540448
- ],
- [
- -99.17128,
- 26.563961
- ],
- [
- -99.171548,
- 26.56583
- ],
- [
- -99.213953,
- 26.568537
- ],
- [
- -99.242801,
- 26.579723
- ],
- [
- -99.254575,
- 26.6018
- ],
- [
- -99.258844,
- 26.614752
- ],
- [
- -99.277683,
- 26.638007
- ],
- [
- -99.281951,
- 26.649781
- ],
- [
- -99.277389,
- 26.657729
- ],
- [
- -99.26635,
- 26.653314
- ],
- [
- -99.252662,
- 26.644483
- ],
- [
- -99.240299,
- 26.639184
- ],
- [
- -99.244861,
- 26.652431
- ],
- [
- -99.240299,
- 26.697763
- ],
- [
- -99.242507,
- 26.713658
- ],
- [
- -99.252368,
- 26.743683
- ],
- [
- -99.254575,
- 26.75899
- ],
- [
- -99.252368,
- 26.799024
- ],
- [
- -99.254575,
- 26.810504
- ],
- [
- -99.257666,
- 26.813153
- ],
- [
- -99.262229,
- 26.814036
- ],
- [
- -99.266497,
- 26.817863
- ],
- [
- -99.268263,
- 26.827872
- ],
- [
- -99.271649,
- 26.832876
- ],
- [
- -99.289458,
- 26.84465
- ],
- [
- -99.308444,
- 26.830521
- ],
- [
- -99.316539,
- 26.822279
- ],
- [
- -99.323457,
- 26.810504
- ],
- [
- -99.328166,
- 26.797258
- ],
- [
- -99.329197,
- 26.789016
- ],
- [
- -99.331699,
- 26.78254
- ],
- [
- -99.340383,
- 26.77312
- ],
- [
- -99.366728,
- 26.761345
- ],
- [
- -99.380269,
- 26.777241
- ],
- [
- -99.391896,
- 26.796963
- ],
- [
- -99.412207,
- 26.796963
- ],
- [
- -99.410883,
- 26.808149
- ],
- [
- -99.405437,
- 26.818452
- ],
- [
- -99.396606,
- 26.824928
- ],
- [
- -99.384979,
- 26.824928
- ],
- [
- -99.377178,
- 26.816686
- ],
- [
- -99.374823,
- 26.804028
- ],
- [
- -99.374234,
- 26.791076
- ],
- [
- -99.371291,
- 26.783128
- ],
- [
- -99.360694,
- 26.780479
- ],
- [
- -99.359369,
- 26.790487
- ],
- [
- -99.36452,
- 26.810504
- ],
- [
- -99.357897,
- 26.822279
- ],
- [
- -99.351274,
- 26.83111
- ],
- [
- -99.346123,
- 26.840824
- ],
- [
- -99.344062,
- 26.855247
- ],
- [
- -99.348772,
- 26.899696
- ],
- [
- -99.355101,
- 26.920302
- ],
- [
- -99.36452,
- 26.934726
- ],
- [
- -99.403377,
- 26.952093
- ],
- [
- -99.413974,
- 26.964162
- ],
- [
- -99.401758,
- 26.985651
- ],
- [
- -99.399991,
- 26.999192
- ],
- [
- -99.418831,
- 27.007728
- ],
- [
- -99.441938,
- 27.013615
- ],
- [
- -99.453271,
- 27.019797
- ],
- [
- -99.455332,
- 27.025979
- ],
- [
- -99.464751,
- 27.039225
- ],
- [
- -99.466959,
- 27.047467
- ],
- [
- -99.462544,
- 27.057181
- ],
- [
- -99.461635,
- 27.056839
- ],
- [
- -99.461728,
- 27.056954
- ],
- [
- -99.442039,
- 27.089614
- ],
- [
- -99.439404,
- 27.098347
- ],
- [
- -99.441419,
- 27.107494
- ],
- [
- -99.445734,
- 27.114728
- ],
- [
- -99.450178,
- 27.120465
- ],
- [
- -99.452452,
- 27.125012
- ],
- [
- -99.450333,
- 27.145166
- ],
- [
- -99.435786,
- 27.188419
- ],
- [
- -99.431988,
- 27.207591
- ],
- [
- -99.434029,
- 27.22697
- ],
- [
- -99.440902,
- 27.244798
- ],
- [
- -99.451832,
- 27.26118
- ],
- [
- -99.46612,
- 27.276527
- ],
- [
- -99.468963,
- 27.278233
- ],
- [
- -99.480409,
- 27.283297
- ],
- [
- -99.482941,
- 27.286708
- ],
- [
- -99.484879,
- 27.294821
- ],
- [
- -99.486584,
- 27.297611
- ],
- [
- -99.493199,
- 27.30128
- ],
- [
- -99.521362,
- 27.311254
- ],
- [
- -99.5148,
- 27.321796
- ],
- [
- -99.497591,
- 27.338798
- ],
- [
- -99.494026,
- 27.348203
- ],
- [
- -99.492889,
- 27.358848
- ],
- [
- -99.487721,
- 27.37187
- ],
- [
- -99.484621,
- 27.391766
- ],
- [
- -99.475706,
- 27.414762
- ],
- [
- -99.472916,
- 27.426647
- ],
- [
- -99.473639,
- 27.463803
- ],
- [
- -99.472916,
- 27.468299
- ],
- [
- -99.47643,
- 27.48251
- ],
- [
- -99.480409,
- 27.490778
- ],
- [
- -99.48829,
- 27.494654
- ],
- [
- -99.503689,
- 27.495584
- ],
- [
- -99.509503,
- 27.500028
- ],
- [
- -99.510071,
- 27.510518
- ],
- [
- -99.507074,
- 27.533437
- ],
- [
- -99.507203,
- 27.57377
- ],
- [
- -99.515006,
- 27.588601
- ],
- [
- -99.535031,
- 27.604828
- ],
- [
- -99.55503,
- 27.613509
- ],
- [
- -99.572264,
- 27.61847
- ],
- [
- -99.578232,
- 27.622811
- ],
- [
- -99.590247,
- 27.642061
- ],
- [
- -99.600169,
- 27.646427
- ],
- [
- -99.612442,
- 27.643637
- ],
- [
- -99.633526,
- 27.633069
- ],
- [
- -99.644869,
- 27.632733
- ],
- [
- -99.648642,
- 27.636919
- ],
- [
- -99.658693,
- 27.654024
- ],
- [
- -99.664739,
- 27.659398
- ],
- [
- -99.70037,
- 27.659191
- ],
- [
- -99.705692,
- 27.66317
- ],
- [
- -99.710674,
- 27.670116
- ],
- [
- -99.723056,
- 27.687381
- ],
- [
- -99.730652,
- 27.691825
- ],
- [
- -99.734037,
- 27.702031
- ],
- [
- -99.736311,
- 27.713607
- ],
- [
- -99.740445,
- 27.722159
- ],
- [
- -99.747344,
- 27.726009
- ],
- [
- -99.765198,
- 27.731177
- ],
- [
- -99.774577,
- 27.735828
- ],
- [
- -99.78685,
- 27.748488
- ],
- [
- -99.795428,
- 27.761924
- ],
- [
- -99.806963,
- 27.771423
- ],
- [
- -99.808167,
- 27.772414
- ],
- [
- -99.83292,
- 27.776755
- ],
- [
- -99.832971,
- 27.782181
- ],
- [
- -99.844779,
- 27.793576
- ],
- [
- -99.858241,
- 27.803524
- ],
- [
- -99.863357,
- 27.804661
- ],
- [
- -99.864727,
- 27.814324
- ],
- [
- -99.861858,
- 27.83608
- ],
- [
- -99.863357,
- 27.845666
- ],
- [
- -99.870928,
- 27.854477
- ],
- [
- -99.880204,
- 27.859231
- ],
- [
- -99.888007,
- 27.864812
- ],
- [
- -99.891288,
- 27.876026
- ],
- [
- -99.882684,
- 27.89158
- ],
- [
- -99.878808,
- 27.901838
- ],
- [
- -99.88134,
- 27.906463
- ],
- [
- -99.896766,
- 27.912923
- ],
- [
- -99.914336,
- 27.928245
- ],
- [
- -99.929916,
- 27.946331
- ],
- [
- -99.939683,
- 27.961085
- ],
- [
- -99.928289,
- 27.975761
- ],
- [
- -99.940717,
- 27.983254
- ],
- [
- -99.961852,
- 27.987492
- ],
- [
- -99.976606,
- 27.992453
- ],
- [
- -99.991127,
- 28.007801
- ],
- [
- -100.000584,
- 28.02041
- ],
- [
- -100.007457,
- 28.033561
- ],
- [
- -100.014123,
- 28.050459
- ],
- [
- -100.013503,
- 28.056971
- ],
- [
- -100.010506,
- 28.063611
- ],
- [
- -100.010196,
- 28.068882
- ],
- [
- -100.017585,
- 28.070949
- ],
- [
- -100.031538,
- 28.081801
- ],
- [
- -100.045077,
- 28.095289
- ],
- [
- -100.048023,
- 28.102523
- ],
- [
- -100.048901,
- 28.115959
- ],
- [
- -100.056498,
- 28.137922
- ],
- [
- -100.074895,
- 28.154407
- ],
- [
- -100.172873,
- 28.198538
- ],
- [
- -100.189203,
- 28.201329
- ],
- [
- -100.197626,
- 28.207168
- ],
- [
- -100.201192,
- 28.220346
- ],
- [
- -100.202949,
- 28.234428
- ],
- [
- -100.205946,
- 28.242877
- ],
- [
- -100.212819,
- 28.245073
- ],
- [
- -100.240724,
- 28.249698
- ],
- [
- -100.257932,
- 28.260524
- ],
- [
- -100.275089,
- 28.277242
- ],
- [
- -100.284339,
- 28.296517
- ],
- [
- -100.277931,
- 28.314888
- ],
- [
- -100.278551,
- 28.331088
- ],
- [
- -100.293899,
- 28.353413
- ],
- [
- -100.322631,
- 28.386899
- ],
- [
- -100.331675,
- 28.422013
- ],
- [
- -100.336326,
- 28.458574
- ],
- [
- -100.340201,
- 28.464259
- ],
- [
- -100.348315,
- 28.470253
- ],
- [
- -100.355549,
- 28.478185
- ],
- [
- -100.35679,
- 28.489322
- ],
- [
- -100.351622,
- 28.496711
- ],
- [
- -100.322631,
- 28.510406
- ],
- [
- -100.364024,
- 28.524797
- ],
- [
- -100.38423,
- 28.537174
- ],
- [
- -100.397769,
- 28.557586
- ],
- [
- -100.398751,
- 28.568645
- ],
- [
- -100.397097,
- 28.592726
- ],
- [
- -100.401438,
- 28.60226
- ],
- [
- -100.411463,
- 28.609314
- ],
- [
- -100.434821,
- 28.619133
- ],
- [
- -100.44619,
- 28.626497
- ],
- [
- -100.444898,
- 28.643782
- ],
- [
- -100.481381,
- 28.686054
- ],
- [
- -100.493939,
- 28.708378
- ],
- [
- -100.519054,
- 28.804961
- ],
- [
- -100.524996,
- 28.814831
- ],
- [
- -100.529285,
- 28.819947
- ],
- [
- -100.534453,
- 28.830231
- ],
- [
- -100.538639,
- 28.835631
- ],
- [
- -100.54515,
- 28.83899
- ],
- [
- -100.559671,
- 28.839378
- ],
- [
- -100.566234,
- 28.842504
- ],
- [
- -100.569696,
- 28.84961
- ],
- [
- -100.56334,
- 28.86209
- ],
- [
- -100.566234,
- 28.869789
- ],
- [
- -100.571763,
- 28.8732
- ],
- [
- -100.586543,
- 28.879789
- ],
- [
- -100.58954,
- 28.883458
- ],
- [
- -100.594966,
- 28.899322
- ],
- [
- -100.606955,
- 28.910123
- ],
- [
- -100.618841,
- 28.917926
- ],
- [
- -100.624318,
- 28.924721
- ],
- [
- -100.624783,
- 28.93777
- ],
- [
- -100.626696,
- 28.948338
- ],
- [
- -100.630778,
- 28.956683
- ],
- [
- -100.637909,
- 28.962884
- ],
- [
- -100.628918,
- 28.98433
- ],
- [
- -100.632793,
- 29.005156
- ],
- [
- -100.652224,
- 29.044817
- ],
- [
- -100.660854,
- 29.102669
- ],
- [
- -100.668967,
- 29.116208
- ],
- [
- -100.678165,
- 29.119412
- ],
- [
- -100.690826,
- 29.121014
- ],
- [
- -100.70204,
- 29.12365
- ],
- [
- -100.706846,
- 29.130187
- ],
- [
- -100.70974,
- 29.135561
- ],
- [
- -100.762501,
- 29.173776
- ],
- [
- -100.770098,
- 29.187289
- ],
- [
- -100.762088,
- 29.208658
- ],
- [
- -100.783172,
- 29.243074
- ],
- [
- -100.796143,
- 29.257673
- ],
- [
- -100.81609,
- 29.270773
- ],
- [
- -100.86389,
- 29.290616
- ],
- [
- -100.871797,
- 29.296456
- ],
- [
- -100.891227,
- 29.318547
- ],
- [
- -100.91474,
- 29.337048
- ],
- [
- -100.987397,
- 29.366322
- ],
- [
- -100.998301,
- 29.372472
- ],
- [
- -101.008068,
- 29.380585
- ],
- [
- -101.016232,
- 29.390068
- ],
- [
- -101.022175,
- 29.40048
- ],
- [
- -101.025948,
- 29.414356
- ],
- [
- -101.029617,
- 29.442984
- ],
- [
- -101.037782,
- 29.460063
- ],
- [
- -101.039026,
- 29.460452
- ],
- [
- -101.040188,
- 29.457132
- ],
- [
- -101.045487,
- 29.451245
- ],
- [
- -101.060205,
- 29.449184
- ],
- [
- -101.067711,
- 29.45095
- ],
- [
- -101.076101,
- 29.453894
- ],
- [
- -101.085962,
- 29.454483
- ],
- [
- -101.098031,
- 29.449184
- ],
- [
- -101.113043,
- 29.466552
- ],
- [
- -101.142774,
- 29.475383
- ],
- [
- -101.174124,
- 29.475971
- ],
- [
- -101.193699,
- 29.469495
- ],
- [
- -101.198703,
- 29.473911
- ],
- [
- -101.198851,
- 29.476854
- ],
- [
- -101.184132,
- 29.497754
- ],
- [
- -101.184868,
- 29.512767
- ],
- [
- -101.195171,
- 29.521892
- ],
- [
- -101.214157,
- 29.518065
- ],
- [
- -101.245213,
- 29.493044
- ],
- [
- -101.265818,
- 29.487157
- ],
- [
- -101.290545,
- 29.49746
- ],
- [
- -101.297315,
- 29.503936
- ],
- [
- -101.300995,
- 29.512767
- ],
- [
- -101.294372,
- 29.520715
- ],
- [
- -101.273177,
- 29.524247
- ],
- [
- -101.259195,
- 29.533372
- ],
- [
- -101.243888,
- 29.554861
- ],
- [
- -101.231966,
- 29.580176
- ],
- [
- -101.227845,
- 29.599899
- ],
- [
- -101.239178,
- 29.616677
- ],
- [
- -101.26052,
- 29.613439
- ],
- [
- -101.281272,
- 29.597249
- ],
- [
- -101.290545,
- 29.575761
- ],
- [
- -101.295255,
- 29.570168
- ],
- [
- -101.306146,
- 29.574583
- ],
- [
- -101.317626,
- 29.584003
- ],
- [
- -101.323955,
- 29.592539
- ],
- [
- -101.323661,
- 29.603137
- ],
- [
- -101.318804,
- 29.616383
- ],
- [
- -101.311445,
- 29.628158
- ],
- [
- -101.303497,
- 29.634045
- ],
- [
- -101.303669,
- 29.631411
- ],
- [
- -101.302727,
- 29.633851
- ],
- [
- -101.301073,
- 29.649509
- ],
- [
- -101.30978,
- 29.654548
- ],
- [
- -101.336239,
- 29.654315
- ],
- [
- -101.349029,
- 29.660103
- ],
- [
- -101.357684,
- 29.667441
- ],
- [
- -101.364351,
- 29.676665
- ],
- [
- -101.376624,
- 29.700643
- ],
- [
- -101.383368,
- 29.718497
- ],
- [
- -101.39962,
- 29.740718
- ],
- [
- -101.406545,
- 29.752888
- ],
- [
- -101.409309,
- 29.765781
- ],
- [
- -101.405098,
- 29.778442
- ],
- [
- -101.414012,
- 29.774411
- ],
- [
- -101.424218,
- 29.771414
- ],
- [
- -101.435096,
- 29.770122
- ],
- [
- -101.446103,
- 29.771052
- ],
- [
- -101.455689,
- 29.77591
- ],
- [
- -101.462433,
- 29.788932
- ],
- [
- -101.470908,
- 29.791516
- ],
- [
- -101.490286,
- 29.785547
- ],
- [
- -101.505763,
- 29.773894
- ],
- [
- -101.521809,
- 29.765936
- ],
- [
- -101.542893,
- 29.771052
- ],
- [
- -101.539689,
- 29.779191
- ],
- [
- -101.530516,
- 29.796477
- ],
- [
- -101.528604,
- 29.801438
- ],
- [
- -101.531912,
- 29.811101
- ],
- [
- -101.539172,
- 29.817974
- ],
- [
- -101.546458,
- 29.820145
- ],
- [
- -101.549766,
- 29.815701
- ],
- [
- -101.553977,
- 29.796684
- ],
- [
- -101.564907,
- 29.786478
- ],
- [
- -101.580281,
- 29.781568
- ],
- [
- -101.632216,
- 29.775651
- ],
- [
- -101.794531,
- 29.795857
- ],
- [
- -101.80298,
- 29.801438
- ],
- [
- -101.805978,
- 29.811928
- ],
- [
- -101.812695,
- 29.812032
- ],
- [
- -101.82409,
- 29.805184
- ],
- [
- -101.857602,
- 29.805184
- ],
- [
- -101.877524,
- 29.810843
- ],
- [
- -101.88742,
- 29.81229
- ],
- [
- -101.895455,
- 29.808621
- ],
- [
- -101.90238,
- 29.803247
- ],
- [
- -101.910881,
- 29.799888
- ],
- [
- -101.920157,
- 29.798182
- ],
- [
- -101.929613,
- 29.797717
- ],
- [
- -101.942662,
- 29.803608
- ],
- [
- -101.957054,
- 29.814047
- ],
- [
- -101.972246,
- 29.818181
- ],
- [
- -101.98793,
- 29.805184
- ],
- [
- -102.014595,
- 29.810998
- ],
- [
- -102.109344,
- 29.80211
- ],
- [
- -102.145647,
- 29.815701
- ],
- [
- -102.157248,
- 29.824537
- ],
- [
- -102.203679,
- 29.846138
- ],
- [
- -102.239775,
- 29.849135
- ],
- [
- -102.253444,
- 29.855285
- ],
- [
- -102.258276,
- 29.873475
- ],
- [
- -102.276181,
- 29.869547
- ],
- [
- -102.289023,
- 29.878126
- ],
- [
- -102.302175,
- 29.889391
- ],
- [
- -102.321011,
- 29.893939
- ],
- [
- -102.330235,
- 29.888926
- ],
- [
- -102.339769,
- 29.870633
- ],
- [
- -102.351061,
- 29.866602
- ],
- [
- -102.36323,
- 29.864276
- ],
- [
- -102.370723,
- 29.857765
- ],
- [
- -102.374547,
- 29.848102
- ],
- [
- -102.376589,
- 29.821488
- ],
- [
- -102.380051,
- 29.811386
- ],
- [
- -102.404132,
- 29.780793
- ],
- [
- -102.406096,
- 29.777279
- ],
- [
- -102.515288,
- 29.784721
- ],
- [
- -102.523066,
- 29.782318
- ],
- [
- -102.531127,
- 29.769915
- ],
- [
- -102.54154,
- 29.762474
- ],
- [
- -102.543349,
- 29.760123
- ],
- [
- -102.546578,
- 29.757875
- ],
- [
- -102.553141,
- 29.756738
- ],
- [
- -102.558309,
- 29.759089
- ],
- [
- -102.562882,
- 29.769347
- ],
- [
- -102.566758,
- 29.771052
- ],
- [
- -102.58531,
- 29.764696
- ],
- [
- -102.621225,
- 29.747281
- ],
- [
- -102.638743,
- 29.743715
- ],
- [
- -102.676054,
- 29.74449
- ],
- [
- -102.683469,
- 29.743715
- ],
- [
- -102.69104,
- 29.736817
- ],
- [
- -102.693624,
- 29.729401
- ],
- [
- -102.694709,
- 29.720616
- ],
- [
- -102.697758,
- 29.709557
- ],
- [
- -102.726748,
- 29.664495
- ],
- [
- -102.73127,
- 29.650594
- ],
- [
- -102.735507,
- 29.649509
- ],
- [
- -102.751656,
- 29.622457
- ],
- [
- -102.75176,
- 29.620157
- ],
- [
- -102.761346,
- 29.603414
- ],
- [
- -102.767598,
- 29.59729
- ],
- [
- -102.779665,
- 29.592303
- ],
- [
- -102.774084,
- 29.579617
- ],
- [
- -102.776461,
- 29.575948
- ],
- [
- -102.785892,
- 29.571814
- ],
- [
- -102.78075,
- 29.558249
- ],
- [
- -102.786512,
- 29.550497
- ],
- [
- -102.795478,
- 29.54427
- ],
- [
- -102.827311,
- 29.470502
- ],
- [
- -102.833951,
- 29.461355
- ],
- [
- -102.839067,
- 29.45195
- ],
- [
- -102.841134,
- 29.438308
- ],
- [
- -102.838705,
- 29.426939
- ],
- [
- -102.834984,
- 29.415699
- ],
- [
- -102.835191,
- 29.403839
- ],
- [
- -102.844545,
- 29.390533
- ],
- [
- -102.845578,
- 29.384719
- ],
- [
- -102.838033,
- 29.370534
- ],
- [
- -102.837672,
- 29.366322
- ],
- [
- -102.84656,
- 29.361749
- ],
- [
- -102.853872,
- 29.361
- ],
- [
- -102.859867,
- 29.361155
- ],
- [
- -102.864957,
- 29.359527
- ],
- [
- -102.876972,
- 29.350871
- ],
- [
- -102.883069,
- 29.343766
- ],
- [
- -102.885188,
- 29.333379
- ],
- [
- -102.885498,
- 29.314801
- ],
- [
- -102.899399,
- 29.276095
- ],
- [
- -102.899709,
- 29.2639
- ],
- [
- -102.892139,
- 29.254391
- ],
- [
- -102.867954,
- 29.240387
- ],
- [
- -102.858781,
- 29.229147
- ],
- [
- -102.869866,
- 29.224781
- ],
- [
- -102.896893,
- 29.220285
- ],
- [
- -102.942265,
- 29.190209
- ],
- [
- -102.947536,
- 29.182018
- ],
- [
- -102.969757,
- 29.192845
- ],
- [
- -102.988386,
- 29.177135
- ],
- [
- -103.015826,
- 29.126776
- ],
- [
- -103.024275,
- 29.116157
- ],
- [
- -103.032621,
- 29.110214
- ],
- [
- -103.072541,
- 29.091404
- ],
- [
- -103.080758,
- 29.085203
- ],
- [
- -103.085589,
- 29.07572
- ],
- [
- -103.091532,
- 29.057866
- ],
- [
- -103.095356,
- 29.060294
- ],
- [
- -103.104684,
- 29.057866
- ],
- [
- -103.109205,
- 29.023372
- ],
- [
- -103.122771,
- 28.996474
- ],
- [
- -103.147989,
- 28.985105
- ],
- [
- -103.187108,
- 28.990221
- ],
- [
- -103.241756,
- 29.003502
- ],
- [
- -103.301545,
- 29.002365
- ],
- [
- -103.316247,
- 29.010065
- ],
- [
- -103.311514,
- 29.026043
- ],
- [
- -103.309994,
- 29.031175
- ],
- [
- -103.3248,
- 29.026808
- ],
- [
- -103.330484,
- 29.023733
- ],
- [
- -103.342602,
- 29.041226
- ],
- [
- -103.351671,
- 29.039417
- ],
- [
- -103.360534,
- 29.029831
- ],
- [
- -103.372083,
- 29.023733
- ],
- [
- -103.38663,
- 29.028798
- ],
- [
- -103.414639,
- 29.052414
- ],
- [
- -103.423605,
- 29.057866
- ],
- [
- -103.435697,
- 29.061121
- ],
- [
- -103.478537,
- 29.08205
- ],
- [
- -103.529748,
- 29.126776
- ],
- [
- -103.535588,
- 29.135122
- ],
- [
- -103.538223,
- 29.142408
- ],
- [
- -103.541711,
- 29.148816
- ],
- [
- -103.550238,
- 29.154656
- ],
- [
- -103.558015,
- 29.156206
- ],
- [
- -103.58499,
- 29.154656
- ],
- [
- -103.673125,
- 29.173569
- ],
- [
- -103.702477,
- 29.187858
- ],
- [
- -103.749476,
- 29.222972
- ],
- [
- -103.759062,
- 29.226848
- ],
- [
- -103.770767,
- 29.229845
- ],
- [
- -103.777718,
- 29.235297
- ],
- [
- -103.769424,
- 29.257543
- ],
- [
- -103.774229,
- 29.267517
- ],
- [
- -103.78366,
- 29.274803
- ],
- [
- -103.794177,
- 29.277594
- ],
- [
- -103.837038,
- 29.279906
- ]
- ]
- ],
- [
- [
- [
- 178.301106,
- 52.056551
- ],
- [
- 179.595462,
- 52.142083
- ],
- [
- 179.825447,
- 51.992849
- ],
- [
- 179.661729,
- 51.485763
- ],
- [
- 179.723231,
- 51.459963
- ],
- [
- 179.408066,
- 51.209841
- ],
- [
- 178.411463,
- 51.523605
- ],
- [
- 177.698335,
- 51.877899
- ],
- [
- 177.16784,
- 51.581866
- ],
- [
- 176.487008,
- 52.175325
- ],
- [
- 174.484678,
- 52.08716
- ],
- [
- 172.866263,
- 52.207379
- ],
- [
- 172.825506,
- 52.716846
- ],
- [
- 172.747012,
- 52.654022
- ],
- [
- 172.08261,
- 52.952695
- ],
- [
- 172.942925,
- 53.183013
- ],
- [
- 173.029416,
- 52.993628
- ],
- [
- 173.127208,
- 52.99494
- ],
- [
- 173.143321,
- 52.990383
- ],
- [
- 173.175059,
- 52.971747
- ],
- [
- 173.182932,
- 52.968373
- ],
- [
- 176.45233,
- 52.628178
- ],
- [
- 176.468135,
- 52.488358
- ],
- [
- 177.900385,
- 52.488358
- ],
- [
- 178.007601,
- 52.179677
- ],
- [
- 178.301106,
- 52.056551
- ]
- ]
- ],
- [
- [
- [
- -168.899607,
- 65.747626
- ],
- [
- -168.909861,
- 65.739569
- ],
- [
- -168.926218,
- 65.739895
- ],
- [
- -168.942128,
- 65.74372
- ],
- [
- -168.951731,
- 65.75316
- ],
- [
- -168.942983,
- 65.764716
- ],
- [
- -168.920115,
- 65.768866
- ],
- [
- -168.907908,
- 65.768297
- ],
- [
- -168.902781,
- 65.761542
- ],
- [
- -168.899607,
- 65.747626
- ]
- ]
- ],
- [
- [
- [
- -131.160718,
- 54.787192
- ],
- [
- -132.853508,
- 54.482536
- ],
- [
- -134.77719,
- 54.717786
- ],
- [
- -142.6966,
- 55.845503
- ],
- [
- -142.861997,
- 49.948308
- ],
- [
- -155.675916,
- 51.109976
- ],
- [
- -164.492732,
- 50.603976
- ],
- [
- -164.691217,
- 50.997975
- ],
- [
- -171.246993,
- 49.948308
- ],
- [
- -171.215436,
- 50.576636
- ],
- [
- -173.341669,
- 50.968826
- ],
- [
- -173.362022,
- 51.082198
- ],
- [
- -177.799603,
- 51.272899
- ],
- [
- -179.155463,
- 50.982285
- ],
- [
- -179.476076,
- 52.072632
- ],
- [
- -177.11459,
- 52.248701
- ],
- [
- -177.146284,
- 52.789384
- ],
- [
- -174.777218,
- 52.443779
- ],
- [
- -174.773743,
- 52.685853
- ],
- [
- -173.653194,
- 52.704099
- ],
- [
- -173.790528,
- 53.469081
- ],
- [
- -171.063371,
- 53.604473
- ],
- [
- -170.777733,
- 59.291898
- ],
- [
- -174.324884,
- 60.332184
- ],
- [
- -171.736408,
- 62.68026
- ],
- [
- -172.315705,
- 62.725352
- ],
- [
- -171.995091,
- 63.999658
- ],
- [
- -168.501424,
- 65.565173
- ],
- [
- -168.714145,
- 65.546708
- ],
- [
- -168.853077,
- 68.370871
- ],
- [
- -161.115601,
- 72.416214
- ],
- [
- -146.132257,
- 70.607941
- ],
- [
- -140.692512,
- 69.955349
- ],
- [
- -141.145395,
- 69.671641
- ],
- [
- -141.015207,
- 69.654202
- ],
- [
- -141.006459,
- 69.651272
- ],
- [
- -141.005564,
- 69.650946
- ],
- [
- -141.005549,
- 69.650941
- ],
- [
- -141.005471,
- 69.505164
- ],
- [
- -141.001208,
- 60.466879
- ],
- [
- -141.001156,
- 60.321074
- ],
- [
- -140.994929,
- 60.304382
- ],
- [
- -140.979555,
- 60.295804
- ],
- [
- -140.909146,
- 60.28366
- ],
- [
- -140.768457,
- 60.259269
- ],
- [
- -140.660505,
- 60.24051
- ],
- [
- -140.533743,
- 60.218548
- ],
- [
- -140.518705,
- 60.22387
- ],
- [
- -140.506664,
- 60.236324
- ],
- [
- -140.475323,
- 60.276477
- ],
- [
- -140.462791,
- 60.289138
- ],
- [
- -140.447805,
- 60.29446
- ],
- [
- -140.424111,
- 60.293168
- ],
- [
- -140.32497,
- 60.267537
- ],
- [
- -140.169243,
- 60.227229
- ],
- [
- -140.01579,
- 60.187387
- ],
- [
- -139.967757,
- 60.188369
- ],
- [
- -139.916933,
- 60.207851
- ],
- [
- -139.826318,
- 60.256478
- ],
- [
- -139.728417,
- 60.309033
- ],
- [
- -139.679816,
- 60.32681
- ],
- [
- -139.628346,
- 60.334096
- ],
- [
- -139.517965,
- 60.336732
- ],
- [
- -139.413992,
- 60.339212
- ],
- [
- -139.262193,
- 60.342778
- ],
- [
- -139.101608,
- 60.346602
- ],
- [
- -139.079465,
- 60.341021
- ],
- [
- -139.06869,
- 60.322056
- ],
- [
- -139.073186,
- 60.299835
- ],
- [
- -139.113468,
- 60.226816
- ],
- [
- -139.149615,
- 60.161187
- ],
- [
- -139.183231,
- 60.100157
- ],
- [
- -139.182146,
- 60.073389
- ],
- [
- -139.112305,
- 60.031376
- ],
- [
- -139.060207,
- 60.000059
- ],
- [
- -139.051611,
- 59.994892
- ],
- [
- -139.003759,
- 59.977219
- ],
- [
- -138.842425,
- 59.937686
- ],
- [
- -138.742586,
- 59.913192
- ],
- [
- -138.704888,
- 59.898464
- ],
- [
- -138.697188,
- 59.89371
- ],
- [
- -138.692098,
- 59.886888
- ],
- [
- -138.654349,
- 59.805498
- ],
- [
- -138.63745,
- 59.784052
- ],
- [
- -138.59921,
- 59.753822
- ],
- [
- -138.488881,
- 59.696357
- ],
- [
- -138.363617,
- 59.631142
- ],
- [
- -138.219543,
- 59.556004
- ],
- [
- -138.067614,
- 59.476991
- ],
- [
- -137.91057,
- 59.395187
- ],
- [
- -137.758305,
- 59.315915
- ],
- [
- -137.611363,
- 59.239331
- ],
- [
- -137.594181,
- 59.225275
- ],
- [
- -137.582088,
- 59.206568
- ],
- [
- -137.5493,
- 59.134531
- ],
- [
- -137.521007,
- 59.072364
- ],
- [
- -137.484394,
- 58.991904
- ],
- [
- -137.507752,
- 58.939969
- ],
- [
- -137.50876,
- 58.914906
- ],
- [
- -137.486875,
- 58.900075
- ],
- [
- -137.453466,
- 58.899145
- ],
- [
- -137.423106,
- 58.907723
- ],
- [
- -137.338098,
- 58.955472
- ],
- [
- -137.2819,
- 58.98715
- ],
- [
- -137.172346,
- 59.027148
- ],
- [
- -137.062367,
- 59.067572
- ],
- [
- -137.047109,
- 59.07331
- ],
- [
- -136.942282,
- 59.11107
- ],
- [
- -136.840816,
- 59.148174
- ],
- [
- -136.785496,
- 59.157217
- ],
- [
- -136.671911,
- 59.150809
- ],
- [
- -136.613491,
- 59.15422
- ],
- [
- -136.569489,
- 59.172152
- ],
- [
- -136.484791,
- 59.2538
- ],
- [
- -136.483551,
- 59.257469
- ],
- [
- -136.466549,
- 59.287803
- ],
- [
- -136.467092,
- 59.38449
- ],
- [
- -136.467557,
- 59.461643
- ],
- [
- -136.415958,
- 59.452238
- ],
- [
- -136.36684,
- 59.449551
- ],
- [
- -136.319995,
- 59.459059
- ],
- [
- -136.275036,
- 59.486448
- ],
- [
- -136.244728,
- 59.528202
- ],
- [
- -136.258474,
- 59.556107
- ],
- [
- -136.29935,
- 59.575745
- ],
- [
- -136.350329,
- 59.592384
- ],
- [
- -136.2585,
- 59.621582
- ],
- [
- -136.145406,
- 59.636826
- ],
- [
- -136.02686,
- 59.652846
- ],
- [
- -135.923818,
- 59.666747
- ],
- [
- -135.830955,
- 59.693257
- ],
- [
- -135.641251,
- 59.747362
- ],
- [
- -135.482759,
- 59.792475
- ],
- [
- -135.465137,
- 59.789685
- ],
- [
- -135.404392,
- 59.753305
- ],
- [
- -135.345791,
- 59.731032
- ],
- [
- -135.259879,
- 59.698218
- ],
- [
- -135.221897,
- 59.675273
- ],
- [
- -135.192028,
- 59.64711
- ],
- [
- -135.157792,
- 59.623287
- ],
- [
- -135.106684,
- 59.613158
- ],
- [
- -135.087874,
- 59.606544
- ],
- [
- -135.032942,
- 59.573109
- ],
- [
- -135.018524,
- 59.559363
- ],
- [
- -135.016198,
- 59.543447
- ],
- [
- -135.01948,
- 59.493166
- ],
- [
- -135.023252,
- 59.477146
- ],
- [
- -135.037489,
- 59.461591
- ],
- [
- -135.078598,
- 59.438337
- ],
- [
- -135.095754,
- 59.418855
- ],
- [
- -134.993254,
- 59.381906
- ],
- [
- -135.00483,
- 59.367127
- ],
- [
- -135.014441,
- 59.35152
- ],
- [
- -135.016198,
- 59.336173
- ],
- [
- -134.979973,
- 59.297415
- ],
- [
- -134.95783,
- 59.280982
- ],
- [
- -134.932431,
- 59.270647
- ],
- [
- -134.839465,
- 59.258141
- ],
- [
- -134.74345,
- 59.245119
- ],
- [
- -134.70552,
- 59.240106
- ],
- [
- -134.692084,
- 59.235249
- ],
- [
- -134.68286,
- 59.223001
- ],
- [
- -134.671439,
- 59.193752
- ],
- [
- -134.66038,
- 59.181298
- ],
- [
- -134.610771,
- 59.144556
- ],
- [
- -134.582788,
- 59.128847
- ],
- [
- -134.556717,
- 59.123059
- ],
- [
- -134.509072,
- 59.122801
- ],
- [
- -134.477575,
- 59.114946
- ],
- [
- -134.451013,
- 59.097893
- ],
- [
- -134.398019,
- 59.051952
- ],
- [
- -134.387167,
- 59.036863
- ],
- [
- -134.385591,
- 59.018828
- ],
- [
- -134.399389,
- 58.974954
- ],
- [
- -134.343423,
- 58.968857
- ],
- [
- -134.329651,
- 58.963017
- ],
- [
- -134.320039,
- 58.952682
- ],
- [
- -134.32314,
- 58.949168
- ],
- [
- -134.330323,
- 58.945344
- ],
- [
- -134.333036,
- 58.93413
- ],
- [
- -134.327403,
- 58.916457
- ],
- [
- -134.316939,
- 58.903796
- ],
- [
- -134.22219,
- 58.842714
- ],
- [
- -134.108838,
- 58.808246
- ],
- [
- -133.983109,
- 58.769902
- ],
- [
- -133.87123,
- 58.735899
- ],
- [
- -133.831129,
- 58.718019
- ],
- [
- -133.796402,
- 58.693421
- ],
- [
- -133.700077,
- 58.59937
- ],
- [
- -133.626283,
- 58.546402
- ],
- [
- -133.547063,
- 58.505577
- ],
- [
- -133.463089,
- 58.462221
- ],
- [
- -133.392241,
- 58.403878
- ],
- [
- -133.43012,
- 58.372097
- ],
- [
- -133.41503,
- 58.330549
- ],
- [
- -133.374567,
- 58.290965
- ],
- [
- -133.257262,
- 58.210298
- ],
- [
- -133.165588,
- 58.147305
- ],
- [
- -133.142127,
- 58.120588
- ],
- [
- -133.094843,
- 58.0331
- ],
- [
- -133.075154,
- 58.007882
- ],
- [
- -132.99335,
- 57.941917
- ],
- [
- -132.917153,
- 57.880499
- ],
- [
- -132.83212,
- 57.791564
- ],
- [
- -132.70944,
- 57.663303
- ],
- [
- -132.629057,
- 57.579277
- ],
- [
- -132.552447,
- 57.499075
- ],
- [
- -132.455735,
- 57.420992
- ],
- [
- -132.362304,
- 57.3457
- ],
- [
- -132.304684,
- 57.280355
- ],
- [
- -132.230994,
- 57.19682
- ],
- [
- -132.276366,
- 57.14889
- ],
- [
- -132.34122,
- 57.080393
- ],
- [
- -132.16229,
- 57.050317
- ],
- [
- -132.031859,
- 57.028406
- ],
- [
- -132.107384,
- 56.858753
- ],
- [
- -131.871558,
- 56.79346
- ],
- [
- -131.865874,
- 56.785708
- ],
- [
- -131.872411,
- 56.77297
- ],
- [
- -131.882617,
- 56.759146
- ],
- [
- -131.887966,
- 56.747958
- ],
- [
- -131.886028,
- 56.737055
- ],
- [
- -131.880705,
- 56.728838
- ],
- [
- -131.864789,
- 56.71349
- ],
- [
- -131.838976,
- 56.682278
- ],
- [
- -131.830424,
- 56.664759
- ],
- [
- -131.826574,
- 56.644606
- ],
- [
- -131.832103,
- 56.603368
- ],
- [
- -131.825592,
- 56.593343
- ],
- [
- -131.799108,
- 56.587658
- ],
- [
- -131.692293,
- 56.585074
- ],
- [
- -131.585891,
- 56.595048
- ],
- [
- -131.560363,
- 56.594066
- ],
- [
- -131.536437,
- 56.585229
- ],
- [
- -131.491659,
- 56.560166
- ],
- [
- -131.345699,
- 56.503271
- ],
- [
- -131.215604,
- 56.45255
- ],
- [
- -131.100546,
- 56.407669
- ],
- [
- -131.016934,
- 56.38705
- ],
- [
- -130.839089,
- 56.372452
- ],
- [
- -130.760334,
- 56.345192
- ],
- [
- -130.645768,
- 56.261942
- ],
- [
- -130.602256,
- 56.247059
- ],
- [
- -130.495518,
- 56.232434
- ],
- [
- -130.47229,
- 56.22489
- ],
- [
- -130.458053,
- 56.210653
- ],
- [
- -130.427926,
- 56.143964
- ],
- [
- -130.418159,
- 56.129702
- ],
- [
- -130.403974,
- 56.121898
- ],
- [
- -130.290311,
- 56.10097
- ],
- [
- -130.243156,
- 56.092391
- ],
- [
- -130.211246,
- 56.089962
- ],
- [
- -130.116756,
- 56.105646
- ],
- [
- -130.094328,
- 56.101486
- ],
- [
- -130.071539,
- 56.084123
- ],
- [
- -130.039319,
- 56.045521
- ],
- [
- -130.026632,
- 56.024101
- ],
- [
- -130.01901,
- 56.002216
- ],
- [
- -130.014695,
- 55.963252
- ],
- [
- -130.016788,
- 55.918913
- ],
- [
- -130.019612,
- 55.907978
- ],
- [
- -130.019618,
- 55.907952
- ],
- [
- -130.022817,
- 55.901353
- ],
- [
- -130.049387,
- 55.871405
- ],
- [
- -130.104726,
- 55.825263
- ],
- [
- -130.136627,
- 55.806464
- ],
- [
- -130.148834,
- 55.795356
- ],
- [
- -130.163482,
- 55.771145
- ],
- [
- -130.167307,
- 55.766262
- ],
- [
- -130.170806,
- 55.759833
- ],
- [
- -130.173655,
- 55.749498
- ],
- [
- -130.170806,
- 55.740953
- ],
- [
- -130.163808,
- 55.734565
- ],
- [
- -130.160064,
- 55.727118
- ],
- [
- -130.167388,
- 55.715399
- ],
- [
- -130.155914,
- 55.700141
- ],
- [
- -130.142893,
- 55.689521
- ],
- [
- -130.131825,
- 55.676581
- ],
- [
- -130.126454,
- 55.653998
- ],
- [
- -130.12857,
- 55.63642
- ],
- [
- -130.135121,
- 55.619127
- ],
- [
- -130.153147,
- 55.58511
- ],
- [
- -130.148671,
- 55.578192
- ],
- [
- -130.146881,
- 55.569322
- ],
- [
- -130.146962,
- 55.547187
- ],
- [
- -130.112172,
- 55.509345
- ],
- [
- -130.101674,
- 55.481147
- ],
- [
- -130.095082,
- 55.472113
- ],
- [
- -130.065419,
- 55.446112
- ],
- [
- -130.057525,
- 55.434882
- ],
- [
- -130.052561,
- 55.414008
- ],
- [
- -130.054311,
- 55.366645
- ],
- [
- -130.05012,
- 55.345445
- ],
- [
- -130.039296,
- 55.330756
- ],
- [
- -129.989247,
- 55.284003
- ],
- [
- -130.031239,
- 55.26435
- ],
- [
- -130.050038,
- 55.252875
- ],
- [
- -130.067494,
- 55.239
- ],
- [
- -130.078236,
- 55.233791
- ],
- [
- -130.100494,
- 55.230292
- ],
- [
- -130.104726,
- 55.225653
- ],
- [
- -130.105702,
- 55.211127
- ],
- [
- -130.10912,
- 55.200751
- ],
- [
- -130.115793,
- 55.191596
- ],
- [
- -130.126454,
- 55.180976
- ],
- [
- -130.151967,
- 55.163275
- ],
- [
- -130.159983,
- 55.153713
- ],
- [
- -130.167592,
- 55.129584
- ],
- [
- -130.173695,
- 55.117743
- ],
- [
- -130.200266,
- 55.104153
- ],
- [
- -130.211781,
- 55.084133
- ],
- [
- -130.228871,
- 55.04385
- ],
- [
- -130.238678,
- 55.03441
- ],
- [
- -130.261342,
- 55.022895
- ],
- [
- -130.269846,
- 55.016547
- ],
- [
- -130.275706,
- 55.006985
- ],
- [
- -130.286366,
- 54.983222
- ],
- [
- -130.294342,
- 54.971869
- ],
- [
- -130.326568,
- 54.952094
- ],
- [
- -130.335561,
- 54.938707
- ],
- [
- -130.365387,
- 54.907294
- ],
- [
- -130.385243,
- 54.896552
- ],
- [
- -130.430816,
- 54.881252
- ],
- [
- -130.488759,
- 54.844184
- ],
- [
- -130.580312,
- 54.806383
- ],
- [
- -130.597485,
- 54.803391
- ],
- [
- -130.71074,
- 54.733215
- ],
- [
- -131.160718,
- 54.787192
- ]
- ]
- ]
- ]
- }
- }
- ]
- },
- "featureIcons": {
- "airfield": {
- "12": [
- 0,
- 0
- ],
- "18": [
- 0,
- 14
- ],
- "24": [
- 0,
- 34
- ]
- },
- "airport": {
- "12": [
- 0,
- 60
- ],
- "18": [
- 0,
- 74
- ],
- "24": [
- 0,
- 94
- ]
- },
- "alcohol-shop": {
- "12": [
- 0,
- 120
- ],
- "18": [
- 0,
- 134
- ],
- "24": [
- 0,
- 154
- ]
- },
- "america-football": {
- "12": [
- 0,
- 180
- ],
- "18": [
- 0,
- 194
- ],
- "24": [
- 0,
- 214
- ]
- },
- "art-gallery": {
- "12": [
- 0,
- 240
- ],
- "18": [
- 0,
- 254
- ],
- "24": [
- 0,
- 274
- ]
- },
- "bank": {
- "12": [
- 0,
- 300
- ],
- "18": [
- 0,
- 314
- ],
- "24": [
- 0,
- 334
- ]
- },
- "bar": {
- "12": [
- 0,
- 360
- ],
- "18": [
- 0,
- 374
- ],
- "24": [
- 0,
- 394
- ]
- },
- "baseball": {
- "12": [
- 0,
- 420
- ],
- "18": [
- 0,
- 434
- ],
- "24": [
- 0,
- 454
- ]
- },
- "basketball": {
- "12": [
- 0,
- 480
- ],
- "18": [
- 0,
- 494
- ],
- "24": [
- 0,
- 514
- ]
- },
- "beer": {
- "12": [
- 0,
- 540
- ],
- "18": [
- 0,
- 554
- ],
- "24": [
- 0,
- 574
- ]
- },
- "bicycle": {
- "12": [
- 0,
- 600
- ],
- "18": [
- 0,
- 614
- ],
- "24": [
- 0,
- 634
- ]
- },
- "building": {
- "12": [
- 0,
- 660
- ],
- "18": [
- 0,
- 674
- ],
- "24": [
- 0,
- 694
- ]
- },
- "bus": {
- "12": [
- 0,
- 720
- ],
- "18": [
- 0,
- 734
- ],
- "24": [
- 0,
- 754
- ]
- },
- "cafe": {
- "12": [
- 0,
- 780
- ],
- "18": [
- 0,
- 794
- ],
- "24": [
- 0,
- 814
- ]
- },
- "campsite": {
- "12": [
- 0,
- 840
- ],
- "18": [
- 0,
- 854
- ],
- "24": [
- 0,
- 874
- ]
- },
- "cemetery": {
- "12": [
- 0,
- 900
- ],
- "18": [
- 0,
- 914
- ],
- "24": [
- 0,
- 934
- ]
- },
- "cinema": {
- "12": [
- 0,
- 960
- ],
- "18": [
- 0,
- 974
- ],
- "24": [
- 0,
- 994
- ]
- },
- "circle": {
- "12": [
- 0,
- 1020
- ],
- "18": [
- 0,
- 1034
- ],
- "24": [
- 0,
- 1054
- ]
- },
- "circle-stroked": {
- "12": [
- 0,
- 1080
- ],
- "18": [
- 0,
- 1094
- ],
- "24": [
- 0,
- 1114
- ]
- },
- "college": {
- "12": [
- 0,
- 1140
- ],
- "18": [
- 0,
- 1154
- ],
- "24": [
- 0,
- 1174
- ]
- },
- "commercial": {
- "12": [
- 0,
- 1200
- ],
- "18": [
- 0,
- 1214
- ],
- "24": [
- 0,
- 1234
- ]
- },
- "cricket": {
- "12": [
- 0,
- 1260
- ],
- "18": [
- 0,
- 1274
- ],
- "24": [
- 0,
- 1294
- ]
- },
- "cross": {
- "12": [
- 0,
- 1320
- ],
- "18": [
- 0,
- 1334
- ],
- "24": [
- 0,
- 1354
- ]
- },
- "dam": {
- "12": [
- 0,
- 1380
- ],
- "18": [
- 0,
- 1394
- ],
- "24": [
- 0,
- 1414
- ]
- },
- "danger": {
- "12": [
- 0,
- 1440
- ],
- "18": [
- 0,
- 1454
- ],
- "24": [
- 0,
- 1474
- ]
- },
- "disability": {
- "12": [
- 0,
- 1500
- ],
- "18": [
- 0,
- 1514
- ],
- "24": [
- 0,
- 1534
- ]
- },
- "embassy": {
- "12": [
- 0,
- 1560
- ],
- "18": [
- 0,
- 1574
- ],
- "24": [
- 0,
- 1594
- ]
- },
- "emergency-telephone": {
- "12": [
- 0,
- 1620
- ],
- "18": [
- 0,
- 1634
- ],
- "24": [
- 0,
- 1654
- ]
- },
- "fast-food": {
- "12": [
- 0,
- 1680
- ],
- "18": [
- 0,
- 1694
- ],
- "24": [
- 0,
- 1714
- ]
- },
- "ferry": {
- "12": [
- 0,
- 1740
- ],
- "18": [
- 0,
- 1754
- ],
- "24": [
- 0,
- 1774
- ]
- },
- "fire-station": {
- "12": [
- 0,
- 1800
- ],
- "18": [
- 0,
- 1814
- ],
- "24": [
- 0,
- 1834
- ]
- },
- "fuel": {
- "12": [
- 0,
- 1860
- ],
- "18": [
- 0,
- 1874
- ],
- "24": [
- 0,
- 1894
- ]
- },
- "garden": {
- "12": [
- 0,
- 1920
- ],
- "18": [
- 0,
- 1934
- ],
- "24": [
- 0,
- 1954
- ]
- },
- "golf": {
- "12": [
- 0,
- 1980
- ],
- "18": [
- 0,
- 1994
- ],
- "24": [
- 0,
- 2014
- ]
- },
- "grocery": {
- "12": [
- 0,
- 2040
- ],
- "18": [
- 0,
- 2054
- ],
- "24": [
- 0,
- 2074
- ]
- },
- "harbor": {
- "12": [
- 0,
- 2100
- ],
- "18": [
- 0,
- 2114
- ],
- "24": [
- 0,
- 2134
- ]
- },
- "heliport": {
- "12": [
- 0,
- 2160
- ],
- "18": [
- 0,
- 2174
- ],
- "24": [
- 0,
- 2194
- ]
- },
- "hospital": {
- "12": [
- 0,
- 2220
- ],
- "18": [
- 0,
- 2234
- ],
- "24": [
- 0,
- 2254
- ]
- },
- "industrial": {
- "12": [
- 0,
- 2280
- ],
- "18": [
- 0,
- 2294
- ],
- "24": [
- 0,
- 2314
- ]
- },
- "library": {
- "12": [
- 0,
- 2340
- ],
- "18": [
- 0,
- 2354
- ],
- "24": [
- 0,
- 2374
- ]
- },
- "lodging": {
- "12": [
- 0,
- 2400
- ],
- "18": [
- 0,
- 2414
- ],
- "24": [
- 0,
- 2434
- ]
- },
- "logging": {
- "12": [
- 0,
- 2460
- ],
- "18": [
- 0,
- 2474
- ],
- "24": [
- 0,
- 2494
- ]
- },
- "marker": {
- "12": [
- 0,
- 2520
- ],
- "18": [
- 0,
- 2534
- ],
- "24": [
- 0,
- 2554
- ]
- },
- "marker-stroked": {
- "12": [
- 0,
- 2580
- ],
- "18": [
- 0,
- 2594
- ],
- "24": [
- 0,
- 2614
- ]
- },
- "monument": {
- "12": [
- 0,
- 2640
- ],
- "18": [
- 0,
- 2654
- ],
- "24": [
- 0,
- 2674
- ]
- },
- "museum": {
- "12": [
- 0,
- 2700
- ],
- "18": [
- 0,
- 2714
- ],
- "24": [
- 0,
- 2734
- ]
- },
- "music": {
- "12": [
- 0,
- 2760
- ],
- "18": [
- 0,
- 2774
- ],
- "24": [
- 0,
- 2794
- ]
- },
- "oil-well": {
- "12": [
- 0,
- 2820
- ],
- "18": [
- 0,
- 2834
- ],
- "24": [
- 0,
- 2854
- ]
- },
- "park": {
- "12": [
- 0,
- 2880
- ],
- "18": [
- 0,
- 2894
- ],
- "24": [
- 0,
- 2914
- ]
- },
- "park2": {
- "12": [
- 0,
- 2940
- ],
- "18": [
- 0,
- 2954
- ],
- "24": [
- 0,
- 2974
- ]
- },
- "parking": {
- "12": [
- 0,
- 3000
- ],
- "18": [
- 0,
- 3014
- ],
- "24": [
- 0,
- 3034
- ]
- },
- "parking-garage": {
- "12": [
- 0,
- 3060
- ],
- "18": [
- 0,
- 3074
- ],
- "24": [
- 0,
- 3094
- ]
- },
- "pharmacy": {
- "12": [
- 0,
- 3120
- ],
- "18": [
- 0,
- 3134
- ],
- "24": [
- 0,
- 3154
- ]
- },
- "pitch": {
- "12": [
- 0,
- 3180
- ],
- "18": [
- 0,
- 3194
- ],
- "24": [
- 0,
- 3214
- ]
- },
- "place-of-worship": {
- "12": [
- 0,
- 3240
- ],
- "18": [
- 0,
- 3254
- ],
- "24": [
- 0,
- 3274
- ]
- },
- "police": {
- "12": [
- 0,
- 3300
- ],
- "18": [
- 0,
- 3314
- ],
- "24": [
- 0,
- 3334
- ]
- },
- "post": {
- "12": [
- 0,
- 3360
- ],
- "18": [
- 0,
- 3374
- ],
- "24": [
- 0,
- 3394
- ]
- },
- "prison": {
- "12": [
- 0,
- 3420
- ],
- "18": [
- 0,
- 3434
- ],
- "24": [
- 0,
- 3454
- ]
- },
- "rail": {
- "12": [
- 0,
- 3480
- ],
- "18": [
- 0,
- 3494
- ],
- "24": [
- 0,
- 3514
- ]
- },
- "rail-above": {
- "12": [
- 0,
- 3540
- ],
- "18": [
- 0,
- 3554
- ],
- "24": [
- 0,
- 3574
- ]
- },
- "rail-underground": {
- "12": [
- 0,
- 3600
- ],
- "18": [
- 0,
- 3614
- ],
- "24": [
- 0,
- 3634
- ]
- },
- "religious-christian": {
- "12": [
- 0,
- 3660
- ],
- "18": [
- 0,
- 3674
- ],
- "24": [
- 0,
- 3694
- ]
- },
- "religious-jewish": {
- "12": [
- 0,
- 3720
- ],
- "18": [
- 0,
- 3734
- ],
- "24": [
- 0,
- 3754
- ]
- },
- "religious-muslim": {
- "12": [
- 0,
- 3780
- ],
- "18": [
- 0,
- 3794
- ],
- "24": [
- 0,
- 3814
- ]
- },
- "restaurant": {
- "12": [
- 0,
- 3840
- ],
- "18": [
- 0,
- 3854
- ],
- "24": [
- 0,
- 3874
- ]
- },
- "roadblock": {
- "12": [
- 0,
- 3900
- ],
- "18": [
- 0,
- 3914
- ],
- "24": [
- 0,
- 3934
- ]
- },
- "school": {
- "12": [
- 0,
- 3960
- ],
- "18": [
- 0,
- 3974
- ],
- "24": [
- 0,
- 3994
- ]
- },
- "shop": {
- "12": [
- 0,
- 4020
- ],
- "18": [
- 0,
- 4034
- ],
- "24": [
- 0,
- 4054
- ]
- },
- "skiing": {
- "12": [
- 0,
- 4080
- ],
- "18": [
- 0,
- 4094
- ],
- "24": [
- 0,
- 4114
- ]
- },
- "slaughterhouse": {
- "12": [
- 0,
- 4140
- ],
- "18": [
- 0,
- 4154
- ],
- "24": [
- 0,
- 4174
- ]
- },
- "soccer": {
- "12": [
- 0,
- 4200
- ],
- "18": [
- 0,
- 4214
- ],
- "24": [
- 0,
- 4234
- ]
- },
- "square": {
- "12": [
- 0,
- 4260
- ],
- "18": [
- 0,
- 4274
- ],
- "24": [
- 0,
- 4294
- ]
- },
- "square-stroked": {
- "12": [
- 0,
- 4320
- ],
- "18": [
- 0,
- 4334
- ],
- "24": [
- 0,
- 4354
- ]
- },
- "star": {
- "12": [
- 0,
- 4380
- ],
- "18": [
- 0,
- 4394
- ],
- "24": [
- 0,
- 4414
- ]
- },
- "star-stroked": {
- "12": [
- 0,
- 4440
- ],
- "18": [
- 0,
- 4454
- ],
- "24": [
- 0,
- 4474
- ]
- },
- "swimming": {
- "12": [
- 0,
- 4500
- ],
- "18": [
- 0,
- 4514
- ],
- "24": [
- 0,
- 4534
- ]
- },
- "telephone": {
- "12": [
- 0,
- 4560
- ],
- "18": [
- 0,
- 4574
- ],
- "24": [
- 0,
- 4594
- ]
- },
- "tennis": {
- "12": [
- 0,
- 4620
- ],
- "18": [
- 0,
- 4634
- ],
- "24": [
- 0,
- 4654
- ]
- },
- "theatre": {
- "12": [
- 0,
- 4680
- ],
- "18": [
- 0,
- 4694
- ],
- "24": [
- 0,
- 4714
- ]
- },
- "toilets": {
- "12": [
- 0,
- 4740
- ],
- "18": [
- 0,
- 4754
- ],
- "24": [
- 0,
- 4774
- ]
- },
- "town-hall": {
- "12": [
- 0,
- 4800
- ],
- "18": [
- 0,
- 4814
- ],
- "24": [
- 0,
- 4834
- ]
- },
- "triangle": {
- "12": [
- 0,
- 4860
- ],
- "18": [
- 0,
- 4874
- ],
- "24": [
- 0,
- 4894
- ]
- },
- "triangle-stroked": {
- "12": [
- 0,
- 4920
- ],
- "18": [
- 0,
- 4934
- ],
- "24": [
- 0,
- 4954
- ]
- },
- "warehouse": {
- "12": [
- 0,
- 4980
- ],
- "18": [
- 0,
- 4994
- ],
- "24": [
- 0,
- 5014
- ]
- },
- "waste-basket": {
- "12": [
- 0,
- 5040
- ],
- "18": [
- 0,
- 5054
- ],
- "24": [
- 0,
- 5074
- ]
- },
- "water": {
- "12": [
- 0,
- 5100
- ],
- "18": [
- 0,
- 5114
- ],
- "24": [
- 0,
- 5134
- ]
- },
- "wetland": {
- "12": [
- 0,
- 5160
- ],
- "18": [
- 0,
- 5174
- ],
- "24": [
- 0,
- 5194
- ]
- },
- "zoo": {
- "12": [
- 0,
- 5220
- ],
- "18": [
- 0,
- 5234
- ],
- "24": [
- 0,
- 5254
- ]
- },
- "highway-motorway": {
- "line": [
- 20,
- 25
- ]
- },
- "highway-trunk": {
- "line": [
- 80,
- 25
- ]
- },
- "highway-primary": {
- "line": [
- 140,
- 25
- ]
- },
- "highway-secondary": {
- "line": [
- 200,
- 25
- ]
- },
- "highway-tertiary": {
- "line": [
- 260,
- 25
- ]
- },
- "highway-motorway-link": {
- "line": [
- 320,
- 25
- ]
- },
- "highway-trunk-link": {
- "line": [
- 380,
- 25
- ]
- },
- "highway-primary-link": {
- "line": [
- 440,
- 25
- ]
- },
- "highway-secondary-link": {
- "line": [
- 500,
- 25
- ]
- },
- "highway-tertiary-link": {
- "line": [
- 560,
- 25
- ]
- },
- "highway-residential": {
- "line": [
- 620,
- 25
- ]
- },
- "highway-unclassified": {
- "line": [
- 680,
- 25
- ]
- },
- "highway-service": {
- "line": [
- 740,
- 25
- ]
- },
- "highway-road": {
- "line": [
- 800,
- 25
- ]
- },
- "highway-track": {
- "line": [
- 860,
- 25
- ]
- },
- "highway-living-street": {
- "line": [
- 920,
- 25
- ]
- },
- "highway-path": {
- "line": [
- 980,
- 25
- ]
- },
- "highway-cycleway": {
- "line": [
- 1040,
- 25
- ]
- },
- "highway-footway": {
- "line": [
- 1100,
- 25
- ]
- },
- "highway-bridleway": {
- "line": [
- 1160,
- 25
- ]
- },
- "highway-steps": {
- "line": [
- 1220,
- 25
- ]
- },
- "railway-rail": {
- "line": [
- 1280,
- 25
- ]
- },
- "railway-disused": {
- "line": [
- 1340,
- 25
- ]
- },
- "railway-abandoned": {
- "line": [
- 1400,
- 25
- ]
- },
- "railway-subway": {
- "line": [
- 1460,
- 25
- ]
- },
- "railway-light-rail": {
- "line": [
- 1520,
- 25
- ]
- },
- "railway-monorail": {
- "line": [
- 1580,
- 25
- ]
- },
- "waterway-river": {
- "line": [
- 1640,
- 25
- ]
- },
- "waterway-stream": {
- "line": [
- 1700,
- 25
- ]
- },
- "waterway-canal": {
- "line": [
- 1760,
- 25
- ]
- },
- "waterway-ditch": {
- "line": [
- 1820,
- 25
- ]
- },
- "power-line": {
- "line": [
- 1880,
- 25
- ]
- },
- "other-line": {
- "line": [
- 1940,
- 25
- ]
- },
- "category-roads": {
- "line": [
- 2000,
- 25
- ]
- },
- "category-rail": {
- "line": [
- 2060,
- 25
- ]
- },
- "category-path": {
- "line": [
- 2120,
- 25
- ]
- },
- "category-water": {
- "line": [
- 2180,
- 25
- ]
- }
- },
- "operations": {
- "icon-operation-delete": [
- 0,
- 140
- ],
- "icon-operation-circularize": [
- 20,
- 140
- ],
- "icon-operation-straighten": [
- 40,
- 140
- ],
- "icon-operation-split": [
- 60,
- 140
- ],
- "icon-operation-disconnect": [
- 80,
- 140
- ],
- "icon-operation-reverse": [
- 100,
- 140
- ],
- "icon-operation-move": [
- 120,
- 140
- ],
- "icon-operation-merge": [
- 140,
- 140
- ],
- "icon-operation-orthogonalize": [
- 160,
- 140
- ],
- "icon-operation-rotate": [
- 180,
- 140
- ],
- "icon-operation-simplify": [
- 200,
- 140
- ],
- "icon-operation-disabled-delete": [
- 0,
- 160
- ],
- "icon-operation-disabled-circularize": [
- 20,
- 160
- ],
- "icon-operation-disabled-straighten": [
- 40,
- 160
- ],
- "icon-operation-disabled-split": [
- 60,
- 160
- ],
- "icon-operation-disabled-disconnect": [
- 80,
- 160
- ],
- "icon-operation-disabled-reverse": [
- 100,
- 160
- ],
- "icon-operation-disabled-move": [
- 120,
- 160
- ],
- "icon-operation-disabled-merge": [
- 140,
- 160
- ],
- "icon-operation-disabled-orthogonalize": [
- 160,
- 160
- ],
- "icon-operation-disabled-rotate": [
- 180,
- 160
- ],
- "icon-operation-disabled-simplify": [
- 200,
- 160
- ]
- },
- "locales": [
- "af",
- "bs",
- "ca",
- "zh",
- "zh_TW",
- "hr",
- "cs",
- "da",
- "nl",
- "fr",
- "de",
- "it",
- "ja",
- "lv",
- "pl",
- "pt",
- "ru",
- "sr",
- "sk",
- "es",
- "sv",
- "tr",
- "uk",
- "vi"
- ],
- "en": {
- "modes": {
- "add_area": {
- "title": "Area",
- "description": "Add parks, buildings, lakes or other areas to the map.",
- "tail": "Click on the map to start drawing an area, like a park, lake, or building."
- },
- "add_line": {
- "title": "Line",
- "description": "Add highways, streets, pedestrian paths, canals or other lines to the map.",
- "tail": "Click on the map to start drawing a road, path, or route."
- },
- "add_point": {
- "title": "Point",
- "description": "Add restaurants, monuments, postal boxes or other points to the map.",
- "tail": "Click on the map to add a point."
- },
- "browse": {
- "title": "Browse",
- "description": "Pan and zoom the map."
- },
- "draw_area": {
- "tail": "Click to add nodes to your area. Click the first node to finish the area."
- },
- "draw_line": {
- "tail": "Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."
- }
- },
- "operations": {
- "add": {
- "annotation": {
- "point": "Added a point.",
- "vertex": "Added a node to a way."
- }
- },
- "start": {
- "annotation": {
- "line": "Started a line.",
- "area": "Started an area."
- }
- },
- "continue": {
- "annotation": {
- "line": "Continued a line.",
- "area": "Continued an area."
- }
- },
- "cancel_draw": {
- "annotation": "Canceled drawing."
- },
- "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."
- },
- "orthogonalize": {
- "title": "Orthogonalize",
- "description": "Square these corners.",
- "key": "Q",
- "annotation": {
- "line": "Squared the corners of a line.",
- "area": "Squared the corners of an area."
- },
- "not_closed": "This can't be made square because it's not a loop."
- },
- "delete": {
- "title": "Delete",
- "description": "Remove this from the map.",
- "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} objects."
- }
- },
- "connect": {
- "annotation": {
- "point": "Connected a way to a point.",
- "vertex": "Connected a way to another.",
- "line": "Connected a way to a line.",
- "area": "Connected a way to an area."
- }
- },
- "disconnect": {
- "title": "Disconnect",
- "description": "Disconnect these lines/areas from each other.",
- "key": "D",
- "annotation": "Disconnected lines/areas.",
- "not_connected": "There aren't enough lines/areas here to disconnect."
- },
- "merge": {
- "title": "Merge",
- "description": "Merge these lines.",
- "key": "C",
- "annotation": "Merged {n} lines.",
- "not_eligible": "These features can't be merged.",
- "not_adjacent": "These lines can't be merged because they aren't connected."
- },
- "move": {
- "title": "Move",
- "description": "Move this 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 objects."
- },
- "incomplete_relation": "This feature can't be moved because it hasn't been fully downloaded."
- },
- "rotate": {
- "title": "Rotate",
- "description": "Rotate this object around its centre point.",
- "key": "R",
- "annotation": {
- "line": "Rotated a line.",
- "area": "Rotated an area."
- }
- },
- "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."
- }
- },
- "nothing_to_undo": "Nothing to undo.",
- "nothing_to_redo": "Nothing to redo.",
- "just_edited": "You just edited OpenStreetMap!",
- "browser_notice": "This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 9 and above. Please upgrade your browser or use Potlatch 2 to edit the map.",
- "view_on_osm": "View on OSM",
- "zoom_in_edit": "zoom in to edit the map",
- "logout": "logout",
- "loading_auth": "Connecting to OpenStreetMap...",
- "report_a_bug": "report a bug",
- "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."
- },
- "commit": {
- "title": "Save Changes",
- "description_placeholder": "Brief description of your contributions",
- "message_label": "Commit message",
- "upload_explanation": "The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.",
- "save": "Save",
- "cancel": "Cancel",
- "warnings": "Warnings",
- "modified": "Modified",
- "deleted": "Deleted",
- "created": "Created"
- },
- "contributors": {
- "list": "Contributed by {users}",
- "truncated_list": "Contributed by {users} and {count} others"
- },
- "geocoder": {
- "title": "Find a place",
- "placeholder": "Find a place",
- "no_results": "Couldn't locate a place named '{name}'"
- },
- "geolocate": {
- "title": "Show My Location"
- },
- "inspector": {
- "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",
- "new_tag": "New tag",
- "view_on_osm": "View on openstreetmap.org",
- "editing_feature": "Editing {feature}",
- "all_tags": "All tags",
- "choose": "Select feature type",
- "results": "{n} results for {search}",
- "reference": "View on OpenStreetMap Wiki",
- "back_tooltip": "Change feature type",
- "remove": "Remove",
- "search": "Search"
- },
- "background": {
- "title": "Background",
- "description": "Background settings",
- "percent_brightness": "{opacity}% brightness",
- "fix_misalignment": "Fix misalignment",
- "reset": "reset"
- },
- "restore": {
- "heading": "You have unsaved changes",
- "description": "Do you wish to restore unsaved changes from a previous editing session?",
- "restore": "Restore",
- "reset": "Reset"
- },
- "save": {
- "title": "Save",
- "help": "Save changes to OpenStreetMap, making them visible to other users.",
- "no_changes": "No changes to save.",
- "error": "An error occurred while trying to save",
- "uploading": "Uploading changes to OpenStreetMap.",
- "unsaved_changes": "You have unsaved changes"
- },
- "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 development 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"
- },
- "tag_reference": {
- "description": "Description",
- "on_wiki": "{tag} on wiki.osm.org",
- "used_with": "used with {type}"
- },
- "validations": {
- "untagged_point": "Untagged point",
- "untagged_line": "Untagged line",
- "untagged_area": "Untagged area",
- "many_deletions": "You're deleting {n} objects. 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.",
- "gpx": {
- "local_layer": "Local GPX file",
- "drag_drop": "Drag and drop a .gpx file on the page"
- },
- "help": {
- "title": "Help",
- "help": "# Help\n\nThis is an editor for [OpenStreetMap](http://www.openstreetmap.org/), the\nfree and editable map of the world. You can use it to add and update\ndata in your area, making an open-source and open-data map of the world\nbetter for everyone.\n\nEdits that you make on this map will be visible to everyone who uses\nOpenStreetMap. In order to make an edit, you'll need a\n[free OpenStreetMap account](https://www.openstreetmap.org/user/new).\n\nThe [iD editor](http://ideditor.com/) is a collaborative project with [source\ncode available on GitHub](https://github.com/systemed/iD).\n",
- "editing_saving": "# Editing & Saving\n\nThis editor is designed to work primarily online, and you're accessing\nit through a website right now.\n\n### Selecting Features\n\nTo select a map feature, like a road or point of interest, click\non it on the map. This will highlight the selected feature, open a panel with\ndetails about it, and show a menu of things you can do with the feature.\n\nMultiple features can be selected by holding the 'Shift' key, clicking,\nand dragging on the map. This will select all features within the box\nthat's drawn, allowing you to do things with several features at once.\n\n### Saving Edits\n\nWhen you make changes like editing roads, buildings, and places, these are\nstored locally until you save them to the server. Don't worry if you make\na mistake - you can undo changes by clicking the undo button, and redo\nchanges by clicking the redo button.\n\nClick 'Save' to finish a group of edits - for instance, if you've completed\nan area of town and would like to start on a new area. You'll have a chance\nto review what you've done, and the editor supplies helpful suggestions\nand warnings if something doesn't seem right about the changes.\n\nIf everything looks good, you can enter a short comment explaining the change\nyou made, and click 'Save' again to post the changes\nto [OpenStreetMap.org](http://www.openstreetmap.org/), where they are visible\nto all other users and available for others to build and improve upon.\n\nIf you can't finish your edits in one sitting, you can leave the editor\nwindow and come back (on the same browser and computer), and the\neditor application will offer to restore your work.\n",
- "roads": "# Roads\n\nYou can create, fix, and delete roads with this editor. Roads can be all\nkinds: paths, highways, trails, cycleways, and more - any often-crossed\nsegment should be mappable.\n\n### Selecting\n\nClick on a road to select it. An outline should become visible, along\nwith a small tools menu on the map and a sidebar showing more information\nabout the road.\n\n### Modifying\n\nOften you'll see roads that aren't aligned to the imagery behind them\nor to a GPS track. You can adjust these roads so they are in the correct\nplace.\n\nFirst click on the road you want to change. This will highlight it and show\ncontrol points along it that you can drag to better locations. If\nyou want to add new control points for more detail, double-click a part\nof the road without a node, and one will be added.\n\nIf the road connects to another road, but doesn't properly connect on\nthe map, you can drag one of its control points onto the other road in\norder to join them. Having roads connect is important for the map\nand essential for providing driving directions.\n\nYou can also click the 'Move' tool or press the `M` shortcut key to move the entire road at\none time, and then click again to save that movement.\n\n### Deleting\n\nIf a road is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the road could simply be newly built.\n\nYou can delete a road by clicking on it to select it, then clicking the\ntrash can icon or pressing the 'Delete' key.\n\n### Creating\n\nFound somewhere there should be a road but there isn't? Click the 'Line'\nicon in the top-left of the editor or press the shortcut key `2` to start drawing\na line.\n\nClick on the start of the road on the map to start drawing. If the road\nbranches off from an existing road, start by clicking on the place where they connect.\n\nThen click on points along the road so that it follows the right path, according\nto satellite imagery or GPS. If the road you are drawing crosses another road, connect\nit by clicking on the intersection point. When you're done drawing, double-click\nor press 'Return' or 'Enter' on your keyboard.\n",
- "gps": "# GPS\n\nGPS data is the most trusted source of data for OpenStreetMap. This editor\nsupports local traces - `.gpx` files on your local computer. You can collect\nthis kind of GPS trace with a number of smartphone applications as well as\npersonal GPS hardware.\n\nFor information on how to perform a GPS survey, read\n[Surveying with a GPS](http://learnosm.org/en/beginner/using-gps/).\n\nTo use a GPX track for mapping, drag and drop the GPX file onto the map\neditor. If it's recognized, it will be added to the map as a bright green\nline. Click on the 'Background Settings' menu on the left side to enable,\ndisable, or zoom to this new GPX-powered layer.\n\nThe GPX track isn't directly uploaded to OpenStreetMap - the best way to\nuse it is to draw on the map, using it as a guide for the new features that\nyou add.\n",
- "imagery": "# Imagery\n\nAerial imagery is an important resource for mapping. A combination of\nairplane flyovers, satellite views, and freely-compiled sources are available\nin the editor under the 'Background Settings' menu on the left.\n\nBy default a [Bing Maps](http://www.bing.com/maps/) satellite layer is\npresented in the editor, but as you pan and zoom the map to new geographical\nareas, new sources will become available. Some countries, like the United\nStates, France, and Denmark have very high-quality imagery available for some areas.\n\nImagery is sometimes offset from the map data because of a mistake on the\nimagery provider's side. If you see a lot of roads shifted from the background,\ndon't immediately move them all to match the background. Instead you can adjust\nthe imagery so that it matches the existing data by clicking 'Fix alignment' at\nthe bottom of the Background Settings UI.\n",
- "addresses": "# Addresses\n\nAddresses are some of the most useful information for the map.\n\nAlthough addresses are often represented as parts of streets, in OpenStreetMap\nthey're recorded as attributes of buildings and places along streets.\n\nYou can add address information to places mapped as building outlines as well\nas well as those mapped as single points. The optimal source of address\ndata is from an on-the-ground survey or personal knowledge - as with any\nother feature, copying from commercial sources like Google Maps is strictly\nforbidden.\n",
- "inspector": "# Using the Inspector\n\nThe inspector is the user interface element on the right-hand side of the\npage that appears when a feature is selected and allows you to edit its details.\n\n### Selecting a Feature Type\n\nAfter you add a point, line, or area, you can choose what type of feature it\nis, like whether it's a highway or residential road, supermarket or cafe.\nThe inspector will display buttons for common feature types, and you can\nfind others by typing what you're looking for in the search box.\n\nClick the 'i' in the bottom-right-hand corner of a feature type button to\nlearn more about it. Click a button to choose that type.\n\n### Using Forms and Editing Tags\n\nAfter you choose a feature type, or when you select a feature that already\nhas a type assigned, the inspector will display fields with details about\nthe feature like its name and address.\n\nBelow the fields you see, you can click icons to add other details,\nlike [Wikipedia](http://www.wikipedia.org/) information, wheelchair\naccess, and more.\n\nAt the bottom of the inspector, click 'Additional tags' to add arbitrary\nother tags to the element. [Taginfo](http://taginfo.openstreetmap.org/) is a\ngreat resource for learn more about popular tag combinations.\n\nChanges you make in the inspector are automatically applied to the map.\nYou can undo them at any time by clicking the 'Undo' button.\n\n### Closing the Inspector\n\nYou can close the inspector by clicking the close button in the top-right,\npressing the 'Escape' key, or clicking on the map.\n",
- "buildings": "# Buildings\n\nOpenStreetMap is the world's largest database of buildings. You can create\nand improve this database.\n\n### Selecting\n\nYou can select a building by clicking on its border. This will highlight the\nbuilding and open a small tools menu and a sidebar showing more information\nabout the building.\n\n### Modifying\n\nSometimes buildings are incorrectly placed or have incorrect tags.\n\nTo move an entire building, select it, then click the 'Move' tool. Move your\nmouse to shift the building, and click when it's correctly placed.\n\nTo fix the specific shape of a building, click and drag the nodes that form\nits border into better places.\n\n### Creating\n\nOne of the main questions around adding buildings to the map is that\nOpenStreetMap records buildings both as shapes and points. The rule of thumb\nis to _map a building as a shape whenever possible_, and map companies, homes,\namenities, and other things that operate out of buildings as points placed\nwithin the building shape.\n\nStart drawing a building as a shape by clicking the 'Area' button in the top\nleft of the interface, and end it either by pressing 'Return' on your keyboard\nor clicking on the first node drawn to close the shape.\n\n### Deleting\n\nIf a building is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the road could simply be newly built.\n\nYou can delete a building by clicking on it to select it, then clicking the\ntrash can icon or pressing the 'Delete' key.\n"
- },
- "intro": {
- "navigation": {
- "drag": "The main map area shows OpenStreetMap data on top of a background. You can navigate by dragging and scrolling, just like any web map. **Drag the map!**",
- "select": "Map features are represented three ways: using points, lines or areas. All features can be selected by clicking on them. **Click on the point to select it.**",
- "header": "The header shows us the feature type.",
- "pane": "When a feature is selected, the feature editor is displayed. The header shows us the feature type and the main pane shows the feature's attributes, such as its name and address. **Close the feature editor with the close button in the top right.**"
- },
- "points": {
- "add": "Points can be used to represent features such as shops, restaurants and monuments. They mark a specific location, and describe what's there. **Click the Point button to add a new point.**",
- "place": "The point can be placed by clicking on the map. **Place the point on top of the building.**",
- "search": "There many different features that can be represented by points. The point you just added is a Cafe. **Search for 'Cafe' **",
- "choose": "**Choose Cafe from the grid.**",
- "describe": "The point is now marked as a cafe. Using the feature editor, we can add more information about the feature. **Add a name**",
- "close": "The feature editor can be closed by clicking on the close button. **Close the feature editor**",
- "reselect": "Often points will already exist, but have mistakes or be incomplete. We can edit existing points. **Select the point you just created.**",
- "fixname": "**Change the name and close the feature editor.**",
- "reselect_delete": "All features on the map can be deleted. **Click on the point you created.**",
- "delete": "The menu around the point contains operations that can be performed on it, including delete. **Delete the point.**"
- },
- "areas": {
- "add": "Areas are a more detailed way to represent features. They provide information on the boundaries of the feature. Areas can be used for most features types points can be used for, and are often preferred. **Click the Area button to add a new area.**",
- "corner": "Areas are drawn by placing nodes that mark the boundary of the area. **Place the starting node on one of the corners of the playground.**",
- "place": "Draw the area by placing more nodes. Finish the area by clicking on the starting node. **Draw an area for the playground.**",
- "search": "**Search for Playground.**",
- "choose": "**Choose Playground from the grid.**",
- "describe": "**Add a name, and close the feature editor**"
- },
- "lines": {
- "add": "Lines are used to represent features such as roads, railways and rivers. **Click the Line button to add a new line.**",
- "start": "**Start the line by clicking on the end of the road.**",
- "intersect": "Click to add more nodes to the line. You can drag the map while drawing if necessary. 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 Flower Street, to create an intersection connecting the two lines.**",
- "finish": "Lines can be finished by clicking on the last node again. **Finish drawing the road.**",
- "road": "**Select Road from the grid**",
- "residential": "There are different types of roads, the most common of which is Residential. **Choose the Residential road type**",
- "describe": "**Name the road and close the feature editor.**",
- "restart": "The road needs to intersect Flower Street."
- },
- "startediting": {
- "help": "More documentation and this walkthrough are available here.",
- "save": "Don't forget to regularly save your changes!",
- "start": "Start mapping!"
- }
- },
- "presets": {
- "categories": {
- "category-landuse": {
- "name": "Land Use"
- },
- "category-path": {
- "name": "Path"
- },
- "category-rail": {
- "name": "Rail"
- },
- "category-road": {
- "name": "Road"
- },
- "category-water": {
- "name": "Water"
- }
- },
- "fields": {
- "access": {
- "label": "Access",
- "types": {
- "access": "General",
- "foot": "Foot",
- "motor_vehicle": "Motor Vehicles",
- "bicycle": "Bicycles",
- "horse": "Horses"
- },
- "options": {
- "yes": {
- "title": "Allowed",
- "description": "Access permitted by law; a right of way"
- },
- "no": {
- "title": "Prohibited",
- "description": "Access not permitted to the general public"
- },
- "permissive": {
- "title": "Permissive",
- "description": "Access permitted until such time as the owner revokes the permission"
- },
- "private": {
- "title": "Private",
- "description": "Access permitted only with permission of the owner on an individual basis"
- },
- "designated": {
- "title": "Designated",
- "description": "Access permitted according to signs or specific local laws"
- },
- "destination": {
- "title": "Destination",
- "description": "Access permitted only to reach a destination"
- }
- }
- },
- "address": {
- "label": "Address",
- "placeholders": {
- "housename": "Housename",
- "number": "123",
- "street": "Street",
- "city": "City",
- "postcode": "Postal code"
- }
- },
- "admin_level": {
- "label": "Admin Level"
- },
- "aeroway": {
- "label": "Type"
- },
- "amenity": {
- "label": "Type"
- },
- "atm": {
- "label": "ATM"
- },
- "barrier": {
- "label": "Type"
- },
- "bicycle_parking": {
- "label": "Type"
- },
- "building": {
- "label": "Building"
- },
- "building_area": {
- "label": "Building"
- },
- "building_yes": {
- "label": "Building"
- },
- "capacity": {
- "label": "Capacity"
- },
- "cardinal_direction": {
- "label": "Direction"
- },
- "clock_direction": {
- "label": "Direction",
- "options": {
- "clockwise": "Clockwise",
- "anticlockwise": "Counterclockwise"
- }
- },
- "collection_times": {
- "label": "Collection Times"
- },
- "construction": {
- "label": "Type"
- },
- "country": {
- "label": "Country"
- },
- "crossing": {
- "label": "Type"
- },
- "cuisine": {
- "label": "Cuisine"
- },
- "denomination": {
- "label": "Denomination"
- },
- "denotation": {
- "label": "Denotation"
- },
- "elevation": {
- "label": "Elevation"
- },
- "emergency": {
- "label": "Emergency"
- },
- "entrance": {
- "label": "Type"
- },
- "fax": {
- "label": "Fax"
- },
- "fee": {
- "label": "Fee"
- },
- "highway": {
- "label": "Type"
- },
- "historic": {
- "label": "Type"
- },
- "iata": {
- "label": "IATA"
- },
- "icao": {
- "label": "ICAO"
- },
- "incline": {
- "label": "Incline"
- },
- "internet_access": {
- "label": "Internet Access",
- "options": {
- "yes": "Yes",
- "no": "No",
- "wlan": "Wifi",
- "wired": "Wired",
- "terminal": "Terminal"
- }
- },
- "landuse": {
- "label": "Type"
- },
- "lanes": {
- "label": "Lanes"
- },
- "layer": {
- "label": "Layer"
- },
- "leisure": {
- "label": "Type"
- },
- "levels": {
- "label": "Levels"
- },
- "location": {
- "label": "Location"
- },
- "man_made": {
- "label": "Type"
- },
- "maxspeed": {
- "label": "Speed Limit"
- },
- "name": {
- "label": "Name"
- },
- "natural": {
- "label": "Natural"
- },
- "network": {
- "label": "Network"
- },
- "note": {
- "label": "Note"
- },
- "office": {
- "label": "Type"
- },
- "oneway": {
- "label": "One Way"
- },
- "oneway_yes": {
- "label": "One Way"
- },
- "opening_hours": {
- "label": "Hours"
- },
- "operator": {
- "label": "Operator"
- },
- "park_ride": {
- "label": "Park and Ride"
- },
- "parking": {
- "label": "Type"
- },
- "phone": {
- "label": "Phone"
- },
- "place": {
- "label": "Type"
- },
- "power": {
- "label": "Type"
- },
- "railway": {
- "label": "Type"
- },
- "ref": {
- "label": "Reference"
- },
- "religion": {
- "label": "Religion",
- "options": {
- "christian": "Christian",
- "muslim": "Muslim",
- "buddhist": "Buddhist",
- "jewish": "Jewish",
- "hindu": "Hindu",
- "shinto": "Shinto",
- "taoist": "Taoist"
- }
- },
- "sac_scale": {
- "label": "Path Difficulty"
- },
- "service": {
- "label": "Type"
- },
- "shelter": {
- "label": "Shelter"
- },
- "shop": {
- "label": "Type"
- },
- "source": {
- "label": "Source"
- },
- "sport": {
- "label": "Sport"
- },
- "structure": {
- "label": "Structure",
- "options": {
- "bridge": "Bridge",
- "tunnel": "Tunnel",
- "embankment": "Embankment",
- "cutting": "Cutting"
- }
- },
- "supervised": {
- "label": "Supervised"
- },
- "surface": {
- "label": "Surface"
- },
- "tourism": {
- "label": "Type"
- },
- "towertype": {
- "label": "Tower type"
- },
- "tracktype": {
- "label": "Type"
- },
- "trail_visibility": {
- "label": "Trail Visibility"
- },
- "water": {
- "label": "Type"
- },
- "waterway": {
- "label": "Type"
- },
- "website": {
- "label": "Website"
- },
- "wetland": {
- "label": "Type"
- },
- "wheelchair": {
- "label": "Wheelchair Access"
- },
- "wikipedia": {
- "label": "Wikipedia"
- },
- "wood": {
- "label": "Type"
- }
- },
- "presets": {
- "aeroway": {
- "name": "Aeroway",
- "terms": ""
- },
- "aeroway/aerodrome": {
- "name": "Airport",
- "terms": "airplane,airport,aerodrome"
- },
- "aeroway/apron": {
- "name": "Apron",
- "terms": "ramp"
- },
- "aeroway/gate": {
- "name": "Airport gate",
- "terms": ""
- },
- "aeroway/hangar": {
- "name": "Hangar",
- "terms": ""
- },
- "aeroway/helipad": {
- "name": "Helipad",
- "terms": "helicopter,helipad,heliport"
- },
- "aeroway/runway": {
- "name": "Runway",
- "terms": "landing strip"
- },
- "aeroway/taxiway": {
- "name": "Taxiway",
- "terms": ""
- },
- "aeroway/terminal": {
- "name": "Airport terminal",
- "terms": "airport,aerodrome"
- },
- "amenity": {
- "name": "Amenity",
- "terms": ""
- },
- "amenity/bank": {
- "name": "Bank",
- "terms": "coffer,countinghouse,credit union,depository,exchequer,fund,hoard,investment firm,repository,reserve,reservoir,safe,savings,stock,stockpile,store,storehouse,thrift,treasury,trust company,vault"
- },
- "amenity/bar": {
- "name": "Bar",
- "terms": ""
- },
- "amenity/bench": {
- "name": "Bench",
- "terms": ""
- },
- "amenity/bicycle_parking": {
- "name": "Bicycle Parking",
- "terms": ""
- },
- "amenity/bicycle_rental": {
- "name": "Bicycle Rental",
- "terms": ""
- },
- "amenity/cafe": {
- "name": "Cafe",
- "terms": "coffee,tea,coffee shop"
- },
- "amenity/car_wash": {
- "name": "Car Wash",
- "terms": ""
- },
- "amenity/cinema": {
- "name": "Cinema",
- "terms": "big screen,bijou,cine,drive-in,film,flicks,motion pictures,movie house,movie theater,moving pictures,nabes,photoplay,picture show,pictures,playhouse,show,silver screen"
- },
- "amenity/college": {
- "name": "College",
- "terms": ""
- },
- "amenity/courthouse": {
- "name": "Courthouse",
- "terms": ""
- },
- "amenity/embassy": {
- "name": "Embassy",
- "terms": ""
- },
- "amenity/fast_food": {
- "name": "Fast Food",
- "terms": ""
- },
- "amenity/fire_station": {
- "name": "Fire Station",
- "terms": ""
- },
- "amenity/fountain": {
- "name": "Fountain",
- "terms": ""
- },
- "amenity/fuel": {
- "name": "Gas Station",
- "terms": ""
- },
- "amenity/grave_yard": {
- "name": "Graveyard",
- "terms": ""
- },
- "amenity/hospital": {
- "name": "Hospital",
- "terms": "clinic,emergency room,health service,hospice,infirmary,institution,nursing home,rest home,sanatorium,sanitarium,sick bay,surgery,ward"
- },
- "amenity/kindergarten": {
- "name": "Kindergarten",
- "terms": "preschool,nursery,childcare,playgroup"
- },
- "amenity/library": {
- "name": "Library",
- "terms": ""
- },
- "amenity/marketplace": {
- "name": "Marketplace",
- "terms": ""
- },
- "amenity/parking": {
- "name": "Parking",
- "terms": ""
- },
- "amenity/pharmacy": {
- "name": "Pharmacy",
- "terms": ""
- },
- "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/christian": {
- "name": "Church",
- "terms": "christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"
- },
- "amenity/place_of_worship/jewish": {
- "name": "Synagogue",
- "terms": "jewish,synagogue"
- },
- "amenity/place_of_worship/muslim": {
- "name": "Mosque",
- "terms": "muslim,mosque"
- },
- "amenity/police": {
- "name": "Police",
- "terms": "badge,bear,blue,bluecoat,bobby,boy scout,bull,constable,constabulary,cop,copper,corps,county mounty,detective,fed,flatfoot,force,fuzz,gendarme,gumshoe,heat,law,law enforcement,man,narc,officers,patrolman,police"
- },
- "amenity/post_box": {
- "name": "Mailbox",
- "terms": "letter drop,letterbox,mail drop,mailbox,pillar box,postbox"
- },
- "amenity/post_office": {
- "name": "Post Office",
- "terms": ""
- },
- "amenity/pub": {
- "name": "Pub",
- "terms": ""
- },
- "amenity/restaurant": {
- "name": "Restaurant",
- "terms": "bar,cafeteria,café,canteen,chophouse,coffee shop,diner,dining room,dive*,doughtnut shop,drive-in,eatery,eating house,eating place,fast-food place,greasy spoon,grill,hamburger stand,hashery,hideaway,hotdog stand,inn,joint*,luncheonette,lunchroom,night club,outlet*,pizzeria,saloon,soda fountain,watering hole"
- },
- "amenity/school": {
- "name": "School",
- "terms": "academy,alma mater,blackboard,college,department,discipline,establishment,faculty,hall,halls of ivy,institute,institution,jail*,schoolhouse,seminary,university"
- },
- "amenity/swimming_pool": {
- "name": "Swimming Pool",
- "terms": ""
- },
- "amenity/telephone": {
- "name": "Telephone",
- "terms": ""
- },
- "amenity/theatre": {
- "name": "Theater",
- "terms": "theatre,performance,play,musical"
- },
- "amenity/toilets": {
- "name": "Toilets",
- "terms": ""
- },
- "amenity/townhall": {
- "name": "Town Hall",
- "terms": "village hall,city government,courthouse,municipal building,municipal center"
- },
- "amenity/university": {
- "name": "University",
- "terms": "college"
- },
- "amenity/waste_basket": {
- "name": "Waste Basket",
- "terms": "rubbish bin,litter bin,trash can,garbage can"
- },
- "barrier": {
- "name": "Barrier",
- "terms": ""
- },
- "barrier/block": {
- "name": "Block",
- "terms": ""
- },
- "barrier/bollard": {
- "name": "Bollard",
- "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": "Ditch",
- "terms": ""
- },
- "barrier/entrance": {
- "name": "Entrance",
- "terms": ""
- },
- "barrier/fence": {
- "name": "Fence",
- "terms": ""
- },
- "barrier/gate": {
- "name": "Gate",
- "terms": ""
- },
- "barrier/hedge": {
- "name": "Hedge",
- "terms": ""
- },
- "barrier/kissing_gate": {
- "name": "Kissing Gate",
- "terms": ""
- },
- "barrier/lift_gate": {
- "name": "Lift Gate",
- "terms": ""
- },
- "barrier/retaining_wall": {
- "name": "Retaining Wall",
- "terms": ""
- },
- "barrier/stile": {
- "name": "Stile",
- "terms": ""
- },
- "barrier/toll_booth": {
- "name": "Toll Booth",
- "terms": ""
- },
- "barrier/wall": {
- "name": "Wall",
- "terms": ""
- },
- "boundary/administrative": {
- "name": "Administrative Boundary",
- "terms": ""
- },
- "building": {
- "name": "Building",
- "terms": ""
- },
- "building/apartments": {
- "name": "Apartments",
- "terms": ""
- },
- "building/entrance": {
- "name": "Entrance",
- "terms": ""
- },
- "building/house": {
- "name": "House",
- "terms": ""
- },
- "emergency/phone": {
- "name": "Emergency Phone",
- "terms": ""
- },
- "entrance": {
- "name": "Entrance",
- "terms": ""
- },
- "highway": {
- "name": "Highway",
- "terms": ""
- },
- "highway/bridleway": {
- "name": "Bridle Path",
- "terms": "bridleway,equestrian trail,horse riding path,bridle road,horse trail"
- },
- "highway/bus_stop": {
- "name": "Bus Stop",
- "terms": ""
- },
- "highway/crossing": {
- "name": "Crossing",
- "terms": "crosswalk,zebra crossing"
- },
- "highway/cycleway": {
- "name": "Cycle Path",
- "terms": ""
- },
- "highway/footway": {
- "name": "Foot Path",
- "terms": "beaten path,boulevard,clearing,course,cut*,drag*,footpath,highway,lane,line,orbit,passage,pathway,rail,rails,road,roadway,route,street,thoroughfare,trackway,trail,trajectory,walk"
- },
- "highway/living_street": {
- "name": "Living Street",
- "terms": ""
- },
- "highway/mini_roundabout": {
- "name": "Mini-Roundabout",
- "terms": ""
- },
- "highway/motorway": {
- "name": "Motorway",
- "terms": ""
- },
- "highway/motorway_junction": {
- "name": "Motorway Junction",
- "terms": ""
- },
- "highway/motorway_link": {
- "name": "Motorway Link",
- "terms": "ramp,on ramp,off ramp"
- },
- "highway/path": {
- "name": "Path",
- "terms": ""
- },
- "highway/pedestrian": {
- "name": "Pedestrian",
- "terms": ""
- },
- "highway/primary": {
- "name": "Primary Road",
- "terms": ""
- },
- "highway/primary_link": {
- "name": "Primary Link",
- "terms": "ramp,on ramp,off ramp"
- },
- "highway/residential": {
- "name": "Residential Road",
- "terms": ""
- },
- "highway/road": {
- "name": "Unknown Road",
- "terms": ""
- },
- "highway/secondary": {
- "name": "Secondary Road",
- "terms": ""
- },
- "highway/secondary_link": {
- "name": "Secondary Link",
- "terms": "ramp,on ramp,off ramp"
- },
- "highway/service": {
- "name": "Service Road",
- "terms": ""
- },
- "highway/service/alley": {
- "name": "Alley",
- "terms": ""
- },
- "highway/service/drive-through": {
- "name": "Drive-Through",
- "terms": ""
- },
- "highway/service/driveway": {
- "name": "Driveway",
- "terms": ""
- },
- "highway/service/emergency_access": {
- "name": "Emergency Access",
- "terms": ""
- },
- "highway/service/parking_aisle": {
- "name": "Parking Aisle",
- "terms": ""
- },
- "highway/steps": {
- "name": "Steps",
- "terms": "stairs,staircase"
- },
- "highway/tertiary": {
- "name": "Tertiary Road",
- "terms": ""
- },
- "highway/tertiary_link": {
- "name": "Tertiary Link",
- "terms": "ramp,on ramp,off ramp"
- },
- "highway/track": {
- "name": "Track",
- "terms": ""
- },
- "highway/traffic_signals": {
- "name": "Traffic Signals",
- "terms": "light,stoplight,traffic light"
- },
- "highway/trunk": {
- "name": "Trunk Road",
- "terms": ""
- },
- "highway/trunk_link": {
- "name": "Trunk Link",
- "terms": "ramp,on ramp,off ramp"
- },
- "highway/turning_circle": {
- "name": "Turning Circle",
- "terms": ""
- },
- "highway/unclassified": {
- "name": "Unclassified Road",
- "terms": ""
- },
- "historic": {
- "name": "Historic Site",
- "terms": ""
- },
- "historic/archaeological_site": {
- "name": "Archaeological Site",
- "terms": ""
- },
- "historic/boundary_stone": {
- "name": "Boundary Stone",
- "terms": ""
- },
- "historic/castle": {
- "name": "Castle",
- "terms": ""
- },
- "historic/memorial": {
- "name": "Memorial",
- "terms": ""
- },
- "historic/monument": {
- "name": "Monument",
- "terms": ""
- },
- "historic/ruins": {
- "name": "Ruins",
- "terms": ""
- },
- "historic/wayside_cross": {
- "name": "Wayside Cross",
- "terms": ""
- },
- "historic/wayside_shrine": {
- "name": "Wayside Shrine",
- "terms": ""
- },
- "landuse": {
- "name": "Landuse",
- "terms": ""
- },
- "landuse/allotments": {
- "name": "Allotments",
- "terms": ""
- },
- "landuse/basin": {
- "name": "Basin",
- "terms": ""
- },
- "landuse/cemetery": {
- "name": "Cemetery",
- "terms": ""
- },
- "landuse/commercial": {
- "name": "Commercial",
- "terms": ""
- },
- "landuse/construction": {
- "name": "Construction",
- "terms": ""
- },
- "landuse/farm": {
- "name": "Farm",
- "terms": ""
- },
- "landuse/farmyard": {
- "name": "Farmyard",
- "terms": ""
- },
- "landuse/forest": {
- "name": "Forest",
- "terms": ""
- },
- "landuse/grass": {
- "name": "Grass",
- "terms": ""
- },
- "landuse/industrial": {
- "name": "Industrial",
- "terms": ""
- },
- "landuse/meadow": {
- "name": "Meadow",
- "terms": ""
- },
- "landuse/orchard": {
- "name": "Orchard",
- "terms": ""
- },
- "landuse/quarry": {
- "name": "Quarry",
- "terms": ""
- },
- "landuse/residential": {
- "name": "Residential",
- "terms": ""
- },
- "landuse/retail": {
- "name": "Retail",
- "terms": ""
- },
- "landuse/vineyard": {
- "name": "Vineyard",
- "terms": ""
- },
- "leisure": {
- "name": "Leisure",
- "terms": ""
- },
- "leisure/garden": {
- "name": "Garden",
- "terms": ""
- },
- "leisure/golf_course": {
- "name": "Golf Course",
- "terms": ""
- },
- "leisure/marina": {
- "name": "Marina",
- "terms": ""
- },
- "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/pitch": {
- "name": "Sport Pitch",
- "terms": ""
- },
- "leisure/pitch/american_football": {
- "name": "American Football Field",
- "terms": ""
- },
- "leisure/pitch/baseball": {
- "name": "Baseball Diamond",
- "terms": ""
- },
- "leisure/pitch/basketball": {
- "name": "Basketball Court",
- "terms": ""
- },
- "leisure/pitch/soccer": {
- "name": "Soccer Field",
- "terms": ""
- },
- "leisure/pitch/tennis": {
- "name": "Tennis Court",
- "terms": ""
- },
- "leisure/pitch/volleyball": {
- "name": "Volleyball Court",
- "terms": ""
- },
- "leisure/playground": {
- "name": "Playground",
- "terms": ""
- },
- "leisure/slipway": {
- "name": "Slipway",
- "terms": ""
- },
- "leisure/stadium": {
- "name": "Stadium",
- "terms": ""
- },
- "leisure/swimming_pool": {
- "name": "Swimming Pool",
- "terms": ""
- },
- "man_made": {
- "name": "Man Made",
- "terms": ""
- },
- "man_made/breakwater": {
- "name": "Breakwater",
- "terms": ""
- },
- "man_made/cutline": {
- "name": "Cut line",
- "terms": ""
- },
- "man_made/lighthouse": {
- "name": "Lighthouse",
- "terms": ""
- },
- "man_made/pier": {
- "name": "Pier",
- "terms": ""
- },
- "man_made/pipeline": {
- "name": "Pipeline",
- "terms": ""
- },
- "man_made/survey_point": {
- "name": "Survey Point",
- "terms": ""
- },
- "man_made/tower": {
- "name": "Tower",
- "terms": ""
- },
- "man_made/wastewater_plant": {
- "name": "Wastewater Plant",
- "terms": "sewage works,sewage treatment plant,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": ""
- },
- "natural": {
- "name": "Natural",
- "terms": ""
- },
- "natural/bay": {
- "name": "Bay",
- "terms": ""
- },
- "natural/beach": {
- "name": "Beach",
- "terms": ""
- },
- "natural/cliff": {
- "name": "Cliff",
- "terms": ""
- },
- "natural/coastline": {
- "name": "Coastline",
- "terms": "shore"
- },
- "natural/glacier": {
- "name": "Glacier",
- "terms": ""
- },
- "natural/grassland": {
- "name": "Grassland",
- "terms": ""
- },
- "natural/heath": {
- "name": "Heath",
- "terms": ""
- },
- "natural/peak": {
- "name": "Peak",
- "terms": "acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"
- },
- "natural/scrub": {
- "name": "Scrub",
- "terms": ""
- },
- "natural/spring": {
- "name": "Spring",
- "terms": ""
- },
- "natural/tree": {
- "name": "Tree",
- "terms": ""
- },
- "natural/water": {
- "name": "Water",
- "terms": ""
- },
- "natural/water/lake": {
- "name": "Lake",
- "terms": "lakelet,loch,mere"
- },
- "natural/water/pond": {
- "name": "Pond",
- "terms": "lakelet,millpond,tarn,pool,mere"
- },
- "natural/water/reservoir": {
- "name": "Reservoir",
- "terms": ""
- },
- "natural/wetland": {
- "name": "Wetland",
- "terms": ""
- },
- "natural/wood": {
- "name": "Wood",
- "terms": ""
- },
- "office": {
- "name": "Office",
- "terms": ""
- },
- "other": {
- "name": "Other",
- "terms": ""
- },
- "other_area": {
- "name": "Other",
- "terms": ""
- },
- "place": {
- "name": "Place",
- "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/isolated_dwelling": {
- "name": "Isolated Dwelling",
- "terms": ""
- },
- "place/locality": {
- "name": "Locality",
- "terms": ""
- },
- "place/town": {
- "name": "Town",
- "terms": ""
- },
- "place/village": {
- "name": "Village",
- "terms": ""
- },
- "power": {
- "name": "Power",
- "terms": ""
- },
- "power/generator": {
- "name": "Power Plant",
- "terms": ""
- },
- "power/line": {
- "name": "Power Line",
- "terms": ""
- },
- "power/pole": {
- "name": "Power Pole",
- "terms": ""
- },
- "power/sub_station": {
- "name": "Substation",
- "terms": ""
- },
- "power/tower": {
- "name": "High-Voltage Tower",
- "terms": ""
- },
- "power/transformer": {
- "name": "Transformer",
- "terms": ""
- },
- "railway": {
- "name": "Railway",
- "terms": ""
- },
- "railway/abandoned": {
- "name": "Abandoned Railway",
- "terms": ""
- },
- "railway/disused": {
- "name": "Disused Railway",
- "terms": ""
- },
- "railway/level_crossing": {
- "name": "Level Crossing",
- "terms": "crossing,railroad crossing,railway crossing,grade crossing,road through railroad,train crossing"
- },
- "railway/monorail": {
- "name": "Monorail",
- "terms": ""
- },
- "railway/platform": {
- "name": "Railway Platform",
- "terms": ""
- },
- "railway/rail": {
- "name": "Rail",
- "terms": ""
- },
- "railway/station": {
- "name": "Railway Station",
- "terms": ""
- },
- "railway/subway": {
- "name": "Subway",
- "terms": ""
- },
- "railway/subway_entrance": {
- "name": "Subway Entrance",
- "terms": ""
- },
- "railway/tram": {
- "name": "Tram",
- "terms": "streetcar"
- },
- "shop": {
- "name": "Shop",
- "terms": ""
- },
- "shop/alcohol": {
- "name": "Liquor Store",
- "terms": "alcohol"
- },
- "shop/bakery": {
- "name": "Bakery",
- "terms": ""
- },
- "shop/beauty": {
- "name": "Beauty Shop",
- "terms": ""
- },
- "shop/beverages": {
- "name": "Beverage Store",
- "terms": ""
- },
- "shop/bicycle": {
- "name": "Bicycle Shop",
- "terms": ""
- },
- "shop/books": {
- "name": "Bookstore",
- "terms": ""
- },
- "shop/boutique": {
- "name": "Boutique",
- "terms": ""
- },
- "shop/butcher": {
- "name": "Butcher",
- "terms": ""
- },
- "shop/car": {
- "name": "Car Dealership",
- "terms": ""
- },
- "shop/car_parts": {
- "name": "Car Parts Store",
- "terms": ""
- },
- "shop/car_repair": {
- "name": "Car Repair Shop",
- "terms": ""
- },
- "shop/chemist": {
- "name": "Chemist",
- "terms": ""
- },
- "shop/clothes": {
- "name": "Clothing Store",
- "terms": ""
- },
- "shop/computer": {
- "name": "Computer Store",
- "terms": ""
- },
- "shop/confectionery": {
- "name": "Confectionery",
- "terms": ""
- },
- "shop/convenience": {
- "name": "Convenience Store",
- "terms": ""
- },
- "shop/deli": {
- "name": "Deli",
- "terms": ""
- },
- "shop/department_store": {
- "name": "Department Store",
- "terms": ""
- },
- "shop/doityourself": {
- "name": "DIY Store",
- "terms": ""
- },
- "shop/dry_cleaning": {
- "name": "Dry Cleaners",
- "terms": ""
- },
- "shop/electronics": {
- "name": "Electronics Store",
- "terms": ""
- },
- "shop/fishmonger": {
- "name": "Fishmonger",
- "terms": ""
- },
- "shop/florist": {
- "name": "Florist",
- "terms": ""
- },
- "shop/furniture": {
- "name": "Furniture Store",
- "terms": ""
- },
- "shop/garden_centre": {
- "name": "Garden Center",
- "terms": ""
- },
- "shop/gift": {
- "name": "Gift Shop",
- "terms": ""
- },
- "shop/greengrocer": {
- "name": "Greengrocer",
- "terms": ""
- },
- "shop/hairdresser": {
- "name": "Hairdresser",
- "terms": ""
- },
- "shop/hardware": {
- "name": "Hardware Store",
- "terms": ""
- },
- "shop/hifi": {
- "name": "Hifi Store",
- "terms": ""
- },
- "shop/jewelry": {
- "name": "Jeweler",
- "terms": ""
- },
- "shop/kiosk": {
- "name": "Kiosk",
- "terms": ""
- },
- "shop/laundry": {
- "name": "Laundry",
- "terms": ""
- },
- "shop/mall": {
- "name": "Mall",
- "terms": ""
- },
- "shop/mobile_phone": {
- "name": "Mobile Phone Store",
- "terms": ""
- },
- "shop/motorcycle": {
- "name": "Motorcycle Dealership",
- "terms": ""
- },
- "shop/music": {
- "name": "Music Store",
- "terms": ""
- },
- "shop/newsagent": {
- "name": "Newsagent",
- "terms": ""
- },
- "shop/optician": {
- "name": "Optician",
- "terms": ""
- },
- "shop/outdoor": {
- "name": "Outdoor Store",
- "terms": ""
- },
- "shop/pet": {
- "name": "Pet Store",
- "terms": ""
- },
- "shop/shoes": {
- "name": "Shoe Store",
- "terms": ""
- },
- "shop/sports": {
- "name": "Sporting Goods Store",
- "terms": ""
- },
- "shop/stationery": {
- "name": "Stationery Store",
- "terms": ""
- },
- "shop/supermarket": {
- "name": "Supermarket",
- "terms": "bazaar,boutique,chain,co-op,cut-rate store,discount store,five-and-dime,flea market,galleria,mall,mart,outlet,outlet store,shop,shopping center,shopping plaza,stand,store,supermarket,thrift shop"
- },
- "shop/toys": {
- "name": "Toy Store",
- "terms": ""
- },
- "shop/travel_agency": {
- "name": "Travel Agency",
- "terms": ""
- },
- "shop/tyres": {
- "name": "Tire Store",
- "terms": ""
- },
- "shop/vacant": {
- "name": "Vacant Shop",
- "terms": ""
- },
- "shop/variety_store": {
- "name": "Variety Store",
- "terms": ""
- },
- "shop/video": {
- "name": "Video Store",
- "terms": ""
- },
- "tourism": {
- "name": "Tourism",
- "terms": ""
- },
- "tourism/alpine_hut": {
- "name": "Alpine Hut",
- "terms": ""
- },
- "tourism/artwork": {
- "name": "Artwork",
- "terms": ""
- },
- "tourism/attraction": {
- "name": "Tourist Attraction",
- "terms": ""
- },
- "tourism/camp_site": {
- "name": "Camp Site",
- "terms": ""
- },
- "tourism/caravan_site": {
- "name": "RV Park",
- "terms": ""
- },
- "tourism/chalet": {
- "name": "Chalet",
- "terms": ""
- },
- "tourism/guest_house": {
- "name": "Guest House",
- "terms": "B&B,Bed & Breakfast,Bed and Breakfast"
- },
- "tourism/hostel": {
- "name": "Hostel",
- "terms": ""
- },
- "tourism/hotel": {
- "name": "Hotel",
- "terms": ""
- },
- "tourism/information": {
- "name": "Information",
- "terms": ""
- },
- "tourism/motel": {
- "name": "Motel",
- "terms": ""
- },
- "tourism/museum": {
- "name": "Museum",
- "terms": "exhibition,exhibits archive,foundation,gallery,hall,institution,library,menagerie,repository,salon,storehouse,treasury,vault"
- },
- "tourism/picnic_site": {
- "name": "Picnic Site",
- "terms": ""
- },
- "tourism/theme_park": {
- "name": "Theme Park",
- "terms": ""
- },
- "tourism/viewpoint": {
- "name": "Viewpoint",
- "terms": ""
- },
- "tourism/zoo": {
- "name": "Zoo",
- "terms": ""
- },
- "waterway": {
- "name": "Waterway",
- "terms": ""
- },
- "waterway/canal": {
- "name": "Canal",
- "terms": ""
- },
- "waterway/dam": {
- "name": "Dam",
- "terms": ""
- },
- "waterway/ditch": {
- "name": "Ditch",
- "terms": ""
- },
- "waterway/drain": {
- "name": "Drain",
- "terms": ""
- },
- "waterway/river": {
- "name": "River",
- "terms": "beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"
- },
- "waterway/riverbank": {
- "name": "Riverbank",
- "terms": ""
- },
- "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/weir": {
- "name": "Weir",
- "terms": ""
+ // node_modules/alif-toolkit/lib/unicode-ligatures.js
+ var require_unicode_ligatures = __commonJS({
+ "node_modules/alif-toolkit/lib/unicode-ligatures.js"(exports2) {
+ "use strict";
+ Object.defineProperty(exports2, "__esModule", { value: true });
+ var ligatureReference = {
+ "\u0626\u0627": {
+ "isolated": "\uFBEA",
+ "final": "\uFBEB"
+ },
+ "\u0626\u06D5": {
+ "isolated": "\uFBEC",
+ "final": "\uFBED"
+ },
+ "\u0626\u0648": {
+ "isolated": "\uFBEE",
+ "final": "\uFBEF"
+ },
+ "\u0626\u06C7": {
+ "isolated": "\uFBF0",
+ "final": "\uFBF1"
+ },
+ "\u0626\u06C6": {
+ "isolated": "\uFBF2",
+ "final": "\uFBF3"
+ },
+ "\u0626\u06C8": {
+ "isolated": "\uFBF4",
+ "final": "\uFBF5"
+ },
+ "\u0626\u06D0": {
+ "isolated": "\uFBF6",
+ "final": "\uFBF7",
+ "initial": "\uFBF8"
+ },
+ "\u0626\u0649": {
+ "uighur_kirghiz": {
+ "isolated": "\uFBF9",
+ "final": "\uFBFA",
+ "initial": "\uFBFB"
+ },
+ "isolated": "\uFC03",
+ "final": "\uFC68"
+ },
+ "\u0626\u062C": {
+ "isolated": "\uFC00",
+ "initial": "\uFC97"
+ },
+ "\u0626\u062D": {
+ "isolated": "\uFC01",
+ "initial": "\uFC98"
+ },
+ "\u0626\u0645": {
+ "isolated": "\uFC02",
+ "final": "\uFC66",
+ "initial": "\uFC9A",
+ "medial": "\uFCDF"
+ },
+ "\u0626\u064A": {
+ "isolated": "\uFC04",
+ "final": "\uFC69"
+ },
+ "\u0628\u062C": {
+ "isolated": "\uFC05",
+ "initial": "\uFC9C"
+ },
+ "\u0628\u062D": {
+ "isolated": "\uFC06",
+ "initial": "\uFC9D"
+ },
+ "\u0628\u062E": {
+ "isolated": "\uFC07",
+ "initial": "\uFC9E"
+ },
+ "\u0628\u0645": {
+ "isolated": "\uFC08",
+ "final": "\uFC6C",
+ "initial": "\uFC9F",
+ "medial": "\uFCE1"
+ },
+ "\u0628\u0649": {
+ "isolated": "\uFC09",
+ "final": "\uFC6E"
+ },
+ "\u0628\u064A": {
+ "isolated": "\uFC0A",
+ "final": "\uFC6F"
+ },
+ "\u062A\u062C": {
+ "isolated": "\uFC0B",
+ "initial": "\uFCA1"
+ },
+ "\u062A\u062D": {
+ "isolated": "\uFC0C",
+ "initial": "\uFCA2"
+ },
+ "\u062A\u062E": {
+ "isolated": "\uFC0D",
+ "initial": "\uFCA3"
+ },
+ "\u062A\u0645": {
+ "isolated": "\uFC0E",
+ "final": "\uFC72",
+ "initial": "\uFCA4",
+ "medial": "\uFCE3"
+ },
+ "\u062A\u0649": {
+ "isolated": "\uFC0F",
+ "final": "\uFC74"
+ },
+ "\u062A\u064A": {
+ "isolated": "\uFC10",
+ "final": "\uFC75"
+ },
+ "\u062B\u062C": {
+ "isolated": "\uFC11"
+ },
+ "\u062B\u0645": {
+ "isolated": "\uFC12",
+ "final": "\uFC78",
+ "initial": "\uFCA6",
+ "medial": "\uFCE5"
+ },
+ "\u062B\u0649": {
+ "isolated": "\uFC13",
+ "final": "\uFC7A"
+ },
+ "\u062B\u0648": {
+ "isolated": "\uFC14"
+ },
+ "\u062C\u062D": {
+ "isolated": "\uFC15",
+ "initial": "\uFCA7"
+ },
+ "\u062C\u0645": {
+ "isolated": "\uFC16",
+ "initial": "\uFCA8"
+ },
+ "\u062D\u062C": {
+ "isolated": "\uFC17",
+ "initial": "\uFCA9"
+ },
+ "\u062D\u0645": {
+ "isolated": "\uFC18",
+ "initial": "\uFCAA"
+ },
+ "\u062E\u062C": {
+ "isolated": "\uFC19",
+ "initial": "\uFCAB"
+ },
+ "\u062E\u062D": {
+ "isolated": "\uFC1A"
+ },
+ "\u062E\u0645": {
+ "isolated": "\uFC1B",
+ "initial": "\uFCAC"
+ },
+ "\u0633\u062C": {
+ "isolated": "\uFC1C",
+ "initial": "\uFCAD",
+ "medial": "\uFD34"
+ },
+ "\u0633\u062D": {
+ "isolated": "\uFC1D",
+ "initial": "\uFCAE",
+ "medial": "\uFD35"
+ },
+ "\u0633\u062E": {
+ "isolated": "\uFC1E",
+ "initial": "\uFCAF",
+ "medial": "\uFD36"
+ },
+ "\u0633\u0645": {
+ "isolated": "\uFC1F",
+ "initial": "\uFCB0",
+ "medial": "\uFCE7"
+ },
+ "\u0635\u062D": {
+ "isolated": "\uFC20",
+ "initial": "\uFCB1"
+ },
+ "\u0635\u0645": {
+ "isolated": "\uFC21",
+ "initial": "\uFCB3"
+ },
+ "\u0636\u062C": {
+ "isolated": "\uFC22",
+ "initial": "\uFCB4"
+ },
+ "\u0636\u062D": {
+ "isolated": "\uFC23",
+ "initial": "\uFCB5"
+ },
+ "\u0636\u062E": {
+ "isolated": "\uFC24",
+ "initial": "\uFCB6"
+ },
+ "\u0636\u0645": {
+ "isolated": "\uFC25",
+ "initial": "\uFCB7"
+ },
+ "\u0637\u062D": {
+ "isolated": "\uFC26",
+ "initial": "\uFCB8"
+ },
+ "\u0637\u0645": {
+ "isolated": "\uFC27",
+ "initial": "\uFD33",
+ "medial": "\uFD3A"
+ },
+ "\u0638\u0645": {
+ "isolated": "\uFC28",
+ "initial": "\uFCB9",
+ "medial": "\uFD3B"
+ },
+ "\u0639\u062C": {
+ "isolated": "\uFC29",
+ "initial": "\uFCBA"
+ },
+ "\u0639\u0645": {
+ "isolated": "\uFC2A",
+ "initial": "\uFCBB"
+ },
+ "\u063A\u062C": {
+ "isolated": "\uFC2B",
+ "initial": "\uFCBC"
+ },
+ "\u063A\u0645": {
+ "isolated": "\uFC2C",
+ "initial": "\uFCBD"
+ },
+ "\u0641\u062C": {
+ "isolated": "\uFC2D",
+ "initial": "\uFCBE"
+ },
+ "\u0641\u062D": {
+ "isolated": "\uFC2E",
+ "initial": "\uFCBF"
+ },
+ "\u0641\u062E": {
+ "isolated": "\uFC2F",
+ "initial": "\uFCC0"
+ },
+ "\u0641\u0645": {
+ "isolated": "\uFC30",
+ "initial": "\uFCC1"
+ },
+ "\u0641\u0649": {
+ "isolated": "\uFC31",
+ "final": "\uFC7C"
+ },
+ "\u0641\u064A": {
+ "isolated": "\uFC32",
+ "final": "\uFC7D"
+ },
+ "\u0642\u062D": {
+ "isolated": "\uFC33",
+ "initial": "\uFCC2"
+ },
+ "\u0642\u0645": {
+ "isolated": "\uFC34",
+ "initial": "\uFCC3"
+ },
+ "\u0642\u0649": {
+ "isolated": "\uFC35",
+ "final": "\uFC7E"
+ },
+ "\u0642\u064A": {
+ "isolated": "\uFC36",
+ "final": "\uFC7F"
+ },
+ "\u0643\u0627": {
+ "isolated": "\uFC37",
+ "final": "\uFC80"
+ },
+ "\u0643\u062C": {
+ "isolated": "\uFC38",
+ "initial": "\uFCC4"
+ },
+ "\u0643\u062D": {
+ "isolated": "\uFC39",
+ "initial": "\uFCC5"
+ },
+ "\u0643\u062E": {
+ "isolated": "\uFC3A",
+ "initial": "\uFCC6"
+ },
+ "\u0643\u0644": {
+ "isolated": "\uFC3B",
+ "final": "\uFC81",
+ "initial": "\uFCC7",
+ "medial": "\uFCEB"
+ },
+ "\u0643\u0645": {
+ "isolated": "\uFC3C",
+ "final": "\uFC82",
+ "initial": "\uFCC8",
+ "medial": "\uFCEC"
+ },
+ "\u0643\u0649": {
+ "isolated": "\uFC3D",
+ "final": "\uFC83"
+ },
+ "\u0643\u064A": {
+ "isolated": "\uFC3E",
+ "final": "\uFC84"
+ },
+ "\u0644\u062C": {
+ "isolated": "\uFC3F",
+ "initial": "\uFCC9"
+ },
+ "\u0644\u062D": {
+ "isolated": "\uFC40",
+ "initial": "\uFCCA"
+ },
+ "\u0644\u062E": {
+ "isolated": "\uFC41",
+ "initial": "\uFCCB"
+ },
+ "\u0644\u0645": {
+ "isolated": "\uFC42",
+ "final": "\uFC85",
+ "initial": "\uFCCC",
+ "medial": "\uFCED"
+ },
+ "\u0644\u0649": {
+ "isolated": "\uFC43",
+ "final": "\uFC86"
+ },
+ "\u0644\u064A": {
+ "isolated": "\uFC44",
+ "final": "\uFC87"
+ },
+ "\u0645\u062C": {
+ "isolated": "\uFC45",
+ "initial": "\uFCCE"
+ },
+ "\u0645\u062D": {
+ "isolated": "\uFC46",
+ "initial": "\uFCCF"
+ },
+ "\u0645\u062E": {
+ "isolated": "\uFC47",
+ "initial": "\uFCD0"
+ },
+ "\u0645\u0645": {
+ "isolated": "\uFC48",
+ "final": "\uFC89",
+ "initial": "\uFCD1"
+ },
+ "\u0645\u0649": {
+ "isolated": "\uFC49"
+ },
+ "\u0645\u064A": {
+ "isolated": "\uFC4A"
+ },
+ "\u0646\u062C": {
+ "isolated": "\uFC4B",
+ "initial": "\uFCD2"
+ },
+ "\u0646\u062D": {
+ "isolated": "\uFC4C",
+ "initial": "\uFCD3"
+ },
+ "\u0646\u062E": {
+ "isolated": "\uFC4D",
+ "initial": "\uFCD4"
+ },
+ "\u0646\u0645": {
+ "isolated": "\uFC4E",
+ "final": "\uFC8C",
+ "initial": "\uFCD5",
+ "medial": "\uFCEE"
+ },
+ "\u0646\u0649": {
+ "isolated": "\uFC4F",
+ "final": "\uFC8E"
+ },
+ "\u0646\u064A": {
+ "isolated": "\uFC50",
+ "final": "\uFC8F"
+ },
+ "\u0647\u062C": {
+ "isolated": "\uFC51",
+ "initial": "\uFCD7"
+ },
+ "\u0647\u0645": {
+ "isolated": "\uFC52",
+ "initial": "\uFCD8"
+ },
+ "\u0647\u0649": {
+ "isolated": "\uFC53"
+ },
+ "\u0647\u064A": {
+ "isolated": "\uFC54"
+ },
+ "\u064A\u062C": {
+ "isolated": "\uFC55",
+ "initial": "\uFCDA"
+ },
+ "\u064A\u062D": {
+ "isolated": "\uFC56",
+ "initial": "\uFCDB"
+ },
+ "\u064A\u062E": {
+ "isolated": "\uFC57",
+ "initial": "\uFCDC"
+ },
+ "\u064A\u0645": {
+ "isolated": "\uFC58",
+ "final": "\uFC93",
+ "initial": "\uFCDD",
+ "medial": "\uFCF0"
+ },
+ "\u064A\u0649": {
+ "isolated": "\uFC59",
+ "final": "\uFC95"
+ },
+ "\u064A\u064A": {
+ "isolated": "\uFC5A",
+ "final": "\uFC96"
+ },
+ "\u0630\u0670": {
+ "isolated": "\uFC5B"
+ },
+ "\u0631\u0670": {
+ "isolated": "\uFC5C"
+ },
+ "\u0649\u0670": {
+ "isolated": "\uFC5D",
+ "final": "\uFC90"
+ },
+ "\u064C\u0651": {
+ "isolated": "\uFC5E"
+ },
+ "\u064D\u0651": {
+ "isolated": "\uFC5F"
+ },
+ "\u064E\u0651": {
+ "isolated": "\uFC60"
+ },
+ "\u064F\u0651": {
+ "isolated": "\uFC61"
+ },
+ "\u0650\u0651": {
+ "isolated": "\uFC62"
+ },
+ "\u0651\u0670": {
+ "isolated": "\uFC63"
+ },
+ "\u0626\u0631": {
+ "final": "\uFC64"
+ },
+ "\u0626\u0632": {
+ "final": "\uFC65"
+ },
+ "\u0626\u0646": {
+ "final": "\uFC67"
+ },
+ "\u0628\u0631": {
+ "final": "\uFC6A"
+ },
+ "\u0628\u0632": {
+ "final": "\uFC6B"
+ },
+ "\u0628\u0646": {
+ "final": "\uFC6D"
+ },
+ "\u062A\u0631": {
+ "final": "\uFC70"
+ },
+ "\u062A\u0632": {
+ "final": "\uFC71"
+ },
+ "\u062A\u0646": {
+ "final": "\uFC73"
+ },
+ "\u062B\u0631": {
+ "final": "\uFC76"
+ },
+ "\u062B\u0632": {
+ "final": "\uFC77"
+ },
+ "\u062B\u0646": {
+ "final": "\uFC79"
+ },
+ "\u062B\u064A": {
+ "final": "\uFC7B"
+ },
+ "\u0645\u0627": {
+ "final": "\uFC88"
+ },
+ "\u0646\u0631": {
+ "final": "\uFC8A"
+ },
+ "\u0646\u0632": {
+ "final": "\uFC8B"
+ },
+ "\u0646\u0646": {
+ "final": "\uFC8D"
+ },
+ "\u064A\u0631": {
+ "final": "\uFC91"
+ },
+ "\u064A\u0632": {
+ "final": "\uFC92"
+ },
+ "\u064A\u0646": {
+ "final": "\uFC94"
+ },
+ "\u0626\u062E": {
+ "initial": "\uFC99"
+ },
+ "\u0626\u0647": {
+ "initial": "\uFC9B",
+ "medial": "\uFCE0"
+ },
+ "\u0628\u0647": {
+ "initial": "\uFCA0",
+ "medial": "\uFCE2"
+ },
+ "\u062A\u0647": {
+ "initial": "\uFCA5",
+ "medial": "\uFCE4"
+ },
+ "\u0635\u062E": {
+ "initial": "\uFCB2"
+ },
+ "\u0644\u0647": {
+ "initial": "\uFCCD"
+ },
+ "\u0646\u0647": {
+ "initial": "\uFCD6",
+ "medial": "\uFCEF"
+ },
+ "\u0647\u0670": {
+ "initial": "\uFCD9"
+ },
+ "\u064A\u0647": {
+ "initial": "\uFCDE",
+ "medial": "\uFCF1"
+ },
+ "\u062B\u0647": {
+ "medial": "\uFCE6"
+ },
+ "\u0633\u0647": {
+ "medial": "\uFCE8",
+ "initial": "\uFD31"
+ },
+ "\u0634\u0645": {
+ "medial": "\uFCE9",
+ "isolated": "\uFD0C",
+ "final": "\uFD28",
+ "initial": "\uFD30"
+ },
+ "\u0634\u0647": {
+ "medial": "\uFCEA",
+ "initial": "\uFD32"
+ },
+ "\u0640\u064E\u0651": {
+ "medial": "\uFCF2"
+ },
+ "\u0640\u064F\u0651": {
+ "medial": "\uFCF3"
+ },
+ "\u0640\u0650\u0651": {
+ "medial": "\uFCF4"
+ },
+ "\u0637\u0649": {
+ "isolated": "\uFCF5",
+ "final": "\uFD11"
+ },
+ "\u0637\u064A": {
+ "isolated": "\uFCF6",
+ "final": "\uFD12"
+ },
+ "\u0639\u0649": {
+ "isolated": "\uFCF7",
+ "final": "\uFD13"
+ },
+ "\u0639\u064A": {
+ "isolated": "\uFCF8",
+ "final": "\uFD14"
+ },
+ "\u063A\u0649": {
+ "isolated": "\uFCF9",
+ "final": "\uFD15"
+ },
+ "\u063A\u064A": {
+ "isolated": "\uFCFA",
+ "final": "\uFD16"
+ },
+ "\u0633\u0649": {
+ "isolated": "\uFCFB"
+ },
+ "\u0633\u064A": {
+ "isolated": "\uFCFC",
+ "final": "\uFD18"
+ },
+ "\u0634\u0649": {
+ "isolated": "\uFCFD",
+ "final": "\uFD19"
+ },
+ "\u0634\u064A": {
+ "isolated": "\uFCFE",
+ "final": "\uFD1A"
+ },
+ "\u062D\u0649": {
+ "isolated": "\uFCFF",
+ "final": "\uFD1B"
+ },
+ "\u062D\u064A": {
+ "isolated": "\uFD00",
+ "final": "\uFD1C"
+ },
+ "\u062C\u0649": {
+ "isolated": "\uFD01",
+ "final": "\uFD1D"
+ },
+ "\u062C\u064A": {
+ "isolated": "\uFD02",
+ "final": "\uFD1E"
+ },
+ "\u062E\u0649": {
+ "isolated": "\uFD03",
+ "final": "\uFD1F"
+ },
+ "\u062E\u064A": {
+ "isolated": "\uFD04",
+ "final": "\uFD20"
+ },
+ "\u0635\u0649": {
+ "isolated": "\uFD05",
+ "final": "\uFD21"
+ },
+ "\u0635\u064A": {
+ "isolated": "\uFD06",
+ "final": "\uFD22"
+ },
+ "\u0636\u0649": {
+ "isolated": "\uFD07",
+ "final": "\uFD23"
+ },
+ "\u0636\u064A": {
+ "isolated": "\uFD08",
+ "final": "\uFD24"
+ },
+ "\u0634\u062C": {
+ "isolated": "\uFD09",
+ "final": "\uFD25",
+ "initial": "\uFD2D",
+ "medial": "\uFD37"
+ },
+ "\u0634\u062D": {
+ "isolated": "\uFD0A",
+ "final": "\uFD26",
+ "initial": "\uFD2E",
+ "medial": "\uFD38"
+ },
+ "\u0634\u062E": {
+ "isolated": "\uFD0B",
+ "final": "\uFD27",
+ "initial": "\uFD2F",
+ "medial": "\uFD39"
+ },
+ "\u0634\u0631": {
+ "isolated": "\uFD0D",
+ "final": "\uFD29"
+ },
+ "\u0633\u0631": {
+ "isolated": "\uFD0E",
+ "final": "\uFD2A"
+ },
+ "\u0635\u0631": {
+ "isolated": "\uFD0F",
+ "final": "\uFD2B"
+ },
+ "\u0636\u0631": {
+ "isolated": "\uFD10",
+ "final": "\uFD2C"
+ },
+ "\u0633\u0639": {
+ "final": "\uFD17"
+ },
+ "\u062A\u062C\u0645": {
+ "initial": "\uFD50"
+ },
+ "\u062A\u062D\u062C": {
+ "final": "\uFD51",
+ "initial": "\uFD52"
+ },
+ "\u062A\u062D\u0645": {
+ "initial": "\uFD53"
+ },
+ "\u062A\u062E\u0645": {
+ "initial": "\uFD54"
+ },
+ "\u062A\u0645\u062C": {
+ "initial": "\uFD55"
+ },
+ "\u062A\u0645\u062D": {
+ "initial": "\uFD56"
+ },
+ "\u062A\u0645\u062E": {
+ "initial": "\uFD57"
+ },
+ "\u062C\u0645\u062D": {
+ "final": "\uFD58",
+ "initial": "\uFD59"
+ },
+ "\u062D\u0645\u064A": {
+ "final": "\uFD5A"
+ },
+ "\u062D\u0645\u0649": {
+ "final": "\uFD5B"
+ },
+ "\u0633\u062D\u062C": {
+ "initial": "\uFD5C"
+ },
+ "\u0633\u062C\u062D": {
+ "initial": "\uFD5D"
+ },
+ "\u0633\u062C\u0649": {
+ "final": "\uFD5E"
+ },
+ "\u0633\u0645\u062D": {
+ "final": "\uFD5F",
+ "initial": "\uFD60"
+ },
+ "\u0633\u0645\u062C": {
+ "initial": "\uFD61"
+ },
+ "\u0633\u0645\u0645": {
+ "final": "\uFD62",
+ "initial": "\uFD63"
+ },
+ "\u0635\u062D\u062D": {
+ "final": "\uFD64",
+ "initial": "\uFD65"
+ },
+ "\u0635\u0645\u0645": {
+ "final": "\uFD66",
+ "initial": "\uFDC5"
+ },
+ "\u0634\u062D\u0645": {
+ "final": "\uFD67",
+ "initial": "\uFD68"
+ },
+ "\u0634\u062C\u064A": {
+ "final": "\uFD69"
+ },
+ "\u0634\u0645\u062E": {
+ "final": "\uFD6A",
+ "initial": "\uFD6B"
+ },
+ "\u0634\u0645\u0645": {
+ "final": "\uFD6C",
+ "initial": "\uFD6D"
+ },
+ "\u0636\u062D\u0649": {
+ "final": "\uFD6E"
+ },
+ "\u0636\u062E\u0645": {
+ "final": "\uFD6F",
+ "initial": "\uFD70"
+ },
+ "\u0636\u0645\u062D": {
+ "final": "\uFD71"
+ },
+ "\u0637\u0645\u062D": {
+ "initial": "\uFD72"
+ },
+ "\u0637\u0645\u0645": {
+ "initial": "\uFD73"
+ },
+ "\u0637\u0645\u064A": {
+ "final": "\uFD74"
+ },
+ "\u0639\u062C\u0645": {
+ "final": "\uFD75",
+ "initial": "\uFDC4"
+ },
+ "\u0639\u0645\u0645": {
+ "final": "\uFD76",
+ "initial": "\uFD77"
+ },
+ "\u0639\u0645\u0649": {
+ "final": "\uFD78"
+ },
+ "\u063A\u0645\u0645": {
+ "final": "\uFD79"
+ },
+ "\u063A\u0645\u064A": {
+ "final": "\uFD7A"
+ },
+ "\u063A\u0645\u0649": {
+ "final": "\uFD7B"
+ },
+ "\u0641\u062E\u0645": {
+ "final": "\uFD7C",
+ "initial": "\uFD7D"
+ },
+ "\u0642\u0645\u062D": {
+ "final": "\uFD7E",
+ "initial": "\uFDB4"
+ },
+ "\u0642\u0645\u0645": {
+ "final": "\uFD7F"
+ },
+ "\u0644\u062D\u0645": {
+ "final": "\uFD80",
+ "initial": "\uFDB5"
+ },
+ "\u0644\u062D\u064A": {
+ "final": "\uFD81"
+ },
+ "\u0644\u062D\u0649": {
+ "final": "\uFD82"
+ },
+ "\u0644\u062C\u062C": {
+ "initial": "\uFD83",
+ "final": "\uFD84"
+ },
+ "\u0644\u062E\u0645": {
+ "final": "\uFD85",
+ "initial": "\uFD86"
+ },
+ "\u0644\u0645\u062D": {
+ "final": "\uFD87",
+ "initial": "\uFD88"
+ },
+ "\u0645\u062D\u062C": {
+ "initial": "\uFD89"
+ },
+ "\u0645\u062D\u0645": {
+ "initial": "\uFD8A"
+ },
+ "\u0645\u062D\u064A": {
+ "final": "\uFD8B"
+ },
+ "\u0645\u062C\u062D": {
+ "initial": "\uFD8C"
+ },
+ "\u0645\u062C\u0645": {
+ "initial": "\uFD8D"
+ },
+ "\u0645\u062E\u062C": {
+ "initial": "\uFD8E"
+ },
+ "\u0645\u062E\u0645": {
+ "initial": "\uFD8F"
+ },
+ "\u0645\u062C\u062E": {
+ "initial": "\uFD92"
+ },
+ "\u0647\u0645\u062C": {
+ "initial": "\uFD93"
+ },
+ "\u0647\u0645\u0645": {
+ "initial": "\uFD94"
+ },
+ "\u0646\u062D\u0645": {
+ "initial": "\uFD95"
+ },
+ "\u0646\u062D\u0649": {
+ "final": "\uFD96"
+ },
+ "\u0646\u062C\u0645": {
+ "final": "\uFD97",
+ "initial": "\uFD98"
+ },
+ "\u0646\u062C\u0649": {
+ "final": "\uFD99"
+ },
+ "\u0646\u0645\u064A": {
+ "final": "\uFD9A"
+ },
+ "\u0646\u0645\u0649": {
+ "final": "\uFD9B"
+ },
+ "\u064A\u0645\u0645": {
+ "final": "\uFD9C",
+ "initial": "\uFD9D"
+ },
+ "\u0628\u062E\u064A": {
+ "final": "\uFD9E"
+ },
+ "\u062A\u062C\u064A": {
+ "final": "\uFD9F"
+ },
+ "\u062A\u062C\u0649": {
+ "final": "\uFDA0"
+ },
+ "\u062A\u062E\u064A": {
+ "final": "\uFDA1"
+ },
+ "\u062A\u062E\u0649": {
+ "final": "\uFDA2"
+ },
+ "\u062A\u0645\u064A": {
+ "final": "\uFDA3"
+ },
+ "\u062A\u0645\u0649": {
+ "final": "\uFDA4"
+ },
+ "\u062C\u0645\u064A": {
+ "final": "\uFDA5"
+ },
+ "\u062C\u062D\u0649": {
+ "final": "\uFDA6"
+ },
+ "\u062C\u0645\u0649": {
+ "final": "\uFDA7"
+ },
+ "\u0633\u062E\u0649": {
+ "final": "\uFDA8"
+ },
+ "\u0635\u062D\u064A": {
+ "final": "\uFDA9"
+ },
+ "\u0634\u062D\u064A": {
+ "final": "\uFDAA"
+ },
+ "\u0636\u062D\u064A": {
+ "final": "\uFDAB"
+ },
+ "\u0644\u062C\u064A": {
+ "final": "\uFDAC"
+ },
+ "\u0644\u0645\u064A": {
+ "final": "\uFDAD"
+ },
+ "\u064A\u062D\u064A": {
+ "final": "\uFDAE"
+ },
+ "\u064A\u062C\u064A": {
+ "final": "\uFDAF"
+ },
+ "\u064A\u0645\u064A": {
+ "final": "\uFDB0"
+ },
+ "\u0645\u0645\u064A": {
+ "final": "\uFDB1"
+ },
+ "\u0642\u0645\u064A": {
+ "final": "\uFDB2"
+ },
+ "\u0646\u062D\u064A": {
+ "final": "\uFDB3"
+ },
+ "\u0639\u0645\u064A": {
+ "final": "\uFDB6"
+ },
+ "\u0643\u0645\u064A": {
+ "final": "\uFDB7"
+ },
+ "\u0646\u062C\u062D": {
+ "initial": "\uFDB8",
+ "final": "\uFDBD"
+ },
+ "\u0645\u062E\u064A": {
+ "final": "\uFDB9"
+ },
+ "\u0644\u062C\u0645": {
+ "initial": "\uFDBA",
+ "final": "\uFDBC"
+ },
+ "\u0643\u0645\u0645": {
+ "final": "\uFDBB",
+ "initial": "\uFDC3"
+ },
+ "\u062C\u062D\u064A": {
+ "final": "\uFDBE"
+ },
+ "\u062D\u062C\u064A": {
+ "final": "\uFDBF"
+ },
+ "\u0645\u062C\u064A": {
+ "final": "\uFDC0"
+ },
+ "\u0641\u0645\u064A": {
+ "final": "\uFDC1"
+ },
+ "\u0628\u062D\u064A": {
+ "final": "\uFDC2"
+ },
+ "\u0633\u062E\u064A": {
+ "final": "\uFDC6"
+ },
+ "\u0646\u062C\u064A": {
+ "final": "\uFDC7"
+ },
+ "\u0644\u0622": {
+ "isolated": "\uFEF5",
+ "final": "\uFEF6"
+ },
+ "\u0644\u0623": {
+ "isolated": "\uFEF7",
+ "final": "\uFEF8"
+ },
+ "\u0644\u0625": {
+ "isolated": "\uFEF9",
+ "final": "\uFEFA"
+ },
+ "\u0644\u0627": {
+ "isolated": "\uFEFB",
+ "final": "\uFEFC"
+ },
+ "words": {
+ "\u0635\u0644\u06D2": "\uFDF0",
+ "\u0642\u0644\u06D2": "\uFDF1",
+ "\u0627\u0644\u0644\u0647": "\uFDF2",
+ "\u0627\u0643\u0628\u0631": "\uFDF3",
+ "\u0645\u062D\u0645\u062F": "\uFDF4",
+ "\u0635\u0644\u0639\u0645": "\uFDF5",
+ "\u0631\u0633\u0648\u0644": "\uFDF6",
+ "\u0639\u0644\u064A\u0647": "\uFDF7",
+ "\u0648\u0633\u0644\u0645": "\uFDF8",
+ "\u0635\u0644\u0649": "\uFDF9",
+ "\u0635\u0644\u0649\u0627\u0644\u0644\u0647\u0639\u0644\u064A\u0647\u0648\u0633\u0644\u0645": "\uFDFA",
+ "\u062C\u0644\u062C\u0644\u0627\u0644\u0647": "\uFDFB",
+ "\u0631\u06CC\u0627\u0644": "\uFDFC"
+ }
+ };
+ exports2.default = ligatureReference;
+ }
+ });
+
+ // node_modules/alif-toolkit/lib/reference.js
+ var require_reference = __commonJS({
+ "node_modules/alif-toolkit/lib/reference.js"(exports2) {
+ "use strict";
+ Object.defineProperty(exports2, "__esModule", { value: true });
+ var unicode_arabic_1 = require_unicode_arabic();
+ var unicode_ligatures_1 = require_unicode_ligatures();
+ var letterList = Object.keys(unicode_arabic_1.default);
+ exports2.letterList = letterList;
+ var ligatureList = Object.keys(unicode_ligatures_1.default);
+ exports2.ligatureList = ligatureList;
+ var ligatureWordList = Object.keys(unicode_ligatures_1.default.words);
+ exports2.ligatureWordList = ligatureWordList;
+ var lams = "\u0644\u06B5\u06B6\u06B7\u06B8";
+ exports2.lams = lams;
+ var alefs = "\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774";
+ exports2.alefs = alefs;
+ var tashkeel = "\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8";
+ exports2.tashkeel = tashkeel;
+ function addToTashkeel(start2, finish) {
+ for (var i2 = start2; i2 <= finish; i2++) {
+ exports2.tashkeel = tashkeel += String.fromCharCode(i2);
+ }
+ }
+ addToTashkeel(1552, 1562);
+ addToTashkeel(1611, 1631);
+ addToTashkeel(1750, 1756);
+ addToTashkeel(1760, 1764);
+ addToTashkeel(1770, 1773);
+ addToTashkeel(2259, 2273);
+ addToTashkeel(2275, 2303);
+ addToTashkeel(65136, 65151);
+ var lineBreakers = "\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9";
+ exports2.lineBreakers = lineBreakers;
+ function addToLineBreakers(start2, finish) {
+ for (var i2 = start2; i2 <= finish; i2++) {
+ exports2.lineBreakers = lineBreakers += String.fromCharCode(i2);
+ }
+ }
+ addToLineBreakers(1536, 1567);
+ addToLineBreakers(1569, 1573);
+ addToLineBreakers(1583, 1586);
+ addToLineBreakers(1632, 1645);
+ addToLineBreakers(1649, 1655);
+ addToLineBreakers(1672, 1689);
+ addToLineBreakers(1731, 1739);
+ addToLineBreakers(1746, 1785);
+ addToLineBreakers(1881, 1883);
+ addToLineBreakers(2218, 2222);
+ addToLineBreakers(64336, 65021);
+ addToLineBreakers(65152, 65276);
+ addToLineBreakers(69216, 69247);
+ addToLineBreakers(126064, 126143);
+ addToLineBreakers(126464, 126719);
+ }
+ });
+
+ // node_modules/alif-toolkit/lib/GlyphSplitter.js
+ var require_GlyphSplitter = __commonJS({
+ "node_modules/alif-toolkit/lib/GlyphSplitter.js"(exports2) {
+ "use strict";
+ Object.defineProperty(exports2, "__esModule", { value: true });
+ var isArabic_1 = require_isArabic();
+ var reference_1 = require_reference();
+ function GlyphSplitter(word) {
+ let letters = [];
+ let lastLetter = "";
+ word.split("").forEach((letter) => {
+ if (isArabic_1.isArabic(letter)) {
+ if (reference_1.tashkeel.indexOf(letter) > -1) {
+ letters[letters.length - 1] += letter;
+ } else if (lastLetter.length && (reference_1.lams.indexOf(lastLetter) === 0 && reference_1.alefs.indexOf(letter) > -1 || reference_1.lams.indexOf(lastLetter) > 0 && reference_1.alefs.indexOf(letter) === 0)) {
+ letters[letters.length - 1] += letter;
+ } else {
+ letters.push(letter);
+ }
+ } else {
+ letters.push(letter);
+ }
+ if (reference_1.tashkeel.indexOf(letter) === -1) {
+ lastLetter = letter;
+ }
+ });
+ return letters;
+ }
+ exports2.GlyphSplitter = GlyphSplitter;
+ }
+ });
+
+ // node_modules/alif-toolkit/lib/BaselineSplitter.js
+ var require_BaselineSplitter = __commonJS({
+ "node_modules/alif-toolkit/lib/BaselineSplitter.js"(exports2) {
+ "use strict";
+ Object.defineProperty(exports2, "__esModule", { value: true });
+ var isArabic_1 = require_isArabic();
+ var reference_1 = require_reference();
+ function BaselineSplitter(word) {
+ let letters = [];
+ let lastLetter = "";
+ word.split("").forEach((letter) => {
+ if (isArabic_1.isArabic(letter) && isArabic_1.isArabic(lastLetter)) {
+ if (lastLetter.length && reference_1.tashkeel.indexOf(letter) > -1) {
+ letters[letters.length - 1] += letter;
+ } else if (reference_1.lineBreakers.indexOf(lastLetter) > -1) {
+ letters.push(letter);
+ } else {
+ letters[letters.length - 1] += letter;
+ }
+ } else {
+ letters.push(letter);
+ }
+ if (reference_1.tashkeel.indexOf(letter) === -1) {
+ lastLetter = letter;
+ }
+ });
+ return letters;
+ }
+ exports2.BaselineSplitter = BaselineSplitter;
+ }
+ });
+
+ // node_modules/alif-toolkit/lib/Normalization.js
+ var require_Normalization = __commonJS({
+ "node_modules/alif-toolkit/lib/Normalization.js"(exports2) {
+ "use strict";
+ Object.defineProperty(exports2, "__esModule", { value: true });
+ var unicode_arabic_1 = require_unicode_arabic();
+ var unicode_ligatures_1 = require_unicode_ligatures();
+ var isArabic_1 = require_isArabic();
+ var reference_1 = require_reference();
+ function Normal(word, breakPresentationForm) {
+ if (typeof breakPresentationForm === "undefined") {
+ breakPresentationForm = true;
+ }
+ let returnable = "";
+ word.split("").forEach((letter) => {
+ if (!isArabic_1.isArabic(letter)) {
+ returnable += letter;
+ return;
+ }
+ for (let w = 0; w < reference_1.letterList.length; w++) {
+ let letterForms = unicode_arabic_1.default[reference_1.letterList[w]];
+ let versions = Object.keys(letterForms);
+ for (let v = 0; v < versions.length; v++) {
+ let localVersion = letterForms[versions[v]];
+ if (typeof localVersion === "object" && typeof localVersion.indexOf === "undefined") {
+ let embeddedForms = Object.keys(localVersion);
+ for (let ef = 0; ef < embeddedForms.length; ef++) {
+ let form = localVersion[embeddedForms[ef]];
+ if (form === letter || typeof form === "object" && form.indexOf && form.indexOf(letter) > -1) {
+ if (form === letter) {
+ if (breakPresentationForm && localVersion["normal"] && ["isolated", "initial", "medial", "final"].indexOf(embeddedForms[ef]) > -1) {
+ if (typeof localVersion["normal"] === "object") {
+ returnable += localVersion["normal"][0];
+ } else {
+ returnable += localVersion["normal"];
+ }
+ return;
+ }
+ returnable += letter;
+ return;
+ } else if (typeof form === "object" && form.indexOf && form.indexOf(letter) > -1) {
+ returnable += form[0];
+ return;
+ }
+ }
+ }
+ } else if (localVersion === letter) {
+ if (breakPresentationForm && letterForms["normal"] && ["isolated", "initial", "medial", "final"].indexOf(versions[v]) > -1) {
+ if (typeof letterForms["normal"] === "object") {
+ returnable += letterForms["normal"][0];
+ } else {
+ returnable += letterForms["normal"];
+ }
+ return;
+ }
+ returnable += letter;
+ return;
+ } else if (typeof localVersion === "object" && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
+ returnable += localVersion[0];
+ return;
+ }
+ }
+ }
+ for (let v2 = 0; v2 < reference_1.ligatureList.length; v2++) {
+ let normalForm = reference_1.ligatureList[v2];
+ if (normalForm !== "words") {
+ let ligForms = Object.keys(unicode_ligatures_1.default[normalForm]);
+ for (let f2 = 0; f2 < ligForms.length; f2++) {
+ if (unicode_ligatures_1.default[normalForm][ligForms[f2]] === letter) {
+ returnable += normalForm;
+ return;
+ }
+ }
+ }
+ }
+ for (let v3 = 0; v3 < reference_1.ligatureWordList.length; v3++) {
+ let normalForm = reference_1.ligatureWordList[v3];
+ if (unicode_ligatures_1.default.words[normalForm] === letter) {
+ returnable += normalForm;
+ return;
+ }
+ }
+ returnable += letter;
+ });
+ return returnable;
+ }
+ exports2.Normal = Normal;
+ }
+ });
+
+ // node_modules/alif-toolkit/lib/CharShaper.js
+ var require_CharShaper = __commonJS({
+ "node_modules/alif-toolkit/lib/CharShaper.js"(exports2) {
+ "use strict";
+ Object.defineProperty(exports2, "__esModule", { value: true });
+ var unicode_arabic_1 = require_unicode_arabic();
+ var isArabic_1 = require_isArabic();
+ var reference_1 = require_reference();
+ function CharShaper(letter, form) {
+ if (!isArabic_1.isArabic(letter)) {
+ throw new Error("Not Arabic");
+ }
+ if (letter === "\u0621") {
+ return "\u0621";
+ }
+ for (let w = 0; w < reference_1.letterList.length; w++) {
+ let letterForms = unicode_arabic_1.default[reference_1.letterList[w]];
+ let versions = Object.keys(letterForms);
+ for (let v = 0; v < versions.length; v++) {
+ let localVersion = letterForms[versions[v]];
+ if (localVersion === letter || typeof localVersion === "object" && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
+ if (versions.indexOf(form) > -1) {
+ return letterForms[form];
+ }
+ } else if (typeof localVersion === "object" && typeof localVersion.indexOf === "undefined") {
+ let embeddedVersions = Object.keys(localVersion);
+ for (let ev = 0; ev < embeddedVersions.length; ev++) {
+ if (localVersion[embeddedVersions[ev]] === letter || typeof localVersion[embeddedVersions[ev]] === "object" && localVersion[embeddedVersions[ev]].indexOf && localVersion[embeddedVersions[ev]].indexOf(letter) > -1) {
+ if (embeddedVersions.indexOf(form) > -1) {
+ return localVersion[form];
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ exports2.CharShaper = CharShaper;
+ }
+ });
+
+ // node_modules/alif-toolkit/lib/WordShaper.js
+ var require_WordShaper = __commonJS({
+ "node_modules/alif-toolkit/lib/WordShaper.js"(exports2) {
+ "use strict";
+ Object.defineProperty(exports2, "__esModule", { value: true });
+ var isArabic_1 = require_isArabic();
+ var reference_1 = require_reference();
+ var CharShaper_1 = require_CharShaper();
+ var unicode_ligatures_1 = require_unicode_ligatures();
+ function WordShaper2(word) {
+ let state = "initial";
+ let output = "";
+ for (let w = 0; w < word.length; w++) {
+ let nextLetter = " ";
+ for (let nxw = w + 1; nxw < word.length; nxw++) {
+ if (!isArabic_1.isArabic(word[nxw])) {
+ break;
+ }
+ if (reference_1.tashkeel.indexOf(word[nxw]) === -1) {
+ nextLetter = word[nxw];
+ break;
+ }
+ }
+ if (!isArabic_1.isArabic(word[w]) || isArabic_1.isMath(word[w])) {
+ output += word[w];
+ state = "initial";
+ } else if (reference_1.tashkeel.indexOf(word[w]) > -1) {
+ output += word[w];
+ } else if (nextLetter === " " || reference_1.lineBreakers.indexOf(word[w]) > -1) {
+ output += CharShaper_1.CharShaper(word[w], state === "initial" ? "isolated" : "final");
+ state = "initial";
+ } else if (reference_1.lams.indexOf(word[w]) > -1 && reference_1.alefs.indexOf(nextLetter) > -1) {
+ output += unicode_ligatures_1.default[word[w] + nextLetter][state === "initial" ? "isolated" : "final"];
+ while (word[w] !== nextLetter) {
+ w++;
+ }
+ state = "initial";
+ } else {
+ output += CharShaper_1.CharShaper(word[w], state);
+ state = "medial";
+ }
+ }
+ return output;
+ }
+ exports2.WordShaper = WordShaper2;
+ }
+ });
+
+ // node_modules/alif-toolkit/lib/ParentLetter.js
+ var require_ParentLetter = __commonJS({
+ "node_modules/alif-toolkit/lib/ParentLetter.js"(exports2) {
+ "use strict";
+ Object.defineProperty(exports2, "__esModule", { value: true });
+ var unicode_arabic_1 = require_unicode_arabic();
+ var isArabic_1 = require_isArabic();
+ var reference_1 = require_reference();
+ function ParentLetter(letter) {
+ if (!isArabic_1.isArabic(letter)) {
+ throw new Error("Not an Arabic letter");
+ }
+ for (let w = 0; w < reference_1.letterList.length; w++) {
+ let letterForms = unicode_arabic_1.default[reference_1.letterList[w]];
+ let versions = Object.keys(letterForms);
+ for (let v = 0; v < versions.length; v++) {
+ let localVersion = letterForms[versions[v]];
+ if (typeof localVersion === "object" && typeof localVersion.indexOf === "undefined") {
+ let embeddedForms = Object.keys(localVersion);
+ for (let ef = 0; ef < embeddedForms.length; ef++) {
+ let form = localVersion[embeddedForms[ef]];
+ if (form === letter || typeof form === "object" && form.indexOf && form.indexOf(letter) > -1) {
+ return localVersion;
+ }
+ }
+ } else if (localVersion === letter || typeof localVersion === "object" && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
+ return letterForms;
+ }
+ }
+ return null;
+ }
+ }
+ exports2.ParentLetter = ParentLetter;
+ function GrandparentLetter(letter) {
+ if (!isArabic_1.isArabic(letter)) {
+ throw new Error("Not an Arabic letter");
+ }
+ for (let w = 0; w < reference_1.letterList.length; w++) {
+ let letterForms = unicode_arabic_1.default[reference_1.letterList[w]];
+ let versions = Object.keys(letterForms);
+ for (let v = 0; v < versions.length; v++) {
+ let localVersion = letterForms[versions[v]];
+ if (typeof localVersion === "object" && typeof localVersion.indexOf === "undefined") {
+ let embeddedForms = Object.keys(localVersion);
+ for (let ef = 0; ef < embeddedForms.length; ef++) {
+ let form = localVersion[embeddedForms[ef]];
+ if (form === letter || typeof form === "object" && form.indexOf && form.indexOf(letter) > -1) {
+ return letterForms;
+ }
+ }
+ } else if (localVersion === letter || typeof localVersion === "object" && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
+ return letterForms;
+ }
+ }
+ return null;
+ }
+ }
+ exports2.GrandparentLetter = GrandparentLetter;
+ }
+ });
+
+ // node_modules/alif-toolkit/lib/index.js
+ var require_lib = __commonJS({
+ "node_modules/alif-toolkit/lib/index.js"(exports2) {
+ "use strict";
+ Object.defineProperty(exports2, "__esModule", { value: true });
+ var isArabic_1 = require_isArabic();
+ exports2.isArabic = isArabic_1.isArabic;
+ var GlyphSplitter_1 = require_GlyphSplitter();
+ exports2.GlyphSplitter = GlyphSplitter_1.GlyphSplitter;
+ var BaselineSplitter_1 = require_BaselineSplitter();
+ exports2.BaselineSplitter = BaselineSplitter_1.BaselineSplitter;
+ var Normalization_1 = require_Normalization();
+ exports2.Normal = Normalization_1.Normal;
+ var CharShaper_1 = require_CharShaper();
+ exports2.CharShaper = CharShaper_1.CharShaper;
+ var WordShaper_1 = require_WordShaper();
+ exports2.WordShaper = WordShaper_1.WordShaper;
+ var ParentLetter_1 = require_ParentLetter();
+ exports2.ParentLetter = ParentLetter_1.ParentLetter;
+ exports2.GrandparentLetter = ParentLetter_1.GrandparentLetter;
+ }
+ });
+
+ // node_modules/vparse/index.js
+ var require_vparse = __commonJS({
+ "node_modules/vparse/index.js"(exports2, module2) {
+ (function(window2) {
+ "use strict";
+ function parseVersion3(v) {
+ var m = v.replace(/[^0-9.]/g, "").match(/[0-9]*\.|[0-9]+/g) || [];
+ v = {
+ major: +m[0] || 0,
+ minor: +m[1] || 0,
+ patch: +m[2] || 0,
+ build: +m[3] || 0
+ };
+ v.isEmpty = !v.major && !v.minor && !v.patch && !v.build;
+ v.parsed = [v.major, v.minor, v.patch, v.build];
+ v.text = v.parsed.join(".");
+ v.compare = compare;
+ return v;
+ }
+ function compare(v) {
+ if (typeof v === "string") {
+ v = parseVersion3(v);
+ }
+ for (var i2 = 0; i2 < 4; i2++) {
+ if (this.parsed[i2] !== v.parsed[i2]) {
+ return this.parsed[i2] > v.parsed[i2] ? 1 : -1;
+ }
+ }
+ return 0;
+ }
+ if (typeof module2 === "object" && module2 && typeof module2.exports === "object") {
+ module2.exports = parseVersion3;
+ } else {
+ window2.parseVersion = parseVersion3;
+ }
+ })(exports2);
+ }
+ });
+
+ // node_modules/which-polygon/node_modules/quickselect/quickselect.js
+ var require_quickselect = __commonJS({
+ "node_modules/which-polygon/node_modules/quickselect/quickselect.js"(exports2, module2) {
+ (function(global3, factory) {
+ typeof exports2 === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global3.quickselect = factory();
+ })(exports2, function() {
+ "use strict";
+ function quickselect2(arr, k, left, right, compare) {
+ quickselectStep(arr, k, left || 0, right || arr.length - 1, compare || defaultCompare);
+ }
+ function quickselectStep(arr, k, left, right, compare) {
+ while (right > left) {
+ if (right - left > 600) {
+ var n2 = right - left + 1;
+ var m = k - left + 1;
+ var z = Math.log(n2);
+ var s = 0.5 * Math.exp(2 * z / 3);
+ var sd = 0.5 * Math.sqrt(z * s * (n2 - s) / n2) * (m - n2 / 2 < 0 ? -1 : 1);
+ var newLeft = Math.max(left, Math.floor(k - m * s / n2 + sd));
+ var newRight = Math.min(right, Math.floor(k + (n2 - m) * s / n2 + sd));
+ quickselectStep(arr, k, newLeft, newRight, compare);
+ }
+ var t = arr[k];
+ var i2 = left;
+ var j2 = right;
+ swap2(arr, left, k);
+ if (compare(arr[right], t) > 0)
+ swap2(arr, left, right);
+ while (i2 < j2) {
+ swap2(arr, i2, j2);
+ i2++;
+ j2--;
+ while (compare(arr[i2], t) < 0)
+ i2++;
+ while (compare(arr[j2], t) > 0)
+ j2--;
+ }
+ if (compare(arr[left], t) === 0)
+ swap2(arr, left, j2);
+ else {
+ j2++;
+ swap2(arr, j2, right);
+ }
+ if (j2 <= k)
+ left = j2 + 1;
+ if (k <= j2)
+ right = j2 - 1;
+ }
+ }
+ function swap2(arr, i2, j2) {
+ var tmp = arr[i2];
+ arr[i2] = arr[j2];
+ arr[j2] = tmp;
+ }
+ function defaultCompare(a, b) {
+ return a < b ? -1 : a > b ? 1 : 0;
+ }
+ return quickselect2;
+ });
+ }
+ });
+
+ // node_modules/which-polygon/node_modules/rbush/index.js
+ var require_rbush = __commonJS({
+ "node_modules/which-polygon/node_modules/rbush/index.js"(exports2, module2) {
+ "use strict";
+ module2.exports = rbush;
+ module2.exports.default = rbush;
+ var quickselect2 = require_quickselect();
+ function rbush(maxEntries, format2) {
+ if (!(this instanceof rbush))
+ return new rbush(maxEntries, format2);
+ this._maxEntries = Math.max(4, maxEntries || 9);
+ this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
+ if (format2) {
+ this._initFormat(format2);
+ }
+ this.clear();
+ }
+ rbush.prototype = {
+ all: function() {
+ return this._all(this.data, []);
+ },
+ search: function(bbox) {
+ var node = this.data, result = [], toBBox = this.toBBox;
+ if (!intersects(bbox, node))
+ return result;
+ var nodesToSearch = [], i2, len, child, childBBox;
+ while (node) {
+ for (i2 = 0, len = node.children.length; i2 < len; i2++) {
+ child = node.children[i2];
+ childBBox = node.leaf ? toBBox(child) : child;
+ if (intersects(bbox, childBBox)) {
+ if (node.leaf)
+ result.push(child);
+ else if (contains(bbox, childBBox))
+ this._all(child, result);
+ else
+ nodesToSearch.push(child);
+ }
+ }
+ node = nodesToSearch.pop();
+ }
+ return result;
+ },
+ collides: function(bbox) {
+ var node = this.data, toBBox = this.toBBox;
+ if (!intersects(bbox, node))
+ return false;
+ var nodesToSearch = [], i2, len, child, childBBox;
+ while (node) {
+ for (i2 = 0, len = node.children.length; i2 < len; i2++) {
+ child = node.children[i2];
+ childBBox = node.leaf ? toBBox(child) : child;
+ if (intersects(bbox, childBBox)) {
+ if (node.leaf || contains(bbox, childBBox))
+ return true;
+ nodesToSearch.push(child);
+ }
+ }
+ node = nodesToSearch.pop();
+ }
+ return false;
+ },
+ load: function(data) {
+ if (!(data && data.length))
+ return this;
+ if (data.length < this._minEntries) {
+ for (var i2 = 0, len = data.length; i2 < len; i2++) {
+ this.insert(data[i2]);
+ }
+ return this;
+ }
+ var node = this._build(data.slice(), 0, data.length - 1, 0);
+ if (!this.data.children.length) {
+ this.data = node;
+ } else if (this.data.height === node.height) {
+ this._splitRoot(this.data, node);
+ } else {
+ if (this.data.height < node.height) {
+ var tmpNode = this.data;
+ this.data = node;
+ node = tmpNode;
+ }
+ this._insert(node, this.data.height - node.height - 1, true);
+ }
+ return this;
+ },
+ insert: function(item) {
+ if (item)
+ this._insert(item, this.data.height - 1);
+ return this;
+ },
+ clear: function() {
+ this.data = createNode([]);
+ return this;
+ },
+ remove: function(item, equalsFn) {
+ if (!item)
+ return this;
+ var node = this.data, bbox = this.toBBox(item), path = [], indexes = [], i2, parent, index, goingUp;
+ while (node || path.length) {
+ if (!node) {
+ node = path.pop();
+ parent = path[path.length - 1];
+ i2 = indexes.pop();
+ goingUp = true;
+ }
+ if (node.leaf) {
+ index = findItem(item, node.children, equalsFn);
+ if (index !== -1) {
+ node.children.splice(index, 1);
+ path.push(node);
+ this._condense(path);
+ return this;
+ }
+ }
+ if (!goingUp && !node.leaf && contains(node, bbox)) {
+ path.push(node);
+ indexes.push(i2);
+ i2 = 0;
+ parent = node;
+ node = node.children[0];
+ } else if (parent) {
+ i2++;
+ node = parent.children[i2];
+ goingUp = false;
+ } else
+ node = null;
+ }
+ return this;
+ },
+ toBBox: function(item) {
+ return item;
+ },
+ compareMinX: compareNodeMinX,
+ compareMinY: compareNodeMinY,
+ toJSON: function() {
+ return this.data;
+ },
+ fromJSON: function(data) {
+ this.data = data;
+ return this;
+ },
+ _all: function(node, result) {
+ var nodesToSearch = [];
+ while (node) {
+ if (node.leaf)
+ result.push.apply(result, node.children);
+ else
+ nodesToSearch.push.apply(nodesToSearch, node.children);
+ node = nodesToSearch.pop();
+ }
+ return result;
+ },
+ _build: function(items, left, right, height) {
+ var N = right - left + 1, M = this._maxEntries, node;
+ if (N <= M) {
+ node = createNode(items.slice(left, right + 1));
+ calcBBox(node, this.toBBox);
+ return node;
+ }
+ if (!height) {
+ height = Math.ceil(Math.log(N) / Math.log(M));
+ M = Math.ceil(N / Math.pow(M, height - 1));
+ }
+ node = createNode([]);
+ node.leaf = false;
+ node.height = height;
+ var N2 = Math.ceil(N / M), N1 = N2 * Math.ceil(Math.sqrt(M)), i2, j2, right2, right3;
+ multiSelect(items, left, right, N1, this.compareMinX);
+ for (i2 = left; i2 <= right; i2 += N1) {
+ right2 = Math.min(i2 + N1 - 1, right);
+ multiSelect(items, i2, right2, N2, this.compareMinY);
+ for (j2 = i2; j2 <= right2; j2 += N2) {
+ right3 = Math.min(j2 + N2 - 1, right2);
+ node.children.push(this._build(items, j2, right3, height - 1));
+ }
+ }
+ calcBBox(node, this.toBBox);
+ return node;
+ },
+ _chooseSubtree: function(bbox, node, level, path) {
+ var i2, len, child, targetNode, area, enlargement, minArea, minEnlargement;
+ while (true) {
+ path.push(node);
+ if (node.leaf || path.length - 1 === level)
+ break;
+ minArea = minEnlargement = Infinity;
+ for (i2 = 0, len = node.children.length; i2 < len; i2++) {
+ child = node.children[i2];
+ area = bboxArea(child);
+ enlargement = enlargedArea(bbox, child) - area;
+ if (enlargement < minEnlargement) {
+ minEnlargement = enlargement;
+ minArea = area < minArea ? area : minArea;
+ targetNode = child;
+ } else if (enlargement === minEnlargement) {
+ if (area < minArea) {
+ minArea = area;
+ targetNode = child;
+ }
+ }
+ }
+ node = targetNode || node.children[0];
+ }
+ return node;
+ },
+ _insert: function(item, level, isNode) {
+ var toBBox = this.toBBox, bbox = isNode ? item : toBBox(item), insertPath = [];
+ var node = this._chooseSubtree(bbox, this.data, level, insertPath);
+ node.children.push(item);
+ extend2(node, bbox);
+ while (level >= 0) {
+ if (insertPath[level].children.length > this._maxEntries) {
+ this._split(insertPath, level);
+ level--;
+ } else
+ break;
+ }
+ this._adjustParentBBoxes(bbox, insertPath, level);
+ },
+ _split: function(insertPath, level) {
+ var node = insertPath[level], M = node.children.length, m = this._minEntries;
+ this._chooseSplitAxis(node, m, M);
+ var splitIndex = this._chooseSplitIndex(node, m, M);
+ var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
+ newNode.height = node.height;
+ newNode.leaf = node.leaf;
+ calcBBox(node, this.toBBox);
+ calcBBox(newNode, this.toBBox);
+ if (level)
+ insertPath[level - 1].children.push(newNode);
+ else
+ this._splitRoot(node, newNode);
+ },
+ _splitRoot: function(node, newNode) {
+ this.data = createNode([node, newNode]);
+ this.data.height = node.height + 1;
+ this.data.leaf = false;
+ calcBBox(this.data, this.toBBox);
+ },
+ _chooseSplitIndex: function(node, m, M) {
+ var i2, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
+ minOverlap = minArea = Infinity;
+ for (i2 = m; i2 <= M - m; i2++) {
+ bbox1 = distBBox(node, 0, i2, this.toBBox);
+ bbox2 = distBBox(node, i2, M, this.toBBox);
+ overlap = intersectionArea(bbox1, bbox2);
+ area = bboxArea(bbox1) + bboxArea(bbox2);
+ if (overlap < minOverlap) {
+ minOverlap = overlap;
+ index = i2;
+ minArea = area < minArea ? area : minArea;
+ } else if (overlap === minOverlap) {
+ if (area < minArea) {
+ minArea = area;
+ index = i2;
+ }
+ }
+ }
+ return index;
+ },
+ _chooseSplitAxis: function(node, m, M) {
+ var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX, compareMinY = node.leaf ? this.compareMinY : compareNodeMinY, xMargin = this._allDistMargin(node, m, M, compareMinX), yMargin = this._allDistMargin(node, m, M, compareMinY);
+ if (xMargin < yMargin)
+ node.children.sort(compareMinX);
+ },
+ _allDistMargin: function(node, m, M, compare) {
+ node.children.sort(compare);
+ var toBBox = this.toBBox, leftBBox = distBBox(node, 0, m, toBBox), rightBBox = distBBox(node, M - m, M, toBBox), margin = bboxMargin(leftBBox) + bboxMargin(rightBBox), i2, child;
+ for (i2 = m; i2 < M - m; i2++) {
+ child = node.children[i2];
+ extend2(leftBBox, node.leaf ? toBBox(child) : child);
+ margin += bboxMargin(leftBBox);
+ }
+ for (i2 = M - m - 1; i2 >= m; i2--) {
+ child = node.children[i2];
+ extend2(rightBBox, node.leaf ? toBBox(child) : child);
+ margin += bboxMargin(rightBBox);
+ }
+ return margin;
+ },
+ _adjustParentBBoxes: function(bbox, path, level) {
+ for (var i2 = level; i2 >= 0; i2--) {
+ extend2(path[i2], bbox);
+ }
+ },
+ _condense: function(path) {
+ for (var i2 = path.length - 1, siblings; i2 >= 0; i2--) {
+ if (path[i2].children.length === 0) {
+ if (i2 > 0) {
+ siblings = path[i2 - 1].children;
+ siblings.splice(siblings.indexOf(path[i2]), 1);
+ } else
+ this.clear();
+ } else
+ calcBBox(path[i2], this.toBBox);
+ }
+ },
+ _initFormat: function(format2) {
+ var compareArr = ["return a", " - b", ";"];
+ this.compareMinX = new Function("a", "b", compareArr.join(format2[0]));
+ this.compareMinY = new Function("a", "b", compareArr.join(format2[1]));
+ this.toBBox = new Function("a", "return {minX: a" + format2[0] + ", minY: a" + format2[1] + ", maxX: a" + format2[2] + ", maxY: a" + format2[3] + "};");
+ }
+ };
+ function findItem(item, items, equalsFn) {
+ if (!equalsFn)
+ return items.indexOf(item);
+ for (var i2 = 0; i2 < items.length; i2++) {
+ if (equalsFn(item, items[i2]))
+ return i2;
+ }
+ return -1;
+ }
+ function calcBBox(node, toBBox) {
+ distBBox(node, 0, node.children.length, toBBox, node);
+ }
+ function distBBox(node, k, p, toBBox, destNode) {
+ if (!destNode)
+ destNode = createNode(null);
+ destNode.minX = Infinity;
+ destNode.minY = Infinity;
+ destNode.maxX = -Infinity;
+ destNode.maxY = -Infinity;
+ for (var i2 = k, child; i2 < p; i2++) {
+ child = node.children[i2];
+ extend2(destNode, node.leaf ? toBBox(child) : child);
+ }
+ return destNode;
+ }
+ function extend2(a, b) {
+ a.minX = Math.min(a.minX, b.minX);
+ a.minY = Math.min(a.minY, b.minY);
+ a.maxX = Math.max(a.maxX, b.maxX);
+ a.maxY = Math.max(a.maxY, b.maxY);
+ return a;
+ }
+ function compareNodeMinX(a, b) {
+ return a.minX - b.minX;
+ }
+ function compareNodeMinY(a, b) {
+ return a.minY - b.minY;
+ }
+ function bboxArea(a) {
+ return (a.maxX - a.minX) * (a.maxY - a.minY);
+ }
+ function bboxMargin(a) {
+ return a.maxX - a.minX + (a.maxY - a.minY);
+ }
+ function enlargedArea(a, b) {
+ return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) * (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
+ }
+ function intersectionArea(a, b) {
+ var minX = Math.max(a.minX, b.minX), minY = Math.max(a.minY, b.minY), maxX = Math.min(a.maxX, b.maxX), maxY = Math.min(a.maxY, b.maxY);
+ return Math.max(0, maxX - minX) * Math.max(0, maxY - minY);
+ }
+ function contains(a, b) {
+ return a.minX <= b.minX && a.minY <= b.minY && b.maxX <= a.maxX && b.maxY <= a.maxY;
+ }
+ function intersects(a, b) {
+ return b.minX <= a.maxX && b.minY <= a.maxY && b.maxX >= a.minX && b.maxY >= a.minY;
+ }
+ function createNode(children2) {
+ return {
+ children: children2,
+ height: 1,
+ leaf: true,
+ minX: Infinity,
+ minY: Infinity,
+ maxX: -Infinity,
+ maxY: -Infinity
+ };
+ }
+ function multiSelect(arr, left, right, n2, compare) {
+ var stack = [left, right], mid;
+ while (stack.length) {
+ right = stack.pop();
+ left = stack.pop();
+ if (right - left <= n2)
+ continue;
+ mid = left + Math.ceil((right - left) / n2 / 2) * n2;
+ quickselect2(arr, mid, left, right, compare);
+ stack.push(left, mid, mid, right);
+ }
+ }
+ }
+ });
+
+ // node_modules/lineclip/index.js
+ var require_lineclip = __commonJS({
+ "node_modules/lineclip/index.js"(exports2, module2) {
+ "use strict";
+ module2.exports = lineclip2;
+ lineclip2.polyline = lineclip2;
+ lineclip2.polygon = polygonclip2;
+ function lineclip2(points, bbox, result) {
+ var len = points.length, codeA = bitCode2(points[0], bbox), part = [], i2, a, b, codeB, lastCode;
+ if (!result)
+ result = [];
+ for (i2 = 1; i2 < len; i2++) {
+ a = points[i2 - 1];
+ b = points[i2];
+ codeB = lastCode = bitCode2(b, bbox);
+ while (true) {
+ if (!(codeA | codeB)) {
+ part.push(a);
+ if (codeB !== lastCode) {
+ part.push(b);
+ if (i2 < len - 1) {
+ result.push(part);
+ part = [];
+ }
+ } else if (i2 === len - 1) {
+ part.push(b);
+ }
+ break;
+ } else if (codeA & codeB) {
+ break;
+ } else if (codeA) {
+ a = intersect2(a, b, codeA, bbox);
+ codeA = bitCode2(a, bbox);
+ } else {
+ b = intersect2(a, b, codeB, bbox);
+ codeB = bitCode2(b, bbox);
+ }
+ }
+ codeA = lastCode;
+ }
+ if (part.length)
+ result.push(part);
+ return result;
+ }
+ function polygonclip2(points, bbox) {
+ var result, edge, prev, prevInside, i2, p, inside;
+ for (edge = 1; edge <= 8; edge *= 2) {
+ result = [];
+ prev = points[points.length - 1];
+ prevInside = !(bitCode2(prev, bbox) & edge);
+ for (i2 = 0; i2 < points.length; i2++) {
+ p = points[i2];
+ inside = !(bitCode2(p, bbox) & edge);
+ if (inside !== prevInside)
+ result.push(intersect2(prev, p, edge, bbox));
+ if (inside)
+ result.push(p);
+ prev = p;
+ prevInside = inside;
+ }
+ points = result;
+ if (!points.length)
+ break;
+ }
+ return result;
+ }
+ function intersect2(a, b, edge, bbox) {
+ return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : null;
+ }
+ function bitCode2(p, bbox) {
+ var code = 0;
+ if (p[0] < bbox[0])
+ code |= 1;
+ else if (p[0] > bbox[2])
+ code |= 2;
+ if (p[1] < bbox[1])
+ code |= 4;
+ else if (p[1] > bbox[3])
+ code |= 8;
+ return code;
+ }
+ }
+ });
+
+ // node_modules/which-polygon/index.js
+ var require_which_polygon = __commonJS({
+ "node_modules/which-polygon/index.js"(exports2, module2) {
+ "use strict";
+ var rbush = require_rbush();
+ var lineclip2 = require_lineclip();
+ module2.exports = whichPolygon5;
+ function whichPolygon5(data) {
+ var bboxes = [];
+ for (var i2 = 0; i2 < data.features.length; i2++) {
+ var feature3 = data.features[i2];
+ var coords = feature3.geometry.coordinates;
+ if (feature3.geometry.type === "Polygon") {
+ bboxes.push(treeItem(coords, feature3.properties));
+ } else if (feature3.geometry.type === "MultiPolygon") {
+ for (var j2 = 0; j2 < coords.length; j2++) {
+ bboxes.push(treeItem(coords[j2], feature3.properties));
+ }
+ }
+ }
+ var tree = rbush().load(bboxes);
+ function query(p, multi) {
+ var output = [], result = tree.search({
+ minX: p[0],
+ minY: p[1],
+ maxX: p[0],
+ maxY: p[1]
+ });
+ for (var i3 = 0; i3 < result.length; i3++) {
+ if (insidePolygon(result[i3].coords, p)) {
+ if (multi)
+ output.push(result[i3].props);
+ else
+ return result[i3].props;
+ }
+ }
+ return multi && output.length ? output : null;
+ }
+ query.tree = tree;
+ query.bbox = function queryBBox(bbox) {
+ var output = [];
+ var result = tree.search({
+ minX: bbox[0],
+ minY: bbox[1],
+ maxX: bbox[2],
+ maxY: bbox[3]
+ });
+ for (var i3 = 0; i3 < result.length; i3++) {
+ if (polygonIntersectsBBox(result[i3].coords, bbox)) {
+ output.push(result[i3].props);
+ }
+ }
+ return output;
+ };
+ return query;
+ }
+ function polygonIntersectsBBox(polygon2, bbox) {
+ var bboxCenter = [
+ (bbox[0] + bbox[2]) / 2,
+ (bbox[1] + bbox[3]) / 2
+ ];
+ if (insidePolygon(polygon2, bboxCenter))
+ return true;
+ for (var i2 = 0; i2 < polygon2.length; i2++) {
+ if (lineclip2(polygon2[i2], bbox).length > 0)
+ return true;
+ }
+ return false;
+ }
+ function insidePolygon(rings, p) {
+ var inside = false;
+ for (var i2 = 0, len = rings.length; i2 < len; i2++) {
+ var ring = rings[i2];
+ for (var j2 = 0, len2 = ring.length, k = len2 - 1; j2 < len2; k = j2++) {
+ if (rayIntersect(p, ring[j2], ring[k]))
+ inside = !inside;
+ }
+ }
+ return inside;
+ }
+ function rayIntersect(p, p1, p2) {
+ 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];
+ }
+ function treeItem(coords, props) {
+ var item = {
+ minX: Infinity,
+ minY: Infinity,
+ maxX: -Infinity,
+ maxY: -Infinity,
+ coords,
+ props
+ };
+ for (var i2 = 0; i2 < coords[0].length; i2++) {
+ var p = coords[0][i2];
+ item.minX = Math.min(item.minX, p[0]);
+ item.minY = Math.min(item.minY, p[1]);
+ item.maxX = Math.max(item.maxX, p[0]);
+ item.maxY = Math.max(item.maxY, p[1]);
+ }
+ return item;
+ }
+ }
+ });
+
+ // node_modules/wgs84/index.js
+ var require_wgs84 = __commonJS({
+ "node_modules/wgs84/index.js"(exports2, module2) {
+ module2.exports.RADIUS = 6378137;
+ module2.exports.FLATTENING = 1 / 298.257223563;
+ module2.exports.POLAR_RADIUS = 63567523142e-4;
+ }
+ });
+
+ // node_modules/@mapbox/geojson-area/index.js
+ var require_geojson_area = __commonJS({
+ "node_modules/@mapbox/geojson-area/index.js"(exports2, module2) {
+ var wgs84 = require_wgs84();
+ module2.exports.geometry = geometry;
+ module2.exports.ring = ringArea;
+ function geometry(_) {
+ var area = 0, i2;
+ switch (_.type) {
+ case "Polygon":
+ return polygonArea(_.coordinates);
+ case "MultiPolygon":
+ for (i2 = 0; i2 < _.coordinates.length; i2++) {
+ area += polygonArea(_.coordinates[i2]);
+ }
+ return area;
+ case "Point":
+ case "MultiPoint":
+ case "LineString":
+ case "MultiLineString":
+ return 0;
+ case "GeometryCollection":
+ for (i2 = 0; i2 < _.geometries.length; i2++) {
+ area += geometry(_.geometries[i2]);
+ }
+ return area;
+ }
+ }
+ function polygonArea(coords) {
+ var area = 0;
+ if (coords && coords.length > 0) {
+ area += Math.abs(ringArea(coords[0]));
+ for (var i2 = 1; i2 < coords.length; i2++) {
+ area -= Math.abs(ringArea(coords[i2]));
+ }
+ }
+ return area;
+ }
+ function ringArea(coords) {
+ var p1, p2, p3, lowerIndex, middleIndex, upperIndex, i2, area = 0, coordsLength = coords.length;
+ if (coordsLength > 2) {
+ for (i2 = 0; i2 < coordsLength; i2++) {
+ if (i2 === coordsLength - 2) {
+ lowerIndex = coordsLength - 2;
+ middleIndex = coordsLength - 1;
+ upperIndex = 0;
+ } else if (i2 === coordsLength - 1) {
+ lowerIndex = coordsLength - 1;
+ middleIndex = 0;
+ upperIndex = 1;
+ } else {
+ lowerIndex = i2;
+ middleIndex = i2 + 1;
+ upperIndex = i2 + 2;
+ }
+ p1 = coords[lowerIndex];
+ p2 = coords[middleIndex];
+ p3 = coords[upperIndex];
+ area += (rad(p3[0]) - rad(p1[0])) * Math.sin(rad(p2[1]));
+ }
+ area = area * wgs84.RADIUS * wgs84.RADIUS / 2;
+ }
+ return area;
+ }
+ function rad(_) {
+ return _ * Math.PI / 180;
+ }
+ }
+ });
+
+ // node_modules/circle-to-polygon/input-validation/validateCenter.js
+ var require_validateCenter = __commonJS({
+ "node_modules/circle-to-polygon/input-validation/validateCenter.js"(exports2) {
+ exports2.validateCenter = function validateCenter(center) {
+ var validCenterLengths = [2, 3];
+ if (!Array.isArray(center) || !validCenterLengths.includes(center.length)) {
+ throw new Error("ERROR! Center has to be an array of length two or three");
+ }
+ var [lng, lat] = center;
+ if (typeof lng !== "number" || typeof lat !== "number") {
+ throw new Error(`ERROR! Longitude and Latitude has to be numbers but where ${typeof lng} and ${typeof lat}`);
+ }
+ if (lng > 180 || lng < -180) {
+ throw new Error(`ERROR! Longitude has to be between -180 and 180 but was ${lng}`);
+ }
+ if (lat > 90 || lat < -90) {
+ throw new Error(`ERROR! Latitude has to be between -90 and 90 but was ${lat}`);
+ }
+ };
+ }
+ });
+
+ // node_modules/circle-to-polygon/input-validation/validateRadius.js
+ var require_validateRadius = __commonJS({
+ "node_modules/circle-to-polygon/input-validation/validateRadius.js"(exports2) {
+ exports2.validateRadius = function validateRadius(radius) {
+ if (typeof radius !== "number") {
+ throw new Error(`ERROR! Radius has to be a positive number but was: ${typeof radius}`);
+ }
+ if (radius <= 0) {
+ throw new Error(`ERROR! Radius has to be a positive number but was: ${radius}`);
+ }
+ };
+ }
+ });
+
+ // node_modules/circle-to-polygon/input-validation/validateNumberOfEdges.js
+ var require_validateNumberOfEdges = __commonJS({
+ "node_modules/circle-to-polygon/input-validation/validateNumberOfEdges.js"(exports2) {
+ exports2.validateNumberOfEdges = function validateNumberOfEdges(numberOfEdges) {
+ if (typeof numberOfEdges !== "number") {
+ const ARGUMENT_TYPE = Array.isArray(numberOfEdges) ? "array" : typeof numberOfEdges;
+ throw new Error(`ERROR! Number of edges has to be a number but was: ${ARGUMENT_TYPE}`);
+ }
+ if (numberOfEdges < 3) {
+ throw new Error(`ERROR! Number of edges has to be at least 3 but was: ${numberOfEdges}`);
+ }
+ };
+ }
+ });
+
+ // node_modules/circle-to-polygon/input-validation/validateEarthRadius.js
+ var require_validateEarthRadius = __commonJS({
+ "node_modules/circle-to-polygon/input-validation/validateEarthRadius.js"(exports2) {
+ exports2.validateEarthRadius = function validateEarthRadius(earthRadius2) {
+ if (typeof earthRadius2 !== "number") {
+ const ARGUMENT_TYPE = Array.isArray(earthRadius2) ? "array" : typeof earthRadius2;
+ throw new Error(`ERROR! Earth radius has to be a number but was: ${ARGUMENT_TYPE}`);
+ }
+ if (earthRadius2 <= 0) {
+ throw new Error(`ERROR! Earth radius has to be a positive number but was: ${earthRadius2}`);
+ }
+ };
+ }
+ });
+
+ // node_modules/circle-to-polygon/input-validation/validateBearing.js
+ var require_validateBearing = __commonJS({
+ "node_modules/circle-to-polygon/input-validation/validateBearing.js"(exports2) {
+ exports2.validateBearing = function validateBearing(bearing) {
+ if (typeof bearing !== "number") {
+ const ARGUMENT_TYPE = Array.isArray(bearing) ? "array" : typeof bearing;
+ throw new Error(`ERROR! Bearing has to be a number but was: ${ARGUMENT_TYPE}`);
+ }
+ };
+ }
+ });
+
+ // node_modules/circle-to-polygon/input-validation/index.js
+ var require_input_validation = __commonJS({
+ "node_modules/circle-to-polygon/input-validation/index.js"(exports2) {
+ var validateCenter = require_validateCenter().validateCenter;
+ var validateRadius = require_validateRadius().validateRadius;
+ var validateNumberOfEdges = require_validateNumberOfEdges().validateNumberOfEdges;
+ var validateEarthRadius = require_validateEarthRadius().validateEarthRadius;
+ var validateBearing = require_validateBearing().validateBearing;
+ function validateInput({ center, radius, numberOfEdges, earthRadius: earthRadius2, bearing }) {
+ validateCenter(center);
+ validateRadius(radius);
+ validateNumberOfEdges(numberOfEdges);
+ validateEarthRadius(earthRadius2);
+ validateBearing(bearing);
+ }
+ exports2.validateCenter = validateCenter;
+ exports2.validateRadius = validateRadius;
+ exports2.validateNumberOfEdges = validateNumberOfEdges;
+ exports2.validateEarthRadius = validateEarthRadius;
+ exports2.validateBearing = validateBearing;
+ exports2.validateInput = validateInput;
+ }
+ });
+
+ // node_modules/circle-to-polygon/index.js
+ var require_circle_to_polygon = __commonJS({
+ "node_modules/circle-to-polygon/index.js"(exports2, module2) {
+ "use strict";
+ var { validateInput } = require_input_validation();
+ var defaultEarthRadius = 6378137;
+ function toRadians(angleInDegrees) {
+ return angleInDegrees * Math.PI / 180;
+ }
+ function toDegrees(angleInRadians) {
+ return angleInRadians * 180 / Math.PI;
+ }
+ function offset(c1, distance, earthRadius2, bearing) {
+ var lat1 = toRadians(c1[1]);
+ var lon1 = toRadians(c1[0]);
+ var dByR = distance / earthRadius2;
+ var lat = Math.asin(Math.sin(lat1) * Math.cos(dByR) + Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing));
+ var lon = lon1 + Math.atan2(Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1), Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat));
+ return [toDegrees(lon), toDegrees(lat)];
+ }
+ module2.exports = function circleToPolygon2(center, radius, options2) {
+ var n2 = getNumberOfEdges(options2);
+ var earthRadius2 = getEarthRadius(options2);
+ var bearing = getBearing(options2);
+ var direction = getDirection(options2);
+ validateInput({ center, radius, numberOfEdges: n2, earthRadius: earthRadius2, bearing });
+ var start2 = toRadians(bearing);
+ var coordinates = [];
+ for (var i2 = 0; i2 < n2; ++i2) {
+ coordinates.push(offset(center, radius, earthRadius2, start2 + direction * 2 * Math.PI * -i2 / n2));
+ }
+ coordinates.push(coordinates[0]);
+ return {
+ type: "Polygon",
+ coordinates: [coordinates]
+ };
+ };
+ function getNumberOfEdges(options2) {
+ if (isUndefinedOrNull(options2)) {
+ return 32;
+ } else if (isObjectNotArray(options2)) {
+ var numberOfEdges = options2.numberOfEdges;
+ return numberOfEdges === void 0 ? 32 : numberOfEdges;
+ }
+ return options2;
+ }
+ function getEarthRadius(options2) {
+ if (isUndefinedOrNull(options2)) {
+ return defaultEarthRadius;
+ } else if (isObjectNotArray(options2)) {
+ var earthRadius2 = options2.earthRadius;
+ return earthRadius2 === void 0 ? defaultEarthRadius : earthRadius2;
+ }
+ return defaultEarthRadius;
+ }
+ function getDirection(options2) {
+ if (isObjectNotArray(options2) && options2.rightHandRule) {
+ return -1;
+ }
+ return 1;
+ }
+ function getBearing(options2) {
+ if (isUndefinedOrNull(options2)) {
+ return 0;
+ } else if (isObjectNotArray(options2)) {
+ var bearing = options2.bearing;
+ return bearing === void 0 ? 0 : bearing;
+ }
+ return 0;
+ }
+ function isObjectNotArray(argument) {
+ return argument !== null && typeof argument === "object" && !Array.isArray(argument);
+ }
+ function isUndefinedOrNull(argument) {
+ return argument === null || argument === void 0;
+ }
+ }
+ });
+
+ // node_modules/polygon-clipping/dist/polygon-clipping.umd.js
+ var require_polygon_clipping_umd = __commonJS({
+ "node_modules/polygon-clipping/dist/polygon-clipping.umd.js"(exports2, module2) {
+ (function(global3, factory) {
+ typeof exports2 === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : (global3 = typeof globalThis !== "undefined" ? globalThis : global3 || self, global3.polygonClipping = factory());
+ })(exports2, function() {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+ function _defineProperties(target, props) {
+ for (var i2 = 0; i2 < props.length; i2++) {
+ var descriptor = props[i2];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor)
+ descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps)
+ _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps)
+ _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+ var Node = function() {
+ function Node2(key, data) {
+ this.next = null;
+ this.key = key;
+ this.data = data;
+ this.left = null;
+ this.right = null;
+ }
+ return Node2;
+ }();
+ function DEFAULT_COMPARE(a, b) {
+ return a > b ? 1 : a < b ? -1 : 0;
+ }
+ function splay(i2, t, comparator) {
+ var N = new Node(null, null);
+ var l = N;
+ var r = N;
+ while (true) {
+ var cmp2 = comparator(i2, t.key);
+ if (cmp2 < 0) {
+ if (t.left === null)
+ break;
+ if (comparator(i2, t.left.key) < 0) {
+ var y = t.left;
+ t.left = y.right;
+ y.right = t;
+ t = y;
+ if (t.left === null)
+ break;
+ }
+ r.left = t;
+ r = t;
+ t = t.left;
+ } else if (cmp2 > 0) {
+ if (t.right === null)
+ break;
+ if (comparator(i2, t.right.key) > 0) {
+ var y = t.right;
+ t.right = y.left;
+ y.left = t;
+ t = y;
+ if (t.right === null)
+ break;
+ }
+ l.right = t;
+ l = t;
+ t = t.right;
+ } else
+ break;
+ }
+ l.right = t.left;
+ r.left = t.right;
+ t.left = N.right;
+ t.right = N.left;
+ return t;
+ }
+ function insert(i2, data, t, comparator) {
+ var node = new Node(i2, data);
+ if (t === null) {
+ node.left = node.right = null;
+ return node;
+ }
+ t = splay(i2, t, comparator);
+ var cmp2 = comparator(i2, t.key);
+ if (cmp2 < 0) {
+ node.left = t.left;
+ node.right = t;
+ t.left = null;
+ } else if (cmp2 >= 0) {
+ node.right = t.right;
+ node.left = t;
+ t.right = null;
+ }
+ return node;
+ }
+ function split(key, v, comparator) {
+ var left = null;
+ var right = null;
+ if (v) {
+ v = splay(key, v, comparator);
+ var cmp2 = comparator(v.key, key);
+ if (cmp2 === 0) {
+ left = v.left;
+ right = v.right;
+ } else if (cmp2 < 0) {
+ right = v.right;
+ v.right = null;
+ left = v;
+ } else {
+ left = v.left;
+ v.left = null;
+ right = v;
+ }
+ }
+ return {
+ left,
+ right
+ };
+ }
+ function merge3(left, right, comparator) {
+ if (right === null)
+ return left;
+ if (left === null)
+ return right;
+ right = splay(left.key, right, comparator);
+ right.left = left;
+ return right;
+ }
+ function printRow(root3, prefix, isTail, out, printNode) {
+ if (root3) {
+ out("" + prefix + (isTail ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ") + printNode(root3) + "\n");
+ var indent2 = prefix + (isTail ? " " : "\u2502 ");
+ if (root3.left)
+ printRow(root3.left, indent2, false, out, printNode);
+ if (root3.right)
+ printRow(root3.right, indent2, true, out, printNode);
+ }
+ }
+ var Tree = function() {
+ function Tree2(comparator) {
+ if (comparator === void 0) {
+ comparator = DEFAULT_COMPARE;
+ }
+ this._root = null;
+ this._size = 0;
+ this._comparator = comparator;
+ }
+ Tree2.prototype.insert = function(key, data) {
+ this._size++;
+ return this._root = insert(key, data, this._root, this._comparator);
+ };
+ Tree2.prototype.add = function(key, data) {
+ var node = new Node(key, data);
+ if (this._root === null) {
+ node.left = node.right = null;
+ this._size++;
+ this._root = node;
+ }
+ var comparator = this._comparator;
+ var t = splay(key, this._root, comparator);
+ var cmp2 = comparator(key, t.key);
+ if (cmp2 === 0)
+ this._root = t;
+ else {
+ if (cmp2 < 0) {
+ node.left = t.left;
+ node.right = t;
+ t.left = null;
+ } else if (cmp2 > 0) {
+ node.right = t.right;
+ node.left = t;
+ t.right = null;
+ }
+ this._size++;
+ this._root = node;
+ }
+ return this._root;
+ };
+ Tree2.prototype.remove = function(key) {
+ this._root = this._remove(key, this._root, this._comparator);
+ };
+ Tree2.prototype._remove = function(i2, t, comparator) {
+ var x;
+ if (t === null)
+ return null;
+ t = splay(i2, t, comparator);
+ var cmp2 = comparator(i2, t.key);
+ if (cmp2 === 0) {
+ if (t.left === null) {
+ x = t.right;
+ } else {
+ x = splay(i2, t.left, comparator);
+ x.right = t.right;
+ }
+ this._size--;
+ return x;
+ }
+ return t;
+ };
+ Tree2.prototype.pop = function() {
+ var node = this._root;
+ if (node) {
+ while (node.left) {
+ node = node.left;
+ }
+ this._root = splay(node.key, this._root, this._comparator);
+ this._root = this._remove(node.key, this._root, this._comparator);
+ return {
+ key: node.key,
+ data: node.data
+ };
+ }
+ return null;
+ };
+ Tree2.prototype.findStatic = function(key) {
+ var current = this._root;
+ var compare = this._comparator;
+ while (current) {
+ var cmp2 = compare(key, current.key);
+ if (cmp2 === 0)
+ return current;
+ else if (cmp2 < 0)
+ current = current.left;
+ else
+ current = current.right;
+ }
+ return null;
+ };
+ Tree2.prototype.find = function(key) {
+ if (this._root) {
+ this._root = splay(key, this._root, this._comparator);
+ if (this._comparator(key, this._root.key) !== 0)
+ return null;
+ }
+ return this._root;
+ };
+ Tree2.prototype.contains = function(key) {
+ var current = this._root;
+ var compare = this._comparator;
+ while (current) {
+ var cmp2 = compare(key, current.key);
+ if (cmp2 === 0)
+ return true;
+ else if (cmp2 < 0)
+ current = current.left;
+ else
+ current = current.right;
+ }
+ return false;
+ };
+ Tree2.prototype.forEach = function(visitor, ctx) {
+ var current = this._root;
+ var Q = [];
+ var done = false;
+ while (!done) {
+ if (current !== null) {
+ Q.push(current);
+ current = current.left;
+ } else {
+ if (Q.length !== 0) {
+ current = Q.pop();
+ visitor.call(ctx, current);
+ current = current.right;
+ } else
+ done = true;
+ }
+ }
+ return this;
+ };
+ Tree2.prototype.range = function(low, high, fn, ctx) {
+ var Q = [];
+ var compare = this._comparator;
+ var node = this._root;
+ var cmp2;
+ while (Q.length !== 0 || node) {
+ if (node) {
+ Q.push(node);
+ node = node.left;
+ } else {
+ node = Q.pop();
+ cmp2 = compare(node.key, high);
+ if (cmp2 > 0) {
+ break;
+ } else if (compare(node.key, low) >= 0) {
+ if (fn.call(ctx, node))
+ return this;
+ }
+ node = node.right;
+ }
+ }
+ return this;
+ };
+ Tree2.prototype.keys = function() {
+ var keys = [];
+ this.forEach(function(_a) {
+ var key = _a.key;
+ return keys.push(key);
+ });
+ return keys;
+ };
+ Tree2.prototype.values = function() {
+ var values = [];
+ this.forEach(function(_a) {
+ var data = _a.data;
+ return values.push(data);
+ });
+ return values;
+ };
+ Tree2.prototype.min = function() {
+ if (this._root)
+ return this.minNode(this._root).key;
+ return null;
+ };
+ Tree2.prototype.max = function() {
+ if (this._root)
+ return this.maxNode(this._root).key;
+ return null;
+ };
+ Tree2.prototype.minNode = function(t) {
+ if (t === void 0) {
+ t = this._root;
+ }
+ if (t)
+ while (t.left) {
+ t = t.left;
+ }
+ return t;
+ };
+ Tree2.prototype.maxNode = function(t) {
+ if (t === void 0) {
+ t = this._root;
+ }
+ if (t)
+ while (t.right) {
+ t = t.right;
+ }
+ return t;
+ };
+ Tree2.prototype.at = function(index2) {
+ var current = this._root;
+ var done = false;
+ var i2 = 0;
+ var Q = [];
+ while (!done) {
+ if (current) {
+ Q.push(current);
+ current = current.left;
+ } else {
+ if (Q.length > 0) {
+ current = Q.pop();
+ if (i2 === index2)
+ return current;
+ i2++;
+ current = current.right;
+ } else
+ done = true;
+ }
+ }
+ return null;
+ };
+ Tree2.prototype.next = function(d) {
+ var root3 = this._root;
+ var successor = null;
+ if (d.right) {
+ successor = d.right;
+ while (successor.left) {
+ successor = successor.left;
+ }
+ return successor;
+ }
+ var comparator = this._comparator;
+ while (root3) {
+ var cmp2 = comparator(d.key, root3.key);
+ if (cmp2 === 0)
+ break;
+ else if (cmp2 < 0) {
+ successor = root3;
+ root3 = root3.left;
+ } else
+ root3 = root3.right;
+ }
+ return successor;
+ };
+ Tree2.prototype.prev = function(d) {
+ var root3 = this._root;
+ var predecessor = null;
+ if (d.left !== null) {
+ predecessor = d.left;
+ while (predecessor.right) {
+ predecessor = predecessor.right;
+ }
+ return predecessor;
+ }
+ var comparator = this._comparator;
+ while (root3) {
+ var cmp2 = comparator(d.key, root3.key);
+ if (cmp2 === 0)
+ break;
+ else if (cmp2 < 0)
+ root3 = root3.left;
+ else {
+ predecessor = root3;
+ root3 = root3.right;
+ }
+ }
+ return predecessor;
+ };
+ Tree2.prototype.clear = function() {
+ this._root = null;
+ this._size = 0;
+ return this;
+ };
+ Tree2.prototype.toList = function() {
+ return toList(this._root);
+ };
+ Tree2.prototype.load = function(keys, values, presort) {
+ if (values === void 0) {
+ values = [];
+ }
+ if (presort === void 0) {
+ presort = false;
+ }
+ var size = keys.length;
+ var comparator = this._comparator;
+ if (presort)
+ sort(keys, values, 0, size - 1, comparator);
+ if (this._root === null) {
+ this._root = loadRecursive(keys, values, 0, size);
+ this._size = size;
+ } else {
+ var mergedList = mergeLists(this.toList(), createList(keys, values), comparator);
+ size = this._size + size;
+ this._root = sortedListToBST({
+ head: mergedList
+ }, 0, size);
+ }
+ return this;
+ };
+ Tree2.prototype.isEmpty = function() {
+ return this._root === null;
+ };
+ Object.defineProperty(Tree2.prototype, "size", {
+ get: function get3() {
+ return this._size;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Tree2.prototype, "root", {
+ get: function get3() {
+ return this._root;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Tree2.prototype.toString = function(printNode) {
+ if (printNode === void 0) {
+ printNode = function printNode2(n2) {
+ return String(n2.key);
+ };
+ }
+ var out = [];
+ printRow(this._root, "", true, function(v) {
+ return out.push(v);
+ }, printNode);
+ return out.join("");
+ };
+ Tree2.prototype.update = function(key, newKey, newData) {
+ var comparator = this._comparator;
+ var _a = split(key, this._root, comparator), left = _a.left, right = _a.right;
+ if (comparator(key, newKey) < 0) {
+ right = insert(newKey, newData, right, comparator);
+ } else {
+ left = insert(newKey, newData, left, comparator);
+ }
+ this._root = merge3(left, right, comparator);
+ };
+ Tree2.prototype.split = function(key) {
+ return split(key, this._root, this._comparator);
+ };
+ return Tree2;
+ }();
+ function loadRecursive(keys, values, start2, end) {
+ var size = end - start2;
+ if (size > 0) {
+ var middle = start2 + Math.floor(size / 2);
+ var key = keys[middle];
+ var data = values[middle];
+ var node = new Node(key, data);
+ node.left = loadRecursive(keys, values, start2, middle);
+ node.right = loadRecursive(keys, values, middle + 1, end);
+ return node;
+ }
+ return null;
+ }
+ function createList(keys, values) {
+ var head = new Node(null, null);
+ var p = head;
+ for (var i2 = 0; i2 < keys.length; i2++) {
+ p = p.next = new Node(keys[i2], values[i2]);
+ }
+ p.next = null;
+ return head.next;
+ }
+ function toList(root3) {
+ var current = root3;
+ var Q = [];
+ var done = false;
+ var head = new Node(null, null);
+ var p = head;
+ while (!done) {
+ if (current) {
+ Q.push(current);
+ current = current.left;
+ } else {
+ if (Q.length > 0) {
+ current = p = p.next = Q.pop();
+ current = current.right;
+ } else
+ done = true;
+ }
+ }
+ p.next = null;
+ return head.next;
+ }
+ function sortedListToBST(list, start2, end) {
+ var size = end - start2;
+ if (size > 0) {
+ var middle = start2 + Math.floor(size / 2);
+ var left = sortedListToBST(list, start2, middle);
+ var root3 = list.head;
+ root3.left = left;
+ list.head = list.head.next;
+ root3.right = sortedListToBST(list, middle + 1, end);
+ return root3;
+ }
+ return null;
+ }
+ function mergeLists(l1, l2, compare) {
+ var head = new Node(null, null);
+ var p = head;
+ var p1 = l1;
+ var p2 = l2;
+ while (p1 !== null && p2 !== null) {
+ if (compare(p1.key, p2.key) < 0) {
+ p.next = p1;
+ p1 = p1.next;
+ } else {
+ p.next = p2;
+ p2 = p2.next;
+ }
+ p = p.next;
+ }
+ if (p1 !== null) {
+ p.next = p1;
+ } else if (p2 !== null) {
+ p.next = p2;
+ }
+ return head.next;
+ }
+ function sort(keys, values, left, right, compare) {
+ if (left >= right)
+ return;
+ var pivot = keys[left + right >> 1];
+ var i2 = left - 1;
+ var j2 = right + 1;
+ while (true) {
+ do {
+ i2++;
+ } while (compare(keys[i2], pivot) < 0);
+ do {
+ j2--;
+ } while (compare(keys[j2], pivot) > 0);
+ if (i2 >= j2)
+ break;
+ var tmp = keys[i2];
+ keys[i2] = keys[j2];
+ keys[j2] = tmp;
+ tmp = values[i2];
+ values[i2] = values[j2];
+ values[j2] = tmp;
+ }
+ sort(keys, values, left, j2, compare);
+ sort(keys, values, j2 + 1, right, compare);
+ }
+ var isInBbox = function isInBbox2(bbox, point) {
+ return bbox.ll.x <= point.x && point.x <= bbox.ur.x && bbox.ll.y <= point.y && point.y <= bbox.ur.y;
+ };
+ var getBboxOverlap = function getBboxOverlap2(b1, b2) {
+ if (b2.ur.x < b1.ll.x || b1.ur.x < b2.ll.x || b2.ur.y < b1.ll.y || b1.ur.y < b2.ll.y)
+ return null;
+ var lowerX = b1.ll.x < b2.ll.x ? b2.ll.x : b1.ll.x;
+ var upperX = b1.ur.x < b2.ur.x ? b1.ur.x : b2.ur.x;
+ var lowerY = b1.ll.y < b2.ll.y ? b2.ll.y : b1.ll.y;
+ var upperY = b1.ur.y < b2.ur.y ? b1.ur.y : b2.ur.y;
+ return {
+ ll: {
+ x: lowerX,
+ y: lowerY
+ },
+ ur: {
+ x: upperX,
+ y: upperY
+ }
+ };
+ };
+ var epsilon3 = Number.EPSILON;
+ if (epsilon3 === void 0)
+ epsilon3 = Math.pow(2, -52);
+ var EPSILON_SQ = epsilon3 * epsilon3;
+ var cmp = function cmp2(a, b) {
+ if (-epsilon3 < a && a < epsilon3) {
+ if (-epsilon3 < b && b < epsilon3) {
+ return 0;
+ }
+ }
+ var ab = a - b;
+ if (ab * ab < EPSILON_SQ * a * b) {
+ return 0;
+ }
+ return a < b ? -1 : 1;
+ };
+ var PtRounder = /* @__PURE__ */ function() {
+ function PtRounder2() {
+ _classCallCheck(this, PtRounder2);
+ this.reset();
+ }
+ _createClass(PtRounder2, [{
+ key: "reset",
+ value: function reset() {
+ this.xRounder = new CoordRounder();
+ this.yRounder = new CoordRounder();
+ }
+ }, {
+ key: "round",
+ value: function round(x, y) {
+ return {
+ x: this.xRounder.round(x),
+ y: this.yRounder.round(y)
+ };
+ }
+ }]);
+ return PtRounder2;
+ }();
+ var CoordRounder = /* @__PURE__ */ function() {
+ function CoordRounder2() {
+ _classCallCheck(this, CoordRounder2);
+ this.tree = new Tree();
+ this.round(0);
+ }
+ _createClass(CoordRounder2, [{
+ key: "round",
+ value: function round(coord2) {
+ var node = this.tree.add(coord2);
+ var prevNode = this.tree.prev(node);
+ if (prevNode !== null && cmp(node.key, prevNode.key) === 0) {
+ this.tree.remove(coord2);
+ return prevNode.key;
+ }
+ var nextNode = this.tree.next(node);
+ if (nextNode !== null && cmp(node.key, nextNode.key) === 0) {
+ this.tree.remove(coord2);
+ return nextNode.key;
+ }
+ return coord2;
+ }
+ }]);
+ return CoordRounder2;
+ }();
+ var rounder = new PtRounder();
+ var crossProduct = function crossProduct2(a, b) {
+ return a.x * b.y - a.y * b.x;
+ };
+ var dotProduct = function dotProduct2(a, b) {
+ return a.x * b.x + a.y * b.y;
+ };
+ var compareVectorAngles = function compareVectorAngles2(basePt, endPt1, endPt2) {
+ var v1 = {
+ x: endPt1.x - basePt.x,
+ y: endPt1.y - basePt.y
+ };
+ var v2 = {
+ x: endPt2.x - basePt.x,
+ y: endPt2.y - basePt.y
+ };
+ var kross = crossProduct(v1, v2);
+ return cmp(kross, 0);
+ };
+ var length = function length2(v) {
+ return Math.sqrt(dotProduct(v, v));
+ };
+ var sineOfAngle = function sineOfAngle2(pShared, pBase, pAngle) {
+ var vBase = {
+ x: pBase.x - pShared.x,
+ y: pBase.y - pShared.y
+ };
+ var vAngle = {
+ x: pAngle.x - pShared.x,
+ y: pAngle.y - pShared.y
+ };
+ return crossProduct(vAngle, vBase) / length(vAngle) / length(vBase);
+ };
+ var cosineOfAngle = function cosineOfAngle2(pShared, pBase, pAngle) {
+ var vBase = {
+ x: pBase.x - pShared.x,
+ y: pBase.y - pShared.y
+ };
+ var vAngle = {
+ x: pAngle.x - pShared.x,
+ y: pAngle.y - pShared.y
+ };
+ return dotProduct(vAngle, vBase) / length(vAngle) / length(vBase);
+ };
+ var horizontalIntersection = function horizontalIntersection2(pt, v, y) {
+ if (v.y === 0)
+ return null;
+ return {
+ x: pt.x + v.x / v.y * (y - pt.y),
+ y
+ };
+ };
+ var verticalIntersection = function verticalIntersection2(pt, v, x) {
+ if (v.x === 0)
+ return null;
+ return {
+ x,
+ y: pt.y + v.y / v.x * (x - pt.x)
+ };
+ };
+ var intersection = function intersection2(pt1, v1, pt2, v2) {
+ if (v1.x === 0)
+ return verticalIntersection(pt2, v2, pt1.x);
+ if (v2.x === 0)
+ return verticalIntersection(pt1, v1, pt2.x);
+ if (v1.y === 0)
+ return horizontalIntersection(pt2, v2, pt1.y);
+ if (v2.y === 0)
+ return horizontalIntersection(pt1, v1, pt2.y);
+ var kross = crossProduct(v1, v2);
+ if (kross == 0)
+ return null;
+ var ve = {
+ x: pt2.x - pt1.x,
+ y: pt2.y - pt1.y
+ };
+ var d1 = crossProduct(ve, v1) / kross;
+ var d2 = crossProduct(ve, v2) / kross;
+ var x12 = pt1.x + d2 * v1.x, x2 = pt2.x + d1 * v2.x;
+ var y12 = pt1.y + d2 * v1.y, y2 = pt2.y + d1 * v2.y;
+ var x = (x12 + x2) / 2;
+ var y = (y12 + y2) / 2;
+ return {
+ x,
+ y
+ };
+ };
+ var SweepEvent = /* @__PURE__ */ function() {
+ _createClass(SweepEvent2, null, [{
+ key: "compare",
+ value: function compare(a, b) {
+ var ptCmp = SweepEvent2.comparePoints(a.point, b.point);
+ if (ptCmp !== 0)
+ return ptCmp;
+ if (a.point !== b.point)
+ a.link(b);
+ if (a.isLeft !== b.isLeft)
+ return a.isLeft ? 1 : -1;
+ return Segment.compare(a.segment, b.segment);
+ }
+ }, {
+ key: "comparePoints",
+ value: function comparePoints(aPt, bPt) {
+ if (aPt.x < bPt.x)
+ return -1;
+ if (aPt.x > bPt.x)
+ return 1;
+ if (aPt.y < bPt.y)
+ return -1;
+ if (aPt.y > bPt.y)
+ return 1;
+ return 0;
+ }
+ }]);
+ function SweepEvent2(point, isLeft) {
+ _classCallCheck(this, SweepEvent2);
+ if (point.events === void 0)
+ point.events = [this];
+ else
+ point.events.push(this);
+ this.point = point;
+ this.isLeft = isLeft;
+ }
+ _createClass(SweepEvent2, [{
+ key: "link",
+ value: function link2(other) {
+ if (other.point === this.point) {
+ throw new Error("Tried to link already linked events");
+ }
+ var otherEvents = other.point.events;
+ for (var i2 = 0, iMax = otherEvents.length; i2 < iMax; i2++) {
+ var evt = otherEvents[i2];
+ this.point.events.push(evt);
+ evt.point = this.point;
+ }
+ this.checkForConsuming();
+ }
+ }, {
+ key: "checkForConsuming",
+ value: function checkForConsuming() {
+ var numEvents = this.point.events.length;
+ for (var i2 = 0; i2 < numEvents; i2++) {
+ var evt1 = this.point.events[i2];
+ if (evt1.segment.consumedBy !== void 0)
+ continue;
+ for (var j2 = i2 + 1; j2 < numEvents; j2++) {
+ var evt2 = this.point.events[j2];
+ if (evt2.consumedBy !== void 0)
+ continue;
+ if (evt1.otherSE.point.events !== evt2.otherSE.point.events)
+ continue;
+ evt1.segment.consume(evt2.segment);
+ }
+ }
+ }
+ }, {
+ key: "getAvailableLinkedEvents",
+ value: function getAvailableLinkedEvents() {
+ var events = [];
+ for (var i2 = 0, iMax = this.point.events.length; i2 < iMax; i2++) {
+ var evt = this.point.events[i2];
+ if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {
+ events.push(evt);
+ }
+ }
+ return events;
+ }
+ }, {
+ key: "getLeftmostComparator",
+ value: function getLeftmostComparator(baseEvent) {
+ var _this = this;
+ var cache = /* @__PURE__ */ new Map();
+ var fillCache = function fillCache2(linkedEvent) {
+ var nextEvent = linkedEvent.otherSE;
+ cache.set(linkedEvent, {
+ sine: sineOfAngle(_this.point, baseEvent.point, nextEvent.point),
+ cosine: cosineOfAngle(_this.point, baseEvent.point, nextEvent.point)
+ });
+ };
+ return function(a, b) {
+ if (!cache.has(a))
+ fillCache(a);
+ if (!cache.has(b))
+ fillCache(b);
+ var _cache$get = cache.get(a), asine = _cache$get.sine, acosine = _cache$get.cosine;
+ var _cache$get2 = cache.get(b), bsine = _cache$get2.sine, bcosine = _cache$get2.cosine;
+ if (asine >= 0 && bsine >= 0) {
+ if (acosine < bcosine)
+ return 1;
+ if (acosine > bcosine)
+ return -1;
+ return 0;
+ }
+ if (asine < 0 && bsine < 0) {
+ if (acosine < bcosine)
+ return -1;
+ if (acosine > bcosine)
+ return 1;
+ return 0;
+ }
+ if (bsine < asine)
+ return -1;
+ if (bsine > asine)
+ return 1;
+ return 0;
+ };
+ }
+ }]);
+ return SweepEvent2;
+ }();
+ var segmentId = 0;
+ var Segment = /* @__PURE__ */ function() {
+ _createClass(Segment2, null, [{
+ key: "compare",
+ value: function compare(a, b) {
+ var alx = a.leftSE.point.x;
+ var blx = b.leftSE.point.x;
+ var arx = a.rightSE.point.x;
+ var brx = b.rightSE.point.x;
+ if (brx < alx)
+ return 1;
+ if (arx < blx)
+ return -1;
+ var aly = a.leftSE.point.y;
+ var bly = b.leftSE.point.y;
+ var ary = a.rightSE.point.y;
+ var bry = b.rightSE.point.y;
+ if (alx < blx) {
+ if (bly < aly && bly < ary)
+ return 1;
+ if (bly > aly && bly > ary)
+ return -1;
+ var aCmpBLeft = a.comparePoint(b.leftSE.point);
+ if (aCmpBLeft < 0)
+ return 1;
+ if (aCmpBLeft > 0)
+ return -1;
+ var bCmpARight = b.comparePoint(a.rightSE.point);
+ if (bCmpARight !== 0)
+ return bCmpARight;
+ return -1;
+ }
+ if (alx > blx) {
+ if (aly < bly && aly < bry)
+ return -1;
+ if (aly > bly && aly > bry)
+ return 1;
+ var bCmpALeft = b.comparePoint(a.leftSE.point);
+ if (bCmpALeft !== 0)
+ return bCmpALeft;
+ var aCmpBRight = a.comparePoint(b.rightSE.point);
+ if (aCmpBRight < 0)
+ return 1;
+ if (aCmpBRight > 0)
+ return -1;
+ return 1;
+ }
+ if (aly < bly)
+ return -1;
+ if (aly > bly)
+ return 1;
+ if (arx < brx) {
+ var _bCmpARight = b.comparePoint(a.rightSE.point);
+ if (_bCmpARight !== 0)
+ return _bCmpARight;
+ }
+ if (arx > brx) {
+ var _aCmpBRight = a.comparePoint(b.rightSE.point);
+ if (_aCmpBRight < 0)
+ return 1;
+ if (_aCmpBRight > 0)
+ return -1;
+ }
+ if (arx !== brx) {
+ var ay = ary - aly;
+ var ax = arx - alx;
+ var by = bry - bly;
+ var bx = brx - blx;
+ if (ay > ax && by < bx)
+ return 1;
+ if (ay < ax && by > bx)
+ return -1;
+ }
+ if (arx > brx)
+ return 1;
+ if (arx < brx)
+ return -1;
+ if (ary < bry)
+ return -1;
+ if (ary > bry)
+ return 1;
+ if (a.id < b.id)
+ return -1;
+ if (a.id > b.id)
+ return 1;
+ return 0;
+ }
+ }]);
+ function Segment2(leftSE, rightSE, rings, windings) {
+ _classCallCheck(this, Segment2);
+ this.id = ++segmentId;
+ this.leftSE = leftSE;
+ leftSE.segment = this;
+ leftSE.otherSE = rightSE;
+ this.rightSE = rightSE;
+ rightSE.segment = this;
+ rightSE.otherSE = leftSE;
+ this.rings = rings;
+ this.windings = windings;
+ }
+ _createClass(Segment2, [{
+ key: "replaceRightSE",
+ value: function replaceRightSE(newRightSE) {
+ this.rightSE = newRightSE;
+ this.rightSE.segment = this;
+ this.rightSE.otherSE = this.leftSE;
+ this.leftSE.otherSE = this.rightSE;
+ }
+ }, {
+ key: "bbox",
+ value: function bbox() {
+ var y12 = this.leftSE.point.y;
+ var y2 = this.rightSE.point.y;
+ return {
+ ll: {
+ x: this.leftSE.point.x,
+ y: y12 < y2 ? y12 : y2
+ },
+ ur: {
+ x: this.rightSE.point.x,
+ y: y12 > y2 ? y12 : y2
+ }
+ };
+ }
+ }, {
+ key: "vector",
+ value: function vector() {
+ return {
+ x: this.rightSE.point.x - this.leftSE.point.x,
+ y: this.rightSE.point.y - this.leftSE.point.y
+ };
+ }
+ }, {
+ key: "isAnEndpoint",
+ value: function isAnEndpoint(pt) {
+ return pt.x === this.leftSE.point.x && pt.y === this.leftSE.point.y || pt.x === this.rightSE.point.x && pt.y === this.rightSE.point.y;
+ }
+ }, {
+ key: "comparePoint",
+ value: function comparePoint(point) {
+ if (this.isAnEndpoint(point))
+ return 0;
+ var lPt = this.leftSE.point;
+ var rPt = this.rightSE.point;
+ var v = this.vector();
+ if (lPt.x === rPt.x) {
+ if (point.x === lPt.x)
+ return 0;
+ return point.x < lPt.x ? 1 : -1;
+ }
+ var yDist = (point.y - lPt.y) / v.y;
+ var xFromYDist = lPt.x + yDist * v.x;
+ if (point.x === xFromYDist)
+ return 0;
+ var xDist = (point.x - lPt.x) / v.x;
+ var yFromXDist = lPt.y + xDist * v.y;
+ if (point.y === yFromXDist)
+ return 0;
+ return point.y < yFromXDist ? -1 : 1;
+ }
+ }, {
+ key: "getIntersection",
+ value: function getIntersection(other) {
+ var tBbox = this.bbox();
+ var oBbox = other.bbox();
+ var bboxOverlap = getBboxOverlap(tBbox, oBbox);
+ if (bboxOverlap === null)
+ return null;
+ var tlp = this.leftSE.point;
+ var trp = this.rightSE.point;
+ var olp = other.leftSE.point;
+ var orp = other.rightSE.point;
+ var touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0;
+ var touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0;
+ var touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0;
+ var touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0;
+ if (touchesThisLSE && touchesOtherLSE) {
+ if (touchesThisRSE && !touchesOtherRSE)
+ return trp;
+ if (!touchesThisRSE && touchesOtherRSE)
+ return orp;
+ return null;
+ }
+ if (touchesThisLSE) {
+ if (touchesOtherRSE) {
+ if (tlp.x === orp.x && tlp.y === orp.y)
+ return null;
+ }
+ return tlp;
+ }
+ if (touchesOtherLSE) {
+ if (touchesThisRSE) {
+ if (trp.x === olp.x && trp.y === olp.y)
+ return null;
+ }
+ return olp;
+ }
+ if (touchesThisRSE && touchesOtherRSE)
+ return null;
+ if (touchesThisRSE)
+ return trp;
+ if (touchesOtherRSE)
+ return orp;
+ var pt = intersection(tlp, this.vector(), olp, other.vector());
+ if (pt === null)
+ return null;
+ if (!isInBbox(bboxOverlap, pt))
+ return null;
+ return rounder.round(pt.x, pt.y);
+ }
+ }, {
+ key: "split",
+ value: function split2(point) {
+ var newEvents = [];
+ var alreadyLinked = point.events !== void 0;
+ var newLeftSE = new SweepEvent(point, true);
+ var newRightSE = new SweepEvent(point, false);
+ var oldRightSE = this.rightSE;
+ this.replaceRightSE(newRightSE);
+ newEvents.push(newRightSE);
+ newEvents.push(newLeftSE);
+ var newSeg = new Segment2(newLeftSE, oldRightSE, this.rings.slice(), this.windings.slice());
+ if (SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0) {
+ newSeg.swapEvents();
+ }
+ if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {
+ this.swapEvents();
+ }
+ if (alreadyLinked) {
+ newLeftSE.checkForConsuming();
+ newRightSE.checkForConsuming();
+ }
+ return newEvents;
+ }
+ }, {
+ key: "swapEvents",
+ value: function swapEvents() {
+ var tmpEvt = this.rightSE;
+ this.rightSE = this.leftSE;
+ this.leftSE = tmpEvt;
+ this.leftSE.isLeft = true;
+ this.rightSE.isLeft = false;
+ for (var i2 = 0, iMax = this.windings.length; i2 < iMax; i2++) {
+ this.windings[i2] *= -1;
+ }
+ }
+ }, {
+ key: "consume",
+ value: function consume(other) {
+ var consumer = this;
+ var consumee = other;
+ while (consumer.consumedBy) {
+ consumer = consumer.consumedBy;
+ }
+ while (consumee.consumedBy) {
+ consumee = consumee.consumedBy;
+ }
+ var cmp2 = Segment2.compare(consumer, consumee);
+ if (cmp2 === 0)
+ return;
+ if (cmp2 > 0) {
+ var tmp = consumer;
+ consumer = consumee;
+ consumee = tmp;
+ }
+ if (consumer.prev === consumee) {
+ var _tmp = consumer;
+ consumer = consumee;
+ consumee = _tmp;
+ }
+ for (var i2 = 0, iMax = consumee.rings.length; i2 < iMax; i2++) {
+ var ring = consumee.rings[i2];
+ var winding = consumee.windings[i2];
+ var index2 = consumer.rings.indexOf(ring);
+ if (index2 === -1) {
+ consumer.rings.push(ring);
+ consumer.windings.push(winding);
+ } else
+ consumer.windings[index2] += winding;
+ }
+ consumee.rings = null;
+ consumee.windings = null;
+ consumee.consumedBy = consumer;
+ consumee.leftSE.consumedBy = consumer.leftSE;
+ consumee.rightSE.consumedBy = consumer.rightSE;
+ }
+ }, {
+ key: "prevInResult",
+ value: function prevInResult() {
+ if (this._prevInResult !== void 0)
+ return this._prevInResult;
+ if (!this.prev)
+ this._prevInResult = null;
+ else if (this.prev.isInResult())
+ this._prevInResult = this.prev;
+ else
+ this._prevInResult = this.prev.prevInResult();
+ return this._prevInResult;
+ }
+ }, {
+ key: "beforeState",
+ value: function beforeState() {
+ if (this._beforeState !== void 0)
+ return this._beforeState;
+ if (!this.prev)
+ this._beforeState = {
+ rings: [],
+ windings: [],
+ multiPolys: []
+ };
+ else {
+ var seg = this.prev.consumedBy || this.prev;
+ this._beforeState = seg.afterState();
+ }
+ return this._beforeState;
+ }
+ }, {
+ key: "afterState",
+ value: function afterState() {
+ if (this._afterState !== void 0)
+ return this._afterState;
+ var beforeState = this.beforeState();
+ this._afterState = {
+ rings: beforeState.rings.slice(0),
+ windings: beforeState.windings.slice(0),
+ multiPolys: []
+ };
+ var ringsAfter = this._afterState.rings;
+ var windingsAfter = this._afterState.windings;
+ var mpsAfter = this._afterState.multiPolys;
+ for (var i2 = 0, iMax = this.rings.length; i2 < iMax; i2++) {
+ var ring = this.rings[i2];
+ var winding = this.windings[i2];
+ var index2 = ringsAfter.indexOf(ring);
+ if (index2 === -1) {
+ ringsAfter.push(ring);
+ windingsAfter.push(winding);
+ } else
+ windingsAfter[index2] += winding;
+ }
+ var polysAfter = [];
+ var polysExclude = [];
+ for (var _i = 0, _iMax = ringsAfter.length; _i < _iMax; _i++) {
+ if (windingsAfter[_i] === 0)
+ continue;
+ var _ring = ringsAfter[_i];
+ var poly = _ring.poly;
+ if (polysExclude.indexOf(poly) !== -1)
+ continue;
+ if (_ring.isExterior)
+ polysAfter.push(poly);
+ else {
+ if (polysExclude.indexOf(poly) === -1)
+ polysExclude.push(poly);
+ var _index = polysAfter.indexOf(_ring.poly);
+ if (_index !== -1)
+ polysAfter.splice(_index, 1);
+ }
+ }
+ for (var _i2 = 0, _iMax2 = polysAfter.length; _i2 < _iMax2; _i2++) {
+ var mp = polysAfter[_i2].multiPoly;
+ if (mpsAfter.indexOf(mp) === -1)
+ mpsAfter.push(mp);
+ }
+ return this._afterState;
+ }
+ }, {
+ key: "isInResult",
+ value: function isInResult() {
+ if (this.consumedBy)
+ return false;
+ if (this._isInResult !== void 0)
+ return this._isInResult;
+ var mpsBefore = this.beforeState().multiPolys;
+ var mpsAfter = this.afterState().multiPolys;
+ switch (operation.type) {
+ case "union": {
+ var noBefores = mpsBefore.length === 0;
+ var noAfters = mpsAfter.length === 0;
+ this._isInResult = noBefores !== noAfters;
+ break;
+ }
+ case "intersection": {
+ var least;
+ var most;
+ if (mpsBefore.length < mpsAfter.length) {
+ least = mpsBefore.length;
+ most = mpsAfter.length;
+ } else {
+ least = mpsAfter.length;
+ most = mpsBefore.length;
+ }
+ this._isInResult = most === operation.numMultiPolys && least < most;
+ break;
+ }
+ case "xor": {
+ var diff = Math.abs(mpsBefore.length - mpsAfter.length);
+ this._isInResult = diff % 2 === 1;
+ break;
+ }
+ case "difference": {
+ var isJustSubject = function isJustSubject2(mps) {
+ return mps.length === 1 && mps[0].isSubject;
+ };
+ this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter);
+ break;
+ }
+ default:
+ throw new Error("Unrecognized operation type found ".concat(operation.type));
+ }
+ return this._isInResult;
+ }
+ }], [{
+ key: "fromRing",
+ value: function fromRing(pt1, pt2, ring) {
+ var leftPt, rightPt, winding;
+ var cmpPts = SweepEvent.comparePoints(pt1, pt2);
+ if (cmpPts < 0) {
+ leftPt = pt1;
+ rightPt = pt2;
+ winding = 1;
+ } else if (cmpPts > 0) {
+ leftPt = pt2;
+ rightPt = pt1;
+ winding = -1;
+ } else
+ throw new Error("Tried to create degenerate segment at [".concat(pt1.x, ", ").concat(pt1.y, "]"));
+ var leftSE = new SweepEvent(leftPt, true);
+ var rightSE = new SweepEvent(rightPt, false);
+ return new Segment2(leftSE, rightSE, [ring], [winding]);
+ }
+ }]);
+ return Segment2;
+ }();
+ var RingIn = /* @__PURE__ */ function() {
+ function RingIn2(geomRing, poly, isExterior) {
+ _classCallCheck(this, RingIn2);
+ if (!Array.isArray(geomRing) || geomRing.length === 0) {
+ throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
+ }
+ this.poly = poly;
+ this.isExterior = isExterior;
+ this.segments = [];
+ if (typeof geomRing[0][0] !== "number" || typeof geomRing[0][1] !== "number") {
+ throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
+ }
+ var firstPoint = rounder.round(geomRing[0][0], geomRing[0][1]);
+ this.bbox = {
+ ll: {
+ x: firstPoint.x,
+ y: firstPoint.y
+ },
+ ur: {
+ x: firstPoint.x,
+ y: firstPoint.y
+ }
+ };
+ var prevPoint = firstPoint;
+ for (var i2 = 1, iMax = geomRing.length; i2 < iMax; i2++) {
+ if (typeof geomRing[i2][0] !== "number" || typeof geomRing[i2][1] !== "number") {
+ throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
+ }
+ var point = rounder.round(geomRing[i2][0], geomRing[i2][1]);
+ if (point.x === prevPoint.x && point.y === prevPoint.y)
+ continue;
+ this.segments.push(Segment.fromRing(prevPoint, point, this));
+ if (point.x < this.bbox.ll.x)
+ this.bbox.ll.x = point.x;
+ if (point.y < this.bbox.ll.y)
+ this.bbox.ll.y = point.y;
+ if (point.x > this.bbox.ur.x)
+ this.bbox.ur.x = point.x;
+ if (point.y > this.bbox.ur.y)
+ this.bbox.ur.y = point.y;
+ prevPoint = point;
+ }
+ if (firstPoint.x !== prevPoint.x || firstPoint.y !== prevPoint.y) {
+ this.segments.push(Segment.fromRing(prevPoint, firstPoint, this));
+ }
+ }
+ _createClass(RingIn2, [{
+ key: "getSweepEvents",
+ value: function getSweepEvents() {
+ var sweepEvents = [];
+ for (var i2 = 0, iMax = this.segments.length; i2 < iMax; i2++) {
+ var segment = this.segments[i2];
+ sweepEvents.push(segment.leftSE);
+ sweepEvents.push(segment.rightSE);
+ }
+ return sweepEvents;
+ }
+ }]);
+ return RingIn2;
+ }();
+ var PolyIn = /* @__PURE__ */ function() {
+ function PolyIn2(geomPoly, multiPoly) {
+ _classCallCheck(this, PolyIn2);
+ if (!Array.isArray(geomPoly)) {
+ throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
+ }
+ this.exteriorRing = new RingIn(geomPoly[0], this, true);
+ this.bbox = {
+ ll: {
+ x: this.exteriorRing.bbox.ll.x,
+ y: this.exteriorRing.bbox.ll.y
+ },
+ ur: {
+ x: this.exteriorRing.bbox.ur.x,
+ y: this.exteriorRing.bbox.ur.y
+ }
+ };
+ this.interiorRings = [];
+ for (var i2 = 1, iMax = geomPoly.length; i2 < iMax; i2++) {
+ var ring = new RingIn(geomPoly[i2], this, false);
+ if (ring.bbox.ll.x < this.bbox.ll.x)
+ this.bbox.ll.x = ring.bbox.ll.x;
+ if (ring.bbox.ll.y < this.bbox.ll.y)
+ this.bbox.ll.y = ring.bbox.ll.y;
+ if (ring.bbox.ur.x > this.bbox.ur.x)
+ this.bbox.ur.x = ring.bbox.ur.x;
+ if (ring.bbox.ur.y > this.bbox.ur.y)
+ this.bbox.ur.y = ring.bbox.ur.y;
+ this.interiorRings.push(ring);
+ }
+ this.multiPoly = multiPoly;
+ }
+ _createClass(PolyIn2, [{
+ key: "getSweepEvents",
+ value: function getSweepEvents() {
+ var sweepEvents = this.exteriorRing.getSweepEvents();
+ for (var i2 = 0, iMax = this.interiorRings.length; i2 < iMax; i2++) {
+ var ringSweepEvents = this.interiorRings[i2].getSweepEvents();
+ for (var j2 = 0, jMax = ringSweepEvents.length; j2 < jMax; j2++) {
+ sweepEvents.push(ringSweepEvents[j2]);
+ }
+ }
+ return sweepEvents;
+ }
+ }]);
+ return PolyIn2;
+ }();
+ var MultiPolyIn = /* @__PURE__ */ function() {
+ function MultiPolyIn2(geom, isSubject) {
+ _classCallCheck(this, MultiPolyIn2);
+ if (!Array.isArray(geom)) {
+ throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
+ }
+ try {
+ if (typeof geom[0][0][0] === "number")
+ geom = [geom];
+ } catch (ex) {
+ }
+ this.polys = [];
+ this.bbox = {
+ ll: {
+ x: Number.POSITIVE_INFINITY,
+ y: Number.POSITIVE_INFINITY
+ },
+ ur: {
+ x: Number.NEGATIVE_INFINITY,
+ y: Number.NEGATIVE_INFINITY
+ }
+ };
+ for (var i2 = 0, iMax = geom.length; i2 < iMax; i2++) {
+ var poly = new PolyIn(geom[i2], this);
+ if (poly.bbox.ll.x < this.bbox.ll.x)
+ this.bbox.ll.x = poly.bbox.ll.x;
+ if (poly.bbox.ll.y < this.bbox.ll.y)
+ this.bbox.ll.y = poly.bbox.ll.y;
+ if (poly.bbox.ur.x > this.bbox.ur.x)
+ this.bbox.ur.x = poly.bbox.ur.x;
+ if (poly.bbox.ur.y > this.bbox.ur.y)
+ this.bbox.ur.y = poly.bbox.ur.y;
+ this.polys.push(poly);
+ }
+ this.isSubject = isSubject;
+ }
+ _createClass(MultiPolyIn2, [{
+ key: "getSweepEvents",
+ value: function getSweepEvents() {
+ var sweepEvents = [];
+ for (var i2 = 0, iMax = this.polys.length; i2 < iMax; i2++) {
+ var polySweepEvents = this.polys[i2].getSweepEvents();
+ for (var j2 = 0, jMax = polySweepEvents.length; j2 < jMax; j2++) {
+ sweepEvents.push(polySweepEvents[j2]);
+ }
+ }
+ return sweepEvents;
+ }
+ }]);
+ return MultiPolyIn2;
+ }();
+ var RingOut = /* @__PURE__ */ function() {
+ _createClass(RingOut2, null, [{
+ key: "factory",
+ value: function factory(allSegments) {
+ var ringsOut = [];
+ for (var i2 = 0, iMax = allSegments.length; i2 < iMax; i2++) {
+ var segment = allSegments[i2];
+ if (!segment.isInResult() || segment.ringOut)
+ continue;
+ var prevEvent = null;
+ var event = segment.leftSE;
+ var nextEvent = segment.rightSE;
+ var events = [event];
+ var startingPoint = event.point;
+ var intersectionLEs = [];
+ while (true) {
+ prevEvent = event;
+ event = nextEvent;
+ events.push(event);
+ if (event.point === startingPoint)
+ break;
+ while (true) {
+ var availableLEs = event.getAvailableLinkedEvents();
+ if (availableLEs.length === 0) {
+ var firstPt = events[0].point;
+ var lastPt = events[events.length - 1].point;
+ throw new Error("Unable to complete output ring starting at [".concat(firstPt.x, ",") + " ".concat(firstPt.y, "]. Last matching segment found ends at") + " [".concat(lastPt.x, ", ").concat(lastPt.y, "]."));
+ }
+ if (availableLEs.length === 1) {
+ nextEvent = availableLEs[0].otherSE;
+ break;
+ }
+ var indexLE = null;
+ for (var j2 = 0, jMax = intersectionLEs.length; j2 < jMax; j2++) {
+ if (intersectionLEs[j2].point === event.point) {
+ indexLE = j2;
+ break;
+ }
+ }
+ if (indexLE !== null) {
+ var intersectionLE = intersectionLEs.splice(indexLE)[0];
+ var ringEvents = events.splice(intersectionLE.index);
+ ringEvents.unshift(ringEvents[0].otherSE);
+ ringsOut.push(new RingOut2(ringEvents.reverse()));
+ continue;
+ }
+ intersectionLEs.push({
+ index: events.length,
+ point: event.point
+ });
+ var comparator = event.getLeftmostComparator(prevEvent);
+ nextEvent = availableLEs.sort(comparator)[0].otherSE;
+ break;
+ }
+ }
+ ringsOut.push(new RingOut2(events));
+ }
+ return ringsOut;
+ }
+ }]);
+ function RingOut2(events) {
+ _classCallCheck(this, RingOut2);
+ this.events = events;
+ for (var i2 = 0, iMax = events.length; i2 < iMax; i2++) {
+ events[i2].segment.ringOut = this;
+ }
+ this.poly = null;
+ }
+ _createClass(RingOut2, [{
+ key: "getGeom",
+ value: function getGeom2() {
+ var prevPt = this.events[0].point;
+ var points = [prevPt];
+ for (var i2 = 1, iMax = this.events.length - 1; i2 < iMax; i2++) {
+ var _pt = this.events[i2].point;
+ var _nextPt = this.events[i2 + 1].point;
+ if (compareVectorAngles(_pt, prevPt, _nextPt) === 0)
+ continue;
+ points.push(_pt);
+ prevPt = _pt;
+ }
+ if (points.length === 1)
+ return null;
+ var pt = points[0];
+ var nextPt = points[1];
+ if (compareVectorAngles(pt, prevPt, nextPt) === 0)
+ points.shift();
+ points.push(points[0]);
+ var step = this.isExteriorRing() ? 1 : -1;
+ var iStart = this.isExteriorRing() ? 0 : points.length - 1;
+ var iEnd = this.isExteriorRing() ? points.length : -1;
+ var orderedPoints = [];
+ for (var _i = iStart; _i != iEnd; _i += step) {
+ orderedPoints.push([points[_i].x, points[_i].y]);
+ }
+ return orderedPoints;
+ }
+ }, {
+ key: "isExteriorRing",
+ value: function isExteriorRing() {
+ if (this._isExteriorRing === void 0) {
+ var enclosing = this.enclosingRing();
+ this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true;
+ }
+ return this._isExteriorRing;
+ }
+ }, {
+ key: "enclosingRing",
+ value: function enclosingRing() {
+ if (this._enclosingRing === void 0) {
+ this._enclosingRing = this._calcEnclosingRing();
+ }
+ return this._enclosingRing;
+ }
+ }, {
+ key: "_calcEnclosingRing",
+ value: function _calcEnclosingRing() {
+ var leftMostEvt = this.events[0];
+ for (var i2 = 1, iMax = this.events.length; i2 < iMax; i2++) {
+ var evt = this.events[i2];
+ if (SweepEvent.compare(leftMostEvt, evt) > 0)
+ leftMostEvt = evt;
+ }
+ var prevSeg = leftMostEvt.segment.prevInResult();
+ var prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;
+ while (true) {
+ if (!prevSeg)
+ return null;
+ if (!prevPrevSeg)
+ return prevSeg.ringOut;
+ if (prevPrevSeg.ringOut !== prevSeg.ringOut) {
+ if (prevPrevSeg.ringOut.enclosingRing() !== prevSeg.ringOut) {
+ return prevSeg.ringOut;
+ } else
+ return prevSeg.ringOut.enclosingRing();
+ }
+ prevSeg = prevPrevSeg.prevInResult();
+ prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;
+ }
+ }
+ }]);
+ return RingOut2;
+ }();
+ var PolyOut = /* @__PURE__ */ function() {
+ function PolyOut2(exteriorRing) {
+ _classCallCheck(this, PolyOut2);
+ this.exteriorRing = exteriorRing;
+ exteriorRing.poly = this;
+ this.interiorRings = [];
+ }
+ _createClass(PolyOut2, [{
+ key: "addInterior",
+ value: function addInterior(ring) {
+ this.interiorRings.push(ring);
+ ring.poly = this;
+ }
+ }, {
+ key: "getGeom",
+ value: function getGeom2() {
+ var geom = [this.exteriorRing.getGeom()];
+ if (geom[0] === null)
+ return null;
+ for (var i2 = 0, iMax = this.interiorRings.length; i2 < iMax; i2++) {
+ var ringGeom = this.interiorRings[i2].getGeom();
+ if (ringGeom === null)
+ continue;
+ geom.push(ringGeom);
+ }
+ return geom;
+ }
+ }]);
+ return PolyOut2;
+ }();
+ var MultiPolyOut = /* @__PURE__ */ function() {
+ function MultiPolyOut2(rings) {
+ _classCallCheck(this, MultiPolyOut2);
+ this.rings = rings;
+ this.polys = this._composePolys(rings);
+ }
+ _createClass(MultiPolyOut2, [{
+ key: "getGeom",
+ value: function getGeom2() {
+ var geom = [];
+ for (var i2 = 0, iMax = this.polys.length; i2 < iMax; i2++) {
+ var polyGeom = this.polys[i2].getGeom();
+ if (polyGeom === null)
+ continue;
+ geom.push(polyGeom);
+ }
+ return geom;
+ }
+ }, {
+ key: "_composePolys",
+ value: function _composePolys(rings) {
+ var polys = [];
+ for (var i2 = 0, iMax = rings.length; i2 < iMax; i2++) {
+ var ring = rings[i2];
+ if (ring.poly)
+ continue;
+ if (ring.isExteriorRing())
+ polys.push(new PolyOut(ring));
+ else {
+ var enclosingRing = ring.enclosingRing();
+ if (!enclosingRing.poly)
+ polys.push(new PolyOut(enclosingRing));
+ enclosingRing.poly.addInterior(ring);
+ }
+ }
+ return polys;
+ }
+ }]);
+ return MultiPolyOut2;
+ }();
+ var SweepLine = /* @__PURE__ */ function() {
+ function SweepLine2(queue) {
+ var comparator = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : Segment.compare;
+ _classCallCheck(this, SweepLine2);
+ this.queue = queue;
+ this.tree = new Tree(comparator);
+ this.segments = [];
+ }
+ _createClass(SweepLine2, [{
+ key: "process",
+ value: function process2(event) {
+ var segment = event.segment;
+ var newEvents = [];
+ if (event.consumedBy) {
+ if (event.isLeft)
+ this.queue.remove(event.otherSE);
+ else
+ this.tree.remove(segment);
+ return newEvents;
+ }
+ var node = event.isLeft ? this.tree.insert(segment) : this.tree.find(segment);
+ if (!node)
+ throw new Error("Unable to find segment #".concat(segment.id, " ") + "[".concat(segment.leftSE.point.x, ", ").concat(segment.leftSE.point.y, "] -> ") + "[".concat(segment.rightSE.point.x, ", ").concat(segment.rightSE.point.y, "] ") + "in SweepLine tree. Please submit a bug report.");
+ var prevNode = node;
+ var nextNode = node;
+ var prevSeg = void 0;
+ var nextSeg = void 0;
+ while (prevSeg === void 0) {
+ prevNode = this.tree.prev(prevNode);
+ if (prevNode === null)
+ prevSeg = null;
+ else if (prevNode.key.consumedBy === void 0)
+ prevSeg = prevNode.key;
+ }
+ while (nextSeg === void 0) {
+ nextNode = this.tree.next(nextNode);
+ if (nextNode === null)
+ nextSeg = null;
+ else if (nextNode.key.consumedBy === void 0)
+ nextSeg = nextNode.key;
+ }
+ if (event.isLeft) {
+ var prevMySplitter = null;
+ if (prevSeg) {
+ var prevInter = prevSeg.getIntersection(segment);
+ if (prevInter !== null) {
+ if (!segment.isAnEndpoint(prevInter))
+ prevMySplitter = prevInter;
+ if (!prevSeg.isAnEndpoint(prevInter)) {
+ var newEventsFromSplit = this._splitSafely(prevSeg, prevInter);
+ for (var i2 = 0, iMax = newEventsFromSplit.length; i2 < iMax; i2++) {
+ newEvents.push(newEventsFromSplit[i2]);
+ }
+ }
+ }
+ }
+ var nextMySplitter = null;
+ if (nextSeg) {
+ var nextInter = nextSeg.getIntersection(segment);
+ if (nextInter !== null) {
+ if (!segment.isAnEndpoint(nextInter))
+ nextMySplitter = nextInter;
+ if (!nextSeg.isAnEndpoint(nextInter)) {
+ var _newEventsFromSplit = this._splitSafely(nextSeg, nextInter);
+ for (var _i = 0, _iMax = _newEventsFromSplit.length; _i < _iMax; _i++) {
+ newEvents.push(_newEventsFromSplit[_i]);
+ }
+ }
+ }
+ }
+ if (prevMySplitter !== null || nextMySplitter !== null) {
+ var mySplitter = null;
+ if (prevMySplitter === null)
+ mySplitter = nextMySplitter;
+ else if (nextMySplitter === null)
+ mySplitter = prevMySplitter;
+ else {
+ var cmpSplitters = SweepEvent.comparePoints(prevMySplitter, nextMySplitter);
+ mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter;
+ }
+ this.queue.remove(segment.rightSE);
+ newEvents.push(segment.rightSE);
+ var _newEventsFromSplit2 = segment.split(mySplitter);
+ for (var _i2 = 0, _iMax2 = _newEventsFromSplit2.length; _i2 < _iMax2; _i2++) {
+ newEvents.push(_newEventsFromSplit2[_i2]);
+ }
+ }
+ if (newEvents.length > 0) {
+ this.tree.remove(segment);
+ newEvents.push(event);
+ } else {
+ this.segments.push(segment);
+ segment.prev = prevSeg;
+ }
+ } else {
+ if (prevSeg && nextSeg) {
+ var inter = prevSeg.getIntersection(nextSeg);
+ if (inter !== null) {
+ if (!prevSeg.isAnEndpoint(inter)) {
+ var _newEventsFromSplit3 = this._splitSafely(prevSeg, inter);
+ for (var _i3 = 0, _iMax3 = _newEventsFromSplit3.length; _i3 < _iMax3; _i3++) {
+ newEvents.push(_newEventsFromSplit3[_i3]);
+ }
+ }
+ if (!nextSeg.isAnEndpoint(inter)) {
+ var _newEventsFromSplit4 = this._splitSafely(nextSeg, inter);
+ for (var _i4 = 0, _iMax4 = _newEventsFromSplit4.length; _i4 < _iMax4; _i4++) {
+ newEvents.push(_newEventsFromSplit4[_i4]);
+ }
+ }
+ }
+ }
+ this.tree.remove(segment);
+ }
+ return newEvents;
+ }
+ }, {
+ key: "_splitSafely",
+ value: function _splitSafely(seg, pt) {
+ this.tree.remove(seg);
+ var rightSE = seg.rightSE;
+ this.queue.remove(rightSE);
+ var newEvents = seg.split(pt);
+ newEvents.push(rightSE);
+ if (seg.consumedBy === void 0)
+ this.tree.insert(seg);
+ return newEvents;
+ }
+ }]);
+ return SweepLine2;
+ }();
+ var POLYGON_CLIPPING_MAX_QUEUE_SIZE = typeof process !== "undefined" && process.env.POLYGON_CLIPPING_MAX_QUEUE_SIZE || 1e6;
+ var POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS = typeof process !== "undefined" && process.env.POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS || 1e6;
+ var Operation = /* @__PURE__ */ function() {
+ function Operation2() {
+ _classCallCheck(this, Operation2);
+ }
+ _createClass(Operation2, [{
+ key: "run",
+ value: function run(type3, geom, moreGeoms) {
+ operation.type = type3;
+ rounder.reset();
+ var multipolys = [new MultiPolyIn(geom, true)];
+ for (var i2 = 0, iMax = moreGeoms.length; i2 < iMax; i2++) {
+ multipolys.push(new MultiPolyIn(moreGeoms[i2], false));
+ }
+ operation.numMultiPolys = multipolys.length;
+ if (operation.type === "difference") {
+ var subject = multipolys[0];
+ var _i = 1;
+ while (_i < multipolys.length) {
+ if (getBboxOverlap(multipolys[_i].bbox, subject.bbox) !== null)
+ _i++;
+ else
+ multipolys.splice(_i, 1);
+ }
+ }
+ if (operation.type === "intersection") {
+ for (var _i2 = 0, _iMax = multipolys.length; _i2 < _iMax; _i2++) {
+ var mpA = multipolys[_i2];
+ for (var j2 = _i2 + 1, jMax = multipolys.length; j2 < jMax; j2++) {
+ if (getBboxOverlap(mpA.bbox, multipolys[j2].bbox) === null)
+ return [];
+ }
+ }
+ }
+ var queue = new Tree(SweepEvent.compare);
+ for (var _i3 = 0, _iMax2 = multipolys.length; _i3 < _iMax2; _i3++) {
+ var sweepEvents = multipolys[_i3].getSweepEvents();
+ for (var _j = 0, _jMax = sweepEvents.length; _j < _jMax; _j++) {
+ queue.insert(sweepEvents[_j]);
+ if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) {
+ throw new Error("Infinite loop when putting segment endpoints in a priority queue (queue size too big). Please file a bug report.");
+ }
+ }
+ }
+ var sweepLine = new SweepLine(queue);
+ var prevQueueSize = queue.size;
+ var node = queue.pop();
+ while (node) {
+ var evt = node.key;
+ if (queue.size === prevQueueSize) {
+ var seg = evt.segment;
+ throw new Error("Unable to pop() ".concat(evt.isLeft ? "left" : "right", " SweepEvent ") + "[".concat(evt.point.x, ", ").concat(evt.point.y, "] from segment #").concat(seg.id, " ") + "[".concat(seg.leftSE.point.x, ", ").concat(seg.leftSE.point.y, "] -> ") + "[".concat(seg.rightSE.point.x, ", ").concat(seg.rightSE.point.y, "] from queue. ") + "Please file a bug report.");
+ }
+ if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) {
+ throw new Error("Infinite loop when passing sweep line over endpoints (queue size too big). Please file a bug report.");
+ }
+ if (sweepLine.segments.length > POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS) {
+ throw new Error("Infinite loop when passing sweep line over endpoints (too many sweep line segments). Please file a bug report.");
+ }
+ var newEvents = sweepLine.process(evt);
+ for (var _i4 = 0, _iMax3 = newEvents.length; _i4 < _iMax3; _i4++) {
+ var _evt = newEvents[_i4];
+ if (_evt.consumedBy === void 0)
+ queue.insert(_evt);
+ }
+ prevQueueSize = queue.size;
+ node = queue.pop();
+ }
+ rounder.reset();
+ var ringsOut = RingOut.factory(sweepLine.segments);
+ var result = new MultiPolyOut(ringsOut);
+ return result.getGeom();
+ }
+ }]);
+ return Operation2;
+ }();
+ var operation = new Operation();
+ var union = function union2(geom) {
+ for (var _len = arguments.length, moreGeoms = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ moreGeoms[_key - 1] = arguments[_key];
+ }
+ return operation.run("union", geom, moreGeoms);
+ };
+ var intersection$1 = function intersection2(geom) {
+ for (var _len2 = arguments.length, moreGeoms = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ moreGeoms[_key2 - 1] = arguments[_key2];
+ }
+ return operation.run("intersection", geom, moreGeoms);
+ };
+ var xor = function xor2(geom) {
+ for (var _len3 = arguments.length, moreGeoms = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
+ moreGeoms[_key3 - 1] = arguments[_key3];
+ }
+ return operation.run("xor", geom, moreGeoms);
+ };
+ var difference = function difference2(subjectGeom) {
+ for (var _len4 = arguments.length, clippingGeoms = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
+ clippingGeoms[_key4 - 1] = arguments[_key4];
+ }
+ return operation.run("difference", subjectGeom, clippingGeoms);
+ };
+ var index = {
+ union,
+ intersection: intersection$1,
+ xor,
+ difference
+ };
+ return index;
+ });
+ }
+ });
+
+ // node_modules/geojson-precision/index.js
+ var require_geojson_precision = __commonJS({
+ "node_modules/geojson-precision/index.js"(exports2, module2) {
+ (function() {
+ function parse(t, coordinatePrecision, extrasPrecision) {
+ function point(p) {
+ return p.map(function(e, index) {
+ if (index < 2) {
+ return 1 * e.toFixed(coordinatePrecision);
+ } else {
+ return 1 * e.toFixed(extrasPrecision);
+ }
+ });
+ }
+ function multi(l) {
+ return l.map(point);
+ }
+ function poly(p) {
+ return p.map(multi);
+ }
+ function multiPoly(m) {
+ return m.map(poly);
+ }
+ function geometry(obj) {
+ if (!obj) {
+ return {};
+ }
+ switch (obj.type) {
+ case "Point":
+ obj.coordinates = point(obj.coordinates);
+ return obj;
+ case "LineString":
+ case "MultiPoint":
+ obj.coordinates = multi(obj.coordinates);
+ return obj;
+ case "Polygon":
+ case "MultiLineString":
+ obj.coordinates = poly(obj.coordinates);
+ return obj;
+ case "MultiPolygon":
+ obj.coordinates = multiPoly(obj.coordinates);
+ return obj;
+ case "GeometryCollection":
+ obj.geometries = obj.geometries.map(geometry);
+ return obj;
+ default:
+ return {};
+ }
+ }
+ function feature3(obj) {
+ obj.geometry = geometry(obj.geometry);
+ return obj;
+ }
+ function featureCollection(f2) {
+ f2.features = f2.features.map(feature3);
+ return f2;
+ }
+ function geometryCollection(g) {
+ g.geometries = g.geometries.map(geometry);
+ return g;
+ }
+ if (!t) {
+ return t;
+ }
+ switch (t.type) {
+ case "Feature":
+ return feature3(t);
+ case "GeometryCollection":
+ return geometryCollection(t);
+ case "FeatureCollection":
+ return featureCollection(t);
+ case "Point":
+ case "LineString":
+ case "Polygon":
+ case "MultiPoint":
+ case "MultiPolygon":
+ case "MultiLineString":
+ return geometry(t);
+ default:
+ return t;
+ }
+ }
+ module2.exports = parse;
+ module2.exports.parse = parse;
+ })();
+ }
+ });
+
+ // node_modules/@aitodotai/json-stringify-pretty-compact/index.js
+ var require_json_stringify_pretty_compact = __commonJS({
+ "node_modules/@aitodotai/json-stringify-pretty-compact/index.js"(exports2, module2) {
+ function isObject2(obj) {
+ return typeof obj === "object" && obj !== null;
+ }
+ function forEach(obj, cb) {
+ if (Array.isArray(obj)) {
+ obj.forEach(cb);
+ } else if (isObject2(obj)) {
+ Object.keys(obj).forEach(function(key) {
+ var val = obj[key];
+ cb(val, key);
+ });
+ }
+ }
+ function getTreeDepth(obj) {
+ var depth = 0;
+ if (Array.isArray(obj) || isObject2(obj)) {
+ forEach(obj, function(val) {
+ if (Array.isArray(val) || isObject2(val)) {
+ var tmpDepth = getTreeDepth(val);
+ if (tmpDepth > depth) {
+ depth = tmpDepth;
+ }
+ }
+ });
+ return depth + 1;
+ }
+ return depth;
+ }
+ function stringify3(obj, options2) {
+ options2 = options2 || {};
+ var indent2 = JSON.stringify([1], null, get3(options2, "indent", 2)).slice(2, -3);
+ var addMargin = get3(options2, "margins", false);
+ var addArrayMargin = get3(options2, "arrayMargins", false);
+ var addObjectMargin = get3(options2, "objectMargins", false);
+ var maxLength = indent2 === "" ? Infinity : get3(options2, "maxLength", 80);
+ var maxNesting = get3(options2, "maxNesting", Infinity);
+ return function _stringify(obj2, currentIndent, reserved) {
+ if (obj2 && typeof obj2.toJSON === "function") {
+ obj2 = obj2.toJSON();
+ }
+ var string = JSON.stringify(obj2);
+ if (string === void 0) {
+ return string;
+ }
+ var length = maxLength - currentIndent.length - reserved;
+ var treeDepth = getTreeDepth(obj2);
+ if (treeDepth <= maxNesting && string.length <= length) {
+ var prettified = prettify(string, {
+ addMargin,
+ addArrayMargin,
+ addObjectMargin
+ });
+ if (prettified.length <= length) {
+ return prettified;
+ }
+ }
+ if (isObject2(obj2)) {
+ var nextIndent = currentIndent + indent2;
+ var items = [];
+ var delimiters;
+ var comma = function(array2, index2) {
+ return index2 === array2.length - 1 ? 0 : 1;
+ };
+ if (Array.isArray(obj2)) {
+ for (var index = 0; index < obj2.length; index++) {
+ items.push(_stringify(obj2[index], nextIndent, comma(obj2, index)) || "null");
+ }
+ delimiters = "[]";
+ } else {
+ Object.keys(obj2).forEach(function(key, index2, array2) {
+ var keyPart = JSON.stringify(key) + ": ";
+ var value = _stringify(obj2[key], nextIndent, keyPart.length + comma(array2, index2));
+ if (value !== void 0) {
+ items.push(keyPart + value);
+ }
+ });
+ delimiters = "{}";
+ }
+ if (items.length > 0) {
+ return [
+ delimiters[0],
+ indent2 + items.join(",\n" + nextIndent),
+ delimiters[1]
+ ].join("\n" + currentIndent);
+ }
+ }
+ return string;
+ }(obj, "", 0);
+ }
+ var stringOrChar = /("(?:[^\\"]|\\.)*")|[:,\][}{]/g;
+ function prettify(string, options2) {
+ options2 = options2 || {};
+ var tokens = {
+ "{": "{",
+ "}": "}",
+ "[": "[",
+ "]": "]",
+ ",": ", ",
+ ":": ": "
+ };
+ if (options2.addMargin || options2.addObjectMargin) {
+ tokens["{"] = "{ ";
+ tokens["}"] = " }";
+ }
+ if (options2.addMargin || options2.addArrayMargin) {
+ tokens["["] = "[ ";
+ tokens["]"] = " ]";
+ }
+ return string.replace(stringOrChar, function(match, string2) {
+ return string2 ? match : tokens[match];
+ });
+ }
+ function get3(options2, name2, defaultValue) {
+ return name2 in options2 ? options2[name2] : defaultValue;
+ }
+ module2.exports = stringify3;
+ }
+ });
+
+ // node_modules/aes-js/index.js
+ var require_aes_js = __commonJS({
+ "node_modules/aes-js/index.js"(exports2, module2) {
+ (function(root3) {
+ "use strict";
+ function checkInt(value) {
+ return parseInt(value) === value;
+ }
+ function checkInts(arrayish) {
+ if (!checkInt(arrayish.length)) {
+ return false;
+ }
+ for (var i2 = 0; i2 < arrayish.length; i2++) {
+ if (!checkInt(arrayish[i2]) || arrayish[i2] < 0 || arrayish[i2] > 255) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function coerceArray(arg, copy2) {
+ if (arg.buffer && arg.name === "Uint8Array") {
+ if (copy2) {
+ if (arg.slice) {
+ arg = arg.slice();
+ } else {
+ arg = Array.prototype.slice.call(arg);
+ }
+ }
+ return arg;
+ }
+ if (Array.isArray(arg)) {
+ if (!checkInts(arg)) {
+ throw new Error("Array contains invalid value: " + arg);
+ }
+ return new Uint8Array(arg);
+ }
+ if (checkInt(arg.length) && checkInts(arg)) {
+ return new Uint8Array(arg);
+ }
+ throw new Error("unsupported array-like object");
+ }
+ function createArray(length) {
+ return new Uint8Array(length);
+ }
+ function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {
+ if (sourceStart != null || sourceEnd != null) {
+ if (sourceArray.slice) {
+ sourceArray = sourceArray.slice(sourceStart, sourceEnd);
+ } else {
+ sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);
+ }
+ }
+ targetArray.set(sourceArray, targetStart);
+ }
+ var convertUtf8 = function() {
+ function toBytes(text2) {
+ var result = [], i2 = 0;
+ text2 = encodeURI(text2);
+ while (i2 < text2.length) {
+ var c = text2.charCodeAt(i2++);
+ if (c === 37) {
+ result.push(parseInt(text2.substr(i2, 2), 16));
+ i2 += 2;
+ } else {
+ result.push(c);
+ }
+ }
+ return coerceArray(result);
+ }
+ function fromBytes(bytes) {
+ var result = [], i2 = 0;
+ while (i2 < bytes.length) {
+ var c = bytes[i2];
+ if (c < 128) {
+ result.push(String.fromCharCode(c));
+ i2++;
+ } else if (c > 191 && c < 224) {
+ result.push(String.fromCharCode((c & 31) << 6 | bytes[i2 + 1] & 63));
+ i2 += 2;
+ } else {
+ result.push(String.fromCharCode((c & 15) << 12 | (bytes[i2 + 1] & 63) << 6 | bytes[i2 + 2] & 63));
+ i2 += 3;
+ }
+ }
+ return result.join("");
+ }
+ return {
+ toBytes,
+ fromBytes
+ };
+ }();
+ var convertHex = function() {
+ function toBytes(text2) {
+ var result = [];
+ for (var i2 = 0; i2 < text2.length; i2 += 2) {
+ result.push(parseInt(text2.substr(i2, 2), 16));
+ }
+ return result;
+ }
+ var Hex = "0123456789abcdef";
+ function fromBytes(bytes) {
+ var result = [];
+ for (var i2 = 0; i2 < bytes.length; i2++) {
+ var v = bytes[i2];
+ result.push(Hex[(v & 240) >> 4] + Hex[v & 15]);
+ }
+ return result.join("");
+ }
+ return {
+ toBytes,
+ fromBytes
+ };
+ }();
+ var numberOfRounds = { 16: 10, 24: 12, 32: 14 };
+ var rcon = [1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, 145];
+ var S = [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22];
+ var Si = [82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125];
+ var T1 = [3328402341, 4168907908, 4000806809, 4135287693, 4294111757, 3597364157, 3731845041, 2445657428, 1613770832, 33620227, 3462883241, 1445669757, 3892248089, 3050821474, 1303096294, 3967186586, 2412431941, 528646813, 2311702848, 4202528135, 4026202645, 2992200171, 2387036105, 4226871307, 1101901292, 3017069671, 1604494077, 1169141738, 597466303, 1403299063, 3832705686, 2613100635, 1974974402, 3791519004, 1033081774, 1277568618, 1815492186, 2118074177, 4126668546, 2211236943, 1748251740, 1369810420, 3521504564, 4193382664, 3799085459, 2883115123, 1647391059, 706024767, 134480908, 2512897874, 1176707941, 2646852446, 806885416, 932615841, 168101135, 798661301, 235341577, 605164086, 461406363, 3756188221, 3454790438, 1311188841, 2142417613, 3933566367, 302582043, 495158174, 1479289972, 874125870, 907746093, 3698224818, 3025820398, 1537253627, 2756858614, 1983593293, 3084310113, 2108928974, 1378429307, 3722699582, 1580150641, 327451799, 2790478837, 3117535592, 0, 3253595436, 1075847264, 3825007647, 2041688520, 3059440621, 3563743934, 2378943302, 1740553945, 1916352843, 2487896798, 2555137236, 2958579944, 2244988746, 3151024235, 3320835882, 1336584933, 3992714006, 2252555205, 2588757463, 1714631509, 293963156, 2319795663, 3925473552, 67240454, 4269768577, 2689618160, 2017213508, 631218106, 1269344483, 2723238387, 1571005438, 2151694528, 93294474, 1066570413, 563977660, 1882732616, 4059428100, 1673313503, 2008463041, 2950355573, 1109467491, 537923632, 3858759450, 4260623118, 3218264685, 2177748300, 403442708, 638784309, 3287084079, 3193921505, 899127202, 2286175436, 773265209, 2479146071, 1437050866, 4236148354, 2050833735, 3362022572, 3126681063, 840505643, 3866325909, 3227541664, 427917720, 2655997905, 2749160575, 1143087718, 1412049534, 999329963, 193497219, 2353415882, 3354324521, 1807268051, 672404540, 2816401017, 3160301282, 369822493, 2916866934, 3688947771, 1681011286, 1949973070, 336202270, 2454276571, 201721354, 1210328172, 3093060836, 2680341085, 3184776046, 1135389935, 3294782118, 965841320, 831886756, 3554993207, 4068047243, 3588745010, 2345191491, 1849112409, 3664604599, 26054028, 2983581028, 2622377682, 1235855840, 3630984372, 2891339514, 4092916743, 3488279077, 3395642799, 4101667470, 1202630377, 268961816, 1874508501, 4034427016, 1243948399, 1546530418, 941366308, 1470539505, 1941222599, 2546386513, 3421038627, 2715671932, 3899946140, 1042226977, 2521517021, 1639824860, 227249030, 260737669, 3765465232, 2084453954, 1907733956, 3429263018, 2420656344, 100860677, 4160157185, 470683154, 3261161891, 1781871967, 2924959737, 1773779408, 394692241, 2579611992, 974986535, 664706745, 3655459128, 3958962195, 731420851, 571543859, 3530123707, 2849626480, 126783113, 865375399, 765172662, 1008606754, 361203602, 3387549984, 2278477385, 2857719295, 1344809080, 2782912378, 59542671, 1503764984, 160008576, 437062935, 1707065306, 3622233649, 2218934982, 3496503480, 2185314755, 697932208, 1512910199, 504303377, 2075177163, 2824099068, 1841019862, 739644986];
+ var T2 = [2781242211, 2230877308, 2582542199, 2381740923, 234877682, 3184946027, 2984144751, 1418839493, 1348481072, 50462977, 2848876391, 2102799147, 434634494, 1656084439, 3863849899, 2599188086, 1167051466, 2636087938, 1082771913, 2281340285, 368048890, 3954334041, 3381544775, 201060592, 3963727277, 1739838676, 4250903202, 3930435503, 3206782108, 4149453988, 2531553906, 1536934080, 3262494647, 484572669, 2923271059, 1783375398, 1517041206, 1098792767, 49674231, 1334037708, 1550332980, 4098991525, 886171109, 150598129, 2481090929, 1940642008, 1398944049, 1059722517, 201851908, 1385547719, 1699095331, 1587397571, 674240536, 2704774806, 252314885, 3039795866, 151914247, 908333586, 2602270848, 1038082786, 651029483, 1766729511, 3447698098, 2682942837, 454166793, 2652734339, 1951935532, 775166490, 758520603, 3000790638, 4004797018, 4217086112, 4137964114, 1299594043, 1639438038, 3464344499, 2068982057, 1054729187, 1901997871, 2534638724, 4121318227, 1757008337, 0, 750906861, 1614815264, 535035132, 3363418545, 3988151131, 3201591914, 1183697867, 3647454910, 1265776953, 3734260298, 3566750796, 3903871064, 1250283471, 1807470800, 717615087, 3847203498, 384695291, 3313910595, 3617213773, 1432761139, 2484176261, 3481945413, 283769337, 100925954, 2180939647, 4037038160, 1148730428, 3123027871, 3813386408, 4087501137, 4267549603, 3229630528, 2315620239, 2906624658, 3156319645, 1215313976, 82966005, 3747855548, 3245848246, 1974459098, 1665278241, 807407632, 451280895, 251524083, 1841287890, 1283575245, 337120268, 891687699, 801369324, 3787349855, 2721421207, 3431482436, 959321879, 1469301956, 4065699751, 2197585534, 1199193405, 2898814052, 3887750493, 724703513, 2514908019, 2696962144, 2551808385, 3516813135, 2141445340, 1715741218, 2119445034, 2872807568, 2198571144, 3398190662, 700968686, 3547052216, 1009259540, 2041044702, 3803995742, 487983883, 1991105499, 1004265696, 1449407026, 1316239930, 504629770, 3683797321, 168560134, 1816667172, 3837287516, 1570751170, 1857934291, 4014189740, 2797888098, 2822345105, 2754712981, 936633572, 2347923833, 852879335, 1133234376, 1500395319, 3084545389, 2348912013, 1689376213, 3533459022, 3762923945, 3034082412, 4205598294, 133428468, 634383082, 2949277029, 2398386810, 3913789102, 403703816, 3580869306, 2297460856, 1867130149, 1918643758, 607656988, 4049053350, 3346248884, 1368901318, 600565992, 2090982877, 2632479860, 557719327, 3717614411, 3697393085, 2249034635, 2232388234, 2430627952, 1115438654, 3295786421, 2865522278, 3633334344, 84280067, 33027830, 303828494, 2747425121, 1600795957, 4188952407, 3496589753, 2434238086, 1486471617, 658119965, 3106381470, 953803233, 334231800, 3005978776, 857870609, 3151128937, 1890179545, 2298973838, 2805175444, 3056442267, 574365214, 2450884487, 550103529, 1233637070, 4289353045, 2018519080, 2057691103, 2399374476, 4166623649, 2148108681, 387583245, 3664101311, 836232934, 3330556482, 3100665960, 3280093505, 2955516313, 2002398509, 287182607, 3413881008, 4238890068, 3597515707, 975967766];
+ var T3 = [1671808611, 2089089148, 2006576759, 2072901243, 4061003762, 1807603307, 1873927791, 3310653893, 810573872, 16974337, 1739181671, 729634347, 4263110654, 3613570519, 2883997099, 1989864566, 3393556426, 2191335298, 3376449993, 2106063485, 4195741690, 1508618841, 1204391495, 4027317232, 2917941677, 3563566036, 2734514082, 2951366063, 2629772188, 2767672228, 1922491506, 3227229120, 3082974647, 4246528509, 2477669779, 644500518, 911895606, 1061256767, 4144166391, 3427763148, 878471220, 2784252325, 3845444069, 4043897329, 1905517169, 3631459288, 827548209, 356461077, 67897348, 3344078279, 593839651, 3277757891, 405286936, 2527147926, 84871685, 2595565466, 118033927, 305538066, 2157648768, 3795705826, 3945188843, 661212711, 2999812018, 1973414517, 152769033, 2208177539, 745822252, 439235610, 455947803, 1857215598, 1525593178, 2700827552, 1391895634, 994932283, 3596728278, 3016654259, 695947817, 3812548067, 795958831, 2224493444, 1408607827, 3513301457, 0, 3979133421, 543178784, 4229948412, 2982705585, 1542305371, 1790891114, 3410398667, 3201918910, 961245753, 1256100938, 1289001036, 1491644504, 3477767631, 3496721360, 4012557807, 2867154858, 4212583931, 1137018435, 1305975373, 861234739, 2241073541, 1171229253, 4178635257, 33948674, 2139225727, 1357946960, 1011120188, 2679776671, 2833468328, 1374921297, 2751356323, 1086357568, 2408187279, 2460827538, 2646352285, 944271416, 4110742005, 3168756668, 3066132406, 3665145818, 560153121, 271589392, 4279952895, 4077846003, 3530407890, 3444343245, 202643468, 322250259, 3962553324, 1608629855, 2543990167, 1154254916, 389623319, 3294073796, 2817676711, 2122513534, 1028094525, 1689045092, 1575467613, 422261273, 1939203699, 1621147744, 2174228865, 1339137615, 3699352540, 577127458, 712922154, 2427141008, 2290289544, 1187679302, 3995715566, 3100863416, 339486740, 3732514782, 1591917662, 186455563, 3681988059, 3762019296, 844522546, 978220090, 169743370, 1239126601, 101321734, 611076132, 1558493276, 3260915650, 3547250131, 2901361580, 1655096418, 2443721105, 2510565781, 3828863972, 2039214713, 3878868455, 3359869896, 928607799, 1840765549, 2374762893, 3580146133, 1322425422, 2850048425, 1823791212, 1459268694, 4094161908, 3928346602, 1706019429, 2056189050, 2934523822, 135794696, 3134549946, 2022240376, 628050469, 779246638, 472135708, 2800834470, 3032970164, 3327236038, 3894660072, 3715932637, 1956440180, 522272287, 1272813131, 3185336765, 2340818315, 2323976074, 1888542832, 1044544574, 3049550261, 1722469478, 1222152264, 50660867, 4127324150, 236067854, 1638122081, 895445557, 1475980887, 3117443513, 2257655686, 3243809217, 489110045, 2662934430, 3778599393, 4162055160, 2561878936, 288563729, 1773916777, 3648039385, 2391345038, 2493985684, 2612407707, 505560094, 2274497927, 3911240169, 3460925390, 1442818645, 678973480, 3749357023, 2358182796, 2717407649, 2306869641, 219617805, 3218761151, 3862026214, 1120306242, 1756942440, 1103331905, 2578459033, 762796589, 252780047, 2966125488, 1425844308, 3151392187, 372911126];
+ var T4 = [1667474886, 2088535288, 2004326894, 2071694838, 4075949567, 1802223062, 1869591006, 3318043793, 808472672, 16843522, 1734846926, 724270422, 4278065639, 3621216949, 2880169549, 1987484396, 3402253711, 2189597983, 3385409673, 2105378810, 4210693615, 1499065266, 1195886990, 4042263547, 2913856577, 3570689971, 2728590687, 2947541573, 2627518243, 2762274643, 1920112356, 3233831835, 3082273397, 4261223649, 2475929149, 640051788, 909531756, 1061110142, 4160160501, 3435941763, 875846760, 2779116625, 3857003729, 4059105529, 1903268834, 3638064043, 825316194, 353713962, 67374088, 3351728789, 589522246, 3284360861, 404236336, 2526454071, 84217610, 2593830191, 117901582, 303183396, 2155911963, 3806477791, 3958056653, 656894286, 2998062463, 1970642922, 151591698, 2206440989, 741110872, 437923380, 454765878, 1852748508, 1515908788, 2694904667, 1381168804, 993742198, 3604373943, 3014905469, 690584402, 3823320797, 791638366, 2223281939, 1398011302, 3520161977, 0, 3991743681, 538992704, 4244381667, 2981218425, 1532751286, 1785380564, 3419096717, 3200178535, 960056178, 1246420628, 1280103576, 1482221744, 3486468741, 3503319995, 4025428677, 2863326543, 4227536621, 1128514950, 1296947098, 859002214, 2240123921, 1162203018, 4193849577, 33687044, 2139062782, 1347481760, 1010582648, 2678045221, 2829640523, 1364325282, 2745433693, 1077985408, 2408548869, 2459086143, 2644360225, 943212656, 4126475505, 3166494563, 3065430391, 3671750063, 555836226, 269496352, 4294908645, 4092792573, 3537006015, 3452783745, 202118168, 320025894, 3974901699, 1600119230, 2543297077, 1145359496, 387397934, 3301201811, 2812801621, 2122220284, 1027426170, 1684319432, 1566435258, 421079858, 1936954854, 1616945344, 2172753945, 1330631070, 3705438115, 572679748, 707427924, 2425400123, 2290647819, 1179044492, 4008585671, 3099120491, 336870440, 3739122087, 1583276732, 185277718, 3688593069, 3772791771, 842159716, 976899700, 168435220, 1229577106, 101059084, 606366792, 1549591736, 3267517855, 3553849021, 2897014595, 1650632388, 2442242105, 2509612081, 3840161747, 2038008818, 3890688725, 3368567691, 926374254, 1835907034, 2374863873, 3587531953, 1313788572, 2846482505, 1819063512, 1448540844, 4109633523, 3941213647, 1701162954, 2054852340, 2930698567, 134748176, 3132806511, 2021165296, 623210314, 774795868, 471606328, 2795958615, 3031746419, 3334885783, 3907527627, 3722280097, 1953799400, 522133822, 1263263126, 3183336545, 2341176845, 2324333839, 1886425312, 1044267644, 3048588401, 1718004428, 1212733584, 50529542, 4143317495, 235803164, 1633788866, 892690282, 1465383342, 3115962473, 2256965911, 3250673817, 488449850, 2661202215, 3789633753, 4177007595, 2560144171, 286339874, 1768537042, 3654906025, 2391705863, 2492770099, 2610673197, 505291324, 2273808917, 3924369609, 3469625735, 1431699370, 673740880, 3755965093, 2358021891, 2711746649, 2307489801, 218961690, 3217021541, 3873845719, 1111672452, 1751693520, 1094828930, 2576986153, 757954394, 252645662, 2964376443, 1414855848, 3149649517, 370555436];
+ var T5 = [1374988112, 2118214995, 437757123, 975658646, 1001089995, 530400753, 2902087851, 1273168787, 540080725, 2910219766, 2295101073, 4110568485, 1340463100, 3307916247, 641025152, 3043140495, 3736164937, 632953703, 1172967064, 1576976609, 3274667266, 2169303058, 2370213795, 1809054150, 59727847, 361929877, 3211623147, 2505202138, 3569255213, 1484005843, 1239443753, 2395588676, 1975683434, 4102977912, 2572697195, 666464733, 3202437046, 4035489047, 3374361702, 2110667444, 1675577880, 3843699074, 2538681184, 1649639237, 2976151520, 3144396420, 4269907996, 4178062228, 1883793496, 2403728665, 2497604743, 1383856311, 2876494627, 1917518562, 3810496343, 1716890410, 3001755655, 800440835, 2261089178, 3543599269, 807962610, 599762354, 33778362, 3977675356, 2328828971, 2809771154, 4077384432, 1315562145, 1708848333, 101039829, 3509871135, 3299278474, 875451293, 2733856160, 92987698, 2767645557, 193195065, 1080094634, 1584504582, 3178106961, 1042385657, 2531067453, 3711829422, 1306967366, 2438237621, 1908694277, 67556463, 1615861247, 429456164, 3602770327, 2302690252, 1742315127, 2968011453, 126454664, 3877198648, 2043211483, 2709260871, 2084704233, 4169408201, 0, 159417987, 841739592, 504459436, 1817866830, 4245618683, 260388950, 1034867998, 908933415, 168810852, 1750902305, 2606453969, 607530554, 202008497, 2472011535, 3035535058, 463180190, 2160117071, 1641816226, 1517767529, 470948374, 3801332234, 3231722213, 1008918595, 303765277, 235474187, 4069246893, 766945465, 337553864, 1475418501, 2943682380, 4003061179, 2743034109, 4144047775, 1551037884, 1147550661, 1543208500, 2336434550, 3408119516, 3069049960, 3102011747, 3610369226, 1113818384, 328671808, 2227573024, 2236228733, 3535486456, 2935566865, 3341394285, 496906059, 3702665459, 226906860, 2009195472, 733156972, 2842737049, 294930682, 1206477858, 2835123396, 2700099354, 1451044056, 573804783, 2269728455, 3644379585, 2362090238, 2564033334, 2801107407, 2776292904, 3669462566, 1068351396, 742039012, 1350078989, 1784663195, 1417561698, 4136440770, 2430122216, 775550814, 2193862645, 2673705150, 1775276924, 1876241833, 3475313331, 3366754619, 270040487, 3902563182, 3678124923, 3441850377, 1851332852, 3969562369, 2203032232, 3868552805, 2868897406, 566021896, 4011190502, 3135740889, 1248802510, 3936291284, 699432150, 832877231, 708780849, 3332740144, 899835584, 1951317047, 4236429990, 3767586992, 866637845, 4043610186, 1106041591, 2144161806, 395441711, 1984812685, 1139781709, 3433712980, 3835036895, 2664543715, 1282050075, 3240894392, 1181045119, 2640243204, 25965917, 4203181171, 4211818798, 3009879386, 2463879762, 3910161971, 1842759443, 2597806476, 933301370, 1509430414, 3943906441, 3467192302, 3076639029, 3776767469, 2051518780, 2631065433, 1441952575, 404016761, 1942435775, 1408749034, 1610459739, 3745345300, 2017778566, 3400528769, 3110650942, 941896748, 3265478751, 371049330, 3168937228, 675039627, 4279080257, 967311729, 135050206, 3635733660, 1683407248, 2076935265, 3576870512, 1215061108, 3501741890];
+ var T6 = [1347548327, 1400783205, 3273267108, 2520393566, 3409685355, 4045380933, 2880240216, 2471224067, 1428173050, 4138563181, 2441661558, 636813900, 4233094615, 3620022987, 2149987652, 2411029155, 1239331162, 1730525723, 2554718734, 3781033664, 46346101, 310463728, 2743944855, 3328955385, 3875770207, 2501218972, 3955191162, 3667219033, 768917123, 3545789473, 692707433, 1150208456, 1786102409, 2029293177, 1805211710, 3710368113, 3065962831, 401639597, 1724457132, 3028143674, 409198410, 2196052529, 1620529459, 1164071807, 3769721975, 2226875310, 486441376, 2499348523, 1483753576, 428819965, 2274680428, 3075636216, 598438867, 3799141122, 1474502543, 711349675, 129166120, 53458370, 2592523643, 2782082824, 4063242375, 2988687269, 3120694122, 1559041666, 730517276, 2460449204, 4042459122, 2706270690, 3446004468, 3573941694, 533804130, 2328143614, 2637442643, 2695033685, 839224033, 1973745387, 957055980, 2856345839, 106852767, 1371368976, 4181598602, 1033297158, 2933734917, 1179510461, 3046200461, 91341917, 1862534868, 4284502037, 605657339, 2547432937, 3431546947, 2003294622, 3182487618, 2282195339, 954669403, 3682191598, 1201765386, 3917234703, 3388507166, 0, 2198438022, 1211247597, 2887651696, 1315723890, 4227665663, 1443857720, 507358933, 657861945, 1678381017, 560487590, 3516619604, 975451694, 2970356327, 261314535, 3535072918, 2652609425, 1333838021, 2724322336, 1767536459, 370938394, 182621114, 3854606378, 1128014560, 487725847, 185469197, 2918353863, 3106780840, 3356761769, 2237133081, 1286567175, 3152976349, 4255350624, 2683765030, 3160175349, 3309594171, 878443390, 1988838185, 3704300486, 1756818940, 1673061617, 3403100636, 272786309, 1075025698, 545572369, 2105887268, 4174560061, 296679730, 1841768865, 1260232239, 4091327024, 3960309330, 3497509347, 1814803222, 2578018489, 4195456072, 575138148, 3299409036, 446754879, 3629546796, 4011996048, 3347532110, 3252238545, 4270639778, 915985419, 3483825537, 681933534, 651868046, 2755636671, 3828103837, 223377554, 2607439820, 1649704518, 3270937875, 3901806776, 1580087799, 4118987695, 3198115200, 2087309459, 2842678573, 3016697106, 1003007129, 2802849917, 1860738147, 2077965243, 164439672, 4100872472, 32283319, 2827177882, 1709610350, 2125135846, 136428751, 3874428392, 3652904859, 3460984630, 3572145929, 3593056380, 2939266226, 824852259, 818324884, 3224740454, 930369212, 2801566410, 2967507152, 355706840, 1257309336, 4148292826, 243256656, 790073846, 2373340630, 1296297904, 1422699085, 3756299780, 3818836405, 457992840, 3099667487, 2135319889, 77422314, 1560382517, 1945798516, 788204353, 1521706781, 1385356242, 870912086, 325965383, 2358957921, 2050466060, 2388260884, 2313884476, 4006521127, 901210569, 3990953189, 1014646705, 1503449823, 1062597235, 2031621326, 3212035895, 3931371469, 1533017514, 350174575, 2256028891, 2177544179, 1052338372, 741876788, 1606591296, 1914052035, 213705253, 2334669897, 1107234197, 1899603969, 3725069491, 2631447780, 2422494913, 1635502980, 1893020342, 1950903388, 1120974935];
+ var T7 = [2807058932, 1699970625, 2764249623, 1586903591, 1808481195, 1173430173, 1487645946, 59984867, 4199882800, 1844882806, 1989249228, 1277555970, 3623636965, 3419915562, 1149249077, 2744104290, 1514790577, 459744698, 244860394, 3235995134, 1963115311, 4027744588, 2544078150, 4190530515, 1608975247, 2627016082, 2062270317, 1507497298, 2200818878, 567498868, 1764313568, 3359936201, 2305455554, 2037970062, 1047239e3, 1910319033, 1337376481, 2904027272, 2892417312, 984907214, 1243112415, 830661914, 861968209, 2135253587, 2011214180, 2927934315, 2686254721, 731183368, 1750626376, 4246310725, 1820824798, 4172763771, 3542330227, 48394827, 2404901663, 2871682645, 671593195, 3254988725, 2073724613, 145085239, 2280796200, 2779915199, 1790575107, 2187128086, 472615631, 3029510009, 4075877127, 3802222185, 4107101658, 3201631749, 1646252340, 4270507174, 1402811438, 1436590835, 3778151818, 3950355702, 3963161475, 4020912224, 2667994737, 273792366, 2331590177, 104699613, 95345982, 3175501286, 2377486676, 1560637892, 3564045318, 369057872, 4213447064, 3919042237, 1137477952, 2658625497, 1119727848, 2340947849, 1530455833, 4007360968, 172466556, 266959938, 516552836, 0, 2256734592, 3980931627, 1890328081, 1917742170, 4294704398, 945164165, 3575528878, 958871085, 3647212047, 2787207260, 1423022939, 775562294, 1739656202, 3876557655, 2530391278, 2443058075, 3310321856, 547512796, 1265195639, 437656594, 3121275539, 719700128, 3762502690, 387781147, 218828297, 3350065803, 2830708150, 2848461854, 428169201, 122466165, 3720081049, 1627235199, 648017665, 4122762354, 1002783846, 2117360635, 695634755, 3336358691, 4234721005, 4049844452, 3704280881, 2232435299, 574624663, 287343814, 612205898, 1039717051, 840019705, 2708326185, 793451934, 821288114, 1391201670, 3822090177, 376187827, 3113855344, 1224348052, 1679968233, 2361698556, 1058709744, 752375421, 2431590963, 1321699145, 3519142200, 2734591178, 188127444, 2177869557, 3727205754, 2384911031, 3215212461, 2648976442, 2450346104, 3432737375, 1180849278, 331544205, 3102249176, 4150144569, 2952102595, 2159976285, 2474404304, 766078933, 313773861, 2570832044, 2108100632, 1668212892, 3145456443, 2013908262, 418672217, 3070356634, 2594734927, 1852171925, 3867060991, 3473416636, 3907448597, 2614737639, 919489135, 164948639, 2094410160, 2997825956, 590424639, 2486224549, 1723872674, 3157750862, 3399941250, 3501252752, 3625268135, 2555048196, 3673637356, 1343127501, 4130281361, 3599595085, 2957853679, 1297403050, 81781910, 3051593425, 2283490410, 532201772, 1367295589, 3926170974, 895287692, 1953757831, 1093597963, 492483431, 3528626907, 1446242576, 1192455638, 1636604631, 209336225, 344873464, 1015671571, 669961897, 3375740769, 3857572124, 2973530695, 3747192018, 1933530610, 3464042516, 935293895, 3454686199, 2858115069, 1863638845, 3683022916, 4085369519, 3292445032, 875313188, 1080017571, 3279033885, 621591778, 1233856572, 2504130317, 24197544, 3017672716, 3835484340, 3247465558, 2220981195, 3060847922, 1551124588, 1463996600];
+ var T8 = [4104605777, 1097159550, 396673818, 660510266, 2875968315, 2638606623, 4200115116, 3808662347, 821712160, 1986918061, 3430322568, 38544885, 3856137295, 718002117, 893681702, 1654886325, 2975484382, 3122358053, 3926825029, 4274053469, 796197571, 1290801793, 1184342925, 3556361835, 2405426947, 2459735317, 1836772287, 1381620373, 3196267988, 1948373848, 3764988233, 3385345166, 3263785589, 2390325492, 1480485785, 3111247143, 3780097726, 2293045232, 548169417, 3459953789, 3746175075, 439452389, 1362321559, 1400849762, 1685577905, 1806599355, 2174754046, 137073913, 1214797936, 1174215055, 3731654548, 2079897426, 1943217067, 1258480242, 529487843, 1437280870, 3945269170, 3049390895, 3313212038, 923313619, 679998e3, 3215307299, 57326082, 377642221, 3474729866, 2041877159, 133361907, 1776460110, 3673476453, 96392454, 878845905, 2801699524, 777231668, 4082475170, 2330014213, 4142626212, 2213296395, 1626319424, 1906247262, 1846563261, 562755902, 3708173718, 1040559837, 3871163981, 1418573201, 3294430577, 114585348, 1343618912, 2566595609, 3186202582, 1078185097, 3651041127, 3896688048, 2307622919, 425408743, 3371096953, 2081048481, 1108339068, 2216610296, 0, 2156299017, 736970802, 292596766, 1517440620, 251657213, 2235061775, 2933202493, 758720310, 265905162, 1554391400, 1532285339, 908999204, 174567692, 1474760595, 4002861748, 2610011675, 3234156416, 3693126241, 2001430874, 303699484, 2478443234, 2687165888, 585122620, 454499602, 151849742, 2345119218, 3064510765, 514443284, 4044981591, 1963412655, 2581445614, 2137062819, 19308535, 1928707164, 1715193156, 4219352155, 1126790795, 600235211, 3992742070, 3841024952, 836553431, 1669664834, 2535604243, 3323011204, 1243905413, 3141400786, 4180808110, 698445255, 2653899549, 2989552604, 2253581325, 3252932727, 3004591147, 1891211689, 2487810577, 3915653703, 4237083816, 4030667424, 2100090966, 865136418, 1229899655, 953270745, 3399679628, 3557504664, 4118925222, 2061379749, 3079546586, 2915017791, 983426092, 2022837584, 1607244650, 2118541908, 2366882550, 3635996816, 972512814, 3283088770, 1568718495, 3499326569, 3576539503, 621982671, 2895723464, 410887952, 2623762152, 1002142683, 645401037, 1494807662, 2595684844, 1335535747, 2507040230, 4293295786, 3167684641, 367585007, 3885750714, 1865862730, 2668221674, 2960971305, 2763173681, 1059270954, 2777952454, 2724642869, 1320957812, 2194319100, 2429595872, 2815956275, 77089521, 3973773121, 3444575871, 2448830231, 1305906550, 4021308739, 2857194700, 2516901860, 3518358430, 1787304780, 740276417, 1699839814, 1592394909, 2352307457, 2272556026, 188821243, 1729977011, 3687994002, 274084841, 3594982253, 3613494426, 2701949495, 4162096729, 322734571, 2837966542, 1640576439, 484830689, 1202797690, 3537852828, 4067639125, 349075736, 3342319475, 4157467219, 4255800159, 1030690015, 1155237496, 2951971274, 1757691577, 607398968, 2738905026, 499347990, 3794078908, 1011452712, 227885567, 2818666809, 213114376, 3034881240, 1455525988, 3414450555, 850817237, 1817998408, 3092726480];
+ var U1 = [0, 235474187, 470948374, 303765277, 941896748, 908933415, 607530554, 708780849, 1883793496, 2118214995, 1817866830, 1649639237, 1215061108, 1181045119, 1417561698, 1517767529, 3767586992, 4003061179, 4236429990, 4069246893, 3635733660, 3602770327, 3299278474, 3400528769, 2430122216, 2664543715, 2362090238, 2193862645, 2835123396, 2801107407, 3035535058, 3135740889, 3678124923, 3576870512, 3341394285, 3374361702, 3810496343, 3977675356, 4279080257, 4043610186, 2876494627, 2776292904, 3076639029, 3110650942, 2472011535, 2640243204, 2403728665, 2169303058, 1001089995, 899835584, 666464733, 699432150, 59727847, 226906860, 530400753, 294930682, 1273168787, 1172967064, 1475418501, 1509430414, 1942435775, 2110667444, 1876241833, 1641816226, 2910219766, 2743034109, 2976151520, 3211623147, 2505202138, 2606453969, 2302690252, 2269728455, 3711829422, 3543599269, 3240894392, 3475313331, 3843699074, 3943906441, 4178062228, 4144047775, 1306967366, 1139781709, 1374988112, 1610459739, 1975683434, 2076935265, 1775276924, 1742315127, 1034867998, 866637845, 566021896, 800440835, 92987698, 193195065, 429456164, 395441711, 1984812685, 2017778566, 1784663195, 1683407248, 1315562145, 1080094634, 1383856311, 1551037884, 101039829, 135050206, 437757123, 337553864, 1042385657, 807962610, 573804783, 742039012, 2531067453, 2564033334, 2328828971, 2227573024, 2935566865, 2700099354, 3001755655, 3168937228, 3868552805, 3902563182, 4203181171, 4102977912, 3736164937, 3501741890, 3265478751, 3433712980, 1106041591, 1340463100, 1576976609, 1408749034, 2043211483, 2009195472, 1708848333, 1809054150, 832877231, 1068351396, 766945465, 599762354, 159417987, 126454664, 361929877, 463180190, 2709260871, 2943682380, 3178106961, 3009879386, 2572697195, 2538681184, 2236228733, 2336434550, 3509871135, 3745345300, 3441850377, 3274667266, 3910161971, 3877198648, 4110568485, 4211818798, 2597806476, 2497604743, 2261089178, 2295101073, 2733856160, 2902087851, 3202437046, 2968011453, 3936291284, 3835036895, 4136440770, 4169408201, 3535486456, 3702665459, 3467192302, 3231722213, 2051518780, 1951317047, 1716890410, 1750902305, 1113818384, 1282050075, 1584504582, 1350078989, 168810852, 67556463, 371049330, 404016761, 841739592, 1008918595, 775550814, 540080725, 3969562369, 3801332234, 4035489047, 4269907996, 3569255213, 3669462566, 3366754619, 3332740144, 2631065433, 2463879762, 2160117071, 2395588676, 2767645557, 2868897406, 3102011747, 3069049960, 202008497, 33778362, 270040487, 504459436, 875451293, 975658646, 675039627, 641025152, 2084704233, 1917518562, 1615861247, 1851332852, 1147550661, 1248802510, 1484005843, 1451044056, 933301370, 967311729, 733156972, 632953703, 260388950, 25965917, 328671808, 496906059, 1206477858, 1239443753, 1543208500, 1441952575, 2144161806, 1908694277, 1675577880, 1842759443, 3610369226, 3644379585, 3408119516, 3307916247, 4011190502, 3776767469, 4077384432, 4245618683, 2809771154, 2842737049, 3144396420, 3043140495, 2673705150, 2438237621, 2203032232, 2370213795];
+ var U2 = [0, 185469197, 370938394, 487725847, 741876788, 657861945, 975451694, 824852259, 1483753576, 1400783205, 1315723890, 1164071807, 1950903388, 2135319889, 1649704518, 1767536459, 2967507152, 3152976349, 2801566410, 2918353863, 2631447780, 2547432937, 2328143614, 2177544179, 3901806776, 3818836405, 4270639778, 4118987695, 3299409036, 3483825537, 3535072918, 3652904859, 2077965243, 1893020342, 1841768865, 1724457132, 1474502543, 1559041666, 1107234197, 1257309336, 598438867, 681933534, 901210569, 1052338372, 261314535, 77422314, 428819965, 310463728, 3409685355, 3224740454, 3710368113, 3593056380, 3875770207, 3960309330, 4045380933, 4195456072, 2471224067, 2554718734, 2237133081, 2388260884, 3212035895, 3028143674, 2842678573, 2724322336, 4138563181, 4255350624, 3769721975, 3955191162, 3667219033, 3516619604, 3431546947, 3347532110, 2933734917, 2782082824, 3099667487, 3016697106, 2196052529, 2313884476, 2499348523, 2683765030, 1179510461, 1296297904, 1347548327, 1533017514, 1786102409, 1635502980, 2087309459, 2003294622, 507358933, 355706840, 136428751, 53458370, 839224033, 957055980, 605657339, 790073846, 2373340630, 2256028891, 2607439820, 2422494913, 2706270690, 2856345839, 3075636216, 3160175349, 3573941694, 3725069491, 3273267108, 3356761769, 4181598602, 4063242375, 4011996048, 3828103837, 1033297158, 915985419, 730517276, 545572369, 296679730, 446754879, 129166120, 213705253, 1709610350, 1860738147, 1945798516, 2029293177, 1239331162, 1120974935, 1606591296, 1422699085, 4148292826, 4233094615, 3781033664, 3931371469, 3682191598, 3497509347, 3446004468, 3328955385, 2939266226, 2755636671, 3106780840, 2988687269, 2198438022, 2282195339, 2501218972, 2652609425, 1201765386, 1286567175, 1371368976, 1521706781, 1805211710, 1620529459, 2105887268, 1988838185, 533804130, 350174575, 164439672, 46346101, 870912086, 954669403, 636813900, 788204353, 2358957921, 2274680428, 2592523643, 2441661558, 2695033685, 2880240216, 3065962831, 3182487618, 3572145929, 3756299780, 3270937875, 3388507166, 4174560061, 4091327024, 4006521127, 3854606378, 1014646705, 930369212, 711349675, 560487590, 272786309, 457992840, 106852767, 223377554, 1678381017, 1862534868, 1914052035, 2031621326, 1211247597, 1128014560, 1580087799, 1428173050, 32283319, 182621114, 401639597, 486441376, 768917123, 651868046, 1003007129, 818324884, 1503449823, 1385356242, 1333838021, 1150208456, 1973745387, 2125135846, 1673061617, 1756818940, 2970356327, 3120694122, 2802849917, 2887651696, 2637442643, 2520393566, 2334669897, 2149987652, 3917234703, 3799141122, 4284502037, 4100872472, 3309594171, 3460984630, 3545789473, 3629546796, 2050466060, 1899603969, 1814803222, 1730525723, 1443857720, 1560382517, 1075025698, 1260232239, 575138148, 692707433, 878443390, 1062597235, 243256656, 91341917, 409198410, 325965383, 3403100636, 3252238545, 3704300486, 3620022987, 3874428392, 3990953189, 4042459122, 4227665663, 2460449204, 2578018489, 2226875310, 2411029155, 3198115200, 3046200461, 2827177882, 2743944855];
+ var U3 = [0, 218828297, 437656594, 387781147, 875313188, 958871085, 775562294, 590424639, 1750626376, 1699970625, 1917742170, 2135253587, 1551124588, 1367295589, 1180849278, 1265195639, 3501252752, 3720081049, 3399941250, 3350065803, 3835484340, 3919042237, 4270507174, 4085369519, 3102249176, 3051593425, 2734591178, 2952102595, 2361698556, 2177869557, 2530391278, 2614737639, 3145456443, 3060847922, 2708326185, 2892417312, 2404901663, 2187128086, 2504130317, 2555048196, 3542330227, 3727205754, 3375740769, 3292445032, 3876557655, 3926170974, 4246310725, 4027744588, 1808481195, 1723872674, 1910319033, 2094410160, 1608975247, 1391201670, 1173430173, 1224348052, 59984867, 244860394, 428169201, 344873464, 935293895, 984907214, 766078933, 547512796, 1844882806, 1627235199, 2011214180, 2062270317, 1507497298, 1423022939, 1137477952, 1321699145, 95345982, 145085239, 532201772, 313773861, 830661914, 1015671571, 731183368, 648017665, 3175501286, 2957853679, 2807058932, 2858115069, 2305455554, 2220981195, 2474404304, 2658625497, 3575528878, 3625268135, 3473416636, 3254988725, 3778151818, 3963161475, 4213447064, 4130281361, 3599595085, 3683022916, 3432737375, 3247465558, 3802222185, 4020912224, 4172763771, 4122762354, 3201631749, 3017672716, 2764249623, 2848461854, 2331590177, 2280796200, 2431590963, 2648976442, 104699613, 188127444, 472615631, 287343814, 840019705, 1058709744, 671593195, 621591778, 1852171925, 1668212892, 1953757831, 2037970062, 1514790577, 1463996600, 1080017571, 1297403050, 3673637356, 3623636965, 3235995134, 3454686199, 4007360968, 3822090177, 4107101658, 4190530515, 2997825956, 3215212461, 2830708150, 2779915199, 2256734592, 2340947849, 2627016082, 2443058075, 172466556, 122466165, 273792366, 492483431, 1047239e3, 861968209, 612205898, 695634755, 1646252340, 1863638845, 2013908262, 1963115311, 1446242576, 1530455833, 1277555970, 1093597963, 1636604631, 1820824798, 2073724613, 1989249228, 1436590835, 1487645946, 1337376481, 1119727848, 164948639, 81781910, 331544205, 516552836, 1039717051, 821288114, 669961897, 719700128, 2973530695, 3157750862, 2871682645, 2787207260, 2232435299, 2283490410, 2667994737, 2450346104, 3647212047, 3564045318, 3279033885, 3464042516, 3980931627, 3762502690, 4150144569, 4199882800, 3070356634, 3121275539, 2904027272, 2686254721, 2200818878, 2384911031, 2570832044, 2486224549, 3747192018, 3528626907, 3310321856, 3359936201, 3950355702, 3867060991, 4049844452, 4234721005, 1739656202, 1790575107, 2108100632, 1890328081, 1402811438, 1586903591, 1233856572, 1149249077, 266959938, 48394827, 369057872, 418672217, 1002783846, 919489135, 567498868, 752375421, 209336225, 24197544, 376187827, 459744698, 945164165, 895287692, 574624663, 793451934, 1679968233, 1764313568, 2117360635, 1933530610, 1343127501, 1560637892, 1243112415, 1192455638, 3704280881, 3519142200, 3336358691, 3419915562, 3907448597, 3857572124, 4075877127, 4294704398, 3029510009, 3113855344, 2927934315, 2744104290, 2159976285, 2377486676, 2594734927, 2544078150];
+ var U4 = [0, 151849742, 303699484, 454499602, 607398968, 758720310, 908999204, 1059270954, 1214797936, 1097159550, 1517440620, 1400849762, 1817998408, 1699839814, 2118541908, 2001430874, 2429595872, 2581445614, 2194319100, 2345119218, 3034881240, 3186202582, 2801699524, 2951971274, 3635996816, 3518358430, 3399679628, 3283088770, 4237083816, 4118925222, 4002861748, 3885750714, 1002142683, 850817237, 698445255, 548169417, 529487843, 377642221, 227885567, 77089521, 1943217067, 2061379749, 1640576439, 1757691577, 1474760595, 1592394909, 1174215055, 1290801793, 2875968315, 2724642869, 3111247143, 2960971305, 2405426947, 2253581325, 2638606623, 2487810577, 3808662347, 3926825029, 4044981591, 4162096729, 3342319475, 3459953789, 3576539503, 3693126241, 1986918061, 2137062819, 1685577905, 1836772287, 1381620373, 1532285339, 1078185097, 1229899655, 1040559837, 923313619, 740276417, 621982671, 439452389, 322734571, 137073913, 19308535, 3871163981, 4021308739, 4104605777, 4255800159, 3263785589, 3414450555, 3499326569, 3651041127, 2933202493, 2815956275, 3167684641, 3049390895, 2330014213, 2213296395, 2566595609, 2448830231, 1305906550, 1155237496, 1607244650, 1455525988, 1776460110, 1626319424, 2079897426, 1928707164, 96392454, 213114376, 396673818, 514443284, 562755902, 679998e3, 865136418, 983426092, 3708173718, 3557504664, 3474729866, 3323011204, 4180808110, 4030667424, 3945269170, 3794078908, 2507040230, 2623762152, 2272556026, 2390325492, 2975484382, 3092726480, 2738905026, 2857194700, 3973773121, 3856137295, 4274053469, 4157467219, 3371096953, 3252932727, 3673476453, 3556361835, 2763173681, 2915017791, 3064510765, 3215307299, 2156299017, 2307622919, 2459735317, 2610011675, 2081048481, 1963412655, 1846563261, 1729977011, 1480485785, 1362321559, 1243905413, 1126790795, 878845905, 1030690015, 645401037, 796197571, 274084841, 425408743, 38544885, 188821243, 3613494426, 3731654548, 3313212038, 3430322568, 4082475170, 4200115116, 3780097726, 3896688048, 2668221674, 2516901860, 2366882550, 2216610296, 3141400786, 2989552604, 2837966542, 2687165888, 1202797690, 1320957812, 1437280870, 1554391400, 1669664834, 1787304780, 1906247262, 2022837584, 265905162, 114585348, 499347990, 349075736, 736970802, 585122620, 972512814, 821712160, 2595684844, 2478443234, 2293045232, 2174754046, 3196267988, 3079546586, 2895723464, 2777952454, 3537852828, 3687994002, 3234156416, 3385345166, 4142626212, 4293295786, 3841024952, 3992742070, 174567692, 57326082, 410887952, 292596766, 777231668, 660510266, 1011452712, 893681702, 1108339068, 1258480242, 1343618912, 1494807662, 1715193156, 1865862730, 1948373848, 2100090966, 2701949495, 2818666809, 3004591147, 3122358053, 2235061775, 2352307457, 2535604243, 2653899549, 3915653703, 3764988233, 4219352155, 4067639125, 3444575871, 3294430577, 3746175075, 3594982253, 836553431, 953270745, 600235211, 718002117, 367585007, 484830689, 133361907, 251657213, 2041877159, 1891211689, 1806599355, 1654886325, 1568718495, 1418573201, 1335535747, 1184342925];
+ function convertToInt32(bytes) {
+ var result = [];
+ for (var i2 = 0; i2 < bytes.length; i2 += 4) {
+ result.push(bytes[i2] << 24 | bytes[i2 + 1] << 16 | bytes[i2 + 2] << 8 | bytes[i2 + 3]);
+ }
+ return result;
+ }
+ var AES = function(key) {
+ if (!(this instanceof AES)) {
+ throw Error("AES must be instanitated with `new`");
+ }
+ Object.defineProperty(this, "key", {
+ value: coerceArray(key, true)
+ });
+ this._prepare();
+ };
+ AES.prototype._prepare = function() {
+ var rounds = numberOfRounds[this.key.length];
+ if (rounds == null) {
+ throw new Error("invalid key size (must be 16, 24 or 32 bytes)");
+ }
+ this._Ke = [];
+ this._Kd = [];
+ for (var i2 = 0; i2 <= rounds; i2++) {
+ this._Ke.push([0, 0, 0, 0]);
+ this._Kd.push([0, 0, 0, 0]);
+ }
+ var roundKeyCount = (rounds + 1) * 4;
+ var KC = this.key.length / 4;
+ var tk = convertToInt32(this.key);
+ var index;
+ for (var i2 = 0; i2 < KC; i2++) {
+ index = i2 >> 2;
+ this._Ke[index][i2 % 4] = tk[i2];
+ this._Kd[rounds - index][i2 % 4] = tk[i2];
+ }
+ var rconpointer = 0;
+ var t = KC, tt;
+ while (t < roundKeyCount) {
+ tt = tk[KC - 1];
+ tk[0] ^= S[tt >> 16 & 255] << 24 ^ S[tt >> 8 & 255] << 16 ^ S[tt & 255] << 8 ^ S[tt >> 24 & 255] ^ rcon[rconpointer] << 24;
+ rconpointer += 1;
+ if (KC != 8) {
+ for (var i2 = 1; i2 < KC; i2++) {
+ tk[i2] ^= tk[i2 - 1];
+ }
+ } else {
+ for (var i2 = 1; i2 < KC / 2; i2++) {
+ tk[i2] ^= tk[i2 - 1];
+ }
+ tt = tk[KC / 2 - 1];
+ tk[KC / 2] ^= S[tt & 255] ^ S[tt >> 8 & 255] << 8 ^ S[tt >> 16 & 255] << 16 ^ S[tt >> 24 & 255] << 24;
+ for (var i2 = KC / 2 + 1; i2 < KC; i2++) {
+ tk[i2] ^= tk[i2 - 1];
+ }
+ }
+ var i2 = 0, r, c;
+ while (i2 < KC && t < roundKeyCount) {
+ r = t >> 2;
+ c = t % 4;
+ this._Ke[r][c] = tk[i2];
+ this._Kd[rounds - r][c] = tk[i2++];
+ t++;
+ }
+ }
+ for (var r = 1; r < rounds; r++) {
+ for (var c = 0; c < 4; c++) {
+ tt = this._Kd[r][c];
+ this._Kd[r][c] = U1[tt >> 24 & 255] ^ U2[tt >> 16 & 255] ^ U3[tt >> 8 & 255] ^ U4[tt & 255];
+ }
+ }
+ };
+ AES.prototype.encrypt = function(plaintext) {
+ if (plaintext.length != 16) {
+ throw new Error("invalid plaintext size (must be 16 bytes)");
+ }
+ var rounds = this._Ke.length - 1;
+ var a = [0, 0, 0, 0];
+ var t = convertToInt32(plaintext);
+ for (var i2 = 0; i2 < 4; i2++) {
+ t[i2] ^= this._Ke[0][i2];
+ }
+ for (var r = 1; r < rounds; r++) {
+ for (var i2 = 0; i2 < 4; i2++) {
+ a[i2] = T1[t[i2] >> 24 & 255] ^ T2[t[(i2 + 1) % 4] >> 16 & 255] ^ T3[t[(i2 + 2) % 4] >> 8 & 255] ^ T4[t[(i2 + 3) % 4] & 255] ^ this._Ke[r][i2];
+ }
+ t = a.slice();
+ }
+ var result = createArray(16), tt;
+ for (var i2 = 0; i2 < 4; i2++) {
+ tt = this._Ke[rounds][i2];
+ result[4 * i2] = (S[t[i2] >> 24 & 255] ^ tt >> 24) & 255;
+ result[4 * i2 + 1] = (S[t[(i2 + 1) % 4] >> 16 & 255] ^ tt >> 16) & 255;
+ result[4 * i2 + 2] = (S[t[(i2 + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255;
+ result[4 * i2 + 3] = (S[t[(i2 + 3) % 4] & 255] ^ tt) & 255;
+ }
+ return result;
+ };
+ AES.prototype.decrypt = function(ciphertext) {
+ if (ciphertext.length != 16) {
+ throw new Error("invalid ciphertext size (must be 16 bytes)");
+ }
+ var rounds = this._Kd.length - 1;
+ var a = [0, 0, 0, 0];
+ var t = convertToInt32(ciphertext);
+ for (var i2 = 0; i2 < 4; i2++) {
+ t[i2] ^= this._Kd[0][i2];
+ }
+ for (var r = 1; r < rounds; r++) {
+ for (var i2 = 0; i2 < 4; i2++) {
+ a[i2] = T5[t[i2] >> 24 & 255] ^ T6[t[(i2 + 3) % 4] >> 16 & 255] ^ T7[t[(i2 + 2) % 4] >> 8 & 255] ^ T8[t[(i2 + 1) % 4] & 255] ^ this._Kd[r][i2];
+ }
+ t = a.slice();
+ }
+ var result = createArray(16), tt;
+ for (var i2 = 0; i2 < 4; i2++) {
+ tt = this._Kd[rounds][i2];
+ result[4 * i2] = (Si[t[i2] >> 24 & 255] ^ tt >> 24) & 255;
+ result[4 * i2 + 1] = (Si[t[(i2 + 3) % 4] >> 16 & 255] ^ tt >> 16) & 255;
+ result[4 * i2 + 2] = (Si[t[(i2 + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255;
+ result[4 * i2 + 3] = (Si[t[(i2 + 1) % 4] & 255] ^ tt) & 255;
+ }
+ return result;
+ };
+ var ModeOfOperationECB = function(key) {
+ if (!(this instanceof ModeOfOperationECB)) {
+ throw Error("AES must be instanitated with `new`");
+ }
+ this.description = "Electronic Code Block";
+ this.name = "ecb";
+ this._aes = new AES(key);
+ };
+ ModeOfOperationECB.prototype.encrypt = function(plaintext) {
+ plaintext = coerceArray(plaintext);
+ if (plaintext.length % 16 !== 0) {
+ throw new Error("invalid plaintext size (must be multiple of 16 bytes)");
+ }
+ var ciphertext = createArray(plaintext.length);
+ var block2 = createArray(16);
+ for (var i2 = 0; i2 < plaintext.length; i2 += 16) {
+ copyArray(plaintext, block2, 0, i2, i2 + 16);
+ block2 = this._aes.encrypt(block2);
+ copyArray(block2, ciphertext, i2);
+ }
+ return ciphertext;
+ };
+ ModeOfOperationECB.prototype.decrypt = function(ciphertext) {
+ ciphertext = coerceArray(ciphertext);
+ if (ciphertext.length % 16 !== 0) {
+ throw new Error("invalid ciphertext size (must be multiple of 16 bytes)");
+ }
+ var plaintext = createArray(ciphertext.length);
+ var block2 = createArray(16);
+ for (var i2 = 0; i2 < ciphertext.length; i2 += 16) {
+ copyArray(ciphertext, block2, 0, i2, i2 + 16);
+ block2 = this._aes.decrypt(block2);
+ copyArray(block2, plaintext, i2);
+ }
+ return plaintext;
+ };
+ var ModeOfOperationCBC = function(key, iv) {
+ if (!(this instanceof ModeOfOperationCBC)) {
+ throw Error("AES must be instanitated with `new`");
+ }
+ this.description = "Cipher Block Chaining";
+ this.name = "cbc";
+ if (!iv) {
+ iv = createArray(16);
+ } else if (iv.length != 16) {
+ throw new Error("invalid initialation vector size (must be 16 bytes)");
+ }
+ this._lastCipherblock = coerceArray(iv, true);
+ this._aes = new AES(key);
+ };
+ ModeOfOperationCBC.prototype.encrypt = function(plaintext) {
+ plaintext = coerceArray(plaintext);
+ if (plaintext.length % 16 !== 0) {
+ throw new Error("invalid plaintext size (must be multiple of 16 bytes)");
+ }
+ var ciphertext = createArray(plaintext.length);
+ var block2 = createArray(16);
+ for (var i2 = 0; i2 < plaintext.length; i2 += 16) {
+ copyArray(plaintext, block2, 0, i2, i2 + 16);
+ for (var j2 = 0; j2 < 16; j2++) {
+ block2[j2] ^= this._lastCipherblock[j2];
+ }
+ this._lastCipherblock = this._aes.encrypt(block2);
+ copyArray(this._lastCipherblock, ciphertext, i2);
+ }
+ return ciphertext;
+ };
+ ModeOfOperationCBC.prototype.decrypt = function(ciphertext) {
+ ciphertext = coerceArray(ciphertext);
+ if (ciphertext.length % 16 !== 0) {
+ throw new Error("invalid ciphertext size (must be multiple of 16 bytes)");
+ }
+ var plaintext = createArray(ciphertext.length);
+ var block2 = createArray(16);
+ for (var i2 = 0; i2 < ciphertext.length; i2 += 16) {
+ copyArray(ciphertext, block2, 0, i2, i2 + 16);
+ block2 = this._aes.decrypt(block2);
+ for (var j2 = 0; j2 < 16; j2++) {
+ plaintext[i2 + j2] = block2[j2] ^ this._lastCipherblock[j2];
+ }
+ copyArray(ciphertext, this._lastCipherblock, 0, i2, i2 + 16);
+ }
+ return plaintext;
+ };
+ var ModeOfOperationCFB = function(key, iv, segmentSize) {
+ if (!(this instanceof ModeOfOperationCFB)) {
+ throw Error("AES must be instanitated with `new`");
+ }
+ this.description = "Cipher Feedback";
+ this.name = "cfb";
+ if (!iv) {
+ iv = createArray(16);
+ } else if (iv.length != 16) {
+ throw new Error("invalid initialation vector size (must be 16 size)");
+ }
+ if (!segmentSize) {
+ segmentSize = 1;
+ }
+ this.segmentSize = segmentSize;
+ this._shiftRegister = coerceArray(iv, true);
+ this._aes = new AES(key);
+ };
+ ModeOfOperationCFB.prototype.encrypt = function(plaintext) {
+ if (plaintext.length % this.segmentSize != 0) {
+ throw new Error("invalid plaintext size (must be segmentSize bytes)");
+ }
+ var encrypted = coerceArray(plaintext, true);
+ var xorSegment;
+ for (var i2 = 0; i2 < encrypted.length; i2 += this.segmentSize) {
+ xorSegment = this._aes.encrypt(this._shiftRegister);
+ for (var j2 = 0; j2 < this.segmentSize; j2++) {
+ encrypted[i2 + j2] ^= xorSegment[j2];
+ }
+ copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
+ copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i2, i2 + this.segmentSize);
+ }
+ return encrypted;
+ };
+ ModeOfOperationCFB.prototype.decrypt = function(ciphertext) {
+ if (ciphertext.length % this.segmentSize != 0) {
+ throw new Error("invalid ciphertext size (must be segmentSize bytes)");
+ }
+ var plaintext = coerceArray(ciphertext, true);
+ var xorSegment;
+ for (var i2 = 0; i2 < plaintext.length; i2 += this.segmentSize) {
+ xorSegment = this._aes.encrypt(this._shiftRegister);
+ for (var j2 = 0; j2 < this.segmentSize; j2++) {
+ plaintext[i2 + j2] ^= xorSegment[j2];
+ }
+ copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
+ copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i2, i2 + this.segmentSize);
+ }
+ return plaintext;
+ };
+ var ModeOfOperationOFB = function(key, iv) {
+ if (!(this instanceof ModeOfOperationOFB)) {
+ throw Error("AES must be instanitated with `new`");
+ }
+ this.description = "Output Feedback";
+ this.name = "ofb";
+ if (!iv) {
+ iv = createArray(16);
+ } else if (iv.length != 16) {
+ throw new Error("invalid initialation vector size (must be 16 bytes)");
+ }
+ this._lastPrecipher = coerceArray(iv, true);
+ this._lastPrecipherIndex = 16;
+ this._aes = new AES(key);
+ };
+ ModeOfOperationOFB.prototype.encrypt = function(plaintext) {
+ var encrypted = coerceArray(plaintext, true);
+ for (var i2 = 0; i2 < encrypted.length; i2++) {
+ if (this._lastPrecipherIndex === 16) {
+ this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);
+ this._lastPrecipherIndex = 0;
+ }
+ encrypted[i2] ^= this._lastPrecipher[this._lastPrecipherIndex++];
+ }
+ return encrypted;
+ };
+ ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;
+ var Counter = function(initialValue) {
+ if (!(this instanceof Counter)) {
+ throw Error("Counter must be instanitated with `new`");
+ }
+ if (initialValue !== 0 && !initialValue) {
+ initialValue = 1;
+ }
+ if (typeof initialValue === "number") {
+ this._counter = createArray(16);
+ this.setValue(initialValue);
+ } else {
+ this.setBytes(initialValue);
+ }
+ };
+ Counter.prototype.setValue = function(value) {
+ if (typeof value !== "number" || parseInt(value) != value) {
+ throw new Error("invalid counter value (must be an integer)");
+ }
+ if (value > Number.MAX_SAFE_INTEGER) {
+ throw new Error("integer value out of safe range");
+ }
+ for (var index = 15; index >= 0; --index) {
+ this._counter[index] = value % 256;
+ value = parseInt(value / 256);
+ }
+ };
+ Counter.prototype.setBytes = function(bytes) {
+ bytes = coerceArray(bytes, true);
+ if (bytes.length != 16) {
+ throw new Error("invalid counter bytes size (must be 16 bytes)");
+ }
+ this._counter = bytes;
+ };
+ Counter.prototype.increment = function() {
+ for (var i2 = 15; i2 >= 0; i2--) {
+ if (this._counter[i2] === 255) {
+ this._counter[i2] = 0;
+ } else {
+ this._counter[i2]++;
+ break;
+ }
+ }
+ };
+ var ModeOfOperationCTR = function(key, counter) {
+ if (!(this instanceof ModeOfOperationCTR)) {
+ throw Error("AES must be instanitated with `new`");
+ }
+ this.description = "Counter";
+ this.name = "ctr";
+ if (!(counter instanceof Counter)) {
+ counter = new Counter(counter);
+ }
+ this._counter = counter;
+ this._remainingCounter = null;
+ this._remainingCounterIndex = 16;
+ this._aes = new AES(key);
+ };
+ ModeOfOperationCTR.prototype.encrypt = function(plaintext) {
+ var encrypted = coerceArray(plaintext, true);
+ for (var i2 = 0; i2 < encrypted.length; i2++) {
+ if (this._remainingCounterIndex === 16) {
+ this._remainingCounter = this._aes.encrypt(this._counter._counter);
+ this._remainingCounterIndex = 0;
+ this._counter.increment();
+ }
+ encrypted[i2] ^= this._remainingCounter[this._remainingCounterIndex++];
+ }
+ return encrypted;
+ };
+ ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt;
+ function pkcs7pad(data) {
+ data = coerceArray(data, true);
+ var padder = 16 - data.length % 16;
+ var result = createArray(data.length + padder);
+ copyArray(data, result);
+ for (var i2 = data.length; i2 < result.length; i2++) {
+ result[i2] = padder;
+ }
+ return result;
+ }
+ function pkcs7strip(data) {
+ data = coerceArray(data, true);
+ if (data.length < 16) {
+ throw new Error("PKCS#7 invalid length");
+ }
+ var padder = data[data.length - 1];
+ if (padder > 16) {
+ throw new Error("PKCS#7 padding byte out of range");
+ }
+ var length = data.length - padder;
+ for (var i2 = 0; i2 < padder; i2++) {
+ if (data[length + i2] !== padder) {
+ throw new Error("PKCS#7 invalid padding byte");
+ }
+ }
+ var result = createArray(length);
+ copyArray(data, result, 0, 0, length);
+ return result;
+ }
+ var aesjs2 = {
+ AES,
+ Counter,
+ ModeOfOperation: {
+ ecb: ModeOfOperationECB,
+ cbc: ModeOfOperationCBC,
+ cfb: ModeOfOperationCFB,
+ ofb: ModeOfOperationOFB,
+ ctr: ModeOfOperationCTR
+ },
+ utils: {
+ hex: convertHex,
+ utf8: convertUtf8
+ },
+ padding: {
+ pkcs7: {
+ pad: pkcs7pad,
+ strip: pkcs7strip
+ }
+ },
+ _arrayTest: {
+ coerceArray,
+ createArray,
+ copyArray
+ }
+ };
+ if (typeof exports2 !== "undefined") {
+ module2.exports = aesjs2;
+ } else if (typeof define === "function" && define.amd) {
+ define([], function() {
+ return aesjs2;
+ });
+ } else {
+ if (root3.aesjs) {
+ aesjs2._aesjs = root3.aesjs;
+ }
+ root3.aesjs = aesjs2;
+ }
+ })(exports2);
+ }
+ });
+
+ // node_modules/fast-deep-equal/index.js
+ var require_fast_deep_equal = __commonJS({
+ "node_modules/fast-deep-equal/index.js"(exports2, module2) {
+ "use strict";
+ module2.exports = function equal(a, b) {
+ if (a === b)
+ return true;
+ if (a && b && typeof a == "object" && typeof b == "object") {
+ if (a.constructor !== b.constructor)
+ return false;
+ var length, i2, keys;
+ if (Array.isArray(a)) {
+ length = a.length;
+ if (length != b.length)
+ return false;
+ for (i2 = length; i2-- !== 0; )
+ if (!equal(a[i2], b[i2]))
+ return false;
+ return true;
+ }
+ if (a.constructor === RegExp)
+ return a.source === b.source && a.flags === b.flags;
+ if (a.valueOf !== Object.prototype.valueOf)
+ return a.valueOf() === b.valueOf();
+ if (a.toString !== Object.prototype.toString)
+ return a.toString() === b.toString();
+ keys = Object.keys(a);
+ length = keys.length;
+ if (length !== Object.keys(b).length)
+ return false;
+ for (i2 = length; i2-- !== 0; )
+ if (!Object.prototype.hasOwnProperty.call(b, keys[i2]))
+ return false;
+ for (i2 = length; i2-- !== 0; ) {
+ var key = keys[i2];
+ if (!equal(a[key], b[key]))
+ return false;
+ }
+ return true;
+ }
+ return a !== a && b !== b;
+ };
+ }
+ });
+
+ // node_modules/lodash/lodash.js
+ var require_lodash = __commonJS({
+ "node_modules/lodash/lodash.js"(exports2, module2) {
+ (function() {
+ var undefined2;
+ var VERSION = "4.17.21";
+ var LARGE_ARRAY_SIZE = 200;
+ var CORE_ERROR_TEXT = "Unsupported core-js use. Try https://npms.io/search?q=ponyfill.", FUNC_ERROR_TEXT3 = "Expected a function", INVALID_TEMPL_VAR_ERROR_TEXT = "Invalid `variable` option passed into `_.template`";
+ var HASH_UNDEFINED = "__lodash_hash_undefined__";
+ var MAX_MEMOIZE_SIZE = 500;
+ var PLACEHOLDER = "__lodash_placeholder__";
+ var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4;
+ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;
+ var WRAP_BIND_FLAG = 1, WRAP_BIND_KEY_FLAG = 2, WRAP_CURRY_BOUND_FLAG = 4, WRAP_CURRY_FLAG = 8, WRAP_CURRY_RIGHT_FLAG = 16, WRAP_PARTIAL_FLAG = 32, WRAP_PARTIAL_RIGHT_FLAG = 64, WRAP_ARY_FLAG = 128, WRAP_REARG_FLAG = 256, WRAP_FLIP_FLAG = 512;
+ var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = "...";
+ var HOT_COUNT = 800, HOT_SPAN = 16;
+ var LAZY_FILTER_FLAG = 1, LAZY_MAP_FLAG = 2, LAZY_WHILE_FLAG = 3;
+ var INFINITY2 = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991, MAX_INTEGER = 17976931348623157e292, NAN2 = 0 / 0;
+ var MAX_ARRAY_LENGTH = 4294967295, MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
+ var wrapFlags = [
+ ["ary", WRAP_ARY_FLAG],
+ ["bind", WRAP_BIND_FLAG],
+ ["bindKey", WRAP_BIND_KEY_FLAG],
+ ["curry", WRAP_CURRY_FLAG],
+ ["curryRight", WRAP_CURRY_RIGHT_FLAG],
+ ["flip", WRAP_FLIP_FLAG],
+ ["partial", WRAP_PARTIAL_FLAG],
+ ["partialRight", WRAP_PARTIAL_RIGHT_FLAG],
+ ["rearg", WRAP_REARG_FLAG]
+ ];
+ var argsTag = "[object Arguments]", arrayTag = "[object Array]", asyncTag = "[object AsyncFunction]", boolTag = "[object Boolean]", dateTag = "[object Date]", domExcTag = "[object DOMException]", errorTag = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag = "[object Map]", numberTag = "[object Number]", nullTag2 = "[object Null]", objectTag = "[object Object]", promiseTag = "[object Promise]", proxyTag = "[object Proxy]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag2 = "[object Symbol]", undefinedTag2 = "[object Undefined]", weakMapTag = "[object WeakMap]", weakSetTag = "[object WeakSet]";
+ var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]";
+ var reEmptyStringLeading = /\b__p \+= '';/g, reEmptyStringMiddle = /\b(__p \+=) '' \+/g, reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
+ var reEscapedHtml2 = /&(?:amp|lt|gt|quot|#39);/g, reUnescapedHtml2 = /[&<>"']/g, reHasEscapedHtml2 = RegExp(reEscapedHtml2.source), reHasUnescapedHtml2 = RegExp(reUnescapedHtml2.source);
+ var reEscape = /<%-([\s\S]+?)%>/g, reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g;
+ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
+ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar.source);
+ var reTrimStart2 = /^\s+/;
+ var reWhitespace2 = /\s/;
+ var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, reSplitDetails = /,? & /;
+ var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
+ var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;
+ var reEscapeChar = /\\(\\)?/g;
+ var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
+ var reFlags = /\w*$/;
+ var reIsBadHex2 = /^[-+]0x[0-9a-f]+$/i;
+ var reIsBinary2 = /^0b[01]+$/i;
+ var reIsHostCtor = /^\[object .+?Constructor\]$/;
+ var reIsOctal2 = /^0o[0-7]+$/i;
+ var reIsUint = /^(?:0|[1-9]\d*)$/;
+ var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
+ var reNoMatch = /($^)/;
+ var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
+ var rsAstralRange = "\\ud800-\\udfff", rsComboMarksRange = "\\u0300-\\u036f", reComboHalfMarksRange = "\\ufe20-\\ufe2f", rsComboSymbolsRange = "\\u20d0-\\u20ff", rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsDingbatRange = "\\u2700-\\u27bf", rsLowerRange = "a-z\\xdf-\\xf6\\xf8-\\xff", rsMathOpRange = "\\xac\\xb1\\xd7\\xf7", rsNonCharRange = "\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf", rsPunctuationRange = "\\u2000-\\u206f", rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", rsUpperRange = "A-Z\\xc0-\\xd6\\xd8-\\xde", rsVarRange = "\\ufe0e\\ufe0f", rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
+ var rsApos = "['\u2019]", rsAstral = "[" + rsAstralRange + "]", rsBreak = "[" + rsBreakRange + "]", rsCombo = "[" + rsComboRange + "]", rsDigits = "\\d+", rsDingbat = "[" + rsDingbatRange + "]", rsLower = "[" + rsLowerRange + "]", rsMisc = "[^" + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + "]", rsFitz = "\\ud83c[\\udffb-\\udfff]", rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")", rsNonAstral = "[^" + rsAstralRange + "]", rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}", rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]", rsUpper = "[" + rsUpperRange + "]", rsZWJ = "\\u200d";
+ var rsMiscLower = "(?:" + rsLower + "|" + rsMisc + ")", rsMiscUpper = "(?:" + rsUpper + "|" + rsMisc + ")", rsOptContrLower = "(?:" + rsApos + "(?:d|ll|m|re|s|t|ve))?", rsOptContrUpper = "(?:" + rsApos + "(?:D|LL|M|RE|S|T|VE))?", reOptMod = rsModifier + "?", rsOptVar = "[" + rsVarRange + "]?", rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join("|") + ")" + rsOptVar + reOptMod + ")*", rsOrdLower = "\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])", rsOrdUpper = "\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])", rsSeq = rsOptVar + reOptMod + rsOptJoin, rsEmoji = "(?:" + [rsDingbat, rsRegional, rsSurrPair].join("|") + ")" + rsSeq, rsSymbol = "(?:" + [rsNonAstral + rsCombo + "?", rsCombo, rsRegional, rsSurrPair, rsAstral].join("|") + ")";
+ var reApos = RegExp(rsApos, "g");
+ var reComboMark = RegExp(rsCombo, "g");
+ var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g");
+ var reUnicodeWord = RegExp([
+ rsUpper + "?" + rsLower + "+" + rsOptContrLower + "(?=" + [rsBreak, rsUpper, "$"].join("|") + ")",
+ rsMiscUpper + "+" + rsOptContrUpper + "(?=" + [rsBreak, rsUpper + rsMiscLower, "$"].join("|") + ")",
+ rsUpper + "?" + rsMiscLower + "+" + rsOptContrLower,
+ rsUpper + "+" + rsOptContrUpper,
+ rsOrdUpper,
+ rsOrdLower,
+ rsDigits,
+ rsEmoji
+ ].join("|"), "g");
+ var reHasUnicode = RegExp("[" + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + "]");
+ var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
+ var contextProps = [
+ "Array",
+ "Buffer",
+ "DataView",
+ "Date",
+ "Error",
+ "Float32Array",
+ "Float64Array",
+ "Function",
+ "Int8Array",
+ "Int16Array",
+ "Int32Array",
+ "Map",
+ "Math",
+ "Object",
+ "Promise",
+ "RegExp",
+ "Set",
+ "String",
+ "Symbol",
+ "TypeError",
+ "Uint8Array",
+ "Uint8ClampedArray",
+ "Uint16Array",
+ "Uint32Array",
+ "WeakMap",
+ "_",
+ "clearTimeout",
+ "isFinite",
+ "parseInt",
+ "setTimeout"
+ ];
+ var templateCounter = -1;
+ var typedArrayTags = {};
+ typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;
+ typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
+ var cloneableTags = {};
+ cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag2] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
+ cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false;
+ var deburredLetters = {
+ "\xC0": "A",
+ "\xC1": "A",
+ "\xC2": "A",
+ "\xC3": "A",
+ "\xC4": "A",
+ "\xC5": "A",
+ "\xE0": "a",
+ "\xE1": "a",
+ "\xE2": "a",
+ "\xE3": "a",
+ "\xE4": "a",
+ "\xE5": "a",
+ "\xC7": "C",
+ "\xE7": "c",
+ "\xD0": "D",
+ "\xF0": "d",
+ "\xC8": "E",
+ "\xC9": "E",
+ "\xCA": "E",
+ "\xCB": "E",
+ "\xE8": "e",
+ "\xE9": "e",
+ "\xEA": "e",
+ "\xEB": "e",
+ "\xCC": "I",
+ "\xCD": "I",
+ "\xCE": "I",
+ "\xCF": "I",
+ "\xEC": "i",
+ "\xED": "i",
+ "\xEE": "i",
+ "\xEF": "i",
+ "\xD1": "N",
+ "\xF1": "n",
+ "\xD2": "O",
+ "\xD3": "O",
+ "\xD4": "O",
+ "\xD5": "O",
+ "\xD6": "O",
+ "\xD8": "O",
+ "\xF2": "o",
+ "\xF3": "o",
+ "\xF4": "o",
+ "\xF5": "o",
+ "\xF6": "o",
+ "\xF8": "o",
+ "\xD9": "U",
+ "\xDA": "U",
+ "\xDB": "U",
+ "\xDC": "U",
+ "\xF9": "u",
+ "\xFA": "u",
+ "\xFB": "u",
+ "\xFC": "u",
+ "\xDD": "Y",
+ "\xFD": "y",
+ "\xFF": "y",
+ "\xC6": "Ae",
+ "\xE6": "ae",
+ "\xDE": "Th",
+ "\xFE": "th",
+ "\xDF": "ss",
+ "\u0100": "A",
+ "\u0102": "A",
+ "\u0104": "A",
+ "\u0101": "a",
+ "\u0103": "a",
+ "\u0105": "a",
+ "\u0106": "C",
+ "\u0108": "C",
+ "\u010A": "C",
+ "\u010C": "C",
+ "\u0107": "c",
+ "\u0109": "c",
+ "\u010B": "c",
+ "\u010D": "c",
+ "\u010E": "D",
+ "\u0110": "D",
+ "\u010F": "d",
+ "\u0111": "d",
+ "\u0112": "E",
+ "\u0114": "E",
+ "\u0116": "E",
+ "\u0118": "E",
+ "\u011A": "E",
+ "\u0113": "e",
+ "\u0115": "e",
+ "\u0117": "e",
+ "\u0119": "e",
+ "\u011B": "e",
+ "\u011C": "G",
+ "\u011E": "G",
+ "\u0120": "G",
+ "\u0122": "G",
+ "\u011D": "g",
+ "\u011F": "g",
+ "\u0121": "g",
+ "\u0123": "g",
+ "\u0124": "H",
+ "\u0126": "H",
+ "\u0125": "h",
+ "\u0127": "h",
+ "\u0128": "I",
+ "\u012A": "I",
+ "\u012C": "I",
+ "\u012E": "I",
+ "\u0130": "I",
+ "\u0129": "i",
+ "\u012B": "i",
+ "\u012D": "i",
+ "\u012F": "i",
+ "\u0131": "i",
+ "\u0134": "J",
+ "\u0135": "j",
+ "\u0136": "K",
+ "\u0137": "k",
+ "\u0138": "k",
+ "\u0139": "L",
+ "\u013B": "L",
+ "\u013D": "L",
+ "\u013F": "L",
+ "\u0141": "L",
+ "\u013A": "l",
+ "\u013C": "l",
+ "\u013E": "l",
+ "\u0140": "l",
+ "\u0142": "l",
+ "\u0143": "N",
+ "\u0145": "N",
+ "\u0147": "N",
+ "\u014A": "N",
+ "\u0144": "n",
+ "\u0146": "n",
+ "\u0148": "n",
+ "\u014B": "n",
+ "\u014C": "O",
+ "\u014E": "O",
+ "\u0150": "O",
+ "\u014D": "o",
+ "\u014F": "o",
+ "\u0151": "o",
+ "\u0154": "R",
+ "\u0156": "R",
+ "\u0158": "R",
+ "\u0155": "r",
+ "\u0157": "r",
+ "\u0159": "r",
+ "\u015A": "S",
+ "\u015C": "S",
+ "\u015E": "S",
+ "\u0160": "S",
+ "\u015B": "s",
+ "\u015D": "s",
+ "\u015F": "s",
+ "\u0161": "s",
+ "\u0162": "T",
+ "\u0164": "T",
+ "\u0166": "T",
+ "\u0163": "t",
+ "\u0165": "t",
+ "\u0167": "t",
+ "\u0168": "U",
+ "\u016A": "U",
+ "\u016C": "U",
+ "\u016E": "U",
+ "\u0170": "U",
+ "\u0172": "U",
+ "\u0169": "u",
+ "\u016B": "u",
+ "\u016D": "u",
+ "\u016F": "u",
+ "\u0171": "u",
+ "\u0173": "u",
+ "\u0174": "W",
+ "\u0175": "w",
+ "\u0176": "Y",
+ "\u0177": "y",
+ "\u0178": "Y",
+ "\u0179": "Z",
+ "\u017B": "Z",
+ "\u017D": "Z",
+ "\u017A": "z",
+ "\u017C": "z",
+ "\u017E": "z",
+ "\u0132": "IJ",
+ "\u0133": "ij",
+ "\u0152": "Oe",
+ "\u0153": "oe",
+ "\u0149": "'n",
+ "\u017F": "s"
+ };
+ var htmlEscapes2 = {
+ "&": "&",
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'"
+ };
+ var htmlUnescapes2 = {
+ "&": "&",
+ "<": "<",
+ ">": ">",
+ """: '"',
+ "'": "'"
+ };
+ var stringEscapes = {
+ "\\": "\\",
+ "'": "'",
+ "\n": "n",
+ "\r": "r",
+ "\u2028": "u2028",
+ "\u2029": "u2029"
+ };
+ var freeParseFloat = parseFloat, freeParseInt2 = parseInt;
+ var freeGlobal2 = typeof global == "object" && global && global.Object === Object && global;
+ var freeSelf2 = typeof self == "object" && self && self.Object === Object && self;
+ var root3 = freeGlobal2 || freeSelf2 || Function("return this")();
+ var freeExports = typeof exports2 == "object" && exports2 && !exports2.nodeType && exports2;
+ var freeModule = freeExports && typeof module2 == "object" && module2 && !module2.nodeType && module2;
+ var moduleExports = freeModule && freeModule.exports === freeExports;
+ var freeProcess = moduleExports && freeGlobal2.process;
+ var nodeUtil = function() {
+ try {
+ var types = freeModule && freeModule.require && freeModule.require("util").types;
+ if (types) {
+ return types;
+ }
+ return freeProcess && freeProcess.binding && freeProcess.binding("util");
+ } catch (e) {
+ }
+ }();
+ var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, nodeIsDate = nodeUtil && nodeUtil.isDate, nodeIsMap = nodeUtil && nodeUtil.isMap, nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, nodeIsSet = nodeUtil && nodeUtil.isSet, nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
+ function apply(func, thisArg, args) {
+ switch (args.length) {
+ case 0:
+ return func.call(thisArg);
+ case 1:
+ return func.call(thisArg, args[0]);
+ case 2:
+ return func.call(thisArg, args[0], args[1]);
+ case 3:
+ return func.call(thisArg, args[0], args[1], args[2]);
+ }
+ return func.apply(thisArg, args);
+ }
+ function arrayAggregator(array2, setter, iteratee, accumulator) {
+ var index = -1, length = array2 == null ? 0 : array2.length;
+ while (++index < length) {
+ var value = array2[index];
+ setter(accumulator, value, iteratee(value), array2);
+ }
+ return accumulator;
+ }
+ function arrayEach(array2, iteratee) {
+ var index = -1, length = array2 == null ? 0 : array2.length;
+ while (++index < length) {
+ if (iteratee(array2[index], index, array2) === false) {
+ break;
+ }
+ }
+ return array2;
+ }
+ function arrayEachRight(array2, iteratee) {
+ var length = array2 == null ? 0 : array2.length;
+ while (length--) {
+ if (iteratee(array2[length], length, array2) === false) {
+ break;
+ }
+ }
+ return array2;
+ }
+ function arrayEvery(array2, predicate) {
+ var index = -1, length = array2 == null ? 0 : array2.length;
+ while (++index < length) {
+ if (!predicate(array2[index], index, array2)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function arrayFilter(array2, predicate) {
+ var index = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result = [];
+ while (++index < length) {
+ var value = array2[index];
+ if (predicate(value, index, array2)) {
+ result[resIndex++] = value;
+ }
+ }
+ return result;
+ }
+ function arrayIncludes(array2, value) {
+ var length = array2 == null ? 0 : array2.length;
+ return !!length && baseIndexOf(array2, value, 0) > -1;
+ }
+ function arrayIncludesWith(array2, value, comparator) {
+ var index = -1, length = array2 == null ? 0 : array2.length;
+ while (++index < length) {
+ if (comparator(value, array2[index])) {
+ return true;
+ }
+ }
+ return false;
+ }
+ function arrayMap2(array2, iteratee) {
+ var index = -1, length = array2 == null ? 0 : array2.length, result = Array(length);
+ while (++index < length) {
+ result[index] = iteratee(array2[index], index, array2);
+ }
+ return result;
+ }
+ function arrayPush(array2, values) {
+ var index = -1, length = values.length, offset = array2.length;
+ while (++index < length) {
+ array2[offset + index] = values[index];
+ }
+ return array2;
+ }
+ function arrayReduce(array2, iteratee, accumulator, initAccum) {
+ var index = -1, length = array2 == null ? 0 : array2.length;
+ if (initAccum && length) {
+ accumulator = array2[++index];
+ }
+ while (++index < length) {
+ accumulator = iteratee(accumulator, array2[index], index, array2);
+ }
+ return accumulator;
+ }
+ function arrayReduceRight(array2, iteratee, accumulator, initAccum) {
+ var length = array2 == null ? 0 : array2.length;
+ if (initAccum && length) {
+ accumulator = array2[--length];
+ }
+ while (length--) {
+ accumulator = iteratee(accumulator, array2[length], length, array2);
+ }
+ return accumulator;
+ }
+ function arraySome(array2, predicate) {
+ var index = -1, length = array2 == null ? 0 : array2.length;
+ while (++index < length) {
+ if (predicate(array2[index], index, array2)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ var asciiSize = baseProperty("length");
+ function asciiToArray(string) {
+ return string.split("");
+ }
+ function asciiWords(string) {
+ return string.match(reAsciiWord) || [];
+ }
+ function baseFindKey(collection, predicate, eachFunc) {
+ var result;
+ eachFunc(collection, function(value, key, collection2) {
+ if (predicate(value, key, collection2)) {
+ result = key;
+ return false;
+ }
+ });
+ return result;
+ }
+ function baseFindIndex(array2, predicate, fromIndex, fromRight) {
+ var length = array2.length, index = fromIndex + (fromRight ? 1 : -1);
+ while (fromRight ? index-- : ++index < length) {
+ if (predicate(array2[index], index, array2)) {
+ return index;
+ }
+ }
+ return -1;
+ }
+ function baseIndexOf(array2, value, fromIndex) {
+ return value === value ? strictIndexOf(array2, value, fromIndex) : baseFindIndex(array2, baseIsNaN, fromIndex);
+ }
+ function baseIndexOfWith(array2, value, fromIndex, comparator) {
+ var index = fromIndex - 1, length = array2.length;
+ while (++index < length) {
+ if (comparator(array2[index], value)) {
+ return index;
+ }
+ }
+ return -1;
+ }
+ function baseIsNaN(value) {
+ return value !== value;
+ }
+ function baseMean(array2, iteratee) {
+ var length = array2 == null ? 0 : array2.length;
+ return length ? baseSum(array2, iteratee) / length : NAN2;
+ }
+ function baseProperty(key) {
+ return function(object) {
+ return object == null ? undefined2 : object[key];
+ };
+ }
+ function basePropertyOf2(object) {
+ return function(key) {
+ return object == null ? undefined2 : object[key];
+ };
+ }
+ function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
+ eachFunc(collection, function(value, index, collection2) {
+ accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index, collection2);
+ });
+ return accumulator;
+ }
+ function baseSortBy(array2, comparer) {
+ var length = array2.length;
+ array2.sort(comparer);
+ while (length--) {
+ array2[length] = array2[length].value;
+ }
+ return array2;
+ }
+ function baseSum(array2, iteratee) {
+ var result, index = -1, length = array2.length;
+ while (++index < length) {
+ var current = iteratee(array2[index]);
+ if (current !== undefined2) {
+ result = result === undefined2 ? current : result + current;
+ }
+ }
+ return result;
+ }
+ function baseTimes(n2, iteratee) {
+ var index = -1, result = Array(n2);
+ while (++index < n2) {
+ result[index] = iteratee(index);
+ }
+ return result;
+ }
+ function baseToPairs(object, props) {
+ return arrayMap2(props, function(key) {
+ return [key, object[key]];
+ });
+ }
+ function baseTrim2(string) {
+ return string ? string.slice(0, trimmedEndIndex2(string) + 1).replace(reTrimStart2, "") : string;
+ }
+ function baseUnary(func) {
+ return function(value) {
+ return func(value);
+ };
+ }
+ function baseValues(object, props) {
+ return arrayMap2(props, function(key) {
+ return object[key];
+ });
+ }
+ function cacheHas(cache, key) {
+ return cache.has(key);
+ }
+ function charsStartIndex(strSymbols, chrSymbols) {
+ var index = -1, length = strSymbols.length;
+ while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {
+ }
+ return index;
+ }
+ function charsEndIndex(strSymbols, chrSymbols) {
+ var index = strSymbols.length;
+ while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {
+ }
+ return index;
+ }
+ function countHolders(array2, placeholder) {
+ var length = array2.length, result = 0;
+ while (length--) {
+ if (array2[length] === placeholder) {
+ ++result;
+ }
+ }
+ return result;
+ }
+ var deburrLetter = basePropertyOf2(deburredLetters);
+ var escapeHtmlChar2 = basePropertyOf2(htmlEscapes2);
+ function escapeStringChar(chr) {
+ return "\\" + stringEscapes[chr];
+ }
+ function getValue(object, key) {
+ return object == null ? undefined2 : object[key];
+ }
+ function hasUnicode(string) {
+ return reHasUnicode.test(string);
+ }
+ function hasUnicodeWord(string) {
+ return reHasUnicodeWord.test(string);
+ }
+ function iteratorToArray(iterator) {
+ var data, result = [];
+ while (!(data = iterator.next()).done) {
+ result.push(data.value);
+ }
+ return result;
+ }
+ function mapToArray(map2) {
+ var index = -1, result = Array(map2.size);
+ map2.forEach(function(value, key) {
+ result[++index] = [key, value];
+ });
+ return result;
+ }
+ function overArg(func, transform2) {
+ return function(arg) {
+ return func(transform2(arg));
+ };
+ }
+ function replaceHolders(array2, placeholder) {
+ var index = -1, length = array2.length, resIndex = 0, result = [];
+ while (++index < length) {
+ var value = array2[index];
+ if (value === placeholder || value === PLACEHOLDER) {
+ array2[index] = PLACEHOLDER;
+ result[resIndex++] = index;
+ }
+ }
+ return result;
+ }
+ function setToArray(set3) {
+ var index = -1, result = Array(set3.size);
+ set3.forEach(function(value) {
+ result[++index] = value;
+ });
+ return result;
+ }
+ function setToPairs(set3) {
+ var index = -1, result = Array(set3.size);
+ set3.forEach(function(value) {
+ result[++index] = [value, value];
+ });
+ return result;
+ }
+ function strictIndexOf(array2, value, fromIndex) {
+ var index = fromIndex - 1, length = array2.length;
+ while (++index < length) {
+ if (array2[index] === value) {
+ return index;
+ }
+ }
+ return -1;
+ }
+ function strictLastIndexOf(array2, value, fromIndex) {
+ var index = fromIndex + 1;
+ while (index--) {
+ if (array2[index] === value) {
+ return index;
+ }
+ }
+ return index;
+ }
+ function stringSize(string) {
+ return hasUnicode(string) ? unicodeSize(string) : asciiSize(string);
+ }
+ function stringToArray(string) {
+ return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string);
+ }
+ function trimmedEndIndex2(string) {
+ var index = string.length;
+ while (index-- && reWhitespace2.test(string.charAt(index))) {
+ }
+ return index;
+ }
+ var unescapeHtmlChar2 = basePropertyOf2(htmlUnescapes2);
+ function unicodeSize(string) {
+ var result = reUnicode.lastIndex = 0;
+ while (reUnicode.test(string)) {
+ ++result;
+ }
+ return result;
+ }
+ function unicodeToArray(string) {
+ return string.match(reUnicode) || [];
+ }
+ function unicodeWords(string) {
+ return string.match(reUnicodeWord) || [];
+ }
+ var runInContext = function runInContext2(context) {
+ context = context == null ? root3 : _.defaults(root3.Object(), context, _.pick(root3, contextProps));
+ var Array2 = context.Array, Date2 = context.Date, Error2 = context.Error, Function2 = context.Function, Math2 = context.Math, Object2 = context.Object, RegExp2 = context.RegExp, String2 = context.String, TypeError2 = context.TypeError;
+ var arrayProto = Array2.prototype, funcProto = Function2.prototype, objectProto3 = Object2.prototype;
+ var coreJsData = context["__core-js_shared__"];
+ var funcToString = funcProto.toString;
+ var hasOwnProperty2 = objectProto3.hasOwnProperty;
+ var idCounter = 0;
+ var maskSrcKey = function() {
+ var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || "");
+ return uid ? "Symbol(src)_1." + uid : "";
+ }();
+ var nativeObjectToString3 = objectProto3.toString;
+ var objectCtorString = funcToString.call(Object2);
+ var oldDash = root3._;
+ var reIsNative = RegExp2("^" + funcToString.call(hasOwnProperty2).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$");
+ var Buffer2 = moduleExports ? context.Buffer : undefined2, Symbol3 = context.Symbol, Uint8Array2 = context.Uint8Array, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : undefined2, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto3.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol3 ? Symbol3.isConcatSpreadable : undefined2, symIterator = Symbol3 ? Symbol3.iterator : undefined2, symToStringTag3 = Symbol3 ? Symbol3.toStringTag : undefined2;
+ var defineProperty = function() {
+ try {
+ var func = getNative(Object2, "defineProperty");
+ func({}, "", {});
+ return func;
+ } catch (e) {
+ }
+ }();
+ var ctxClearTimeout = context.clearTimeout !== root3.clearTimeout && context.clearTimeout, ctxNow = Date2 && Date2.now !== root3.Date.now && Date2.now, ctxSetTimeout = context.setTimeout !== root3.setTimeout && context.setTimeout;
+ var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined2, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax2 = Math2.max, nativeMin2 = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse;
+ var DataView2 = getNative(context, "DataView"), Map2 = getNative(context, "Map"), Promise2 = getNative(context, "Promise"), Set2 = getNative(context, "Set"), WeakMap = getNative(context, "WeakMap"), nativeCreate = getNative(Object2, "create");
+ var metaMap = WeakMap && new WeakMap();
+ var realNames = {};
+ var dataViewCtorString = toSource(DataView2), mapCtorString = toSource(Map2), promiseCtorString = toSource(Promise2), setCtorString = toSource(Set2), weakMapCtorString = toSource(WeakMap);
+ var symbolProto2 = Symbol3 ? Symbol3.prototype : undefined2, symbolValueOf = symbolProto2 ? symbolProto2.valueOf : undefined2, symbolToString2 = symbolProto2 ? symbolProto2.toString : undefined2;
+ function lodash(value) {
+ if (isObjectLike2(value) && !isArray2(value) && !(value instanceof LazyWrapper)) {
+ if (value instanceof LodashWrapper) {
+ return value;
+ }
+ if (hasOwnProperty2.call(value, "__wrapped__")) {
+ return wrapperClone(value);
+ }
+ }
+ return new LodashWrapper(value);
+ }
+ var baseCreate = function() {
+ function object() {
+ }
+ return function(proto) {
+ if (!isObject2(proto)) {
+ return {};
+ }
+ if (objectCreate) {
+ return objectCreate(proto);
+ }
+ object.prototype = proto;
+ var result2 = new object();
+ object.prototype = undefined2;
+ return result2;
+ };
+ }();
+ function baseLodash() {
+ }
+ function LodashWrapper(value, chainAll) {
+ this.__wrapped__ = value;
+ this.__actions__ = [];
+ this.__chain__ = !!chainAll;
+ this.__index__ = 0;
+ this.__values__ = undefined2;
+ }
+ lodash.templateSettings = {
+ "escape": reEscape,
+ "evaluate": reEvaluate,
+ "interpolate": reInterpolate,
+ "variable": "",
+ "imports": {
+ "_": lodash
+ }
+ };
+ lodash.prototype = baseLodash.prototype;
+ lodash.prototype.constructor = lodash;
+ LodashWrapper.prototype = baseCreate(baseLodash.prototype);
+ LodashWrapper.prototype.constructor = LodashWrapper;
+ function LazyWrapper(value) {
+ this.__wrapped__ = value;
+ this.__actions__ = [];
+ this.__dir__ = 1;
+ this.__filtered__ = false;
+ this.__iteratees__ = [];
+ this.__takeCount__ = MAX_ARRAY_LENGTH;
+ this.__views__ = [];
+ }
+ function lazyClone() {
+ var result2 = new LazyWrapper(this.__wrapped__);
+ result2.__actions__ = copyArray(this.__actions__);
+ result2.__dir__ = this.__dir__;
+ result2.__filtered__ = this.__filtered__;
+ result2.__iteratees__ = copyArray(this.__iteratees__);
+ result2.__takeCount__ = this.__takeCount__;
+ result2.__views__ = copyArray(this.__views__);
+ return result2;
+ }
+ function lazyReverse() {
+ if (this.__filtered__) {
+ var result2 = new LazyWrapper(this);
+ result2.__dir__ = -1;
+ result2.__filtered__ = true;
+ } else {
+ result2 = this.clone();
+ result2.__dir__ *= -1;
+ }
+ return result2;
+ }
+ function lazyValue() {
+ var array2 = this.__wrapped__.value(), dir = this.__dir__, isArr = isArray2(array2), isRight = dir < 0, arrLength = isArr ? array2.length : 0, view = getView(0, arrLength, this.__views__), start2 = view.start, end = view.end, length = end - start2, index = isRight ? end : start2 - 1, iteratees = this.__iteratees__, iterLength = iteratees.length, resIndex = 0, takeCount = nativeMin2(length, this.__takeCount__);
+ if (!isArr || !isRight && arrLength == length && takeCount == length) {
+ return baseWrapperValue(array2, this.__actions__);
+ }
+ var result2 = [];
+ outer:
+ while (length-- && resIndex < takeCount) {
+ index += dir;
+ var iterIndex = -1, value = array2[index];
+ while (++iterIndex < iterLength) {
+ var data = iteratees[iterIndex], iteratee2 = data.iteratee, type3 = data.type, computed = iteratee2(value);
+ if (type3 == LAZY_MAP_FLAG) {
+ value = computed;
+ } else if (!computed) {
+ if (type3 == LAZY_FILTER_FLAG) {
+ continue outer;
+ } else {
+ break outer;
+ }
+ }
+ }
+ result2[resIndex++] = value;
+ }
+ return result2;
+ }
+ LazyWrapper.prototype = baseCreate(baseLodash.prototype);
+ LazyWrapper.prototype.constructor = LazyWrapper;
+ function Hash(entries) {
+ var index = -1, length = entries == null ? 0 : entries.length;
+ this.clear();
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+ }
+ function hashClear() {
+ this.__data__ = nativeCreate ? nativeCreate(null) : {};
+ this.size = 0;
+ }
+ function hashDelete(key) {
+ var result2 = this.has(key) && delete this.__data__[key];
+ this.size -= result2 ? 1 : 0;
+ return result2;
+ }
+ function hashGet(key) {
+ var data = this.__data__;
+ if (nativeCreate) {
+ var result2 = data[key];
+ return result2 === HASH_UNDEFINED ? undefined2 : result2;
+ }
+ return hasOwnProperty2.call(data, key) ? data[key] : undefined2;
+ }
+ function hashHas(key) {
+ var data = this.__data__;
+ return nativeCreate ? data[key] !== undefined2 : hasOwnProperty2.call(data, key);
+ }
+ function hashSet(key, value) {
+ var data = this.__data__;
+ this.size += this.has(key) ? 0 : 1;
+ data[key] = nativeCreate && value === undefined2 ? HASH_UNDEFINED : value;
+ return this;
+ }
+ Hash.prototype.clear = hashClear;
+ Hash.prototype["delete"] = hashDelete;
+ Hash.prototype.get = hashGet;
+ Hash.prototype.has = hashHas;
+ Hash.prototype.set = hashSet;
+ function ListCache(entries) {
+ var index = -1, length = entries == null ? 0 : entries.length;
+ this.clear();
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+ }
+ function listCacheClear() {
+ this.__data__ = [];
+ this.size = 0;
+ }
+ function listCacheDelete(key) {
+ var data = this.__data__, index = assocIndexOf(data, key);
+ if (index < 0) {
+ return false;
+ }
+ var lastIndex = data.length - 1;
+ if (index == lastIndex) {
+ data.pop();
+ } else {
+ splice.call(data, index, 1);
+ }
+ --this.size;
+ return true;
+ }
+ function listCacheGet(key) {
+ var data = this.__data__, index = assocIndexOf(data, key);
+ return index < 0 ? undefined2 : data[index][1];
+ }
+ function listCacheHas(key) {
+ return assocIndexOf(this.__data__, key) > -1;
+ }
+ function listCacheSet(key, value) {
+ var data = this.__data__, index = assocIndexOf(data, key);
+ if (index < 0) {
+ ++this.size;
+ data.push([key, value]);
+ } else {
+ data[index][1] = value;
+ }
+ return this;
+ }
+ ListCache.prototype.clear = listCacheClear;
+ ListCache.prototype["delete"] = listCacheDelete;
+ ListCache.prototype.get = listCacheGet;
+ ListCache.prototype.has = listCacheHas;
+ ListCache.prototype.set = listCacheSet;
+ function MapCache(entries) {
+ var index = -1, length = entries == null ? 0 : entries.length;
+ this.clear();
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+ }
+ function mapCacheClear() {
+ this.size = 0;
+ this.__data__ = {
+ "hash": new Hash(),
+ "map": new (Map2 || ListCache)(),
+ "string": new Hash()
+ };
+ }
+ function mapCacheDelete(key) {
+ var result2 = getMapData(this, key)["delete"](key);
+ this.size -= result2 ? 1 : 0;
+ return result2;
+ }
+ function mapCacheGet(key) {
+ return getMapData(this, key).get(key);
+ }
+ function mapCacheHas(key) {
+ return getMapData(this, key).has(key);
+ }
+ function mapCacheSet(key, value) {
+ var data = getMapData(this, key), size2 = data.size;
+ data.set(key, value);
+ this.size += data.size == size2 ? 0 : 1;
+ return this;
+ }
+ MapCache.prototype.clear = mapCacheClear;
+ MapCache.prototype["delete"] = mapCacheDelete;
+ MapCache.prototype.get = mapCacheGet;
+ MapCache.prototype.has = mapCacheHas;
+ MapCache.prototype.set = mapCacheSet;
+ function SetCache(values2) {
+ var index = -1, length = values2 == null ? 0 : values2.length;
+ this.__data__ = new MapCache();
+ while (++index < length) {
+ this.add(values2[index]);
+ }
+ }
+ function setCacheAdd(value) {
+ this.__data__.set(value, HASH_UNDEFINED);
+ return this;
+ }
+ function setCacheHas(value) {
+ return this.__data__.has(value);
+ }
+ SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
+ SetCache.prototype.has = setCacheHas;
+ function Stack(entries) {
+ var data = this.__data__ = new ListCache(entries);
+ this.size = data.size;
+ }
+ function stackClear() {
+ this.__data__ = new ListCache();
+ this.size = 0;
+ }
+ function stackDelete(key) {
+ var data = this.__data__, result2 = data["delete"](key);
+ this.size = data.size;
+ return result2;
+ }
+ function stackGet(key) {
+ return this.__data__.get(key);
+ }
+ function stackHas(key) {
+ return this.__data__.has(key);
+ }
+ function stackSet(key, value) {
+ var data = this.__data__;
+ if (data instanceof ListCache) {
+ var pairs = data.__data__;
+ if (!Map2 || pairs.length < LARGE_ARRAY_SIZE - 1) {
+ pairs.push([key, value]);
+ this.size = ++data.size;
+ return this;
+ }
+ data = this.__data__ = new MapCache(pairs);
+ }
+ data.set(key, value);
+ this.size = data.size;
+ return this;
+ }
+ Stack.prototype.clear = stackClear;
+ Stack.prototype["delete"] = stackDelete;
+ Stack.prototype.get = stackGet;
+ Stack.prototype.has = stackHas;
+ Stack.prototype.set = stackSet;
+ function arrayLikeKeys(value, inherited) {
+ var isArr = isArray2(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result2 = skipIndexes ? baseTimes(value.length, String2) : [], length = result2.length;
+ for (var key in value) {
+ if ((inherited || hasOwnProperty2.call(value, key)) && !(skipIndexes && (key == "length" || isBuff && (key == "offset" || key == "parent") || isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || isIndex(key, length)))) {
+ result2.push(key);
+ }
+ }
+ return result2;
+ }
+ function arraySample(array2) {
+ var length = array2.length;
+ return length ? array2[baseRandom(0, length - 1)] : undefined2;
+ }
+ function arraySampleSize(array2, n2) {
+ return shuffleSelf(copyArray(array2), baseClamp(n2, 0, array2.length));
+ }
+ function arrayShuffle(array2) {
+ return shuffleSelf(copyArray(array2));
+ }
+ function assignMergeValue(object, key, value) {
+ if (value !== undefined2 && !eq(object[key], value) || value === undefined2 && !(key in object)) {
+ baseAssignValue(object, key, value);
+ }
+ }
+ function assignValue(object, key, value) {
+ var objValue = object[key];
+ if (!(hasOwnProperty2.call(object, key) && eq(objValue, value)) || value === undefined2 && !(key in object)) {
+ baseAssignValue(object, key, value);
+ }
+ }
+ function assocIndexOf(array2, key) {
+ var length = array2.length;
+ while (length--) {
+ if (eq(array2[length][0], key)) {
+ return length;
+ }
+ }
+ return -1;
+ }
+ function baseAggregator(collection, setter, iteratee2, accumulator) {
+ baseEach(collection, function(value, key, collection2) {
+ setter(accumulator, value, iteratee2(value), collection2);
+ });
+ return accumulator;
+ }
+ function baseAssign(object, source) {
+ return object && copyObject(source, keys(source), object);
+ }
+ function baseAssignIn(object, source) {
+ return object && copyObject(source, keysIn(source), object);
+ }
+ function baseAssignValue(object, key, value) {
+ if (key == "__proto__" && defineProperty) {
+ defineProperty(object, key, {
+ "configurable": true,
+ "enumerable": true,
+ "value": value,
+ "writable": true
+ });
+ } else {
+ object[key] = value;
+ }
+ }
+ function baseAt(object, paths) {
+ var index = -1, length = paths.length, result2 = Array2(length), skip = object == null;
+ while (++index < length) {
+ result2[index] = skip ? undefined2 : get3(object, paths[index]);
+ }
+ return result2;
+ }
+ function baseClamp(number3, lower2, upper) {
+ if (number3 === number3) {
+ if (upper !== undefined2) {
+ number3 = number3 <= upper ? number3 : upper;
+ }
+ if (lower2 !== undefined2) {
+ number3 = number3 >= lower2 ? number3 : lower2;
+ }
+ }
+ return number3;
+ }
+ function baseClone(value, bitmask, customizer, key, object, stack) {
+ var result2, isDeep = bitmask & CLONE_DEEP_FLAG, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG;
+ if (customizer) {
+ result2 = object ? customizer(value, key, object, stack) : customizer(value);
+ }
+ if (result2 !== undefined2) {
+ return result2;
+ }
+ if (!isObject2(value)) {
+ return value;
+ }
+ var isArr = isArray2(value);
+ if (isArr) {
+ result2 = initCloneArray(value);
+ if (!isDeep) {
+ return copyArray(value, result2);
+ }
+ } else {
+ var tag = getTag(value), isFunc = tag == funcTag || tag == genTag;
+ if (isBuffer(value)) {
+ return cloneBuffer(value, isDeep);
+ }
+ if (tag == objectTag || tag == argsTag || isFunc && !object) {
+ result2 = isFlat || isFunc ? {} : initCloneObject(value);
+ if (!isDeep) {
+ return isFlat ? copySymbolsIn(value, baseAssignIn(result2, value)) : copySymbols(value, baseAssign(result2, value));
+ }
+ } else {
+ if (!cloneableTags[tag]) {
+ return object ? value : {};
+ }
+ result2 = initCloneByTag(value, tag, isDeep);
+ }
+ }
+ stack || (stack = new Stack());
+ var stacked = stack.get(value);
+ if (stacked) {
+ return stacked;
+ }
+ stack.set(value, result2);
+ if (isSet(value)) {
+ value.forEach(function(subValue) {
+ result2.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
+ });
+ } else if (isMap(value)) {
+ value.forEach(function(subValue, key2) {
+ result2.set(key2, baseClone(subValue, bitmask, customizer, key2, value, stack));
+ });
+ }
+ var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys;
+ var props = isArr ? undefined2 : keysFunc(value);
+ arrayEach(props || value, function(subValue, key2) {
+ if (props) {
+ key2 = subValue;
+ subValue = value[key2];
+ }
+ assignValue(result2, key2, baseClone(subValue, bitmask, customizer, key2, value, stack));
+ });
+ return result2;
+ }
+ function baseConforms(source) {
+ var props = keys(source);
+ return function(object) {
+ return baseConformsTo(object, source, props);
+ };
+ }
+ function baseConformsTo(object, source, props) {
+ var length = props.length;
+ if (object == null) {
+ return !length;
+ }
+ object = Object2(object);
+ while (length--) {
+ var key = props[length], predicate = source[key], value = object[key];
+ if (value === undefined2 && !(key in object) || !predicate(value)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function baseDelay(func, wait, args) {
+ if (typeof func != "function") {
+ throw new TypeError2(FUNC_ERROR_TEXT3);
+ }
+ return setTimeout2(function() {
+ func.apply(undefined2, args);
+ }, wait);
+ }
+ function baseDifference(array2, values2, iteratee2, comparator) {
+ var index = -1, includes2 = arrayIncludes, isCommon = true, length = array2.length, result2 = [], valuesLength = values2.length;
+ if (!length) {
+ return result2;
+ }
+ if (iteratee2) {
+ values2 = arrayMap2(values2, baseUnary(iteratee2));
+ }
+ if (comparator) {
+ includes2 = arrayIncludesWith;
+ isCommon = false;
+ } else if (values2.length >= LARGE_ARRAY_SIZE) {
+ includes2 = cacheHas;
+ isCommon = false;
+ values2 = new SetCache(values2);
+ }
+ outer:
+ while (++index < length) {
+ var value = array2[index], computed = iteratee2 == null ? value : iteratee2(value);
+ value = comparator || value !== 0 ? value : 0;
+ if (isCommon && computed === computed) {
+ var valuesIndex = valuesLength;
+ while (valuesIndex--) {
+ if (values2[valuesIndex] === computed) {
+ continue outer;
+ }
+ }
+ result2.push(value);
+ } else if (!includes2(values2, computed, comparator)) {
+ result2.push(value);
+ }
+ }
+ return result2;
+ }
+ var baseEach = createBaseEach(baseForOwn);
+ var baseEachRight = createBaseEach(baseForOwnRight, true);
+ function baseEvery(collection, predicate) {
+ var result2 = true;
+ baseEach(collection, function(value, index, collection2) {
+ result2 = !!predicate(value, index, collection2);
+ return result2;
+ });
+ return result2;
+ }
+ function baseExtremum(array2, iteratee2, comparator) {
+ var index = -1, length = array2.length;
+ while (++index < length) {
+ var value = array2[index], current = iteratee2(value);
+ if (current != null && (computed === undefined2 ? current === current && !isSymbol2(current) : comparator(current, computed))) {
+ var computed = current, result2 = value;
+ }
+ }
+ return result2;
+ }
+ function baseFill(array2, value, start2, end) {
+ var length = array2.length;
+ start2 = toInteger(start2);
+ if (start2 < 0) {
+ start2 = -start2 > length ? 0 : length + start2;
+ }
+ end = end === undefined2 || end > length ? length : toInteger(end);
+ if (end < 0) {
+ end += length;
+ }
+ end = start2 > end ? 0 : toLength(end);
+ while (start2 < end) {
+ array2[start2++] = value;
+ }
+ return array2;
+ }
+ function baseFilter(collection, predicate) {
+ var result2 = [];
+ baseEach(collection, function(value, index, collection2) {
+ if (predicate(value, index, collection2)) {
+ result2.push(value);
+ }
+ });
+ return result2;
+ }
+ function baseFlatten(array2, depth, predicate, isStrict, result2) {
+ var index = -1, length = array2.length;
+ predicate || (predicate = isFlattenable);
+ result2 || (result2 = []);
+ while (++index < length) {
+ var value = array2[index];
+ if (depth > 0 && predicate(value)) {
+ if (depth > 1) {
+ baseFlatten(value, depth - 1, predicate, isStrict, result2);
+ } else {
+ arrayPush(result2, value);
+ }
+ } else if (!isStrict) {
+ result2[result2.length] = value;
+ }
+ }
+ return result2;
+ }
+ var baseFor = createBaseFor();
+ var baseForRight = createBaseFor(true);
+ function baseForOwn(object, iteratee2) {
+ return object && baseFor(object, iteratee2, keys);
+ }
+ function baseForOwnRight(object, iteratee2) {
+ return object && baseForRight(object, iteratee2, keys);
+ }
+ function baseFunctions(object, props) {
+ return arrayFilter(props, function(key) {
+ return isFunction(object[key]);
+ });
+ }
+ function baseGet(object, path) {
+ path = castPath(path, object);
+ var index = 0, length = path.length;
+ while (object != null && index < length) {
+ object = object[toKey(path[index++])];
+ }
+ return index && index == length ? object : undefined2;
+ }
+ function baseGetAllKeys(object, keysFunc, symbolsFunc) {
+ var result2 = keysFunc(object);
+ return isArray2(object) ? result2 : arrayPush(result2, symbolsFunc(object));
+ }
+ function baseGetTag2(value) {
+ if (value == null) {
+ return value === undefined2 ? undefinedTag2 : nullTag2;
+ }
+ return symToStringTag3 && symToStringTag3 in Object2(value) ? getRawTag2(value) : objectToString2(value);
+ }
+ function baseGt(value, other) {
+ return value > other;
+ }
+ function baseHas(object, key) {
+ return object != null && hasOwnProperty2.call(object, key);
+ }
+ function baseHasIn(object, key) {
+ return object != null && key in Object2(object);
+ }
+ function baseInRange(number3, start2, end) {
+ return number3 >= nativeMin2(start2, end) && number3 < nativeMax2(start2, end);
+ }
+ function baseIntersection(arrays, iteratee2, comparator) {
+ var includes2 = comparator ? arrayIncludesWith : arrayIncludes, length = arrays[0].length, othLength = arrays.length, othIndex = othLength, caches = Array2(othLength), maxLength = Infinity, result2 = [];
+ while (othIndex--) {
+ var array2 = arrays[othIndex];
+ if (othIndex && iteratee2) {
+ array2 = arrayMap2(array2, baseUnary(iteratee2));
+ }
+ maxLength = nativeMin2(array2.length, maxLength);
+ caches[othIndex] = !comparator && (iteratee2 || length >= 120 && array2.length >= 120) ? new SetCache(othIndex && array2) : undefined2;
+ }
+ array2 = arrays[0];
+ var index = -1, seen = caches[0];
+ outer:
+ while (++index < length && result2.length < maxLength) {
+ var value = array2[index], computed = iteratee2 ? iteratee2(value) : value;
+ value = comparator || value !== 0 ? value : 0;
+ if (!(seen ? cacheHas(seen, computed) : includes2(result2, computed, comparator))) {
+ othIndex = othLength;
+ while (--othIndex) {
+ var cache = caches[othIndex];
+ if (!(cache ? cacheHas(cache, computed) : includes2(arrays[othIndex], computed, comparator))) {
+ continue outer;
+ }
+ }
+ if (seen) {
+ seen.push(computed);
+ }
+ result2.push(value);
+ }
+ }
+ return result2;
+ }
+ function baseInverter(object, setter, iteratee2, accumulator) {
+ baseForOwn(object, function(value, key, object2) {
+ setter(accumulator, iteratee2(value), key, object2);
+ });
+ return accumulator;
+ }
+ function baseInvoke(object, path, args) {
+ path = castPath(path, object);
+ object = parent(object, path);
+ var func = object == null ? object : object[toKey(last(path))];
+ return func == null ? undefined2 : apply(func, object, args);
+ }
+ function baseIsArguments(value) {
+ return isObjectLike2(value) && baseGetTag2(value) == argsTag;
+ }
+ function baseIsArrayBuffer(value) {
+ return isObjectLike2(value) && baseGetTag2(value) == arrayBufferTag;
+ }
+ function baseIsDate(value) {
+ return isObjectLike2(value) && baseGetTag2(value) == dateTag;
+ }
+ function baseIsEqual(value, other, bitmask, customizer, stack) {
+ if (value === other) {
+ return true;
+ }
+ if (value == null || other == null || !isObjectLike2(value) && !isObjectLike2(other)) {
+ return value !== value && other !== other;
+ }
+ return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
+ }
+ function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
+ var objIsArr = isArray2(object), othIsArr = isArray2(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other);
+ objTag = objTag == argsTag ? objectTag : objTag;
+ othTag = othTag == argsTag ? objectTag : othTag;
+ var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag;
+ if (isSameTag && isBuffer(object)) {
+ if (!isBuffer(other)) {
+ return false;
+ }
+ objIsArr = true;
+ objIsObj = false;
+ }
+ if (isSameTag && !objIsObj) {
+ stack || (stack = new Stack());
+ return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
+ }
+ if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
+ var objIsWrapped = objIsObj && hasOwnProperty2.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty2.call(other, "__wrapped__");
+ if (objIsWrapped || othIsWrapped) {
+ var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;
+ stack || (stack = new Stack());
+ return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
+ }
+ }
+ if (!isSameTag) {
+ return false;
+ }
+ stack || (stack = new Stack());
+ return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
+ }
+ function baseIsMap(value) {
+ return isObjectLike2(value) && getTag(value) == mapTag;
+ }
+ function baseIsMatch(object, source, matchData, customizer) {
+ var index = matchData.length, length = index, noCustomizer = !customizer;
+ if (object == null) {
+ return !length;
+ }
+ object = Object2(object);
+ while (index--) {
+ var data = matchData[index];
+ if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {
+ return false;
+ }
+ }
+ while (++index < length) {
+ data = matchData[index];
+ var key = data[0], objValue = object[key], srcValue = data[1];
+ if (noCustomizer && data[2]) {
+ if (objValue === undefined2 && !(key in object)) {
+ return false;
+ }
+ } else {
+ var stack = new Stack();
+ if (customizer) {
+ var result2 = customizer(objValue, srcValue, key, object, source, stack);
+ }
+ if (!(result2 === undefined2 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result2)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+ function baseIsNative(value) {
+ if (!isObject2(value) || isMasked(value)) {
+ return false;
+ }
+ var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
+ return pattern.test(toSource(value));
+ }
+ function baseIsRegExp(value) {
+ return isObjectLike2(value) && baseGetTag2(value) == regexpTag;
+ }
+ function baseIsSet(value) {
+ return isObjectLike2(value) && getTag(value) == setTag;
+ }
+ function baseIsTypedArray(value) {
+ return isObjectLike2(value) && isLength(value.length) && !!typedArrayTags[baseGetTag2(value)];
+ }
+ function baseIteratee(value) {
+ if (typeof value == "function") {
+ return value;
+ }
+ if (value == null) {
+ return identity4;
+ }
+ if (typeof value == "object") {
+ return isArray2(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);
+ }
+ return property(value);
+ }
+ function baseKeys(object) {
+ if (!isPrototype(object)) {
+ return nativeKeys(object);
+ }
+ var result2 = [];
+ for (var key in Object2(object)) {
+ if (hasOwnProperty2.call(object, key) && key != "constructor") {
+ result2.push(key);
+ }
+ }
+ return result2;
+ }
+ function baseKeysIn(object) {
+ if (!isObject2(object)) {
+ return nativeKeysIn(object);
+ }
+ var isProto = isPrototype(object), result2 = [];
+ for (var key in object) {
+ if (!(key == "constructor" && (isProto || !hasOwnProperty2.call(object, key)))) {
+ result2.push(key);
+ }
+ }
+ return result2;
+ }
+ function baseLt(value, other) {
+ return value < other;
+ }
+ function baseMap(collection, iteratee2) {
+ var index = -1, result2 = isArrayLike(collection) ? Array2(collection.length) : [];
+ baseEach(collection, function(value, key, collection2) {
+ result2[++index] = iteratee2(value, key, collection2);
+ });
+ return result2;
+ }
+ function baseMatches(source) {
+ var matchData = getMatchData(source);
+ if (matchData.length == 1 && matchData[0][2]) {
+ return matchesStrictComparable(matchData[0][0], matchData[0][1]);
+ }
+ return function(object) {
+ return object === source || baseIsMatch(object, source, matchData);
+ };
+ }
+ function baseMatchesProperty(path, srcValue) {
+ if (isKey(path) && isStrictComparable(srcValue)) {
+ return matchesStrictComparable(toKey(path), srcValue);
+ }
+ return function(object) {
+ var objValue = get3(object, path);
+ return objValue === undefined2 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
+ };
+ }
+ function baseMerge(object, source, srcIndex, customizer, stack) {
+ if (object === source) {
+ return;
+ }
+ baseFor(source, function(srcValue, key) {
+ stack || (stack = new Stack());
+ if (isObject2(srcValue)) {
+ baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
+ } else {
+ var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source, stack) : undefined2;
+ if (newValue === undefined2) {
+ newValue = srcValue;
+ }
+ assignMergeValue(object, key, newValue);
+ }
+ }, keysIn);
+ }
+ function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
+ var objValue = safeGet(object, key), srcValue = safeGet(source, key), stacked = stack.get(srcValue);
+ if (stacked) {
+ assignMergeValue(object, key, stacked);
+ return;
+ }
+ var newValue = customizer ? customizer(objValue, srcValue, key + "", object, source, stack) : undefined2;
+ var isCommon = newValue === undefined2;
+ if (isCommon) {
+ var isArr = isArray2(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue);
+ newValue = srcValue;
+ if (isArr || isBuff || isTyped) {
+ if (isArray2(objValue)) {
+ newValue = objValue;
+ } else if (isArrayLikeObject(objValue)) {
+ newValue = copyArray(objValue);
+ } else if (isBuff) {
+ isCommon = false;
+ newValue = cloneBuffer(srcValue, true);
+ } else if (isTyped) {
+ isCommon = false;
+ newValue = cloneTypedArray(srcValue, true);
+ } else {
+ newValue = [];
+ }
+ } else if (isPlainObject(srcValue) || isArguments(srcValue)) {
+ newValue = objValue;
+ if (isArguments(objValue)) {
+ newValue = toPlainObject(objValue);
+ } else if (!isObject2(objValue) || isFunction(objValue)) {
+ newValue = initCloneObject(srcValue);
+ }
+ } else {
+ isCommon = false;
+ }
+ }
+ if (isCommon) {
+ stack.set(srcValue, newValue);
+ mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
+ stack["delete"](srcValue);
+ }
+ assignMergeValue(object, key, newValue);
+ }
+ function baseNth(array2, n2) {
+ var length = array2.length;
+ if (!length) {
+ return;
+ }
+ n2 += n2 < 0 ? length : 0;
+ return isIndex(n2, length) ? array2[n2] : undefined2;
+ }
+ function baseOrderBy(collection, iteratees, orders) {
+ if (iteratees.length) {
+ iteratees = arrayMap2(iteratees, function(iteratee2) {
+ if (isArray2(iteratee2)) {
+ return function(value) {
+ return baseGet(value, iteratee2.length === 1 ? iteratee2[0] : iteratee2);
+ };
+ }
+ return iteratee2;
+ });
+ } else {
+ iteratees = [identity4];
+ }
+ var index = -1;
+ iteratees = arrayMap2(iteratees, baseUnary(getIteratee()));
+ var result2 = baseMap(collection, function(value, key, collection2) {
+ var criteria = arrayMap2(iteratees, function(iteratee2) {
+ return iteratee2(value);
+ });
+ return { "criteria": criteria, "index": ++index, "value": value };
+ });
+ return baseSortBy(result2, function(object, other) {
+ return compareMultiple(object, other, orders);
+ });
+ }
+ function basePick(object, paths) {
+ return basePickBy(object, paths, function(value, path) {
+ return hasIn(object, path);
+ });
+ }
+ function basePickBy(object, paths, predicate) {
+ var index = -1, length = paths.length, result2 = {};
+ while (++index < length) {
+ var path = paths[index], value = baseGet(object, path);
+ if (predicate(value, path)) {
+ baseSet(result2, castPath(path, object), value);
+ }
+ }
+ return result2;
+ }
+ function basePropertyDeep(path) {
+ return function(object) {
+ return baseGet(object, path);
+ };
+ }
+ function basePullAll(array2, values2, iteratee2, comparator) {
+ var indexOf2 = comparator ? baseIndexOfWith : baseIndexOf, index = -1, length = values2.length, seen = array2;
+ if (array2 === values2) {
+ values2 = copyArray(values2);
+ }
+ if (iteratee2) {
+ seen = arrayMap2(array2, baseUnary(iteratee2));
+ }
+ while (++index < length) {
+ var fromIndex = 0, value = values2[index], computed = iteratee2 ? iteratee2(value) : value;
+ while ((fromIndex = indexOf2(seen, computed, fromIndex, comparator)) > -1) {
+ if (seen !== array2) {
+ splice.call(seen, fromIndex, 1);
+ }
+ splice.call(array2, fromIndex, 1);
+ }
+ }
+ return array2;
+ }
+ function basePullAt(array2, indexes) {
+ var length = array2 ? indexes.length : 0, lastIndex = length - 1;
+ while (length--) {
+ var index = indexes[length];
+ if (length == lastIndex || index !== previous) {
+ var previous = index;
+ if (isIndex(index)) {
+ splice.call(array2, index, 1);
+ } else {
+ baseUnset(array2, index);
+ }
+ }
+ }
+ return array2;
+ }
+ function baseRandom(lower2, upper) {
+ return lower2 + nativeFloor(nativeRandom() * (upper - lower2 + 1));
+ }
+ function baseRange(start2, end, step, fromRight) {
+ var index = -1, length = nativeMax2(nativeCeil((end - start2) / (step || 1)), 0), result2 = Array2(length);
+ while (length--) {
+ result2[fromRight ? length : ++index] = start2;
+ start2 += step;
+ }
+ return result2;
+ }
+ function baseRepeat(string, n2) {
+ var result2 = "";
+ if (!string || n2 < 1 || n2 > MAX_SAFE_INTEGER) {
+ return result2;
+ }
+ do {
+ if (n2 % 2) {
+ result2 += string;
+ }
+ n2 = nativeFloor(n2 / 2);
+ if (n2) {
+ string += string;
+ }
+ } while (n2);
+ return result2;
+ }
+ function baseRest(func, start2) {
+ return setToString(overRest(func, start2, identity4), func + "");
+ }
+ function baseSample(collection) {
+ return arraySample(values(collection));
+ }
+ function baseSampleSize(collection, n2) {
+ var array2 = values(collection);
+ return shuffleSelf(array2, baseClamp(n2, 0, array2.length));
+ }
+ function baseSet(object, path, value, customizer) {
+ if (!isObject2(object)) {
+ return object;
+ }
+ path = castPath(path, object);
+ var index = -1, length = path.length, lastIndex = length - 1, nested = object;
+ while (nested != null && ++index < length) {
+ var key = toKey(path[index]), newValue = value;
+ if (key === "__proto__" || key === "constructor" || key === "prototype") {
+ return object;
+ }
+ if (index != lastIndex) {
+ var objValue = nested[key];
+ newValue = customizer ? customizer(objValue, key, nested) : undefined2;
+ if (newValue === undefined2) {
+ newValue = isObject2(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {};
+ }
+ }
+ assignValue(nested, key, newValue);
+ nested = nested[key];
+ }
+ return object;
+ }
+ var baseSetData = !metaMap ? identity4 : function(func, data) {
+ metaMap.set(func, data);
+ return func;
+ };
+ var baseSetToString = !defineProperty ? identity4 : function(func, string) {
+ return defineProperty(func, "toString", {
+ "configurable": true,
+ "enumerable": false,
+ "value": constant(string),
+ "writable": true
+ });
+ };
+ function baseShuffle(collection) {
+ return shuffleSelf(values(collection));
+ }
+ function baseSlice(array2, start2, end) {
+ var index = -1, length = array2.length;
+ if (start2 < 0) {
+ start2 = -start2 > length ? 0 : length + start2;
+ }
+ end = end > length ? length : end;
+ if (end < 0) {
+ end += length;
+ }
+ length = start2 > end ? 0 : end - start2 >>> 0;
+ start2 >>>= 0;
+ var result2 = Array2(length);
+ while (++index < length) {
+ result2[index] = array2[index + start2];
+ }
+ return result2;
+ }
+ function baseSome(collection, predicate) {
+ var result2;
+ baseEach(collection, function(value, index, collection2) {
+ result2 = predicate(value, index, collection2);
+ return !result2;
+ });
+ return !!result2;
+ }
+ function baseSortedIndex(array2, value, retHighest) {
+ var low = 0, high = array2 == null ? low : array2.length;
+ if (typeof value == "number" && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
+ while (low < high) {
+ var mid = low + high >>> 1, computed = array2[mid];
+ if (computed !== null && !isSymbol2(computed) && (retHighest ? computed <= value : computed < value)) {
+ low = mid + 1;
+ } else {
+ high = mid;
+ }
+ }
+ return high;
+ }
+ return baseSortedIndexBy(array2, value, identity4, retHighest);
+ }
+ function baseSortedIndexBy(array2, value, iteratee2, retHighest) {
+ var low = 0, high = array2 == null ? 0 : array2.length;
+ if (high === 0) {
+ return 0;
+ }
+ value = iteratee2(value);
+ var valIsNaN = value !== value, valIsNull = value === null, valIsSymbol = isSymbol2(value), valIsUndefined = value === undefined2;
+ while (low < high) {
+ var mid = nativeFloor((low + high) / 2), computed = iteratee2(array2[mid]), othIsDefined = computed !== undefined2, othIsNull = computed === null, othIsReflexive = computed === computed, othIsSymbol = isSymbol2(computed);
+ if (valIsNaN) {
+ var setLow = retHighest || othIsReflexive;
+ } else if (valIsUndefined) {
+ setLow = othIsReflexive && (retHighest || othIsDefined);
+ } else if (valIsNull) {
+ setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
+ } else if (valIsSymbol) {
+ setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
+ } else if (othIsNull || othIsSymbol) {
+ setLow = false;
+ } else {
+ setLow = retHighest ? computed <= value : computed < value;
+ }
+ if (setLow) {
+ low = mid + 1;
+ } else {
+ high = mid;
+ }
+ }
+ return nativeMin2(high, MAX_ARRAY_INDEX);
+ }
+ function baseSortedUniq(array2, iteratee2) {
+ var index = -1, length = array2.length, resIndex = 0, result2 = [];
+ while (++index < length) {
+ var value = array2[index], computed = iteratee2 ? iteratee2(value) : value;
+ if (!index || !eq(computed, seen)) {
+ var seen = computed;
+ result2[resIndex++] = value === 0 ? 0 : value;
+ }
+ }
+ return result2;
+ }
+ function baseToNumber(value) {
+ if (typeof value == "number") {
+ return value;
+ }
+ if (isSymbol2(value)) {
+ return NAN2;
+ }
+ return +value;
+ }
+ function baseToString2(value) {
+ if (typeof value == "string") {
+ return value;
+ }
+ if (isArray2(value)) {
+ return arrayMap2(value, baseToString2) + "";
+ }
+ if (isSymbol2(value)) {
+ return symbolToString2 ? symbolToString2.call(value) : "";
+ }
+ var result2 = value + "";
+ return result2 == "0" && 1 / value == -INFINITY2 ? "-0" : result2;
+ }
+ function baseUniq(array2, iteratee2, comparator) {
+ var index = -1, includes2 = arrayIncludes, length = array2.length, isCommon = true, result2 = [], seen = result2;
+ if (comparator) {
+ isCommon = false;
+ includes2 = arrayIncludesWith;
+ } else if (length >= LARGE_ARRAY_SIZE) {
+ var set4 = iteratee2 ? null : createSet(array2);
+ if (set4) {
+ return setToArray(set4);
+ }
+ isCommon = false;
+ includes2 = cacheHas;
+ seen = new SetCache();
+ } else {
+ seen = iteratee2 ? [] : result2;
+ }
+ outer:
+ while (++index < length) {
+ var value = array2[index], computed = iteratee2 ? iteratee2(value) : value;
+ value = comparator || value !== 0 ? value : 0;
+ if (isCommon && computed === computed) {
+ var seenIndex = seen.length;
+ while (seenIndex--) {
+ if (seen[seenIndex] === computed) {
+ continue outer;
+ }
+ }
+ if (iteratee2) {
+ seen.push(computed);
+ }
+ result2.push(value);
+ } else if (!includes2(seen, computed, comparator)) {
+ if (seen !== result2) {
+ seen.push(computed);
+ }
+ result2.push(value);
+ }
+ }
+ return result2;
+ }
+ function baseUnset(object, path) {
+ path = castPath(path, object);
+ object = parent(object, path);
+ return object == null || delete object[toKey(last(path))];
+ }
+ function baseUpdate(object, path, updater, customizer) {
+ return baseSet(object, path, updater(baseGet(object, path)), customizer);
+ }
+ function baseWhile(array2, predicate, isDrop, fromRight) {
+ var length = array2.length, index = fromRight ? length : -1;
+ while ((fromRight ? index-- : ++index < length) && predicate(array2[index], index, array2)) {
+ }
+ return isDrop ? baseSlice(array2, fromRight ? 0 : index, fromRight ? index + 1 : length) : baseSlice(array2, fromRight ? index + 1 : 0, fromRight ? length : index);
+ }
+ function baseWrapperValue(value, actions) {
+ var result2 = value;
+ if (result2 instanceof LazyWrapper) {
+ result2 = result2.value();
+ }
+ return arrayReduce(actions, function(result3, action) {
+ return action.func.apply(action.thisArg, arrayPush([result3], action.args));
+ }, result2);
+ }
+ function baseXor(arrays, iteratee2, comparator) {
+ var length = arrays.length;
+ if (length < 2) {
+ return length ? baseUniq(arrays[0]) : [];
+ }
+ var index = -1, result2 = Array2(length);
+ while (++index < length) {
+ var array2 = arrays[index], othIndex = -1;
+ while (++othIndex < length) {
+ if (othIndex != index) {
+ result2[index] = baseDifference(result2[index] || array2, arrays[othIndex], iteratee2, comparator);
+ }
+ }
+ }
+ return baseUniq(baseFlatten(result2, 1), iteratee2, comparator);
+ }
+ function baseZipObject(props, values2, assignFunc) {
+ var index = -1, length = props.length, valsLength = values2.length, result2 = {};
+ while (++index < length) {
+ var value = index < valsLength ? values2[index] : undefined2;
+ assignFunc(result2, props[index], value);
+ }
+ return result2;
+ }
+ function castArrayLikeObject(value) {
+ return isArrayLikeObject(value) ? value : [];
+ }
+ function castFunction(value) {
+ return typeof value == "function" ? value : identity4;
+ }
+ function castPath(value, object) {
+ if (isArray2(value)) {
+ return value;
+ }
+ return isKey(value, object) ? [value] : stringToPath(toString2(value));
+ }
+ var castRest = baseRest;
+ function castSlice(array2, start2, end) {
+ var length = array2.length;
+ end = end === undefined2 ? length : end;
+ return !start2 && end >= length ? array2 : baseSlice(array2, start2, end);
+ }
+ var clearTimeout2 = ctxClearTimeout || function(id2) {
+ return root3.clearTimeout(id2);
+ };
+ function cloneBuffer(buffer, isDeep) {
+ if (isDeep) {
+ return buffer.slice();
+ }
+ var length = buffer.length, result2 = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
+ buffer.copy(result2);
+ return result2;
+ }
+ function cloneArrayBuffer(arrayBuffer) {
+ var result2 = new arrayBuffer.constructor(arrayBuffer.byteLength);
+ new Uint8Array2(result2).set(new Uint8Array2(arrayBuffer));
+ return result2;
+ }
+ function cloneDataView(dataView, isDeep) {
+ var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
+ return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
+ }
+ function cloneRegExp(regexp) {
+ var result2 = new regexp.constructor(regexp.source, reFlags.exec(regexp));
+ result2.lastIndex = regexp.lastIndex;
+ return result2;
+ }
+ function cloneSymbol(symbol) {
+ return symbolValueOf ? Object2(symbolValueOf.call(symbol)) : {};
+ }
+ function cloneTypedArray(typedArray, isDeep) {
+ var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
+ return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
+ }
+ function compareAscending(value, other) {
+ if (value !== other) {
+ var valIsDefined = value !== undefined2, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol2(value);
+ var othIsDefined = other !== undefined2, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol2(other);
+ if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) {
+ return 1;
+ }
+ if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) {
+ return -1;
+ }
+ }
+ return 0;
+ }
+ function compareMultiple(object, other, orders) {
+ var index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length;
+ while (++index < length) {
+ var result2 = compareAscending(objCriteria[index], othCriteria[index]);
+ if (result2) {
+ if (index >= ordersLength) {
+ return result2;
+ }
+ var order = orders[index];
+ return result2 * (order == "desc" ? -1 : 1);
+ }
+ }
+ return object.index - other.index;
+ }
+ function composeArgs(args, partials, holders, isCurried) {
+ var argsIndex = -1, argsLength = args.length, holdersLength = holders.length, leftIndex = -1, leftLength = partials.length, rangeLength = nativeMax2(argsLength - holdersLength, 0), result2 = Array2(leftLength + rangeLength), isUncurried = !isCurried;
+ while (++leftIndex < leftLength) {
+ result2[leftIndex] = partials[leftIndex];
+ }
+ while (++argsIndex < holdersLength) {
+ if (isUncurried || argsIndex < argsLength) {
+ result2[holders[argsIndex]] = args[argsIndex];
+ }
+ }
+ while (rangeLength--) {
+ result2[leftIndex++] = args[argsIndex++];
+ }
+ return result2;
+ }
+ function composeArgsRight(args, partials, holders, isCurried) {
+ var argsIndex = -1, argsLength = args.length, holdersIndex = -1, holdersLength = holders.length, rightIndex = -1, rightLength = partials.length, rangeLength = nativeMax2(argsLength - holdersLength, 0), result2 = Array2(rangeLength + rightLength), isUncurried = !isCurried;
+ while (++argsIndex < rangeLength) {
+ result2[argsIndex] = args[argsIndex];
+ }
+ var offset = argsIndex;
+ while (++rightIndex < rightLength) {
+ result2[offset + rightIndex] = partials[rightIndex];
+ }
+ while (++holdersIndex < holdersLength) {
+ if (isUncurried || argsIndex < argsLength) {
+ result2[offset + holders[holdersIndex]] = args[argsIndex++];
+ }
+ }
+ return result2;
+ }
+ function copyArray(source, array2) {
+ var index = -1, length = source.length;
+ array2 || (array2 = Array2(length));
+ while (++index < length) {
+ array2[index] = source[index];
+ }
+ return array2;
+ }
+ function copyObject(source, props, object, customizer) {
+ var isNew = !object;
+ object || (object = {});
+ var index = -1, length = props.length;
+ while (++index < length) {
+ var key = props[index];
+ var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined2;
+ if (newValue === undefined2) {
+ newValue = source[key];
+ }
+ if (isNew) {
+ baseAssignValue(object, key, newValue);
+ } else {
+ assignValue(object, key, newValue);
+ }
+ }
+ return object;
+ }
+ function copySymbols(source, object) {
+ return copyObject(source, getSymbols(source), object);
+ }
+ function copySymbolsIn(source, object) {
+ return copyObject(source, getSymbolsIn(source), object);
+ }
+ function createAggregator(setter, initializer) {
+ return function(collection, iteratee2) {
+ var func = isArray2(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {};
+ return func(collection, setter, getIteratee(iteratee2, 2), accumulator);
+ };
+ }
+ function createAssigner(assigner) {
+ return baseRest(function(object, sources) {
+ var index = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : undefined2, guard = length > 2 ? sources[2] : undefined2;
+ customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : undefined2;
+ if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+ customizer = length < 3 ? undefined2 : customizer;
+ length = 1;
+ }
+ object = Object2(object);
+ while (++index < length) {
+ var source = sources[index];
+ if (source) {
+ assigner(object, source, index, customizer);
+ }
+ }
+ return object;
+ });
+ }
+ function createBaseEach(eachFunc, fromRight) {
+ return function(collection, iteratee2) {
+ if (collection == null) {
+ return collection;
+ }
+ if (!isArrayLike(collection)) {
+ return eachFunc(collection, iteratee2);
+ }
+ var length = collection.length, index = fromRight ? length : -1, iterable = Object2(collection);
+ while (fromRight ? index-- : ++index < length) {
+ if (iteratee2(iterable[index], index, iterable) === false) {
+ break;
+ }
+ }
+ return collection;
+ };
+ }
+ function createBaseFor(fromRight) {
+ return function(object, iteratee2, keysFunc) {
+ var index = -1, iterable = Object2(object), props = keysFunc(object), length = props.length;
+ while (length--) {
+ var key = props[fromRight ? length : ++index];
+ if (iteratee2(iterable[key], key, iterable) === false) {
+ break;
+ }
+ }
+ return object;
+ };
+ }
+ function createBind(func, bitmask, thisArg) {
+ var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func);
+ function wrapper() {
+ var fn = this && this !== root3 && this instanceof wrapper ? Ctor : func;
+ return fn.apply(isBind ? thisArg : this, arguments);
+ }
+ return wrapper;
+ }
+ function createCaseFirst(methodName) {
+ return function(string) {
+ string = toString2(string);
+ var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined2;
+ var chr = strSymbols ? strSymbols[0] : string.charAt(0);
+ var trailing = strSymbols ? castSlice(strSymbols, 1).join("") : string.slice(1);
+ return chr[methodName]() + trailing;
+ };
+ }
+ function createCompounder(callback) {
+ return function(string) {
+ return arrayReduce(words(deburr(string).replace(reApos, "")), callback, "");
+ };
+ }
+ function createCtor(Ctor) {
+ return function() {
+ var args = arguments;
+ switch (args.length) {
+ case 0:
+ return new Ctor();
+ case 1:
+ return new Ctor(args[0]);
+ case 2:
+ return new Ctor(args[0], args[1]);
+ case 3:
+ return new Ctor(args[0], args[1], args[2]);
+ case 4:
+ return new Ctor(args[0], args[1], args[2], args[3]);
+ case 5:
+ return new Ctor(args[0], args[1], args[2], args[3], args[4]);
+ case 6:
+ return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
+ case 7:
+ return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
+ }
+ var thisBinding = baseCreate(Ctor.prototype), result2 = Ctor.apply(thisBinding, args);
+ return isObject2(result2) ? result2 : thisBinding;
+ };
+ }
+ function createCurry(func, bitmask, arity) {
+ var Ctor = createCtor(func);
+ function wrapper() {
+ var length = arguments.length, args = Array2(length), index = length, placeholder = getHolder(wrapper);
+ while (index--) {
+ args[index] = arguments[index];
+ }
+ var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder);
+ length -= holders.length;
+ if (length < arity) {
+ return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, undefined2, args, holders, undefined2, undefined2, arity - length);
+ }
+ var fn = this && this !== root3 && this instanceof wrapper ? Ctor : func;
+ return apply(fn, this, args);
+ }
+ return wrapper;
+ }
+ function createFind(findIndexFunc) {
+ return function(collection, predicate, fromIndex) {
+ var iterable = Object2(collection);
+ if (!isArrayLike(collection)) {
+ var iteratee2 = getIteratee(predicate, 3);
+ collection = keys(collection);
+ predicate = function(key) {
+ return iteratee2(iterable[key], key, iterable);
+ };
+ }
+ var index = findIndexFunc(collection, predicate, fromIndex);
+ return index > -1 ? iterable[iteratee2 ? collection[index] : index] : undefined2;
+ };
+ }
+ function createFlow(fromRight) {
+ return flatRest(function(funcs) {
+ var length = funcs.length, index = length, prereq = LodashWrapper.prototype.thru;
+ if (fromRight) {
+ funcs.reverse();
+ }
+ while (index--) {
+ var func = funcs[index];
+ if (typeof func != "function") {
+ throw new TypeError2(FUNC_ERROR_TEXT3);
+ }
+ if (prereq && !wrapper && getFuncName(func) == "wrapper") {
+ var wrapper = new LodashWrapper([], true);
+ }
+ }
+ index = wrapper ? index : length;
+ while (++index < length) {
+ func = funcs[index];
+ var funcName = getFuncName(func), data = funcName == "wrapper" ? getData(func) : undefined2;
+ if (data && isLaziable(data[0]) && data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1) {
+ wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
+ } else {
+ wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func);
+ }
+ }
+ return function() {
+ var args = arguments, value = args[0];
+ if (wrapper && args.length == 1 && isArray2(value)) {
+ return wrapper.plant(value).value();
+ }
+ var index2 = 0, result2 = length ? funcs[index2].apply(this, args) : value;
+ while (++index2 < length) {
+ result2 = funcs[index2].call(this, result2);
+ }
+ return result2;
+ };
+ });
+ }
+ function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary2, arity) {
+ var isAry = bitmask & WRAP_ARY_FLAG, isBind = bitmask & WRAP_BIND_FLAG, isBindKey = bitmask & WRAP_BIND_KEY_FLAG, isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), isFlip = bitmask & WRAP_FLIP_FLAG, Ctor = isBindKey ? undefined2 : createCtor(func);
+ function wrapper() {
+ var length = arguments.length, args = Array2(length), index = length;
+ while (index--) {
+ args[index] = arguments[index];
+ }
+ if (isCurried) {
+ var placeholder = getHolder(wrapper), holdersCount = countHolders(args, placeholder);
+ }
+ if (partials) {
+ args = composeArgs(args, partials, holders, isCurried);
+ }
+ if (partialsRight) {
+ args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
+ }
+ length -= holdersCount;
+ if (isCurried && length < arity) {
+ var newHolders = replaceHolders(args, placeholder);
+ return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, thisArg, args, newHolders, argPos, ary2, arity - length);
+ }
+ var thisBinding = isBind ? thisArg : this, fn = isBindKey ? thisBinding[func] : func;
+ length = args.length;
+ if (argPos) {
+ args = reorder(args, argPos);
+ } else if (isFlip && length > 1) {
+ args.reverse();
+ }
+ if (isAry && ary2 < length) {
+ args.length = ary2;
+ }
+ if (this && this !== root3 && this instanceof wrapper) {
+ fn = Ctor || createCtor(fn);
+ }
+ return fn.apply(thisBinding, args);
+ }
+ return wrapper;
+ }
+ function createInverter(setter, toIteratee) {
+ return function(object, iteratee2) {
+ return baseInverter(object, setter, toIteratee(iteratee2), {});
+ };
+ }
+ function createMathOperation(operator, defaultValue) {
+ return function(value, other) {
+ var result2;
+ if (value === undefined2 && other === undefined2) {
+ return defaultValue;
+ }
+ if (value !== undefined2) {
+ result2 = value;
+ }
+ if (other !== undefined2) {
+ if (result2 === undefined2) {
+ return other;
+ }
+ if (typeof value == "string" || typeof other == "string") {
+ value = baseToString2(value);
+ other = baseToString2(other);
+ } else {
+ value = baseToNumber(value);
+ other = baseToNumber(other);
+ }
+ result2 = operator(value, other);
+ }
+ return result2;
+ };
+ }
+ function createOver(arrayFunc) {
+ return flatRest(function(iteratees) {
+ iteratees = arrayMap2(iteratees, baseUnary(getIteratee()));
+ return baseRest(function(args) {
+ var thisArg = this;
+ return arrayFunc(iteratees, function(iteratee2) {
+ return apply(iteratee2, thisArg, args);
+ });
+ });
+ });
+ }
+ function createPadding(length, chars) {
+ chars = chars === undefined2 ? " " : baseToString2(chars);
+ var charsLength = chars.length;
+ if (charsLength < 2) {
+ return charsLength ? baseRepeat(chars, length) : chars;
+ }
+ var result2 = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
+ return hasUnicode(chars) ? castSlice(stringToArray(result2), 0, length).join("") : result2.slice(0, length);
+ }
+ function createPartial(func, bitmask, thisArg, partials) {
+ var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func);
+ function wrapper() {
+ var argsIndex = -1, argsLength = arguments.length, leftIndex = -1, leftLength = partials.length, args = Array2(leftLength + argsLength), fn = this && this !== root3 && this instanceof wrapper ? Ctor : func;
+ while (++leftIndex < leftLength) {
+ args[leftIndex] = partials[leftIndex];
+ }
+ while (argsLength--) {
+ args[leftIndex++] = arguments[++argsIndex];
+ }
+ return apply(fn, isBind ? thisArg : this, args);
+ }
+ return wrapper;
+ }
+ function createRange(fromRight) {
+ return function(start2, end, step) {
+ if (step && typeof step != "number" && isIterateeCall(start2, end, step)) {
+ end = step = undefined2;
+ }
+ start2 = toFinite(start2);
+ if (end === undefined2) {
+ end = start2;
+ start2 = 0;
+ } else {
+ end = toFinite(end);
+ }
+ step = step === undefined2 ? start2 < end ? 1 : -1 : toFinite(step);
+ return baseRange(start2, end, step, fromRight);
+ };
+ }
+ function createRelationalOperation(operator) {
+ return function(value, other) {
+ if (!(typeof value == "string" && typeof other == "string")) {
+ value = toNumber2(value);
+ other = toNumber2(other);
+ }
+ return operator(value, other);
+ };
+ }
+ function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary2, arity) {
+ var isCurry = bitmask & WRAP_CURRY_FLAG, newHolders = isCurry ? holders : undefined2, newHoldersRight = isCurry ? undefined2 : holders, newPartials = isCurry ? partials : undefined2, newPartialsRight = isCurry ? undefined2 : partials;
+ bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG;
+ bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
+ if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
+ bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
+ }
+ var newData = [
+ func,
+ bitmask,
+ thisArg,
+ newPartials,
+ newHolders,
+ newPartialsRight,
+ newHoldersRight,
+ argPos,
+ ary2,
+ arity
+ ];
+ var result2 = wrapFunc.apply(undefined2, newData);
+ if (isLaziable(func)) {
+ setData(result2, newData);
+ }
+ result2.placeholder = placeholder;
+ return setWrapToString(result2, func, bitmask);
+ }
+ function createRound(methodName) {
+ var func = Math2[methodName];
+ return function(number3, precision2) {
+ number3 = toNumber2(number3);
+ precision2 = precision2 == null ? 0 : nativeMin2(toInteger(precision2), 292);
+ if (precision2 && nativeIsFinite(number3)) {
+ var pair2 = (toString2(number3) + "e").split("e"), value = func(pair2[0] + "e" + (+pair2[1] + precision2));
+ pair2 = (toString2(value) + "e").split("e");
+ return +(pair2[0] + "e" + (+pair2[1] - precision2));
+ }
+ return func(number3);
+ };
+ }
+ var createSet = !(Set2 && 1 / setToArray(new Set2([, -0]))[1] == INFINITY2) ? noop3 : function(values2) {
+ return new Set2(values2);
+ };
+ function createToPairs(keysFunc) {
+ return function(object) {
+ var tag = getTag(object);
+ if (tag == mapTag) {
+ return mapToArray(object);
+ }
+ if (tag == setTag) {
+ return setToPairs(object);
+ }
+ return baseToPairs(object, keysFunc(object));
+ };
+ }
+ function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary2, arity) {
+ var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
+ if (!isBindKey && typeof func != "function") {
+ throw new TypeError2(FUNC_ERROR_TEXT3);
+ }
+ var length = partials ? partials.length : 0;
+ if (!length) {
+ bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
+ partials = holders = undefined2;
+ }
+ ary2 = ary2 === undefined2 ? ary2 : nativeMax2(toInteger(ary2), 0);
+ arity = arity === undefined2 ? arity : toInteger(arity);
+ length -= holders ? holders.length : 0;
+ if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
+ var partialsRight = partials, holdersRight = holders;
+ partials = holders = undefined2;
+ }
+ var data = isBindKey ? undefined2 : getData(func);
+ var newData = [
+ func,
+ bitmask,
+ thisArg,
+ partials,
+ holders,
+ partialsRight,
+ holdersRight,
+ argPos,
+ ary2,
+ arity
+ ];
+ if (data) {
+ mergeData(newData, data);
+ }
+ func = newData[0];
+ bitmask = newData[1];
+ thisArg = newData[2];
+ partials = newData[3];
+ holders = newData[4];
+ arity = newData[9] = newData[9] === undefined2 ? isBindKey ? 0 : func.length : nativeMax2(newData[9] - length, 0);
+ if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
+ bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
+ }
+ if (!bitmask || bitmask == WRAP_BIND_FLAG) {
+ var result2 = createBind(func, bitmask, thisArg);
+ } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
+ result2 = createCurry(func, bitmask, arity);
+ } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
+ result2 = createPartial(func, bitmask, thisArg, partials);
+ } else {
+ result2 = createHybrid.apply(undefined2, newData);
+ }
+ var setter = data ? baseSetData : setData;
+ return setWrapToString(setter(result2, newData), func, bitmask);
+ }
+ function customDefaultsAssignIn(objValue, srcValue, key, object) {
+ if (objValue === undefined2 || eq(objValue, objectProto3[key]) && !hasOwnProperty2.call(object, key)) {
+ return srcValue;
+ }
+ return objValue;
+ }
+ function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
+ if (isObject2(objValue) && isObject2(srcValue)) {
+ stack.set(srcValue, objValue);
+ baseMerge(objValue, srcValue, undefined2, customDefaultsMerge, stack);
+ stack["delete"](srcValue);
+ }
+ return objValue;
+ }
+ function customOmitClone(value) {
+ return isPlainObject(value) ? undefined2 : value;
+ }
+ function equalArrays(array2, other, bitmask, customizer, equalFunc, stack) {
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array2.length, othLength = other.length;
+ if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
+ return false;
+ }
+ var arrStacked = stack.get(array2);
+ var othStacked = stack.get(other);
+ if (arrStacked && othStacked) {
+ return arrStacked == other && othStacked == array2;
+ }
+ var index = -1, result2 = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined2;
+ stack.set(array2, other);
+ stack.set(other, array2);
+ while (++index < arrLength) {
+ var arrValue = array2[index], othValue = other[index];
+ if (customizer) {
+ var compared = isPartial ? customizer(othValue, arrValue, index, other, array2, stack) : customizer(arrValue, othValue, index, array2, other, stack);
+ }
+ if (compared !== undefined2) {
+ if (compared) {
+ continue;
+ }
+ result2 = false;
+ break;
+ }
+ if (seen) {
+ if (!arraySome(other, function(othValue2, othIndex) {
+ if (!cacheHas(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) {
+ return seen.push(othIndex);
+ }
+ })) {
+ result2 = false;
+ break;
+ }
+ } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
+ result2 = false;
+ break;
+ }
+ }
+ stack["delete"](array2);
+ stack["delete"](other);
+ return result2;
+ }
+ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
+ switch (tag) {
+ case dataViewTag:
+ if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {
+ return false;
+ }
+ object = object.buffer;
+ other = other.buffer;
+ case arrayBufferTag:
+ if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array2(object), new Uint8Array2(other))) {
+ return false;
+ }
+ return true;
+ case boolTag:
+ case dateTag:
+ case numberTag:
+ return eq(+object, +other);
+ case errorTag:
+ return object.name == other.name && object.message == other.message;
+ case regexpTag:
+ case stringTag:
+ return object == other + "";
+ case mapTag:
+ var convert = mapToArray;
+ case setTag:
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
+ convert || (convert = setToArray);
+ if (object.size != other.size && !isPartial) {
+ return false;
+ }
+ var stacked = stack.get(object);
+ if (stacked) {
+ return stacked == other;
+ }
+ bitmask |= COMPARE_UNORDERED_FLAG;
+ stack.set(object, other);
+ var result2 = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
+ stack["delete"](object);
+ return result2;
+ case symbolTag2:
+ if (symbolValueOf) {
+ return symbolValueOf.call(object) == symbolValueOf.call(other);
+ }
+ }
+ return false;
+ }
+ function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length;
+ if (objLength != othLength && !isPartial) {
+ return false;
+ }
+ var index = objLength;
+ while (index--) {
+ var key = objProps[index];
+ if (!(isPartial ? key in other : hasOwnProperty2.call(other, key))) {
+ return false;
+ }
+ }
+ var objStacked = stack.get(object);
+ var othStacked = stack.get(other);
+ if (objStacked && othStacked) {
+ return objStacked == other && othStacked == object;
+ }
+ var result2 = true;
+ stack.set(object, other);
+ stack.set(other, object);
+ var skipCtor = isPartial;
+ while (++index < objLength) {
+ key = objProps[index];
+ var objValue = object[key], othValue = other[key];
+ if (customizer) {
+ var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);
+ }
+ if (!(compared === undefined2 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
+ result2 = false;
+ break;
+ }
+ skipCtor || (skipCtor = key == "constructor");
+ }
+ if (result2 && !skipCtor) {
+ var objCtor = object.constructor, othCtor = other.constructor;
+ if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) {
+ result2 = false;
+ }
+ }
+ stack["delete"](object);
+ stack["delete"](other);
+ return result2;
+ }
+ function flatRest(func) {
+ return setToString(overRest(func, undefined2, flatten2), func + "");
+ }
+ function getAllKeys(object) {
+ return baseGetAllKeys(object, keys, getSymbols);
+ }
+ function getAllKeysIn(object) {
+ return baseGetAllKeys(object, keysIn, getSymbolsIn);
+ }
+ var getData = !metaMap ? noop3 : function(func) {
+ return metaMap.get(func);
+ };
+ function getFuncName(func) {
+ var result2 = func.name + "", array2 = realNames[result2], length = hasOwnProperty2.call(realNames, result2) ? array2.length : 0;
+ while (length--) {
+ var data = array2[length], otherFunc = data.func;
+ if (otherFunc == null || otherFunc == func) {
+ return data.name;
+ }
+ }
+ return result2;
+ }
+ function getHolder(func) {
+ var object = hasOwnProperty2.call(lodash, "placeholder") ? lodash : func;
+ return object.placeholder;
+ }
+ function getIteratee() {
+ var result2 = lodash.iteratee || iteratee;
+ result2 = result2 === iteratee ? baseIteratee : result2;
+ return arguments.length ? result2(arguments[0], arguments[1]) : result2;
+ }
+ function getMapData(map3, key) {
+ var data = map3.__data__;
+ return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map;
+ }
+ function getMatchData(object) {
+ var result2 = keys(object), length = result2.length;
+ while (length--) {
+ var key = result2[length], value = object[key];
+ result2[length] = [key, value, isStrictComparable(value)];
+ }
+ return result2;
+ }
+ function getNative(object, key) {
+ var value = getValue(object, key);
+ return baseIsNative(value) ? value : undefined2;
+ }
+ function getRawTag2(value) {
+ var isOwn = hasOwnProperty2.call(value, symToStringTag3), tag = value[symToStringTag3];
+ try {
+ value[symToStringTag3] = undefined2;
+ var unmasked = true;
+ } catch (e) {
+ }
+ var result2 = nativeObjectToString3.call(value);
+ if (unmasked) {
+ if (isOwn) {
+ value[symToStringTag3] = tag;
+ } else {
+ delete value[symToStringTag3];
+ }
+ }
+ return result2;
+ }
+ var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
+ if (object == null) {
+ return [];
+ }
+ object = Object2(object);
+ return arrayFilter(nativeGetSymbols(object), function(symbol) {
+ return propertyIsEnumerable.call(object, symbol);
+ });
+ };
+ var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
+ var result2 = [];
+ while (object) {
+ arrayPush(result2, getSymbols(object));
+ object = getPrototype(object);
+ }
+ return result2;
+ };
+ var getTag = baseGetTag2;
+ if (DataView2 && getTag(new DataView2(new ArrayBuffer(1))) != dataViewTag || Map2 && getTag(new Map2()) != mapTag || Promise2 && getTag(Promise2.resolve()) != promiseTag || Set2 && getTag(new Set2()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) {
+ getTag = function(value) {
+ var result2 = baseGetTag2(value), Ctor = result2 == objectTag ? value.constructor : undefined2, ctorString = Ctor ? toSource(Ctor) : "";
+ if (ctorString) {
+ switch (ctorString) {
+ case dataViewCtorString:
+ return dataViewTag;
+ case mapCtorString:
+ return mapTag;
+ case promiseCtorString:
+ return promiseTag;
+ case setCtorString:
+ return setTag;
+ case weakMapCtorString:
+ return weakMapTag;
+ }
+ }
+ return result2;
+ };
+ }
+ function getView(start2, end, transforms) {
+ var index = -1, length = transforms.length;
+ while (++index < length) {
+ var data = transforms[index], size2 = data.size;
+ switch (data.type) {
+ case "drop":
+ start2 += size2;
+ break;
+ case "dropRight":
+ end -= size2;
+ break;
+ case "take":
+ end = nativeMin2(end, start2 + size2);
+ break;
+ case "takeRight":
+ start2 = nativeMax2(start2, end - size2);
+ break;
+ }
+ }
+ return { "start": start2, "end": end };
+ }
+ function getWrapDetails(source) {
+ var match = source.match(reWrapDetails);
+ return match ? match[1].split(reSplitDetails) : [];
+ }
+ function hasPath(object, path, hasFunc) {
+ path = castPath(path, object);
+ var index = -1, length = path.length, result2 = false;
+ while (++index < length) {
+ var key = toKey(path[index]);
+ if (!(result2 = object != null && hasFunc(object, key))) {
+ break;
+ }
+ object = object[key];
+ }
+ if (result2 || ++index != length) {
+ return result2;
+ }
+ length = object == null ? 0 : object.length;
+ return !!length && isLength(length) && isIndex(key, length) && (isArray2(object) || isArguments(object));
+ }
+ function initCloneArray(array2) {
+ var length = array2.length, result2 = new array2.constructor(length);
+ if (length && typeof array2[0] == "string" && hasOwnProperty2.call(array2, "index")) {
+ result2.index = array2.index;
+ result2.input = array2.input;
+ }
+ return result2;
+ }
+ function initCloneObject(object) {
+ return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {};
+ }
+ function initCloneByTag(object, tag, isDeep) {
+ var Ctor = object.constructor;
+ switch (tag) {
+ case arrayBufferTag:
+ return cloneArrayBuffer(object);
+ case boolTag:
+ case dateTag:
+ return new Ctor(+object);
+ case dataViewTag:
+ return cloneDataView(object, isDeep);
+ case float32Tag:
+ case float64Tag:
+ case int8Tag:
+ case int16Tag:
+ case int32Tag:
+ case uint8Tag:
+ case uint8ClampedTag:
+ case uint16Tag:
+ case uint32Tag:
+ return cloneTypedArray(object, isDeep);
+ case mapTag:
+ return new Ctor();
+ case numberTag:
+ case stringTag:
+ return new Ctor(object);
+ case regexpTag:
+ return cloneRegExp(object);
+ case setTag:
+ return new Ctor();
+ case symbolTag2:
+ return cloneSymbol(object);
+ }
+ }
+ function insertWrapDetails(source, details) {
+ var length = details.length;
+ if (!length) {
+ return source;
+ }
+ var lastIndex = length - 1;
+ details[lastIndex] = (length > 1 ? "& " : "") + details[lastIndex];
+ details = details.join(length > 2 ? ", " : " ");
+ return source.replace(reWrapComment, "{\n/* [wrapped with " + details + "] */\n");
+ }
+ function isFlattenable(value) {
+ return isArray2(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);
+ }
+ function isIndex(value, length) {
+ var type3 = typeof value;
+ length = length == null ? MAX_SAFE_INTEGER : length;
+ return !!length && (type3 == "number" || type3 != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
+ }
+ function isIterateeCall(value, index, object) {
+ if (!isObject2(object)) {
+ return false;
+ }
+ var type3 = typeof index;
+ if (type3 == "number" ? isArrayLike(object) && isIndex(index, object.length) : type3 == "string" && index in object) {
+ return eq(object[index], value);
+ }
+ return false;
+ }
+ function isKey(value, object) {
+ if (isArray2(value)) {
+ return false;
+ }
+ var type3 = typeof value;
+ if (type3 == "number" || type3 == "symbol" || type3 == "boolean" || value == null || isSymbol2(value)) {
+ return true;
+ }
+ return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object2(object);
+ }
+ function isKeyable(value) {
+ var type3 = typeof value;
+ return type3 == "string" || type3 == "number" || type3 == "symbol" || type3 == "boolean" ? value !== "__proto__" : value === null;
+ }
+ function isLaziable(func) {
+ var funcName = getFuncName(func), other = lodash[funcName];
+ if (typeof other != "function" || !(funcName in LazyWrapper.prototype)) {
+ return false;
+ }
+ if (func === other) {
+ return true;
+ }
+ var data = getData(other);
+ return !!data && func === data[0];
+ }
+ function isMasked(func) {
+ return !!maskSrcKey && maskSrcKey in func;
+ }
+ var isMaskable = coreJsData ? isFunction : stubFalse;
+ function isPrototype(value) {
+ var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto3;
+ return value === proto;
+ }
+ function isStrictComparable(value) {
+ return value === value && !isObject2(value);
+ }
+ function matchesStrictComparable(key, srcValue) {
+ return function(object) {
+ if (object == null) {
+ return false;
+ }
+ return object[key] === srcValue && (srcValue !== undefined2 || key in Object2(object));
+ };
+ }
+ function memoizeCapped(func) {
+ var result2 = memoize(func, function(key) {
+ if (cache.size === MAX_MEMOIZE_SIZE) {
+ cache.clear();
+ }
+ return key;
+ });
+ var cache = result2.cache;
+ return result2;
+ }
+ function mergeData(data, source) {
+ var bitmask = data[1], srcBitmask = source[1], newBitmask = bitmask | srcBitmask, isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
+ var isCombo = srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG || srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_REARG_FLAG && data[7].length <= source[8] || srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && source[7].length <= source[8] && bitmask == WRAP_CURRY_FLAG;
+ if (!(isCommon || isCombo)) {
+ return data;
+ }
+ if (srcBitmask & WRAP_BIND_FLAG) {
+ data[2] = source[2];
+ newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
+ }
+ var value = source[3];
+ if (value) {
+ var partials = data[3];
+ data[3] = partials ? composeArgs(partials, value, source[4]) : value;
+ data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
+ }
+ value = source[5];
+ if (value) {
+ partials = data[5];
+ data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
+ data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
+ }
+ value = source[7];
+ if (value) {
+ data[7] = value;
+ }
+ if (srcBitmask & WRAP_ARY_FLAG) {
+ data[8] = data[8] == null ? source[8] : nativeMin2(data[8], source[8]);
+ }
+ if (data[9] == null) {
+ data[9] = source[9];
+ }
+ data[0] = source[0];
+ data[1] = newBitmask;
+ return data;
+ }
+ function nativeKeysIn(object) {
+ var result2 = [];
+ if (object != null) {
+ for (var key in Object2(object)) {
+ result2.push(key);
+ }
+ }
+ return result2;
+ }
+ function objectToString2(value) {
+ return nativeObjectToString3.call(value);
+ }
+ function overRest(func, start2, transform3) {
+ start2 = nativeMax2(start2 === undefined2 ? func.length - 1 : start2, 0);
+ return function() {
+ var args = arguments, index = -1, length = nativeMax2(args.length - start2, 0), array2 = Array2(length);
+ while (++index < length) {
+ array2[index] = args[start2 + index];
+ }
+ index = -1;
+ var otherArgs = Array2(start2 + 1);
+ while (++index < start2) {
+ otherArgs[index] = args[index];
+ }
+ otherArgs[start2] = transform3(array2);
+ return apply(func, this, otherArgs);
+ };
+ }
+ function parent(object, path) {
+ return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
+ }
+ function reorder(array2, indexes) {
+ var arrLength = array2.length, length = nativeMin2(indexes.length, arrLength), oldArray = copyArray(array2);
+ while (length--) {
+ var index = indexes[length];
+ array2[length] = isIndex(index, arrLength) ? oldArray[index] : undefined2;
+ }
+ return array2;
+ }
+ function safeGet(object, key) {
+ if (key === "constructor" && typeof object[key] === "function") {
+ return;
+ }
+ if (key == "__proto__") {
+ return;
+ }
+ return object[key];
+ }
+ var setData = shortOut(baseSetData);
+ var setTimeout2 = ctxSetTimeout || function(func, wait) {
+ return root3.setTimeout(func, wait);
+ };
+ var setToString = shortOut(baseSetToString);
+ function setWrapToString(wrapper, reference, bitmask) {
+ var source = reference + "";
+ return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
+ }
+ function shortOut(func) {
+ var count = 0, lastCalled = 0;
+ return function() {
+ var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled);
+ lastCalled = stamp;
+ if (remaining > 0) {
+ if (++count >= HOT_COUNT) {
+ return arguments[0];
+ }
+ } else {
+ count = 0;
+ }
+ return func.apply(undefined2, arguments);
+ };
+ }
+ function shuffleSelf(array2, size2) {
+ var index = -1, length = array2.length, lastIndex = length - 1;
+ size2 = size2 === undefined2 ? length : size2;
+ while (++index < size2) {
+ var rand = baseRandom(index, lastIndex), value = array2[rand];
+ array2[rand] = array2[index];
+ array2[index] = value;
+ }
+ array2.length = size2;
+ return array2;
+ }
+ var stringToPath = memoizeCapped(function(string) {
+ var result2 = [];
+ if (string.charCodeAt(0) === 46) {
+ result2.push("");
+ }
+ string.replace(rePropName, function(match, number3, quote2, subString) {
+ result2.push(quote2 ? subString.replace(reEscapeChar, "$1") : number3 || match);
+ });
+ return result2;
+ });
+ function toKey(value) {
+ if (typeof value == "string" || isSymbol2(value)) {
+ return value;
+ }
+ var result2 = value + "";
+ return result2 == "0" && 1 / value == -INFINITY2 ? "-0" : result2;
+ }
+ function toSource(func) {
+ if (func != null) {
+ try {
+ return funcToString.call(func);
+ } catch (e) {
+ }
+ try {
+ return func + "";
+ } catch (e) {
+ }
+ }
+ return "";
+ }
+ function updateWrapDetails(details, bitmask) {
+ arrayEach(wrapFlags, function(pair2) {
+ var value = "_." + pair2[0];
+ if (bitmask & pair2[1] && !arrayIncludes(details, value)) {
+ details.push(value);
+ }
+ });
+ return details.sort();
+ }
+ function wrapperClone(wrapper) {
+ if (wrapper instanceof LazyWrapper) {
+ return wrapper.clone();
+ }
+ var result2 = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
+ result2.__actions__ = copyArray(wrapper.__actions__);
+ result2.__index__ = wrapper.__index__;
+ result2.__values__ = wrapper.__values__;
+ return result2;
+ }
+ function chunk(array2, size2, guard) {
+ if (guard ? isIterateeCall(array2, size2, guard) : size2 === undefined2) {
+ size2 = 1;
+ } else {
+ size2 = nativeMax2(toInteger(size2), 0);
+ }
+ var length = array2 == null ? 0 : array2.length;
+ if (!length || size2 < 1) {
+ return [];
+ }
+ var index = 0, resIndex = 0, result2 = Array2(nativeCeil(length / size2));
+ while (index < length) {
+ result2[resIndex++] = baseSlice(array2, index, index += size2);
+ }
+ return result2;
+ }
+ function compact(array2) {
+ var index = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result2 = [];
+ while (++index < length) {
+ var value = array2[index];
+ if (value) {
+ result2[resIndex++] = value;
+ }
+ }
+ return result2;
+ }
+ function concat() {
+ var length = arguments.length;
+ if (!length) {
+ return [];
+ }
+ var args = Array2(length - 1), array2 = arguments[0], index = length;
+ while (index--) {
+ args[index - 1] = arguments[index];
+ }
+ return arrayPush(isArray2(array2) ? copyArray(array2) : [array2], baseFlatten(args, 1));
+ }
+ var difference = baseRest(function(array2, values2) {
+ return isArrayLikeObject(array2) ? baseDifference(array2, baseFlatten(values2, 1, isArrayLikeObject, true)) : [];
+ });
+ var differenceBy = baseRest(function(array2, values2) {
+ var iteratee2 = last(values2);
+ if (isArrayLikeObject(iteratee2)) {
+ iteratee2 = undefined2;
+ }
+ return isArrayLikeObject(array2) ? baseDifference(array2, baseFlatten(values2, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)) : [];
+ });
+ var differenceWith = baseRest(function(array2, values2) {
+ var comparator = last(values2);
+ if (isArrayLikeObject(comparator)) {
+ comparator = undefined2;
+ }
+ return isArrayLikeObject(array2) ? baseDifference(array2, baseFlatten(values2, 1, isArrayLikeObject, true), undefined2, comparator) : [];
+ });
+ function drop(array2, n2, guard) {
+ var length = array2 == null ? 0 : array2.length;
+ if (!length) {
+ return [];
+ }
+ n2 = guard || n2 === undefined2 ? 1 : toInteger(n2);
+ return baseSlice(array2, n2 < 0 ? 0 : n2, length);
+ }
+ function dropRight(array2, n2, guard) {
+ var length = array2 == null ? 0 : array2.length;
+ if (!length) {
+ return [];
+ }
+ n2 = guard || n2 === undefined2 ? 1 : toInteger(n2);
+ n2 = length - n2;
+ return baseSlice(array2, 0, n2 < 0 ? 0 : n2);
+ }
+ function dropRightWhile(array2, predicate) {
+ return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3), true, true) : [];
+ }
+ function dropWhile(array2, predicate) {
+ return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3), true) : [];
+ }
+ function fill(array2, value, start2, end) {
+ var length = array2 == null ? 0 : array2.length;
+ if (!length) {
+ return [];
+ }
+ if (start2 && typeof start2 != "number" && isIterateeCall(array2, value, start2)) {
+ start2 = 0;
+ end = length;
+ }
+ return baseFill(array2, value, start2, end);
+ }
+ function findIndex(array2, predicate, fromIndex) {
+ var length = array2 == null ? 0 : array2.length;
+ if (!length) {
+ return -1;
+ }
+ var index = fromIndex == null ? 0 : toInteger(fromIndex);
+ if (index < 0) {
+ index = nativeMax2(length + index, 0);
+ }
+ return baseFindIndex(array2, getIteratee(predicate, 3), index);
+ }
+ function findLastIndex(array2, predicate, fromIndex) {
+ var length = array2 == null ? 0 : array2.length;
+ if (!length) {
+ return -1;
+ }
+ var index = length - 1;
+ if (fromIndex !== undefined2) {
+ index = toInteger(fromIndex);
+ index = fromIndex < 0 ? nativeMax2(length + index, 0) : nativeMin2(index, length - 1);
+ }
+ return baseFindIndex(array2, getIteratee(predicate, 3), index, true);
+ }
+ function flatten2(array2) {
+ var length = array2 == null ? 0 : array2.length;
+ return length ? baseFlatten(array2, 1) : [];
+ }
+ function flattenDeep(array2) {
+ var length = array2 == null ? 0 : array2.length;
+ return length ? baseFlatten(array2, INFINITY2) : [];
+ }
+ function flattenDepth(array2, depth) {
+ var length = array2 == null ? 0 : array2.length;
+ if (!length) {
+ return [];
+ }
+ depth = depth === undefined2 ? 1 : toInteger(depth);
+ return baseFlatten(array2, depth);
+ }
+ function fromPairs(pairs) {
+ var index = -1, length = pairs == null ? 0 : pairs.length, result2 = {};
+ while (++index < length) {
+ var pair2 = pairs[index];
+ result2[pair2[0]] = pair2[1];
+ }
+ return result2;
+ }
+ function head(array2) {
+ return array2 && array2.length ? array2[0] : undefined2;
+ }
+ function indexOf(array2, value, fromIndex) {
+ var length = array2 == null ? 0 : array2.length;
+ if (!length) {
+ return -1;
+ }
+ var index = fromIndex == null ? 0 : toInteger(fromIndex);
+ if (index < 0) {
+ index = nativeMax2(length + index, 0);
+ }
+ return baseIndexOf(array2, value, index);
+ }
+ function initial(array2) {
+ var length = array2 == null ? 0 : array2.length;
+ return length ? baseSlice(array2, 0, -1) : [];
+ }
+ var intersection = baseRest(function(arrays) {
+ var mapped = arrayMap2(arrays, castArrayLikeObject);
+ return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : [];
+ });
+ var intersectionBy = baseRest(function(arrays) {
+ var iteratee2 = last(arrays), mapped = arrayMap2(arrays, castArrayLikeObject);
+ if (iteratee2 === last(mapped)) {
+ iteratee2 = undefined2;
+ } else {
+ mapped.pop();
+ }
+ return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee2, 2)) : [];
+ });
+ var intersectionWith = baseRest(function(arrays) {
+ var comparator = last(arrays), mapped = arrayMap2(arrays, castArrayLikeObject);
+ comparator = typeof comparator == "function" ? comparator : undefined2;
+ if (comparator) {
+ mapped.pop();
+ }
+ return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : [];
+ });
+ function join(array2, separator) {
+ return array2 == null ? "" : nativeJoin.call(array2, separator);
+ }
+ function last(array2) {
+ var length = array2 == null ? 0 : array2.length;
+ return length ? array2[length - 1] : undefined2;
+ }
+ function lastIndexOf(array2, value, fromIndex) {
+ var length = array2 == null ? 0 : array2.length;
+ if (!length) {
+ return -1;
+ }
+ var index = length;
+ if (fromIndex !== undefined2) {
+ index = toInteger(fromIndex);
+ index = index < 0 ? nativeMax2(length + index, 0) : nativeMin2(index, length - 1);
+ }
+ return value === value ? strictLastIndexOf(array2, value, index) : baseFindIndex(array2, baseIsNaN, index, true);
+ }
+ function nth(array2, n2) {
+ return array2 && array2.length ? baseNth(array2, toInteger(n2)) : undefined2;
+ }
+ var pull = baseRest(pullAll);
+ function pullAll(array2, values2) {
+ return array2 && array2.length && values2 && values2.length ? basePullAll(array2, values2) : array2;
+ }
+ function pullAllBy(array2, values2, iteratee2) {
+ return array2 && array2.length && values2 && values2.length ? basePullAll(array2, values2, getIteratee(iteratee2, 2)) : array2;
+ }
+ function pullAllWith(array2, values2, comparator) {
+ return array2 && array2.length && values2 && values2.length ? basePullAll(array2, values2, undefined2, comparator) : array2;
+ }
+ var pullAt = flatRest(function(array2, indexes) {
+ var length = array2 == null ? 0 : array2.length, result2 = baseAt(array2, indexes);
+ basePullAt(array2, arrayMap2(indexes, function(index) {
+ return isIndex(index, length) ? +index : index;
+ }).sort(compareAscending));
+ return result2;
+ });
+ function remove2(array2, predicate) {
+ var result2 = [];
+ if (!(array2 && array2.length)) {
+ return result2;
+ }
+ var index = -1, indexes = [], length = array2.length;
+ predicate = getIteratee(predicate, 3);
+ while (++index < length) {
+ var value = array2[index];
+ if (predicate(value, index, array2)) {
+ result2.push(value);
+ indexes.push(index);
+ }
+ }
+ basePullAt(array2, indexes);
+ return result2;
+ }
+ function reverse(array2) {
+ return array2 == null ? array2 : nativeReverse.call(array2);
+ }
+ function slice(array2, start2, end) {
+ var length = array2 == null ? 0 : array2.length;
+ if (!length) {
+ return [];
+ }
+ if (end && typeof end != "number" && isIterateeCall(array2, start2, end)) {
+ start2 = 0;
+ end = length;
+ } else {
+ start2 = start2 == null ? 0 : toInteger(start2);
+ end = end === undefined2 ? length : toInteger(end);
+ }
+ return baseSlice(array2, start2, end);
+ }
+ function sortedIndex(array2, value) {
+ return baseSortedIndex(array2, value);
+ }
+ function sortedIndexBy(array2, value, iteratee2) {
+ return baseSortedIndexBy(array2, value, getIteratee(iteratee2, 2));
+ }
+ function sortedIndexOf(array2, value) {
+ var length = array2 == null ? 0 : array2.length;
+ if (length) {
+ var index = baseSortedIndex(array2, value);
+ if (index < length && eq(array2[index], value)) {
+ return index;
+ }
+ }
+ return -1;
+ }
+ function sortedLastIndex(array2, value) {
+ return baseSortedIndex(array2, value, true);
+ }
+ function sortedLastIndexBy(array2, value, iteratee2) {
+ return baseSortedIndexBy(array2, value, getIteratee(iteratee2, 2), true);
+ }
+ function sortedLastIndexOf(array2, value) {
+ var length = array2 == null ? 0 : array2.length;
+ if (length) {
+ var index = baseSortedIndex(array2, value, true) - 1;
+ if (eq(array2[index], value)) {
+ return index;
+ }
+ }
+ return -1;
+ }
+ function sortedUniq(array2) {
+ return array2 && array2.length ? baseSortedUniq(array2) : [];
+ }
+ function sortedUniqBy(array2, iteratee2) {
+ return array2 && array2.length ? baseSortedUniq(array2, getIteratee(iteratee2, 2)) : [];
+ }
+ function tail(array2) {
+ var length = array2 == null ? 0 : array2.length;
+ return length ? baseSlice(array2, 1, length) : [];
+ }
+ function take(array2, n2, guard) {
+ if (!(array2 && array2.length)) {
+ return [];
+ }
+ n2 = guard || n2 === undefined2 ? 1 : toInteger(n2);
+ return baseSlice(array2, 0, n2 < 0 ? 0 : n2);
+ }
+ function takeRight(array2, n2, guard) {
+ var length = array2 == null ? 0 : array2.length;
+ if (!length) {
+ return [];
+ }
+ n2 = guard || n2 === undefined2 ? 1 : toInteger(n2);
+ n2 = length - n2;
+ return baseSlice(array2, n2 < 0 ? 0 : n2, length);
+ }
+ function takeRightWhile(array2, predicate) {
+ return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3), false, true) : [];
+ }
+ function takeWhile(array2, predicate) {
+ return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3)) : [];
+ }
+ var union = baseRest(function(arrays) {
+ return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
+ });
+ var unionBy = baseRest(function(arrays) {
+ var iteratee2 = last(arrays);
+ if (isArrayLikeObject(iteratee2)) {
+ iteratee2 = undefined2;
+ }
+ return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2));
+ });
+ var unionWith = baseRest(function(arrays) {
+ var comparator = last(arrays);
+ comparator = typeof comparator == "function" ? comparator : undefined2;
+ return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined2, comparator);
+ });
+ function uniq(array2) {
+ return array2 && array2.length ? baseUniq(array2) : [];
+ }
+ function uniqBy(array2, iteratee2) {
+ return array2 && array2.length ? baseUniq(array2, getIteratee(iteratee2, 2)) : [];
+ }
+ function uniqWith(array2, comparator) {
+ comparator = typeof comparator == "function" ? comparator : undefined2;
+ return array2 && array2.length ? baseUniq(array2, undefined2, comparator) : [];
+ }
+ function unzip(array2) {
+ if (!(array2 && array2.length)) {
+ return [];
+ }
+ var length = 0;
+ array2 = arrayFilter(array2, function(group) {
+ if (isArrayLikeObject(group)) {
+ length = nativeMax2(group.length, length);
+ return true;
+ }
+ });
+ return baseTimes(length, function(index) {
+ return arrayMap2(array2, baseProperty(index));
+ });
+ }
+ function unzipWith(array2, iteratee2) {
+ if (!(array2 && array2.length)) {
+ return [];
+ }
+ var result2 = unzip(array2);
+ if (iteratee2 == null) {
+ return result2;
+ }
+ return arrayMap2(result2, function(group) {
+ return apply(iteratee2, undefined2, group);
+ });
+ }
+ var without = baseRest(function(array2, values2) {
+ return isArrayLikeObject(array2) ? baseDifference(array2, values2) : [];
+ });
+ var xor = baseRest(function(arrays) {
+ return baseXor(arrayFilter(arrays, isArrayLikeObject));
+ });
+ var xorBy = baseRest(function(arrays) {
+ var iteratee2 = last(arrays);
+ if (isArrayLikeObject(iteratee2)) {
+ iteratee2 = undefined2;
+ }
+ return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee2, 2));
+ });
+ var xorWith = baseRest(function(arrays) {
+ var comparator = last(arrays);
+ comparator = typeof comparator == "function" ? comparator : undefined2;
+ return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined2, comparator);
+ });
+ var zip = baseRest(unzip);
+ function zipObject(props, values2) {
+ return baseZipObject(props || [], values2 || [], assignValue);
+ }
+ function zipObjectDeep(props, values2) {
+ return baseZipObject(props || [], values2 || [], baseSet);
+ }
+ var zipWith = baseRest(function(arrays) {
+ var length = arrays.length, iteratee2 = length > 1 ? arrays[length - 1] : undefined2;
+ iteratee2 = typeof iteratee2 == "function" ? (arrays.pop(), iteratee2) : undefined2;
+ return unzipWith(arrays, iteratee2);
+ });
+ function chain(value) {
+ var result2 = lodash(value);
+ result2.__chain__ = true;
+ return result2;
+ }
+ function tap(value, interceptor) {
+ interceptor(value);
+ return value;
+ }
+ function thru(value, interceptor) {
+ return interceptor(value);
+ }
+ var wrapperAt = flatRest(function(paths) {
+ var length = paths.length, start2 = length ? paths[0] : 0, value = this.__wrapped__, interceptor = function(object) {
+ return baseAt(object, paths);
+ };
+ if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start2)) {
+ return this.thru(interceptor);
+ }
+ value = value.slice(start2, +start2 + (length ? 1 : 0));
+ value.__actions__.push({
+ "func": thru,
+ "args": [interceptor],
+ "thisArg": undefined2
+ });
+ return new LodashWrapper(value, this.__chain__).thru(function(array2) {
+ if (length && !array2.length) {
+ array2.push(undefined2);
+ }
+ return array2;
+ });
+ });
+ function wrapperChain() {
+ return chain(this);
+ }
+ function wrapperCommit() {
+ return new LodashWrapper(this.value(), this.__chain__);
+ }
+ function wrapperNext() {
+ if (this.__values__ === undefined2) {
+ this.__values__ = toArray(this.value());
+ }
+ var done = this.__index__ >= this.__values__.length, value = done ? undefined2 : this.__values__[this.__index__++];
+ return { "done": done, "value": value };
+ }
+ function wrapperToIterator() {
+ return this;
+ }
+ function wrapperPlant(value) {
+ var result2, parent2 = this;
+ while (parent2 instanceof baseLodash) {
+ var clone2 = wrapperClone(parent2);
+ clone2.__index__ = 0;
+ clone2.__values__ = undefined2;
+ if (result2) {
+ previous.__wrapped__ = clone2;
+ } else {
+ result2 = clone2;
+ }
+ var previous = clone2;
+ parent2 = parent2.__wrapped__;
+ }
+ previous.__wrapped__ = value;
+ return result2;
+ }
+ function wrapperReverse() {
+ var value = this.__wrapped__;
+ if (value instanceof LazyWrapper) {
+ var wrapped = value;
+ if (this.__actions__.length) {
+ wrapped = new LazyWrapper(this);
+ }
+ wrapped = wrapped.reverse();
+ wrapped.__actions__.push({
+ "func": thru,
+ "args": [reverse],
+ "thisArg": undefined2
+ });
+ return new LodashWrapper(wrapped, this.__chain__);
+ }
+ return this.thru(reverse);
+ }
+ function wrapperValue() {
+ return baseWrapperValue(this.__wrapped__, this.__actions__);
+ }
+ var countBy = createAggregator(function(result2, value, key) {
+ if (hasOwnProperty2.call(result2, key)) {
+ ++result2[key];
+ } else {
+ baseAssignValue(result2, key, 1);
+ }
+ });
+ function every(collection, predicate, guard) {
+ var func = isArray2(collection) ? arrayEvery : baseEvery;
+ if (guard && isIterateeCall(collection, predicate, guard)) {
+ predicate = undefined2;
+ }
+ return func(collection, getIteratee(predicate, 3));
+ }
+ function filter2(collection, predicate) {
+ var func = isArray2(collection) ? arrayFilter : baseFilter;
+ return func(collection, getIteratee(predicate, 3));
+ }
+ var find2 = createFind(findIndex);
+ var findLast = createFind(findLastIndex);
+ function flatMap(collection, iteratee2) {
+ return baseFlatten(map2(collection, iteratee2), 1);
+ }
+ function flatMapDeep(collection, iteratee2) {
+ return baseFlatten(map2(collection, iteratee2), INFINITY2);
+ }
+ function flatMapDepth(collection, iteratee2, depth) {
+ depth = depth === undefined2 ? 1 : toInteger(depth);
+ return baseFlatten(map2(collection, iteratee2), depth);
+ }
+ function forEach(collection, iteratee2) {
+ var func = isArray2(collection) ? arrayEach : baseEach;
+ return func(collection, getIteratee(iteratee2, 3));
+ }
+ function forEachRight(collection, iteratee2) {
+ var func = isArray2(collection) ? arrayEachRight : baseEachRight;
+ return func(collection, getIteratee(iteratee2, 3));
+ }
+ var groupBy = createAggregator(function(result2, value, key) {
+ if (hasOwnProperty2.call(result2, key)) {
+ result2[key].push(value);
+ } else {
+ baseAssignValue(result2, key, [value]);
+ }
+ });
+ function includes(collection, value, fromIndex, guard) {
+ collection = isArrayLike(collection) ? collection : values(collection);
+ fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
+ var length = collection.length;
+ if (fromIndex < 0) {
+ fromIndex = nativeMax2(length + fromIndex, 0);
+ }
+ return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
+ }
+ var invokeMap = baseRest(function(collection, path, args) {
+ var index = -1, isFunc = typeof path == "function", result2 = isArrayLike(collection) ? Array2(collection.length) : [];
+ baseEach(collection, function(value) {
+ result2[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
+ });
+ return result2;
+ });
+ var keyBy = createAggregator(function(result2, value, key) {
+ baseAssignValue(result2, key, value);
+ });
+ function map2(collection, iteratee2) {
+ var func = isArray2(collection) ? arrayMap2 : baseMap;
+ return func(collection, getIteratee(iteratee2, 3));
+ }
+ function orderBy(collection, iteratees, orders, guard) {
+ if (collection == null) {
+ return [];
+ }
+ if (!isArray2(iteratees)) {
+ iteratees = iteratees == null ? [] : [iteratees];
+ }
+ orders = guard ? undefined2 : orders;
+ if (!isArray2(orders)) {
+ orders = orders == null ? [] : [orders];
+ }
+ return baseOrderBy(collection, iteratees, orders);
+ }
+ var partition = createAggregator(function(result2, value, key) {
+ result2[key ? 0 : 1].push(value);
+ }, function() {
+ return [[], []];
+ });
+ function reduce(collection, iteratee2, accumulator) {
+ var func = isArray2(collection) ? arrayReduce : baseReduce, initAccum = arguments.length < 3;
+ return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEach);
+ }
+ function reduceRight(collection, iteratee2, accumulator) {
+ var func = isArray2(collection) ? arrayReduceRight : baseReduce, initAccum = arguments.length < 3;
+ return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEachRight);
+ }
+ function reject(collection, predicate) {
+ var func = isArray2(collection) ? arrayFilter : baseFilter;
+ return func(collection, negate(getIteratee(predicate, 3)));
+ }
+ function sample(collection) {
+ var func = isArray2(collection) ? arraySample : baseSample;
+ return func(collection);
+ }
+ function sampleSize(collection, n2, guard) {
+ if (guard ? isIterateeCall(collection, n2, guard) : n2 === undefined2) {
+ n2 = 1;
+ } else {
+ n2 = toInteger(n2);
+ }
+ var func = isArray2(collection) ? arraySampleSize : baseSampleSize;
+ return func(collection, n2);
+ }
+ function shuffle(collection) {
+ var func = isArray2(collection) ? arrayShuffle : baseShuffle;
+ return func(collection);
+ }
+ function size(collection) {
+ if (collection == null) {
+ return 0;
+ }
+ if (isArrayLike(collection)) {
+ return isString(collection) ? stringSize(collection) : collection.length;
+ }
+ var tag = getTag(collection);
+ if (tag == mapTag || tag == setTag) {
+ return collection.size;
+ }
+ return baseKeys(collection).length;
+ }
+ function some(collection, predicate, guard) {
+ var func = isArray2(collection) ? arraySome : baseSome;
+ if (guard && isIterateeCall(collection, predicate, guard)) {
+ predicate = undefined2;
+ }
+ return func(collection, getIteratee(predicate, 3));
+ }
+ var sortBy = baseRest(function(collection, iteratees) {
+ if (collection == null) {
+ return [];
+ }
+ var length = iteratees.length;
+ if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
+ iteratees = [];
+ } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
+ iteratees = [iteratees[0]];
+ }
+ return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
+ });
+ var now3 = ctxNow || function() {
+ return root3.Date.now();
+ };
+ function after(n2, func) {
+ if (typeof func != "function") {
+ throw new TypeError2(FUNC_ERROR_TEXT3);
+ }
+ n2 = toInteger(n2);
+ return function() {
+ if (--n2 < 1) {
+ return func.apply(this, arguments);
+ }
+ };
+ }
+ function ary(func, n2, guard) {
+ n2 = guard ? undefined2 : n2;
+ n2 = func && n2 == null ? func.length : n2;
+ return createWrap(func, WRAP_ARY_FLAG, undefined2, undefined2, undefined2, undefined2, n2);
+ }
+ function before(n2, func) {
+ var result2;
+ if (typeof func != "function") {
+ throw new TypeError2(FUNC_ERROR_TEXT3);
+ }
+ n2 = toInteger(n2);
+ return function() {
+ if (--n2 > 0) {
+ result2 = func.apply(this, arguments);
+ }
+ if (n2 <= 1) {
+ func = undefined2;
+ }
+ return result2;
+ };
+ }
+ var bind = baseRest(function(func, thisArg, partials) {
+ var bitmask = WRAP_BIND_FLAG;
+ if (partials.length) {
+ var holders = replaceHolders(partials, getHolder(bind));
+ bitmask |= WRAP_PARTIAL_FLAG;
+ }
+ return createWrap(func, bitmask, thisArg, partials, holders);
+ });
+ var bindKey2 = baseRest(function(object, key, partials) {
+ var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
+ if (partials.length) {
+ var holders = replaceHolders(partials, getHolder(bindKey2));
+ bitmask |= WRAP_PARTIAL_FLAG;
+ }
+ return createWrap(key, bitmask, object, partials, holders);
+ });
+ function curry(func, arity, guard) {
+ arity = guard ? undefined2 : arity;
+ var result2 = createWrap(func, WRAP_CURRY_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity);
+ result2.placeholder = curry.placeholder;
+ return result2;
+ }
+ function curryRight(func, arity, guard) {
+ arity = guard ? undefined2 : arity;
+ var result2 = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity);
+ result2.placeholder = curryRight.placeholder;
+ return result2;
+ }
+ function debounce2(func, wait, options2) {
+ var lastArgs, lastThis, maxWait, result2, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
+ if (typeof func != "function") {
+ throw new TypeError2(FUNC_ERROR_TEXT3);
+ }
+ wait = toNumber2(wait) || 0;
+ if (isObject2(options2)) {
+ leading = !!options2.leading;
+ maxing = "maxWait" in options2;
+ maxWait = maxing ? nativeMax2(toNumber2(options2.maxWait) || 0, wait) : maxWait;
+ trailing = "trailing" in options2 ? !!options2.trailing : trailing;
+ }
+ function invokeFunc(time) {
+ var args = lastArgs, thisArg = lastThis;
+ lastArgs = lastThis = undefined2;
+ lastInvokeTime = time;
+ result2 = func.apply(thisArg, args);
+ return result2;
+ }
+ function leadingEdge(time) {
+ lastInvokeTime = time;
+ timerId = setTimeout2(timerExpired, wait);
+ return leading ? invokeFunc(time) : result2;
+ }
+ function remainingWait(time) {
+ var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
+ return maxing ? nativeMin2(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
+ }
+ function shouldInvoke(time) {
+ var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
+ return lastCallTime === undefined2 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
+ }
+ function timerExpired() {
+ var time = now3();
+ if (shouldInvoke(time)) {
+ return trailingEdge(time);
+ }
+ timerId = setTimeout2(timerExpired, remainingWait(time));
+ }
+ function trailingEdge(time) {
+ timerId = undefined2;
+ if (trailing && lastArgs) {
+ return invokeFunc(time);
+ }
+ lastArgs = lastThis = undefined2;
+ return result2;
+ }
+ function cancel() {
+ if (timerId !== undefined2) {
+ clearTimeout2(timerId);
+ }
+ lastInvokeTime = 0;
+ lastArgs = lastCallTime = lastThis = timerId = undefined2;
+ }
+ function flush() {
+ return timerId === undefined2 ? result2 : trailingEdge(now3());
+ }
+ function debounced() {
+ var time = now3(), isInvoking = shouldInvoke(time);
+ lastArgs = arguments;
+ lastThis = this;
+ lastCallTime = time;
+ if (isInvoking) {
+ if (timerId === undefined2) {
+ return leadingEdge(lastCallTime);
+ }
+ if (maxing) {
+ clearTimeout2(timerId);
+ timerId = setTimeout2(timerExpired, wait);
+ return invokeFunc(lastCallTime);
+ }
+ }
+ if (timerId === undefined2) {
+ timerId = setTimeout2(timerExpired, wait);
+ }
+ return result2;
+ }
+ debounced.cancel = cancel;
+ debounced.flush = flush;
+ return debounced;
+ }
+ var defer = baseRest(function(func, args) {
+ return baseDelay(func, 1, args);
+ });
+ var delay = baseRest(function(func, wait, args) {
+ return baseDelay(func, toNumber2(wait) || 0, args);
+ });
+ function flip(func) {
+ return createWrap(func, WRAP_FLIP_FLAG);
+ }
+ function memoize(func, resolver) {
+ if (typeof func != "function" || resolver != null && typeof resolver != "function") {
+ throw new TypeError2(FUNC_ERROR_TEXT3);
+ }
+ var memoized = function() {
+ var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
+ if (cache.has(key)) {
+ return cache.get(key);
+ }
+ var result2 = func.apply(this, args);
+ memoized.cache = cache.set(key, result2) || cache;
+ return result2;
+ };
+ memoized.cache = new (memoize.Cache || MapCache)();
+ return memoized;
+ }
+ memoize.Cache = MapCache;
+ function negate(predicate) {
+ if (typeof predicate != "function") {
+ throw new TypeError2(FUNC_ERROR_TEXT3);
+ }
+ return function() {
+ var args = arguments;
+ switch (args.length) {
+ case 0:
+ return !predicate.call(this);
+ case 1:
+ return !predicate.call(this, args[0]);
+ case 2:
+ return !predicate.call(this, args[0], args[1]);
+ case 3:
+ return !predicate.call(this, args[0], args[1], args[2]);
+ }
+ return !predicate.apply(this, args);
+ };
+ }
+ function once(func) {
+ return before(2, func);
+ }
+ var overArgs = castRest(function(func, transforms) {
+ transforms = transforms.length == 1 && isArray2(transforms[0]) ? arrayMap2(transforms[0], baseUnary(getIteratee())) : arrayMap2(baseFlatten(transforms, 1), baseUnary(getIteratee()));
+ var funcsLength = transforms.length;
+ return baseRest(function(args) {
+ var index = -1, length = nativeMin2(args.length, funcsLength);
+ while (++index < length) {
+ args[index] = transforms[index].call(this, args[index]);
+ }
+ return apply(func, this, args);
+ });
+ });
+ var partial = baseRest(function(func, partials) {
+ var holders = replaceHolders(partials, getHolder(partial));
+ return createWrap(func, WRAP_PARTIAL_FLAG, undefined2, partials, holders);
+ });
+ var partialRight = baseRest(function(func, partials) {
+ var holders = replaceHolders(partials, getHolder(partialRight));
+ return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined2, partials, holders);
+ });
+ var rearg = flatRest(function(func, indexes) {
+ return createWrap(func, WRAP_REARG_FLAG, undefined2, undefined2, undefined2, indexes);
+ });
+ function rest(func, start2) {
+ if (typeof func != "function") {
+ throw new TypeError2(FUNC_ERROR_TEXT3);
+ }
+ start2 = start2 === undefined2 ? start2 : toInteger(start2);
+ return baseRest(func, start2);
+ }
+ function spread(func, start2) {
+ if (typeof func != "function") {
+ throw new TypeError2(FUNC_ERROR_TEXT3);
+ }
+ start2 = start2 == null ? 0 : nativeMax2(toInteger(start2), 0);
+ return baseRest(function(args) {
+ var array2 = args[start2], otherArgs = castSlice(args, 0, start2);
+ if (array2) {
+ arrayPush(otherArgs, array2);
+ }
+ return apply(func, this, otherArgs);
+ });
+ }
+ function throttle2(func, wait, options2) {
+ var leading = true, trailing = true;
+ if (typeof func != "function") {
+ throw new TypeError2(FUNC_ERROR_TEXT3);
+ }
+ if (isObject2(options2)) {
+ leading = "leading" in options2 ? !!options2.leading : leading;
+ trailing = "trailing" in options2 ? !!options2.trailing : trailing;
+ }
+ return debounce2(func, wait, {
+ "leading": leading,
+ "maxWait": wait,
+ "trailing": trailing
+ });
+ }
+ function unary(func) {
+ return ary(func, 1);
+ }
+ function wrap2(value, wrapper) {
+ return partial(castFunction(wrapper), value);
+ }
+ function castArray() {
+ if (!arguments.length) {
+ return [];
+ }
+ var value = arguments[0];
+ return isArray2(value) ? value : [value];
+ }
+ function clone(value) {
+ return baseClone(value, CLONE_SYMBOLS_FLAG);
+ }
+ function cloneWith(value, customizer) {
+ customizer = typeof customizer == "function" ? customizer : undefined2;
+ return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
+ }
+ function cloneDeep(value) {
+ return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
+ }
+ function cloneDeepWith(value, customizer) {
+ customizer = typeof customizer == "function" ? customizer : undefined2;
+ return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
+ }
+ function conformsTo(object, source) {
+ return source == null || baseConformsTo(object, source, keys(source));
+ }
+ function eq(value, other) {
+ return value === other || value !== value && other !== other;
+ }
+ var gt = createRelationalOperation(baseGt);
+ var gte = createRelationalOperation(function(value, other) {
+ return value >= other;
+ });
+ var isArguments = baseIsArguments(function() {
+ return arguments;
+ }()) ? baseIsArguments : function(value) {
+ return isObjectLike2(value) && hasOwnProperty2.call(value, "callee") && !propertyIsEnumerable.call(value, "callee");
+ };
+ var isArray2 = Array2.isArray;
+ var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
+ function isArrayLike(value) {
+ return value != null && isLength(value.length) && !isFunction(value);
+ }
+ function isArrayLikeObject(value) {
+ return isObjectLike2(value) && isArrayLike(value);
+ }
+ function isBoolean(value) {
+ return value === true || value === false || isObjectLike2(value) && baseGetTag2(value) == boolTag;
+ }
+ var isBuffer = nativeIsBuffer || stubFalse;
+ var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
+ function isElement(value) {
+ return isObjectLike2(value) && value.nodeType === 1 && !isPlainObject(value);
+ }
+ function isEmpty(value) {
+ if (value == null) {
+ return true;
+ }
+ if (isArrayLike(value) && (isArray2(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer(value) || isTypedArray(value) || isArguments(value))) {
+ return !value.length;
+ }
+ var tag = getTag(value);
+ if (tag == mapTag || tag == setTag) {
+ return !value.size;
+ }
+ if (isPrototype(value)) {
+ return !baseKeys(value).length;
+ }
+ for (var key in value) {
+ if (hasOwnProperty2.call(value, key)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function isEqual(value, other) {
+ return baseIsEqual(value, other);
+ }
+ function isEqualWith(value, other, customizer) {
+ customizer = typeof customizer == "function" ? customizer : undefined2;
+ var result2 = customizer ? customizer(value, other) : undefined2;
+ return result2 === undefined2 ? baseIsEqual(value, other, undefined2, customizer) : !!result2;
+ }
+ function isError(value) {
+ if (!isObjectLike2(value)) {
+ return false;
+ }
+ var tag = baseGetTag2(value);
+ return tag == errorTag || tag == domExcTag || typeof value.message == "string" && typeof value.name == "string" && !isPlainObject(value);
+ }
+ function isFinite2(value) {
+ return typeof value == "number" && nativeIsFinite(value);
+ }
+ function isFunction(value) {
+ if (!isObject2(value)) {
+ return false;
+ }
+ var tag = baseGetTag2(value);
+ return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
+ }
+ function isInteger(value) {
+ return typeof value == "number" && value == toInteger(value);
+ }
+ function isLength(value) {
+ return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+ }
+ function isObject2(value) {
+ var type3 = typeof value;
+ return value != null && (type3 == "object" || type3 == "function");
+ }
+ function isObjectLike2(value) {
+ return value != null && typeof value == "object";
+ }
+ var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
+ function isMatch(object, source) {
+ return object === source || baseIsMatch(object, source, getMatchData(source));
+ }
+ function isMatchWith(object, source, customizer) {
+ customizer = typeof customizer == "function" ? customizer : undefined2;
+ return baseIsMatch(object, source, getMatchData(source), customizer);
+ }
+ function isNaN2(value) {
+ return isNumber2(value) && value != +value;
+ }
+ function isNative(value) {
+ if (isMaskable(value)) {
+ throw new Error2(CORE_ERROR_TEXT);
+ }
+ return baseIsNative(value);
+ }
+ function isNull(value) {
+ return value === null;
+ }
+ function isNil(value) {
+ return value == null;
+ }
+ function isNumber2(value) {
+ return typeof value == "number" || isObjectLike2(value) && baseGetTag2(value) == numberTag;
+ }
+ function isPlainObject(value) {
+ if (!isObjectLike2(value) || baseGetTag2(value) != objectTag) {
+ return false;
+ }
+ var proto = getPrototype(value);
+ if (proto === null) {
+ return true;
+ }
+ var Ctor = hasOwnProperty2.call(proto, "constructor") && proto.constructor;
+ return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
+ }
+ var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
+ function isSafeInteger(value) {
+ return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
+ }
+ var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
+ function isString(value) {
+ return typeof value == "string" || !isArray2(value) && isObjectLike2(value) && baseGetTag2(value) == stringTag;
+ }
+ function isSymbol2(value) {
+ return typeof value == "symbol" || isObjectLike2(value) && baseGetTag2(value) == symbolTag2;
+ }
+ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
+ function isUndefined(value) {
+ return value === undefined2;
+ }
+ function isWeakMap(value) {
+ return isObjectLike2(value) && getTag(value) == weakMapTag;
+ }
+ function isWeakSet(value) {
+ return isObjectLike2(value) && baseGetTag2(value) == weakSetTag;
+ }
+ var lt = createRelationalOperation(baseLt);
+ var lte = createRelationalOperation(function(value, other) {
+ return value <= other;
+ });
+ function toArray(value) {
+ if (!value) {
+ return [];
+ }
+ if (isArrayLike(value)) {
+ return isString(value) ? stringToArray(value) : copyArray(value);
+ }
+ if (symIterator && value[symIterator]) {
+ return iteratorToArray(value[symIterator]());
+ }
+ var tag = getTag(value), func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values;
+ return func(value);
+ }
+ function toFinite(value) {
+ if (!value) {
+ return value === 0 ? value : 0;
+ }
+ value = toNumber2(value);
+ if (value === INFINITY2 || value === -INFINITY2) {
+ var sign2 = value < 0 ? -1 : 1;
+ return sign2 * MAX_INTEGER;
+ }
+ return value === value ? value : 0;
+ }
+ function toInteger(value) {
+ var result2 = toFinite(value), remainder = result2 % 1;
+ return result2 === result2 ? remainder ? result2 - remainder : result2 : 0;
+ }
+ function toLength(value) {
+ return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
+ }
+ function toNumber2(value) {
+ if (typeof value == "number") {
+ return value;
+ }
+ if (isSymbol2(value)) {
+ return NAN2;
+ }
+ if (isObject2(value)) {
+ var other = typeof value.valueOf == "function" ? value.valueOf() : value;
+ value = isObject2(other) ? other + "" : other;
+ }
+ if (typeof value != "string") {
+ return value === 0 ? value : +value;
+ }
+ value = baseTrim2(value);
+ var isBinary = reIsBinary2.test(value);
+ return isBinary || reIsOctal2.test(value) ? freeParseInt2(value.slice(2), isBinary ? 2 : 8) : reIsBadHex2.test(value) ? NAN2 : +value;
+ }
+ function toPlainObject(value) {
+ return copyObject(value, keysIn(value));
+ }
+ function toSafeInteger(value) {
+ return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0;
+ }
+ function toString2(value) {
+ return value == null ? "" : baseToString2(value);
+ }
+ var assign = createAssigner(function(object, source) {
+ if (isPrototype(source) || isArrayLike(source)) {
+ copyObject(source, keys(source), object);
+ return;
+ }
+ for (var key in source) {
+ if (hasOwnProperty2.call(source, key)) {
+ assignValue(object, key, source[key]);
+ }
+ }
+ });
+ var assignIn = createAssigner(function(object, source) {
+ copyObject(source, keysIn(source), object);
+ });
+ var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
+ copyObject(source, keysIn(source), object, customizer);
+ });
+ var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
+ copyObject(source, keys(source), object, customizer);
+ });
+ var at = flatRest(baseAt);
+ function create2(prototype, properties) {
+ var result2 = baseCreate(prototype);
+ return properties == null ? result2 : baseAssign(result2, properties);
+ }
+ var defaults2 = baseRest(function(object, sources) {
+ object = Object2(object);
+ var index = -1;
+ var length = sources.length;
+ var guard = length > 2 ? sources[2] : undefined2;
+ if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+ length = 1;
+ }
+ while (++index < length) {
+ var source = sources[index];
+ var props = keysIn(source);
+ var propsIndex = -1;
+ var propsLength = props.length;
+ while (++propsIndex < propsLength) {
+ var key = props[propsIndex];
+ var value = object[key];
+ if (value === undefined2 || eq(value, objectProto3[key]) && !hasOwnProperty2.call(object, key)) {
+ object[key] = source[key];
+ }
+ }
+ }
+ return object;
+ });
+ var defaultsDeep = baseRest(function(args) {
+ args.push(undefined2, customDefaultsMerge);
+ return apply(mergeWith, undefined2, args);
+ });
+ function findKey(object, predicate) {
+ return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
+ }
+ function findLastKey(object, predicate) {
+ return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
+ }
+ function forIn(object, iteratee2) {
+ return object == null ? object : baseFor(object, getIteratee(iteratee2, 3), keysIn);
+ }
+ function forInRight(object, iteratee2) {
+ return object == null ? object : baseForRight(object, getIteratee(iteratee2, 3), keysIn);
+ }
+ function forOwn(object, iteratee2) {
+ return object && baseForOwn(object, getIteratee(iteratee2, 3));
+ }
+ function forOwnRight(object, iteratee2) {
+ return object && baseForOwnRight(object, getIteratee(iteratee2, 3));
+ }
+ function functions(object) {
+ return object == null ? [] : baseFunctions(object, keys(object));
+ }
+ function functionsIn(object) {
+ return object == null ? [] : baseFunctions(object, keysIn(object));
+ }
+ function get3(object, path, defaultValue) {
+ var result2 = object == null ? undefined2 : baseGet(object, path);
+ return result2 === undefined2 ? defaultValue : result2;
+ }
+ function has(object, path) {
+ return object != null && hasPath(object, path, baseHas);
+ }
+ function hasIn(object, path) {
+ return object != null && hasPath(object, path, baseHasIn);
+ }
+ var invert = createInverter(function(result2, value, key) {
+ if (value != null && typeof value.toString != "function") {
+ value = nativeObjectToString3.call(value);
+ }
+ result2[value] = key;
+ }, constant(identity4));
+ var invertBy = createInverter(function(result2, value, key) {
+ if (value != null && typeof value.toString != "function") {
+ value = nativeObjectToString3.call(value);
+ }
+ if (hasOwnProperty2.call(result2, value)) {
+ result2[value].push(key);
+ } else {
+ result2[value] = [key];
+ }
+ }, getIteratee);
+ var invoke = baseRest(baseInvoke);
+ function keys(object) {
+ return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
+ }
+ function keysIn(object) {
+ return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
+ }
+ function mapKeys(object, iteratee2) {
+ var result2 = {};
+ iteratee2 = getIteratee(iteratee2, 3);
+ baseForOwn(object, function(value, key, object2) {
+ baseAssignValue(result2, iteratee2(value, key, object2), value);
+ });
+ return result2;
+ }
+ function mapValues(object, iteratee2) {
+ var result2 = {};
+ iteratee2 = getIteratee(iteratee2, 3);
+ baseForOwn(object, function(value, key, object2) {
+ baseAssignValue(result2, key, iteratee2(value, key, object2));
+ });
+ return result2;
+ }
+ var merge3 = createAssigner(function(object, source, srcIndex) {
+ baseMerge(object, source, srcIndex);
+ });
+ var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
+ baseMerge(object, source, srcIndex, customizer);
+ });
+ var omit = flatRest(function(object, paths) {
+ var result2 = {};
+ if (object == null) {
+ return result2;
+ }
+ var isDeep = false;
+ paths = arrayMap2(paths, function(path) {
+ path = castPath(path, object);
+ isDeep || (isDeep = path.length > 1);
+ return path;
+ });
+ copyObject(object, getAllKeysIn(object), result2);
+ if (isDeep) {
+ result2 = baseClone(result2, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
+ }
+ var length = paths.length;
+ while (length--) {
+ baseUnset(result2, paths[length]);
+ }
+ return result2;
+ });
+ function omitBy(object, predicate) {
+ return pickBy(object, negate(getIteratee(predicate)));
+ }
+ var pick = flatRest(function(object, paths) {
+ return object == null ? {} : basePick(object, paths);
+ });
+ function pickBy(object, predicate) {
+ if (object == null) {
+ return {};
+ }
+ var props = arrayMap2(getAllKeysIn(object), function(prop) {
+ return [prop];
+ });
+ predicate = getIteratee(predicate);
+ return basePickBy(object, props, function(value, path) {
+ return predicate(value, path[0]);
+ });
+ }
+ function result(object, path, defaultValue) {
+ path = castPath(path, object);
+ var index = -1, length = path.length;
+ if (!length) {
+ length = 1;
+ object = undefined2;
+ }
+ while (++index < length) {
+ var value = object == null ? undefined2 : object[toKey(path[index])];
+ if (value === undefined2) {
+ index = length;
+ value = defaultValue;
+ }
+ object = isFunction(value) ? value.call(object) : value;
+ }
+ return object;
+ }
+ function set3(object, path, value) {
+ return object == null ? object : baseSet(object, path, value);
+ }
+ function setWith(object, path, value, customizer) {
+ customizer = typeof customizer == "function" ? customizer : undefined2;
+ return object == null ? object : baseSet(object, path, value, customizer);
+ }
+ var toPairs = createToPairs(keys);
+ var toPairsIn = createToPairs(keysIn);
+ function transform2(object, iteratee2, accumulator) {
+ var isArr = isArray2(object), isArrLike = isArr || isBuffer(object) || isTypedArray(object);
+ iteratee2 = getIteratee(iteratee2, 4);
+ if (accumulator == null) {
+ var Ctor = object && object.constructor;
+ if (isArrLike) {
+ accumulator = isArr ? new Ctor() : [];
+ } else if (isObject2(object)) {
+ accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
+ } else {
+ accumulator = {};
+ }
+ }
+ (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object2) {
+ return iteratee2(accumulator, value, index, object2);
+ });
+ return accumulator;
+ }
+ function unset(object, path) {
+ return object == null ? true : baseUnset(object, path);
+ }
+ function update(object, path, updater) {
+ return object == null ? object : baseUpdate(object, path, castFunction(updater));
+ }
+ function updateWith(object, path, updater, customizer) {
+ customizer = typeof customizer == "function" ? customizer : undefined2;
+ return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
+ }
+ function values(object) {
+ return object == null ? [] : baseValues(object, keys(object));
+ }
+ function valuesIn(object) {
+ return object == null ? [] : baseValues(object, keysIn(object));
+ }
+ function clamp3(number3, lower2, upper) {
+ if (upper === undefined2) {
+ upper = lower2;
+ lower2 = undefined2;
+ }
+ if (upper !== undefined2) {
+ upper = toNumber2(upper);
+ upper = upper === upper ? upper : 0;
+ }
+ if (lower2 !== undefined2) {
+ lower2 = toNumber2(lower2);
+ lower2 = lower2 === lower2 ? lower2 : 0;
+ }
+ return baseClamp(toNumber2(number3), lower2, upper);
+ }
+ function inRange(number3, start2, end) {
+ start2 = toFinite(start2);
+ if (end === undefined2) {
+ end = start2;
+ start2 = 0;
+ } else {
+ end = toFinite(end);
+ }
+ number3 = toNumber2(number3);
+ return baseInRange(number3, start2, end);
+ }
+ function random(lower2, upper, floating) {
+ if (floating && typeof floating != "boolean" && isIterateeCall(lower2, upper, floating)) {
+ upper = floating = undefined2;
+ }
+ if (floating === undefined2) {
+ if (typeof upper == "boolean") {
+ floating = upper;
+ upper = undefined2;
+ } else if (typeof lower2 == "boolean") {
+ floating = lower2;
+ lower2 = undefined2;
+ }
+ }
+ if (lower2 === undefined2 && upper === undefined2) {
+ lower2 = 0;
+ upper = 1;
+ } else {
+ lower2 = toFinite(lower2);
+ if (upper === undefined2) {
+ upper = lower2;
+ lower2 = 0;
+ } else {
+ upper = toFinite(upper);
+ }
+ }
+ if (lower2 > upper) {
+ var temp = lower2;
+ lower2 = upper;
+ upper = temp;
+ }
+ if (floating || lower2 % 1 || upper % 1) {
+ var rand = nativeRandom();
+ return nativeMin2(lower2 + rand * (upper - lower2 + freeParseFloat("1e-" + ((rand + "").length - 1))), upper);
+ }
+ return baseRandom(lower2, upper);
+ }
+ var camelCase = createCompounder(function(result2, word, index) {
+ word = word.toLowerCase();
+ return result2 + (index ? capitalize(word) : word);
+ });
+ function capitalize(string) {
+ return upperFirst(toString2(string).toLowerCase());
+ }
+ function deburr(string) {
+ string = toString2(string);
+ return string && string.replace(reLatin, deburrLetter).replace(reComboMark, "");
+ }
+ function endsWith(string, target, position) {
+ string = toString2(string);
+ target = baseToString2(target);
+ var length = string.length;
+ position = position === undefined2 ? length : baseClamp(toInteger(position), 0, length);
+ var end = position;
+ position -= target.length;
+ return position >= 0 && string.slice(position, end) == target;
+ }
+ function escape6(string) {
+ string = toString2(string);
+ return string && reHasUnescapedHtml2.test(string) ? string.replace(reUnescapedHtml2, escapeHtmlChar2) : string;
+ }
+ function escapeRegExp(string) {
+ string = toString2(string);
+ return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, "\\$&") : string;
+ }
+ var kebabCase = createCompounder(function(result2, word, index) {
+ return result2 + (index ? "-" : "") + word.toLowerCase();
+ });
+ var lowerCase = createCompounder(function(result2, word, index) {
+ return result2 + (index ? " " : "") + word.toLowerCase();
+ });
+ var lowerFirst = createCaseFirst("toLowerCase");
+ function pad2(string, length, chars) {
+ string = toString2(string);
+ length = toInteger(length);
+ var strLength = length ? stringSize(string) : 0;
+ if (!length || strLength >= length) {
+ return string;
+ }
+ var mid = (length - strLength) / 2;
+ return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars);
+ }
+ function padEnd(string, length, chars) {
+ string = toString2(string);
+ length = toInteger(length);
+ var strLength = length ? stringSize(string) : 0;
+ return length && strLength < length ? string + createPadding(length - strLength, chars) : string;
+ }
+ function padStart(string, length, chars) {
+ string = toString2(string);
+ length = toInteger(length);
+ var strLength = length ? stringSize(string) : 0;
+ return length && strLength < length ? createPadding(length - strLength, chars) + string : string;
+ }
+ function parseInt2(string, radix, guard) {
+ if (guard || radix == null) {
+ radix = 0;
+ } else if (radix) {
+ radix = +radix;
+ }
+ return nativeParseInt(toString2(string).replace(reTrimStart2, ""), radix || 0);
+ }
+ function repeat(string, n2, guard) {
+ if (guard ? isIterateeCall(string, n2, guard) : n2 === undefined2) {
+ n2 = 1;
+ } else {
+ n2 = toInteger(n2);
+ }
+ return baseRepeat(toString2(string), n2);
+ }
+ function replace() {
+ var args = arguments, string = toString2(args[0]);
+ return args.length < 3 ? string : string.replace(args[1], args[2]);
+ }
+ var snakeCase = createCompounder(function(result2, word, index) {
+ return result2 + (index ? "_" : "") + word.toLowerCase();
+ });
+ function split(string, separator, limit) {
+ if (limit && typeof limit != "number" && isIterateeCall(string, separator, limit)) {
+ separator = limit = undefined2;
+ }
+ limit = limit === undefined2 ? MAX_ARRAY_LENGTH : limit >>> 0;
+ if (!limit) {
+ return [];
+ }
+ string = toString2(string);
+ if (string && (typeof separator == "string" || separator != null && !isRegExp(separator))) {
+ separator = baseToString2(separator);
+ if (!separator && hasUnicode(string)) {
+ return castSlice(stringToArray(string), 0, limit);
+ }
+ }
+ return string.split(separator, limit);
+ }
+ var startCase = createCompounder(function(result2, word, index) {
+ return result2 + (index ? " " : "") + upperFirst(word);
+ });
+ function startsWith(string, target, position) {
+ string = toString2(string);
+ position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length);
+ target = baseToString2(target);
+ return string.slice(position, position + target.length) == target;
+ }
+ function template(string, options2, guard) {
+ var settings = lodash.templateSettings;
+ if (guard && isIterateeCall(string, options2, guard)) {
+ options2 = undefined2;
+ }
+ string = toString2(string);
+ options2 = assignInWith({}, options2, settings, customDefaultsAssignIn);
+ var imports = assignInWith({}, options2.imports, settings.imports, customDefaultsAssignIn), importsKeys = keys(imports), importsValues = baseValues(imports, importsKeys);
+ var isEscaping, isEvaluating, index = 0, interpolate = options2.interpolate || reNoMatch, source = "__p += '";
+ var reDelimiters = RegExp2((options2.escape || reNoMatch).source + "|" + interpolate.source + "|" + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + "|" + (options2.evaluate || reNoMatch).source + "|$", "g");
+ var sourceURL = "//# sourceURL=" + (hasOwnProperty2.call(options2, "sourceURL") ? (options2.sourceURL + "").replace(/\s/g, " ") : "lodash.templateSources[" + ++templateCounter + "]") + "\n";
+ string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
+ interpolateValue || (interpolateValue = esTemplateValue);
+ source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
+ if (escapeValue) {
+ isEscaping = true;
+ source += "' +\n__e(" + escapeValue + ") +\n'";
+ }
+ if (evaluateValue) {
+ isEvaluating = true;
+ source += "';\n" + evaluateValue + ";\n__p += '";
+ }
+ if (interpolateValue) {
+ source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
+ }
+ index = offset + match.length;
+ return match;
+ });
+ source += "';\n";
+ var variable = hasOwnProperty2.call(options2, "variable") && options2.variable;
+ if (!variable) {
+ source = "with (obj) {\n" + source + "\n}\n";
+ } else if (reForbiddenIdentifierChars.test(variable)) {
+ throw new Error2(INVALID_TEMPL_VAR_ERROR_TEXT);
+ }
+ source = (isEvaluating ? source.replace(reEmptyStringLeading, "") : source).replace(reEmptyStringMiddle, "$1").replace(reEmptyStringTrailing, "$1;");
+ source = "function(" + (variable || "obj") + ") {\n" + (variable ? "" : "obj || (obj = {});\n") + "var __t, __p = ''" + (isEscaping ? ", __e = _.escape" : "") + (isEvaluating ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + source + "return __p\n}";
+ var result2 = attempt(function() {
+ return Function2(importsKeys, sourceURL + "return " + source).apply(undefined2, importsValues);
+ });
+ result2.source = source;
+ if (isError(result2)) {
+ throw result2;
+ }
+ return result2;
+ }
+ function toLower(value) {
+ return toString2(value).toLowerCase();
+ }
+ function toUpper(value) {
+ return toString2(value).toUpperCase();
+ }
+ function trim(string, chars, guard) {
+ string = toString2(string);
+ if (string && (guard || chars === undefined2)) {
+ return baseTrim2(string);
+ }
+ if (!string || !(chars = baseToString2(chars))) {
+ return string;
+ }
+ var strSymbols = stringToArray(string), chrSymbols = stringToArray(chars), start2 = charsStartIndex(strSymbols, chrSymbols), end = charsEndIndex(strSymbols, chrSymbols) + 1;
+ return castSlice(strSymbols, start2, end).join("");
+ }
+ function trimEnd(string, chars, guard) {
+ string = toString2(string);
+ if (string && (guard || chars === undefined2)) {
+ return string.slice(0, trimmedEndIndex2(string) + 1);
+ }
+ if (!string || !(chars = baseToString2(chars))) {
+ return string;
+ }
+ var strSymbols = stringToArray(string), end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
+ return castSlice(strSymbols, 0, end).join("");
+ }
+ function trimStart(string, chars, guard) {
+ string = toString2(string);
+ if (string && (guard || chars === undefined2)) {
+ return string.replace(reTrimStart2, "");
+ }
+ if (!string || !(chars = baseToString2(chars))) {
+ return string;
+ }
+ var strSymbols = stringToArray(string), start2 = charsStartIndex(strSymbols, stringToArray(chars));
+ return castSlice(strSymbols, start2).join("");
+ }
+ function truncate(string, options2) {
+ var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION;
+ if (isObject2(options2)) {
+ var separator = "separator" in options2 ? options2.separator : separator;
+ length = "length" in options2 ? toInteger(options2.length) : length;
+ omission = "omission" in options2 ? baseToString2(options2.omission) : omission;
+ }
+ string = toString2(string);
+ var strLength = string.length;
+ if (hasUnicode(string)) {
+ var strSymbols = stringToArray(string);
+ strLength = strSymbols.length;
+ }
+ if (length >= strLength) {
+ return string;
+ }
+ var end = length - stringSize(omission);
+ if (end < 1) {
+ return omission;
+ }
+ var result2 = strSymbols ? castSlice(strSymbols, 0, end).join("") : string.slice(0, end);
+ if (separator === undefined2) {
+ return result2 + omission;
+ }
+ if (strSymbols) {
+ end += result2.length - end;
+ }
+ if (isRegExp(separator)) {
+ if (string.slice(end).search(separator)) {
+ var match, substring = result2;
+ if (!separator.global) {
+ separator = RegExp2(separator.source, toString2(reFlags.exec(separator)) + "g");
+ }
+ separator.lastIndex = 0;
+ while (match = separator.exec(substring)) {
+ var newEnd = match.index;
+ }
+ result2 = result2.slice(0, newEnd === undefined2 ? end : newEnd);
+ }
+ } else if (string.indexOf(baseToString2(separator), end) != end) {
+ var index = result2.lastIndexOf(separator);
+ if (index > -1) {
+ result2 = result2.slice(0, index);
+ }
+ }
+ return result2 + omission;
+ }
+ function unescape4(string) {
+ string = toString2(string);
+ return string && reHasEscapedHtml2.test(string) ? string.replace(reEscapedHtml2, unescapeHtmlChar2) : string;
+ }
+ var upperCase = createCompounder(function(result2, word, index) {
+ return result2 + (index ? " " : "") + word.toUpperCase();
+ });
+ var upperFirst = createCaseFirst("toUpperCase");
+ function words(string, pattern, guard) {
+ string = toString2(string);
+ pattern = guard ? undefined2 : pattern;
+ if (pattern === undefined2) {
+ return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
+ }
+ return string.match(pattern) || [];
+ }
+ var attempt = baseRest(function(func, args) {
+ try {
+ return apply(func, undefined2, args);
+ } catch (e) {
+ return isError(e) ? e : new Error2(e);
+ }
+ });
+ var bindAll = flatRest(function(object, methodNames) {
+ arrayEach(methodNames, function(key) {
+ key = toKey(key);
+ baseAssignValue(object, key, bind(object[key], object));
+ });
+ return object;
+ });
+ function cond(pairs) {
+ var length = pairs == null ? 0 : pairs.length, toIteratee = getIteratee();
+ pairs = !length ? [] : arrayMap2(pairs, function(pair2) {
+ if (typeof pair2[1] != "function") {
+ throw new TypeError2(FUNC_ERROR_TEXT3);
+ }
+ return [toIteratee(pair2[0]), pair2[1]];
+ });
+ return baseRest(function(args) {
+ var index = -1;
+ while (++index < length) {
+ var pair2 = pairs[index];
+ if (apply(pair2[0], this, args)) {
+ return apply(pair2[1], this, args);
+ }
+ }
+ });
+ }
+ function conforms(source) {
+ return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
+ }
+ function constant(value) {
+ return function() {
+ return value;
+ };
+ }
+ function defaultTo(value, defaultValue) {
+ return value == null || value !== value ? defaultValue : value;
+ }
+ var flow = createFlow();
+ var flowRight = createFlow(true);
+ function identity4(value) {
+ return value;
+ }
+ function iteratee(func) {
+ return baseIteratee(typeof func == "function" ? func : baseClone(func, CLONE_DEEP_FLAG));
+ }
+ function matches(source) {
+ return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
+ }
+ function matchesProperty(path, srcValue) {
+ return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
+ }
+ var method = baseRest(function(path, args) {
+ return function(object) {
+ return baseInvoke(object, path, args);
+ };
+ });
+ var methodOf = baseRest(function(object, args) {
+ return function(path) {
+ return baseInvoke(object, path, args);
+ };
+ });
+ function mixin(object, source, options2) {
+ var props = keys(source), methodNames = baseFunctions(source, props);
+ if (options2 == null && !(isObject2(source) && (methodNames.length || !props.length))) {
+ options2 = source;
+ source = object;
+ object = this;
+ methodNames = baseFunctions(source, keys(source));
+ }
+ var chain2 = !(isObject2(options2) && "chain" in options2) || !!options2.chain, isFunc = isFunction(object);
+ arrayEach(methodNames, function(methodName) {
+ var func = source[methodName];
+ object[methodName] = func;
+ if (isFunc) {
+ object.prototype[methodName] = function() {
+ var chainAll = this.__chain__;
+ if (chain2 || chainAll) {
+ var result2 = object(this.__wrapped__), actions = result2.__actions__ = copyArray(this.__actions__);
+ actions.push({ "func": func, "args": arguments, "thisArg": object });
+ result2.__chain__ = chainAll;
+ return result2;
+ }
+ return func.apply(object, arrayPush([this.value()], arguments));
+ };
+ }
+ });
+ return object;
+ }
+ function noConflict() {
+ if (root3._ === this) {
+ root3._ = oldDash;
+ }
+ return this;
+ }
+ function noop3() {
+ }
+ function nthArg(n2) {
+ n2 = toInteger(n2);
+ return baseRest(function(args) {
+ return baseNth(args, n2);
+ });
+ }
+ var over = createOver(arrayMap2);
+ var overEvery = createOver(arrayEvery);
+ var overSome = createOver(arraySome);
+ function property(path) {
+ return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
+ }
+ function propertyOf(object) {
+ return function(path) {
+ return object == null ? undefined2 : baseGet(object, path);
+ };
+ }
+ var range3 = createRange();
+ var rangeRight = createRange(true);
+ function stubArray() {
+ return [];
+ }
+ function stubFalse() {
+ return false;
+ }
+ function stubObject() {
+ return {};
+ }
+ function stubString() {
+ return "";
+ }
+ function stubTrue() {
+ return true;
+ }
+ function times(n2, iteratee2) {
+ n2 = toInteger(n2);
+ if (n2 < 1 || n2 > MAX_SAFE_INTEGER) {
+ return [];
+ }
+ var index = MAX_ARRAY_LENGTH, length = nativeMin2(n2, MAX_ARRAY_LENGTH);
+ iteratee2 = getIteratee(iteratee2);
+ n2 -= MAX_ARRAY_LENGTH;
+ var result2 = baseTimes(length, iteratee2);
+ while (++index < n2) {
+ iteratee2(index);
+ }
+ return result2;
+ }
+ function toPath(value) {
+ if (isArray2(value)) {
+ return arrayMap2(value, toKey);
+ }
+ return isSymbol2(value) ? [value] : copyArray(stringToPath(toString2(value)));
+ }
+ function uniqueId(prefix) {
+ var id2 = ++idCounter;
+ return toString2(prefix) + id2;
+ }
+ var add = createMathOperation(function(augend, addend) {
+ return augend + addend;
+ }, 0);
+ var ceil = createRound("ceil");
+ var divide = createMathOperation(function(dividend, divisor) {
+ return dividend / divisor;
+ }, 1);
+ var floor = createRound("floor");
+ function max3(array2) {
+ return array2 && array2.length ? baseExtremum(array2, identity4, baseGt) : undefined2;
+ }
+ function maxBy(array2, iteratee2) {
+ return array2 && array2.length ? baseExtremum(array2, getIteratee(iteratee2, 2), baseGt) : undefined2;
+ }
+ function mean(array2) {
+ return baseMean(array2, identity4);
+ }
+ function meanBy(array2, iteratee2) {
+ return baseMean(array2, getIteratee(iteratee2, 2));
+ }
+ function min3(array2) {
+ return array2 && array2.length ? baseExtremum(array2, identity4, baseLt) : undefined2;
+ }
+ function minBy(array2, iteratee2) {
+ return array2 && array2.length ? baseExtremum(array2, getIteratee(iteratee2, 2), baseLt) : undefined2;
+ }
+ var multiply = createMathOperation(function(multiplier, multiplicand) {
+ return multiplier * multiplicand;
+ }, 1);
+ var round = createRound("round");
+ var subtract = createMathOperation(function(minuend, subtrahend) {
+ return minuend - subtrahend;
+ }, 0);
+ function sum(array2) {
+ return array2 && array2.length ? baseSum(array2, identity4) : 0;
+ }
+ function sumBy(array2, iteratee2) {
+ return array2 && array2.length ? baseSum(array2, getIteratee(iteratee2, 2)) : 0;
+ }
+ lodash.after = after;
+ lodash.ary = ary;
+ lodash.assign = assign;
+ lodash.assignIn = assignIn;
+ lodash.assignInWith = assignInWith;
+ lodash.assignWith = assignWith;
+ lodash.at = at;
+ lodash.before = before;
+ lodash.bind = bind;
+ lodash.bindAll = bindAll;
+ lodash.bindKey = bindKey2;
+ lodash.castArray = castArray;
+ lodash.chain = chain;
+ lodash.chunk = chunk;
+ lodash.compact = compact;
+ lodash.concat = concat;
+ lodash.cond = cond;
+ lodash.conforms = conforms;
+ lodash.constant = constant;
+ lodash.countBy = countBy;
+ lodash.create = create2;
+ lodash.curry = curry;
+ lodash.curryRight = curryRight;
+ lodash.debounce = debounce2;
+ lodash.defaults = defaults2;
+ lodash.defaultsDeep = defaultsDeep;
+ lodash.defer = defer;
+ lodash.delay = delay;
+ lodash.difference = difference;
+ lodash.differenceBy = differenceBy;
+ lodash.differenceWith = differenceWith;
+ lodash.drop = drop;
+ lodash.dropRight = dropRight;
+ lodash.dropRightWhile = dropRightWhile;
+ lodash.dropWhile = dropWhile;
+ lodash.fill = fill;
+ lodash.filter = filter2;
+ lodash.flatMap = flatMap;
+ lodash.flatMapDeep = flatMapDeep;
+ lodash.flatMapDepth = flatMapDepth;
+ lodash.flatten = flatten2;
+ lodash.flattenDeep = flattenDeep;
+ lodash.flattenDepth = flattenDepth;
+ lodash.flip = flip;
+ lodash.flow = flow;
+ lodash.flowRight = flowRight;
+ lodash.fromPairs = fromPairs;
+ lodash.functions = functions;
+ lodash.functionsIn = functionsIn;
+ lodash.groupBy = groupBy;
+ lodash.initial = initial;
+ lodash.intersection = intersection;
+ lodash.intersectionBy = intersectionBy;
+ lodash.intersectionWith = intersectionWith;
+ lodash.invert = invert;
+ lodash.invertBy = invertBy;
+ lodash.invokeMap = invokeMap;
+ lodash.iteratee = iteratee;
+ lodash.keyBy = keyBy;
+ lodash.keys = keys;
+ lodash.keysIn = keysIn;
+ lodash.map = map2;
+ lodash.mapKeys = mapKeys;
+ lodash.mapValues = mapValues;
+ lodash.matches = matches;
+ lodash.matchesProperty = matchesProperty;
+ lodash.memoize = memoize;
+ lodash.merge = merge3;
+ lodash.mergeWith = mergeWith;
+ lodash.method = method;
+ lodash.methodOf = methodOf;
+ lodash.mixin = mixin;
+ lodash.negate = negate;
+ lodash.nthArg = nthArg;
+ lodash.omit = omit;
+ lodash.omitBy = omitBy;
+ lodash.once = once;
+ lodash.orderBy = orderBy;
+ lodash.over = over;
+ lodash.overArgs = overArgs;
+ lodash.overEvery = overEvery;
+ lodash.overSome = overSome;
+ lodash.partial = partial;
+ lodash.partialRight = partialRight;
+ lodash.partition = partition;
+ lodash.pick = pick;
+ lodash.pickBy = pickBy;
+ lodash.property = property;
+ lodash.propertyOf = propertyOf;
+ lodash.pull = pull;
+ lodash.pullAll = pullAll;
+ lodash.pullAllBy = pullAllBy;
+ lodash.pullAllWith = pullAllWith;
+ lodash.pullAt = pullAt;
+ lodash.range = range3;
+ lodash.rangeRight = rangeRight;
+ lodash.rearg = rearg;
+ lodash.reject = reject;
+ lodash.remove = remove2;
+ lodash.rest = rest;
+ lodash.reverse = reverse;
+ lodash.sampleSize = sampleSize;
+ lodash.set = set3;
+ lodash.setWith = setWith;
+ lodash.shuffle = shuffle;
+ lodash.slice = slice;
+ lodash.sortBy = sortBy;
+ lodash.sortedUniq = sortedUniq;
+ lodash.sortedUniqBy = sortedUniqBy;
+ lodash.split = split;
+ lodash.spread = spread;
+ lodash.tail = tail;
+ lodash.take = take;
+ lodash.takeRight = takeRight;
+ lodash.takeRightWhile = takeRightWhile;
+ lodash.takeWhile = takeWhile;
+ lodash.tap = tap;
+ lodash.throttle = throttle2;
+ lodash.thru = thru;
+ lodash.toArray = toArray;
+ lodash.toPairs = toPairs;
+ lodash.toPairsIn = toPairsIn;
+ lodash.toPath = toPath;
+ lodash.toPlainObject = toPlainObject;
+ lodash.transform = transform2;
+ lodash.unary = unary;
+ lodash.union = union;
+ lodash.unionBy = unionBy;
+ lodash.unionWith = unionWith;
+ lodash.uniq = uniq;
+ lodash.uniqBy = uniqBy;
+ lodash.uniqWith = uniqWith;
+ lodash.unset = unset;
+ lodash.unzip = unzip;
+ lodash.unzipWith = unzipWith;
+ lodash.update = update;
+ lodash.updateWith = updateWith;
+ lodash.values = values;
+ lodash.valuesIn = valuesIn;
+ lodash.without = without;
+ lodash.words = words;
+ lodash.wrap = wrap2;
+ lodash.xor = xor;
+ lodash.xorBy = xorBy;
+ lodash.xorWith = xorWith;
+ lodash.zip = zip;
+ lodash.zipObject = zipObject;
+ lodash.zipObjectDeep = zipObjectDeep;
+ lodash.zipWith = zipWith;
+ lodash.entries = toPairs;
+ lodash.entriesIn = toPairsIn;
+ lodash.extend = assignIn;
+ lodash.extendWith = assignInWith;
+ mixin(lodash, lodash);
+ lodash.add = add;
+ lodash.attempt = attempt;
+ lodash.camelCase = camelCase;
+ lodash.capitalize = capitalize;
+ lodash.ceil = ceil;
+ lodash.clamp = clamp3;
+ lodash.clone = clone;
+ lodash.cloneDeep = cloneDeep;
+ lodash.cloneDeepWith = cloneDeepWith;
+ lodash.cloneWith = cloneWith;
+ lodash.conformsTo = conformsTo;
+ lodash.deburr = deburr;
+ lodash.defaultTo = defaultTo;
+ lodash.divide = divide;
+ lodash.endsWith = endsWith;
+ lodash.eq = eq;
+ lodash.escape = escape6;
+ lodash.escapeRegExp = escapeRegExp;
+ lodash.every = every;
+ lodash.find = find2;
+ lodash.findIndex = findIndex;
+ lodash.findKey = findKey;
+ lodash.findLast = findLast;
+ lodash.findLastIndex = findLastIndex;
+ lodash.findLastKey = findLastKey;
+ lodash.floor = floor;
+ lodash.forEach = forEach;
+ lodash.forEachRight = forEachRight;
+ lodash.forIn = forIn;
+ lodash.forInRight = forInRight;
+ lodash.forOwn = forOwn;
+ lodash.forOwnRight = forOwnRight;
+ lodash.get = get3;
+ lodash.gt = gt;
+ lodash.gte = gte;
+ lodash.has = has;
+ lodash.hasIn = hasIn;
+ lodash.head = head;
+ lodash.identity = identity4;
+ lodash.includes = includes;
+ lodash.indexOf = indexOf;
+ lodash.inRange = inRange;
+ lodash.invoke = invoke;
+ lodash.isArguments = isArguments;
+ lodash.isArray = isArray2;
+ lodash.isArrayBuffer = isArrayBuffer;
+ lodash.isArrayLike = isArrayLike;
+ lodash.isArrayLikeObject = isArrayLikeObject;
+ lodash.isBoolean = isBoolean;
+ lodash.isBuffer = isBuffer;
+ lodash.isDate = isDate;
+ lodash.isElement = isElement;
+ lodash.isEmpty = isEmpty;
+ lodash.isEqual = isEqual;
+ lodash.isEqualWith = isEqualWith;
+ lodash.isError = isError;
+ lodash.isFinite = isFinite2;
+ lodash.isFunction = isFunction;
+ lodash.isInteger = isInteger;
+ lodash.isLength = isLength;
+ lodash.isMap = isMap;
+ lodash.isMatch = isMatch;
+ lodash.isMatchWith = isMatchWith;
+ lodash.isNaN = isNaN2;
+ lodash.isNative = isNative;
+ lodash.isNil = isNil;
+ lodash.isNull = isNull;
+ lodash.isNumber = isNumber2;
+ lodash.isObject = isObject2;
+ lodash.isObjectLike = isObjectLike2;
+ lodash.isPlainObject = isPlainObject;
+ lodash.isRegExp = isRegExp;
+ lodash.isSafeInteger = isSafeInteger;
+ lodash.isSet = isSet;
+ lodash.isString = isString;
+ lodash.isSymbol = isSymbol2;
+ lodash.isTypedArray = isTypedArray;
+ lodash.isUndefined = isUndefined;
+ lodash.isWeakMap = isWeakMap;
+ lodash.isWeakSet = isWeakSet;
+ lodash.join = join;
+ lodash.kebabCase = kebabCase;
+ lodash.last = last;
+ lodash.lastIndexOf = lastIndexOf;
+ lodash.lowerCase = lowerCase;
+ lodash.lowerFirst = lowerFirst;
+ lodash.lt = lt;
+ lodash.lte = lte;
+ lodash.max = max3;
+ lodash.maxBy = maxBy;
+ lodash.mean = mean;
+ lodash.meanBy = meanBy;
+ lodash.min = min3;
+ lodash.minBy = minBy;
+ lodash.stubArray = stubArray;
+ lodash.stubFalse = stubFalse;
+ lodash.stubObject = stubObject;
+ lodash.stubString = stubString;
+ lodash.stubTrue = stubTrue;
+ lodash.multiply = multiply;
+ lodash.nth = nth;
+ lodash.noConflict = noConflict;
+ lodash.noop = noop3;
+ lodash.now = now3;
+ lodash.pad = pad2;
+ lodash.padEnd = padEnd;
+ lodash.padStart = padStart;
+ lodash.parseInt = parseInt2;
+ lodash.random = random;
+ lodash.reduce = reduce;
+ lodash.reduceRight = reduceRight;
+ lodash.repeat = repeat;
+ lodash.replace = replace;
+ lodash.result = result;
+ lodash.round = round;
+ lodash.runInContext = runInContext2;
+ lodash.sample = sample;
+ lodash.size = size;
+ lodash.snakeCase = snakeCase;
+ lodash.some = some;
+ lodash.sortedIndex = sortedIndex;
+ lodash.sortedIndexBy = sortedIndexBy;
+ lodash.sortedIndexOf = sortedIndexOf;
+ lodash.sortedLastIndex = sortedLastIndex;
+ lodash.sortedLastIndexBy = sortedLastIndexBy;
+ lodash.sortedLastIndexOf = sortedLastIndexOf;
+ lodash.startCase = startCase;
+ lodash.startsWith = startsWith;
+ lodash.subtract = subtract;
+ lodash.sum = sum;
+ lodash.sumBy = sumBy;
+ lodash.template = template;
+ lodash.times = times;
+ lodash.toFinite = toFinite;
+ lodash.toInteger = toInteger;
+ lodash.toLength = toLength;
+ lodash.toLower = toLower;
+ lodash.toNumber = toNumber2;
+ lodash.toSafeInteger = toSafeInteger;
+ lodash.toString = toString2;
+ lodash.toUpper = toUpper;
+ lodash.trim = trim;
+ lodash.trimEnd = trimEnd;
+ lodash.trimStart = trimStart;
+ lodash.truncate = truncate;
+ lodash.unescape = unescape4;
+ lodash.uniqueId = uniqueId;
+ lodash.upperCase = upperCase;
+ lodash.upperFirst = upperFirst;
+ lodash.each = forEach;
+ lodash.eachRight = forEachRight;
+ lodash.first = head;
+ mixin(lodash, function() {
+ var source = {};
+ baseForOwn(lodash, function(func, methodName) {
+ if (!hasOwnProperty2.call(lodash.prototype, methodName)) {
+ source[methodName] = func;
+ }
+ });
+ return source;
+ }(), { "chain": false });
+ lodash.VERSION = VERSION;
+ arrayEach(["bind", "bindKey", "curry", "curryRight", "partial", "partialRight"], function(methodName) {
+ lodash[methodName].placeholder = lodash;
+ });
+ arrayEach(["drop", "take"], function(methodName, index) {
+ LazyWrapper.prototype[methodName] = function(n2) {
+ n2 = n2 === undefined2 ? 1 : nativeMax2(toInteger(n2), 0);
+ var result2 = this.__filtered__ && !index ? new LazyWrapper(this) : this.clone();
+ if (result2.__filtered__) {
+ result2.__takeCount__ = nativeMin2(n2, result2.__takeCount__);
+ } else {
+ result2.__views__.push({
+ "size": nativeMin2(n2, MAX_ARRAY_LENGTH),
+ "type": methodName + (result2.__dir__ < 0 ? "Right" : "")
+ });
+ }
+ return result2;
+ };
+ LazyWrapper.prototype[methodName + "Right"] = function(n2) {
+ return this.reverse()[methodName](n2).reverse();
+ };
+ });
+ arrayEach(["filter", "map", "takeWhile"], function(methodName, index) {
+ var type3 = index + 1, isFilter = type3 == LAZY_FILTER_FLAG || type3 == LAZY_WHILE_FLAG;
+ LazyWrapper.prototype[methodName] = function(iteratee2) {
+ var result2 = this.clone();
+ result2.__iteratees__.push({
+ "iteratee": getIteratee(iteratee2, 3),
+ "type": type3
+ });
+ result2.__filtered__ = result2.__filtered__ || isFilter;
+ return result2;
+ };
+ });
+ arrayEach(["head", "last"], function(methodName, index) {
+ var takeName = "take" + (index ? "Right" : "");
+ LazyWrapper.prototype[methodName] = function() {
+ return this[takeName](1).value()[0];
+ };
+ });
+ arrayEach(["initial", "tail"], function(methodName, index) {
+ var dropName = "drop" + (index ? "" : "Right");
+ LazyWrapper.prototype[methodName] = function() {
+ return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
+ };
+ });
+ LazyWrapper.prototype.compact = function() {
+ return this.filter(identity4);
+ };
+ LazyWrapper.prototype.find = function(predicate) {
+ return this.filter(predicate).head();
+ };
+ LazyWrapper.prototype.findLast = function(predicate) {
+ return this.reverse().find(predicate);
+ };
+ LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
+ if (typeof path == "function") {
+ return new LazyWrapper(this);
+ }
+ return this.map(function(value) {
+ return baseInvoke(value, path, args);
+ });
+ });
+ LazyWrapper.prototype.reject = function(predicate) {
+ return this.filter(negate(getIteratee(predicate)));
+ };
+ LazyWrapper.prototype.slice = function(start2, end) {
+ start2 = toInteger(start2);
+ var result2 = this;
+ if (result2.__filtered__ && (start2 > 0 || end < 0)) {
+ return new LazyWrapper(result2);
+ }
+ if (start2 < 0) {
+ result2 = result2.takeRight(-start2);
+ } else if (start2) {
+ result2 = result2.drop(start2);
+ }
+ if (end !== undefined2) {
+ end = toInteger(end);
+ result2 = end < 0 ? result2.dropRight(-end) : result2.take(end - start2);
+ }
+ return result2;
+ };
+ LazyWrapper.prototype.takeRightWhile = function(predicate) {
+ return this.reverse().takeWhile(predicate).reverse();
+ };
+ LazyWrapper.prototype.toArray = function() {
+ return this.take(MAX_ARRAY_LENGTH);
+ };
+ baseForOwn(LazyWrapper.prototype, function(func, methodName) {
+ var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName), isTaker = /^(?:head|last)$/.test(methodName), lodashFunc = lodash[isTaker ? "take" + (methodName == "last" ? "Right" : "") : methodName], retUnwrapped = isTaker || /^find/.test(methodName);
+ if (!lodashFunc) {
+ return;
+ }
+ lodash.prototype[methodName] = function() {
+ var value = this.__wrapped__, args = isTaker ? [1] : arguments, isLazy = value instanceof LazyWrapper, iteratee2 = args[0], useLazy = isLazy || isArray2(value);
+ var interceptor = function(value2) {
+ var result3 = lodashFunc.apply(lodash, arrayPush([value2], args));
+ return isTaker && chainAll ? result3[0] : result3;
+ };
+ if (useLazy && checkIteratee && typeof iteratee2 == "function" && iteratee2.length != 1) {
+ isLazy = useLazy = false;
+ }
+ var chainAll = this.__chain__, isHybrid = !!this.__actions__.length, isUnwrapped = retUnwrapped && !chainAll, onlyLazy = isLazy && !isHybrid;
+ if (!retUnwrapped && useLazy) {
+ value = onlyLazy ? value : new LazyWrapper(this);
+ var result2 = func.apply(value, args);
+ result2.__actions__.push({ "func": thru, "args": [interceptor], "thisArg": undefined2 });
+ return new LodashWrapper(result2, chainAll);
+ }
+ if (isUnwrapped && onlyLazy) {
+ return func.apply(this, args);
+ }
+ result2 = this.thru(interceptor);
+ return isUnwrapped ? isTaker ? result2.value()[0] : result2.value() : result2;
+ };
+ });
+ arrayEach(["pop", "push", "shift", "sort", "splice", "unshift"], function(methodName) {
+ var func = arrayProto[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? "tap" : "thru", retUnwrapped = /^(?:pop|shift)$/.test(methodName);
+ lodash.prototype[methodName] = function() {
+ var args = arguments;
+ if (retUnwrapped && !this.__chain__) {
+ var value = this.value();
+ return func.apply(isArray2(value) ? value : [], args);
+ }
+ return this[chainName](function(value2) {
+ return func.apply(isArray2(value2) ? value2 : [], args);
+ });
+ };
+ });
+ baseForOwn(LazyWrapper.prototype, function(func, methodName) {
+ var lodashFunc = lodash[methodName];
+ if (lodashFunc) {
+ var key = lodashFunc.name + "";
+ if (!hasOwnProperty2.call(realNames, key)) {
+ realNames[key] = [];
+ }
+ realNames[key].push({ "name": methodName, "func": lodashFunc });
+ }
+ });
+ realNames[createHybrid(undefined2, WRAP_BIND_KEY_FLAG).name] = [{
+ "name": "wrapper",
+ "func": undefined2
+ }];
+ LazyWrapper.prototype.clone = lazyClone;
+ LazyWrapper.prototype.reverse = lazyReverse;
+ LazyWrapper.prototype.value = lazyValue;
+ lodash.prototype.at = wrapperAt;
+ lodash.prototype.chain = wrapperChain;
+ lodash.prototype.commit = wrapperCommit;
+ lodash.prototype.next = wrapperNext;
+ lodash.prototype.plant = wrapperPlant;
+ lodash.prototype.reverse = wrapperReverse;
+ lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
+ lodash.prototype.first = lodash.prototype.head;
+ if (symIterator) {
+ lodash.prototype[symIterator] = wrapperToIterator;
+ }
+ return lodash;
+ };
+ var _ = runInContext();
+ if (typeof define == "function" && typeof define.amd == "object" && define.amd) {
+ root3._ = _;
+ define(function() {
+ return _;
+ });
+ } else if (freeModule) {
+ (freeModule.exports = _)._ = _;
+ freeExports._ = _;
+ } else {
+ root3._ = _;
+ }
+ }).call(exports2);
+ }
+ });
+
+ // node_modules/rbush/rbush.min.js
+ var require_rbush_min = __commonJS({
+ "node_modules/rbush/rbush.min.js"(exports2, module2) {
+ !function(t, i2) {
+ typeof exports2 == "object" && typeof module2 != "undefined" ? module2.exports = i2() : typeof define == "function" && define.amd ? define(i2) : (t = t || self).RBush = i2();
+ }(exports2, function() {
+ "use strict";
+ function t(t2, r2, e3, a2, h2) {
+ !function t3(n3, r3, e4, a3, h3) {
+ for (; a3 > e4; ) {
+ if (a3 - e4 > 600) {
+ var o2 = a3 - e4 + 1, s2 = r3 - e4 + 1, l2 = Math.log(o2), f3 = 0.5 * Math.exp(2 * l2 / 3), u2 = 0.5 * Math.sqrt(l2 * f3 * (o2 - f3) / o2) * (s2 - o2 / 2 < 0 ? -1 : 1), m2 = Math.max(e4, Math.floor(r3 - s2 * f3 / o2 + u2)), c2 = Math.min(a3, Math.floor(r3 + (o2 - s2) * f3 / o2 + u2));
+ t3(n3, r3, m2, c2, h3);
+ }
+ var p2 = n3[r3], d2 = e4, x = a3;
+ for (i2(n3, e4, r3), h3(n3[a3], p2) > 0 && i2(n3, e4, a3); d2 < x; ) {
+ for (i2(n3, d2, x), d2++, x--; h3(n3[d2], p2) < 0; )
+ d2++;
+ for (; h3(n3[x], p2) > 0; )
+ x--;
+ }
+ h3(n3[e4], p2) === 0 ? i2(n3, e4, x) : i2(n3, ++x, a3), x <= r3 && (e4 = x + 1), r3 <= x && (a3 = x - 1);
+ }
+ }(t2, r2, e3 || 0, a2 || t2.length - 1, h2 || n2);
+ }
+ function i2(t2, i3, n3) {
+ var r2 = t2[i3];
+ t2[i3] = t2[n3], t2[n3] = r2;
+ }
+ function n2(t2, i3) {
+ return t2 < i3 ? -1 : t2 > i3 ? 1 : 0;
+ }
+ var r = function(t2) {
+ t2 === void 0 && (t2 = 9), this._maxEntries = Math.max(4, t2), this._minEntries = Math.max(2, Math.ceil(0.4 * this._maxEntries)), this.clear();
+ };
+ function e(t2, i3, n3) {
+ if (!n3)
+ return i3.indexOf(t2);
+ for (var r2 = 0; r2 < i3.length; r2++)
+ if (n3(t2, i3[r2]))
+ return r2;
+ return -1;
+ }
+ function a(t2, i3) {
+ h(t2, 0, t2.children.length, i3, t2);
+ }
+ function h(t2, i3, n3, r2, e3) {
+ e3 || (e3 = p(null)), e3.minX = 1 / 0, e3.minY = 1 / 0, e3.maxX = -1 / 0, e3.maxY = -1 / 0;
+ for (var a2 = i3; a2 < n3; a2++) {
+ var h2 = t2.children[a2];
+ o(e3, t2.leaf ? r2(h2) : h2);
+ }
+ return e3;
+ }
+ function o(t2, i3) {
+ return t2.minX = Math.min(t2.minX, i3.minX), t2.minY = Math.min(t2.minY, i3.minY), t2.maxX = Math.max(t2.maxX, i3.maxX), t2.maxY = Math.max(t2.maxY, i3.maxY), t2;
+ }
+ function s(t2, i3) {
+ return t2.minX - i3.minX;
+ }
+ function l(t2, i3) {
+ return t2.minY - i3.minY;
+ }
+ function f2(t2) {
+ return (t2.maxX - t2.minX) * (t2.maxY - t2.minY);
+ }
+ function u(t2) {
+ return t2.maxX - t2.minX + (t2.maxY - t2.minY);
+ }
+ function m(t2, i3) {
+ return t2.minX <= i3.minX && t2.minY <= i3.minY && i3.maxX <= t2.maxX && i3.maxY <= t2.maxY;
+ }
+ function c(t2, i3) {
+ return i3.minX <= t2.maxX && i3.minY <= t2.maxY && i3.maxX >= t2.minX && i3.maxY >= t2.minY;
+ }
+ function p(t2) {
+ return { children: t2, height: 1, leaf: true, minX: 1 / 0, minY: 1 / 0, maxX: -1 / 0, maxY: -1 / 0 };
+ }
+ function d(i3, n3, r2, e3, a2) {
+ for (var h2 = [n3, r2]; h2.length; )
+ if (!((r2 = h2.pop()) - (n3 = h2.pop()) <= e3)) {
+ var o2 = n3 + Math.ceil((r2 - n3) / e3 / 2) * e3;
+ t(i3, o2, n3, r2, a2), h2.push(n3, o2, o2, r2);
+ }
+ }
+ return r.prototype.all = function() {
+ return this._all(this.data, []);
+ }, r.prototype.search = function(t2) {
+ var i3 = this.data, n3 = [];
+ if (!c(t2, i3))
+ return n3;
+ for (var r2 = this.toBBox, e3 = []; i3; ) {
+ for (var a2 = 0; a2 < i3.children.length; a2++) {
+ var h2 = i3.children[a2], o2 = i3.leaf ? r2(h2) : h2;
+ c(t2, o2) && (i3.leaf ? n3.push(h2) : m(t2, o2) ? this._all(h2, n3) : e3.push(h2));
+ }
+ i3 = e3.pop();
+ }
+ return n3;
+ }, r.prototype.collides = function(t2) {
+ var i3 = this.data;
+ if (!c(t2, i3))
+ return false;
+ for (var n3 = []; i3; ) {
+ for (var r2 = 0; r2 < i3.children.length; r2++) {
+ var e3 = i3.children[r2], a2 = i3.leaf ? this.toBBox(e3) : e3;
+ if (c(t2, a2)) {
+ if (i3.leaf || m(t2, a2))
+ return true;
+ n3.push(e3);
+ }
+ }
+ i3 = n3.pop();
+ }
+ return false;
+ }, r.prototype.load = function(t2) {
+ if (!t2 || !t2.length)
+ return this;
+ if (t2.length < this._minEntries) {
+ for (var i3 = 0; i3 < t2.length; i3++)
+ this.insert(t2[i3]);
+ return this;
+ }
+ var n3 = this._build(t2.slice(), 0, t2.length - 1, 0);
+ if (this.data.children.length)
+ if (this.data.height === n3.height)
+ this._splitRoot(this.data, n3);
+ else {
+ if (this.data.height < n3.height) {
+ var r2 = this.data;
+ this.data = n3, n3 = r2;
+ }
+ this._insert(n3, this.data.height - n3.height - 1, true);
+ }
+ else
+ this.data = n3;
+ return this;
+ }, r.prototype.insert = function(t2) {
+ return t2 && this._insert(t2, this.data.height - 1), this;
+ }, r.prototype.clear = function() {
+ return this.data = p([]), this;
+ }, r.prototype.remove = function(t2, i3) {
+ if (!t2)
+ return this;
+ for (var n3, r2, a2, h2 = this.data, o2 = this.toBBox(t2), s2 = [], l2 = []; h2 || s2.length; ) {
+ if (h2 || (h2 = s2.pop(), r2 = s2[s2.length - 1], n3 = l2.pop(), a2 = true), h2.leaf) {
+ var f3 = e(t2, h2.children, i3);
+ if (f3 !== -1)
+ return h2.children.splice(f3, 1), s2.push(h2), this._condense(s2), this;
+ }
+ a2 || h2.leaf || !m(h2, o2) ? r2 ? (n3++, h2 = r2.children[n3], a2 = false) : h2 = null : (s2.push(h2), l2.push(n3), n3 = 0, r2 = h2, h2 = h2.children[0]);
+ }
+ return this;
+ }, r.prototype.toBBox = function(t2) {
+ return t2;
+ }, r.prototype.compareMinX = function(t2, i3) {
+ return t2.minX - i3.minX;
+ }, r.prototype.compareMinY = function(t2, i3) {
+ return t2.minY - i3.minY;
+ }, r.prototype.toJSON = function() {
+ return this.data;
+ }, r.prototype.fromJSON = function(t2) {
+ return this.data = t2, this;
+ }, r.prototype._all = function(t2, i3) {
+ for (var n3 = []; t2; )
+ t2.leaf ? i3.push.apply(i3, t2.children) : n3.push.apply(n3, t2.children), t2 = n3.pop();
+ return i3;
+ }, r.prototype._build = function(t2, i3, n3, r2) {
+ var e3, h2 = n3 - i3 + 1, o2 = this._maxEntries;
+ if (h2 <= o2)
+ return a(e3 = p(t2.slice(i3, n3 + 1)), this.toBBox), e3;
+ r2 || (r2 = Math.ceil(Math.log(h2) / Math.log(o2)), o2 = Math.ceil(h2 / Math.pow(o2, r2 - 1))), (e3 = p([])).leaf = false, e3.height = r2;
+ var s2 = Math.ceil(h2 / o2), l2 = s2 * Math.ceil(Math.sqrt(o2));
+ d(t2, i3, n3, l2, this.compareMinX);
+ for (var f3 = i3; f3 <= n3; f3 += l2) {
+ var u2 = Math.min(f3 + l2 - 1, n3);
+ d(t2, f3, u2, s2, this.compareMinY);
+ for (var m2 = f3; m2 <= u2; m2 += s2) {
+ var c2 = Math.min(m2 + s2 - 1, u2);
+ e3.children.push(this._build(t2, m2, c2, r2 - 1));
+ }
+ }
+ return a(e3, this.toBBox), e3;
+ }, r.prototype._chooseSubtree = function(t2, i3, n3, r2) {
+ for (; r2.push(i3), !i3.leaf && r2.length - 1 !== n3; ) {
+ for (var e3 = 1 / 0, a2 = 1 / 0, h2 = void 0, o2 = 0; o2 < i3.children.length; o2++) {
+ var s2 = i3.children[o2], l2 = f2(s2), u2 = (m2 = t2, c2 = s2, (Math.max(c2.maxX, m2.maxX) - Math.min(c2.minX, m2.minX)) * (Math.max(c2.maxY, m2.maxY) - Math.min(c2.minY, m2.minY)) - l2);
+ u2 < a2 ? (a2 = u2, e3 = l2 < e3 ? l2 : e3, h2 = s2) : u2 === a2 && l2 < e3 && (e3 = l2, h2 = s2);
+ }
+ i3 = h2 || i3.children[0];
+ }
+ var m2, c2;
+ return i3;
+ }, r.prototype._insert = function(t2, i3, n3) {
+ var r2 = n3 ? t2 : this.toBBox(t2), e3 = [], a2 = this._chooseSubtree(r2, this.data, i3, e3);
+ for (a2.children.push(t2), o(a2, r2); i3 >= 0 && e3[i3].children.length > this._maxEntries; )
+ this._split(e3, i3), i3--;
+ this._adjustParentBBoxes(r2, e3, i3);
+ }, r.prototype._split = function(t2, i3) {
+ var n3 = t2[i3], r2 = n3.children.length, e3 = this._minEntries;
+ this._chooseSplitAxis(n3, e3, r2);
+ var h2 = this._chooseSplitIndex(n3, e3, r2), o2 = p(n3.children.splice(h2, n3.children.length - h2));
+ o2.height = n3.height, o2.leaf = n3.leaf, a(n3, this.toBBox), a(o2, this.toBBox), i3 ? t2[i3 - 1].children.push(o2) : this._splitRoot(n3, o2);
+ }, r.prototype._splitRoot = function(t2, i3) {
+ this.data = p([t2, i3]), this.data.height = t2.height + 1, this.data.leaf = false, a(this.data, this.toBBox);
+ }, r.prototype._chooseSplitIndex = function(t2, i3, n3) {
+ for (var r2, e3, a2, o2, s2, l2, u2, m2 = 1 / 0, c2 = 1 / 0, p2 = i3; p2 <= n3 - i3; p2++) {
+ var d2 = h(t2, 0, p2, this.toBBox), x = h(t2, p2, n3, this.toBBox), v = (e3 = d2, a2 = x, o2 = void 0, s2 = void 0, l2 = void 0, u2 = void 0, o2 = Math.max(e3.minX, a2.minX), s2 = Math.max(e3.minY, a2.minY), l2 = Math.min(e3.maxX, a2.maxX), u2 = Math.min(e3.maxY, a2.maxY), Math.max(0, l2 - o2) * Math.max(0, u2 - s2)), M = f2(d2) + f2(x);
+ v < m2 ? (m2 = v, r2 = p2, c2 = M < c2 ? M : c2) : v === m2 && M < c2 && (c2 = M, r2 = p2);
+ }
+ return r2 || n3 - i3;
+ }, r.prototype._chooseSplitAxis = function(t2, i3, n3) {
+ var r2 = t2.leaf ? this.compareMinX : s, e3 = t2.leaf ? this.compareMinY : l;
+ this._allDistMargin(t2, i3, n3, r2) < this._allDistMargin(t2, i3, n3, e3) && t2.children.sort(r2);
+ }, r.prototype._allDistMargin = function(t2, i3, n3, r2) {
+ t2.children.sort(r2);
+ for (var e3 = this.toBBox, a2 = h(t2, 0, i3, e3), s2 = h(t2, n3 - i3, n3, e3), l2 = u(a2) + u(s2), f3 = i3; f3 < n3 - i3; f3++) {
+ var m2 = t2.children[f3];
+ o(a2, t2.leaf ? e3(m2) : m2), l2 += u(a2);
+ }
+ for (var c2 = n3 - i3 - 1; c2 >= i3; c2--) {
+ var p2 = t2.children[c2];
+ o(s2, t2.leaf ? e3(p2) : p2), l2 += u(s2);
+ }
+ return l2;
+ }, r.prototype._adjustParentBBoxes = function(t2, i3, n3) {
+ for (var r2 = n3; r2 >= 0; r2--)
+ o(i3[r2], t2);
+ }, r.prototype._condense = function(t2) {
+ for (var i3 = t2.length - 1, n3 = void 0; i3 >= 0; i3--)
+ t2[i3].children.length === 0 ? i3 > 0 ? (n3 = t2[i3 - 1].children).splice(n3.indexOf(t2[i3]), 1) : this.clear() : a(t2[i3], this.toBBox);
+ }, r;
+ });
+ }
+ });
+
+ // node_modules/ieee754/index.js
+ var require_ieee754 = __commonJS({
+ "node_modules/ieee754/index.js"(exports2) {
+ exports2.read = function(buffer, offset, isLE, mLen, nBytes) {
+ var e, m;
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var nBits = -7;
+ var i2 = isLE ? nBytes - 1 : 0;
+ var d = isLE ? -1 : 1;
+ var s = buffer[offset + i2];
+ i2 += d;
+ e = s & (1 << -nBits) - 1;
+ s >>= -nBits;
+ nBits += eLen;
+ for (; nBits > 0; e = e * 256 + buffer[offset + i2], i2 += d, nBits -= 8) {
+ }
+ m = e & (1 << -nBits) - 1;
+ e >>= -nBits;
+ nBits += mLen;
+ for (; nBits > 0; m = m * 256 + buffer[offset + i2], i2 += d, nBits -= 8) {
+ }
+ if (e === 0) {
+ e = 1 - eBias;
+ } else if (e === eMax) {
+ return m ? NaN : (s ? -1 : 1) * Infinity;
+ } else {
+ m = m + Math.pow(2, mLen);
+ e = e - eBias;
+ }
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
+ };
+ exports2.write = function(buffer, value, offset, isLE, mLen, nBytes) {
+ var e, m, c;
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;
+ var i2 = isLE ? 0 : nBytes - 1;
+ var d = isLE ? 1 : -1;
+ var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
+ value = Math.abs(value);
+ if (isNaN(value) || value === Infinity) {
+ m = isNaN(value) ? 1 : 0;
+ e = eMax;
+ } else {
+ e = Math.floor(Math.log(value) / Math.LN2);
+ if (value * (c = Math.pow(2, -e)) < 1) {
+ e--;
+ c *= 2;
+ }
+ if (e + eBias >= 1) {
+ value += rt / c;
+ } else {
+ value += rt * Math.pow(2, 1 - eBias);
+ }
+ if (value * c >= 2) {
+ e++;
+ c /= 2;
+ }
+ if (e + eBias >= eMax) {
+ m = 0;
+ e = eMax;
+ } else if (e + eBias >= 1) {
+ m = (value * c - 1) * Math.pow(2, mLen);
+ e = e + eBias;
+ } else {
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
+ e = 0;
+ }
+ }
+ for (; mLen >= 8; buffer[offset + i2] = m & 255, i2 += d, m /= 256, mLen -= 8) {
+ }
+ e = e << mLen | m;
+ eLen += mLen;
+ for (; eLen > 0; buffer[offset + i2] = e & 255, i2 += d, e /= 256, eLen -= 8) {
+ }
+ buffer[offset + i2 - d] |= s * 128;
+ };
+ }
+ });
+
+ // node_modules/pbf/index.js
+ var require_pbf = __commonJS({
+ "node_modules/pbf/index.js"(exports2, module2) {
+ "use strict";
+ module2.exports = Pbf;
+ var ieee754 = require_ieee754();
+ function Pbf(buf) {
+ this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
+ this.pos = 0;
+ this.type = 0;
+ this.length = this.buf.length;
+ }
+ Pbf.Varint = 0;
+ Pbf.Fixed64 = 1;
+ Pbf.Bytes = 2;
+ Pbf.Fixed32 = 5;
+ var SHIFT_LEFT_32 = (1 << 16) * (1 << 16);
+ var SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
+ var TEXT_DECODER_MIN_LENGTH = 12;
+ var utf8TextDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder("utf8");
+ Pbf.prototype = {
+ destroy: function() {
+ this.buf = null;
+ },
+ readFields: function(readField, result, end) {
+ end = end || this.length;
+ while (this.pos < end) {
+ var val = this.readVarint(), tag = val >> 3, startPos = this.pos;
+ this.type = val & 7;
+ readField(tag, result, this);
+ if (this.pos === startPos)
+ this.skip(val);
+ }
+ return result;
+ },
+ readMessage: function(readField, result) {
+ return this.readFields(readField, result, this.readVarint() + this.pos);
+ },
+ readFixed32: function() {
+ var val = readUInt32(this.buf, this.pos);
+ this.pos += 4;
+ return val;
+ },
+ readSFixed32: function() {
+ var val = readInt32(this.buf, this.pos);
+ this.pos += 4;
+ return val;
+ },
+ readFixed64: function() {
+ var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
+ this.pos += 8;
+ return val;
+ },
+ readSFixed64: function() {
+ var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
+ this.pos += 8;
+ return val;
+ },
+ readFloat: function() {
+ var val = ieee754.read(this.buf, this.pos, true, 23, 4);
+ this.pos += 4;
+ return val;
+ },
+ readDouble: function() {
+ var val = ieee754.read(this.buf, this.pos, true, 52, 8);
+ this.pos += 8;
+ return val;
+ },
+ readVarint: function(isSigned) {
+ var buf = this.buf, val, b;
+ b = buf[this.pos++];
+ val = b & 127;
+ if (b < 128)
+ return val;
+ b = buf[this.pos++];
+ val |= (b & 127) << 7;
+ if (b < 128)
+ return val;
+ b = buf[this.pos++];
+ val |= (b & 127) << 14;
+ if (b < 128)
+ return val;
+ b = buf[this.pos++];
+ val |= (b & 127) << 21;
+ if (b < 128)
+ return val;
+ b = buf[this.pos];
+ val |= (b & 15) << 28;
+ return readVarintRemainder(val, isSigned, this);
+ },
+ readVarint64: function() {
+ return this.readVarint(true);
+ },
+ readSVarint: function() {
+ var num = this.readVarint();
+ return num % 2 === 1 ? (num + 1) / -2 : num / 2;
+ },
+ readBoolean: function() {
+ return Boolean(this.readVarint());
+ },
+ readString: function() {
+ var end = this.readVarint() + this.pos;
+ var pos = this.pos;
+ this.pos = end;
+ if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) {
+ return readUtf8TextDecoder(this.buf, pos, end);
+ }
+ return readUtf8(this.buf, pos, end);
+ },
+ readBytes: function() {
+ var end = this.readVarint() + this.pos, buffer = this.buf.subarray(this.pos, end);
+ this.pos = end;
+ return buffer;
+ },
+ readPackedVarint: function(arr, isSigned) {
+ if (this.type !== Pbf.Bytes)
+ return arr.push(this.readVarint(isSigned));
+ var end = readPackedEnd(this);
+ arr = arr || [];
+ while (this.pos < end)
+ arr.push(this.readVarint(isSigned));
+ return arr;
+ },
+ readPackedSVarint: function(arr) {
+ if (this.type !== Pbf.Bytes)
+ return arr.push(this.readSVarint());
+ var end = readPackedEnd(this);
+ arr = arr || [];
+ while (this.pos < end)
+ arr.push(this.readSVarint());
+ return arr;
+ },
+ readPackedBoolean: function(arr) {
+ if (this.type !== Pbf.Bytes)
+ return arr.push(this.readBoolean());
+ var end = readPackedEnd(this);
+ arr = arr || [];
+ while (this.pos < end)
+ arr.push(this.readBoolean());
+ return arr;
+ },
+ readPackedFloat: function(arr) {
+ if (this.type !== Pbf.Bytes)
+ return arr.push(this.readFloat());
+ var end = readPackedEnd(this);
+ arr = arr || [];
+ while (this.pos < end)
+ arr.push(this.readFloat());
+ return arr;
+ },
+ readPackedDouble: function(arr) {
+ if (this.type !== Pbf.Bytes)
+ return arr.push(this.readDouble());
+ var end = readPackedEnd(this);
+ arr = arr || [];
+ while (this.pos < end)
+ arr.push(this.readDouble());
+ return arr;
+ },
+ readPackedFixed32: function(arr) {
+ if (this.type !== Pbf.Bytes)
+ return arr.push(this.readFixed32());
+ var end = readPackedEnd(this);
+ arr = arr || [];
+ while (this.pos < end)
+ arr.push(this.readFixed32());
+ return arr;
+ },
+ readPackedSFixed32: function(arr) {
+ if (this.type !== Pbf.Bytes)
+ return arr.push(this.readSFixed32());
+ var end = readPackedEnd(this);
+ arr = arr || [];
+ while (this.pos < end)
+ arr.push(this.readSFixed32());
+ return arr;
+ },
+ readPackedFixed64: function(arr) {
+ if (this.type !== Pbf.Bytes)
+ return arr.push(this.readFixed64());
+ var end = readPackedEnd(this);
+ arr = arr || [];
+ while (this.pos < end)
+ arr.push(this.readFixed64());
+ return arr;
+ },
+ readPackedSFixed64: function(arr) {
+ if (this.type !== Pbf.Bytes)
+ return arr.push(this.readSFixed64());
+ var end = readPackedEnd(this);
+ arr = arr || [];
+ while (this.pos < end)
+ arr.push(this.readSFixed64());
+ return arr;
+ },
+ skip: function(val) {
+ var type3 = val & 7;
+ if (type3 === Pbf.Varint)
+ while (this.buf[this.pos++] > 127) {
+ }
+ else if (type3 === Pbf.Bytes)
+ this.pos = this.readVarint() + this.pos;
+ else if (type3 === Pbf.Fixed32)
+ this.pos += 4;
+ else if (type3 === Pbf.Fixed64)
+ this.pos += 8;
+ else
+ throw new Error("Unimplemented type: " + type3);
+ },
+ writeTag: function(tag, type3) {
+ this.writeVarint(tag << 3 | type3);
+ },
+ realloc: function(min3) {
+ var length = this.length || 16;
+ while (length < this.pos + min3)
+ length *= 2;
+ if (length !== this.length) {
+ var buf = new Uint8Array(length);
+ buf.set(this.buf);
+ this.buf = buf;
+ this.length = length;
+ }
+ },
+ finish: function() {
+ this.length = this.pos;
+ this.pos = 0;
+ return this.buf.subarray(0, this.length);
+ },
+ writeFixed32: function(val) {
+ this.realloc(4);
+ writeInt32(this.buf, val, this.pos);
+ this.pos += 4;
+ },
+ writeSFixed32: function(val) {
+ this.realloc(4);
+ writeInt32(this.buf, val, this.pos);
+ this.pos += 4;
+ },
+ writeFixed64: function(val) {
+ this.realloc(8);
+ writeInt32(this.buf, val & -1, this.pos);
+ writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
+ this.pos += 8;
+ },
+ writeSFixed64: function(val) {
+ this.realloc(8);
+ writeInt32(this.buf, val & -1, this.pos);
+ writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
+ this.pos += 8;
+ },
+ writeVarint: function(val) {
+ val = +val || 0;
+ if (val > 268435455 || val < 0) {
+ writeBigVarint(val, this);
+ return;
+ }
+ this.realloc(4);
+ this.buf[this.pos++] = val & 127 | (val > 127 ? 128 : 0);
+ if (val <= 127)
+ return;
+ this.buf[this.pos++] = (val >>>= 7) & 127 | (val > 127 ? 128 : 0);
+ if (val <= 127)
+ return;
+ this.buf[this.pos++] = (val >>>= 7) & 127 | (val > 127 ? 128 : 0);
+ if (val <= 127)
+ return;
+ this.buf[this.pos++] = val >>> 7 & 127;
+ },
+ writeSVarint: function(val) {
+ this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
+ },
+ writeBoolean: function(val) {
+ this.writeVarint(Boolean(val));
+ },
+ writeString: function(str2) {
+ str2 = String(str2);
+ this.realloc(str2.length * 4);
+ this.pos++;
+ var startPos = this.pos;
+ this.pos = writeUtf8(this.buf, str2, this.pos);
+ var len = this.pos - startPos;
+ if (len >= 128)
+ makeRoomForExtraLength(startPos, len, this);
+ this.pos = startPos - 1;
+ this.writeVarint(len);
+ this.pos += len;
+ },
+ writeFloat: function(val) {
+ this.realloc(4);
+ ieee754.write(this.buf, val, this.pos, true, 23, 4);
+ this.pos += 4;
+ },
+ writeDouble: function(val) {
+ this.realloc(8);
+ ieee754.write(this.buf, val, this.pos, true, 52, 8);
+ this.pos += 8;
+ },
+ writeBytes: function(buffer) {
+ var len = buffer.length;
+ this.writeVarint(len);
+ this.realloc(len);
+ for (var i2 = 0; i2 < len; i2++)
+ this.buf[this.pos++] = buffer[i2];
+ },
+ writeRawMessage: function(fn, obj) {
+ this.pos++;
+ var startPos = this.pos;
+ fn(obj, this);
+ var len = this.pos - startPos;
+ if (len >= 128)
+ makeRoomForExtraLength(startPos, len, this);
+ this.pos = startPos - 1;
+ this.writeVarint(len);
+ this.pos += len;
+ },
+ writeMessage: function(tag, fn, obj) {
+ this.writeTag(tag, Pbf.Bytes);
+ this.writeRawMessage(fn, obj);
+ },
+ writePackedVarint: function(tag, arr) {
+ if (arr.length)
+ this.writeMessage(tag, writePackedVarint, arr);
+ },
+ writePackedSVarint: function(tag, arr) {
+ if (arr.length)
+ this.writeMessage(tag, writePackedSVarint, arr);
+ },
+ writePackedBoolean: function(tag, arr) {
+ if (arr.length)
+ this.writeMessage(tag, writePackedBoolean, arr);
+ },
+ writePackedFloat: function(tag, arr) {
+ if (arr.length)
+ this.writeMessage(tag, writePackedFloat, arr);
+ },
+ writePackedDouble: function(tag, arr) {
+ if (arr.length)
+ this.writeMessage(tag, writePackedDouble, arr);
+ },
+ writePackedFixed32: function(tag, arr) {
+ if (arr.length)
+ this.writeMessage(tag, writePackedFixed32, arr);
+ },
+ writePackedSFixed32: function(tag, arr) {
+ if (arr.length)
+ this.writeMessage(tag, writePackedSFixed32, arr);
+ },
+ writePackedFixed64: function(tag, arr) {
+ if (arr.length)
+ this.writeMessage(tag, writePackedFixed64, arr);
+ },
+ writePackedSFixed64: function(tag, arr) {
+ if (arr.length)
+ this.writeMessage(tag, writePackedSFixed64, arr);
+ },
+ writeBytesField: function(tag, buffer) {
+ this.writeTag(tag, Pbf.Bytes);
+ this.writeBytes(buffer);
+ },
+ writeFixed32Field: function(tag, val) {
+ this.writeTag(tag, Pbf.Fixed32);
+ this.writeFixed32(val);
+ },
+ writeSFixed32Field: function(tag, val) {
+ this.writeTag(tag, Pbf.Fixed32);
+ this.writeSFixed32(val);
+ },
+ writeFixed64Field: function(tag, val) {
+ this.writeTag(tag, Pbf.Fixed64);
+ this.writeFixed64(val);
+ },
+ writeSFixed64Field: function(tag, val) {
+ this.writeTag(tag, Pbf.Fixed64);
+ this.writeSFixed64(val);
+ },
+ writeVarintField: function(tag, val) {
+ this.writeTag(tag, Pbf.Varint);
+ this.writeVarint(val);
+ },
+ writeSVarintField: function(tag, val) {
+ this.writeTag(tag, Pbf.Varint);
+ this.writeSVarint(val);
+ },
+ writeStringField: function(tag, str2) {
+ this.writeTag(tag, Pbf.Bytes);
+ this.writeString(str2);
+ },
+ writeFloatField: function(tag, val) {
+ this.writeTag(tag, Pbf.Fixed32);
+ this.writeFloat(val);
+ },
+ writeDoubleField: function(tag, val) {
+ this.writeTag(tag, Pbf.Fixed64);
+ this.writeDouble(val);
+ },
+ writeBooleanField: function(tag, val) {
+ this.writeVarintField(tag, Boolean(val));
+ }
+ };
+ function readVarintRemainder(l, s, p) {
+ var buf = p.buf, h, b;
+ b = buf[p.pos++];
+ h = (b & 112) >> 4;
+ if (b < 128)
+ return toNum(l, h, s);
+ b = buf[p.pos++];
+ h |= (b & 127) << 3;
+ if (b < 128)
+ return toNum(l, h, s);
+ b = buf[p.pos++];
+ h |= (b & 127) << 10;
+ if (b < 128)
+ return toNum(l, h, s);
+ b = buf[p.pos++];
+ h |= (b & 127) << 17;
+ if (b < 128)
+ return toNum(l, h, s);
+ b = buf[p.pos++];
+ h |= (b & 127) << 24;
+ if (b < 128)
+ return toNum(l, h, s);
+ b = buf[p.pos++];
+ h |= (b & 1) << 31;
+ if (b < 128)
+ return toNum(l, h, s);
+ throw new Error("Expected varint not more than 10 bytes");
+ }
+ function readPackedEnd(pbf) {
+ return pbf.type === Pbf.Bytes ? pbf.readVarint() + pbf.pos : pbf.pos + 1;
+ }
+ function toNum(low, high, isSigned) {
+ if (isSigned) {
+ return high * 4294967296 + (low >>> 0);
+ }
+ return (high >>> 0) * 4294967296 + (low >>> 0);
+ }
+ function writeBigVarint(val, pbf) {
+ var low, high;
+ if (val >= 0) {
+ low = val % 4294967296 | 0;
+ high = val / 4294967296 | 0;
+ } else {
+ low = ~(-val % 4294967296);
+ high = ~(-val / 4294967296);
+ if (low ^ 4294967295) {
+ low = low + 1 | 0;
+ } else {
+ low = 0;
+ high = high + 1 | 0;
+ }
+ }
+ if (val >= 18446744073709552e3 || val < -18446744073709552e3) {
+ throw new Error("Given varint doesn't fit into 10 bytes");
+ }
+ pbf.realloc(10);
+ writeBigVarintLow(low, high, pbf);
+ writeBigVarintHigh(high, pbf);
+ }
+ function writeBigVarintLow(low, high, pbf) {
+ pbf.buf[pbf.pos++] = low & 127 | 128;
+ low >>>= 7;
+ pbf.buf[pbf.pos++] = low & 127 | 128;
+ low >>>= 7;
+ pbf.buf[pbf.pos++] = low & 127 | 128;
+ low >>>= 7;
+ pbf.buf[pbf.pos++] = low & 127 | 128;
+ low >>>= 7;
+ pbf.buf[pbf.pos] = low & 127;
+ }
+ function writeBigVarintHigh(high, pbf) {
+ var lsb = (high & 7) << 4;
+ pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 128 : 0);
+ if (!high)
+ return;
+ pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0);
+ if (!high)
+ return;
+ pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0);
+ if (!high)
+ return;
+ pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0);
+ if (!high)
+ return;
+ pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0);
+ if (!high)
+ return;
+ pbf.buf[pbf.pos++] = high & 127;
+ }
+ function makeRoomForExtraLength(startPos, len, pbf) {
+ var extraLen = len <= 16383 ? 1 : len <= 2097151 ? 2 : len <= 268435455 ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
+ pbf.realloc(extraLen);
+ for (var i2 = pbf.pos - 1; i2 >= startPos; i2--)
+ pbf.buf[i2 + extraLen] = pbf.buf[i2];
+ }
+ function writePackedVarint(arr, pbf) {
+ for (var i2 = 0; i2 < arr.length; i2++)
+ pbf.writeVarint(arr[i2]);
+ }
+ function writePackedSVarint(arr, pbf) {
+ for (var i2 = 0; i2 < arr.length; i2++)
+ pbf.writeSVarint(arr[i2]);
+ }
+ function writePackedFloat(arr, pbf) {
+ for (var i2 = 0; i2 < arr.length; i2++)
+ pbf.writeFloat(arr[i2]);
+ }
+ function writePackedDouble(arr, pbf) {
+ for (var i2 = 0; i2 < arr.length; i2++)
+ pbf.writeDouble(arr[i2]);
+ }
+ function writePackedBoolean(arr, pbf) {
+ for (var i2 = 0; i2 < arr.length; i2++)
+ pbf.writeBoolean(arr[i2]);
+ }
+ function writePackedFixed32(arr, pbf) {
+ for (var i2 = 0; i2 < arr.length; i2++)
+ pbf.writeFixed32(arr[i2]);
+ }
+ function writePackedSFixed32(arr, pbf) {
+ for (var i2 = 0; i2 < arr.length; i2++)
+ pbf.writeSFixed32(arr[i2]);
+ }
+ function writePackedFixed64(arr, pbf) {
+ for (var i2 = 0; i2 < arr.length; i2++)
+ pbf.writeFixed64(arr[i2]);
+ }
+ function writePackedSFixed64(arr, pbf) {
+ for (var i2 = 0; i2 < arr.length; i2++)
+ pbf.writeSFixed64(arr[i2]);
+ }
+ function readUInt32(buf, pos) {
+ return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + buf[pos + 3] * 16777216;
+ }
+ function writeInt32(buf, val, pos) {
+ buf[pos] = val;
+ buf[pos + 1] = val >>> 8;
+ buf[pos + 2] = val >>> 16;
+ buf[pos + 3] = val >>> 24;
+ }
+ function readInt32(buf, pos) {
+ return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + (buf[pos + 3] << 24);
+ }
+ function readUtf8(buf, pos, end) {
+ var str2 = "";
+ var i2 = pos;
+ while (i2 < end) {
+ var b0 = buf[i2];
+ var c = null;
+ var bytesPerSequence = b0 > 239 ? 4 : b0 > 223 ? 3 : b0 > 191 ? 2 : 1;
+ if (i2 + bytesPerSequence > end)
+ break;
+ var b1, b2, b3;
+ if (bytesPerSequence === 1) {
+ if (b0 < 128) {
+ c = b0;
+ }
+ } else if (bytesPerSequence === 2) {
+ b1 = buf[i2 + 1];
+ if ((b1 & 192) === 128) {
+ c = (b0 & 31) << 6 | b1 & 63;
+ if (c <= 127) {
+ c = null;
+ }
+ }
+ } else if (bytesPerSequence === 3) {
+ b1 = buf[i2 + 1];
+ b2 = buf[i2 + 2];
+ if ((b1 & 192) === 128 && (b2 & 192) === 128) {
+ c = (b0 & 15) << 12 | (b1 & 63) << 6 | b2 & 63;
+ if (c <= 2047 || c >= 55296 && c <= 57343) {
+ c = null;
+ }
+ }
+ } else if (bytesPerSequence === 4) {
+ b1 = buf[i2 + 1];
+ b2 = buf[i2 + 2];
+ b3 = buf[i2 + 3];
+ if ((b1 & 192) === 128 && (b2 & 192) === 128 && (b3 & 192) === 128) {
+ c = (b0 & 15) << 18 | (b1 & 63) << 12 | (b2 & 63) << 6 | b3 & 63;
+ if (c <= 65535 || c >= 1114112) {
+ c = null;
+ }
+ }
+ }
+ if (c === null) {
+ c = 65533;
+ bytesPerSequence = 1;
+ } else if (c > 65535) {
+ c -= 65536;
+ str2 += String.fromCharCode(c >>> 10 & 1023 | 55296);
+ c = 56320 | c & 1023;
+ }
+ str2 += String.fromCharCode(c);
+ i2 += bytesPerSequence;
+ }
+ return str2;
+ }
+ function readUtf8TextDecoder(buf, pos, end) {
+ return utf8TextDecoder.decode(buf.subarray(pos, end));
+ }
+ function writeUtf8(buf, str2, pos) {
+ for (var i2 = 0, c, lead; i2 < str2.length; i2++) {
+ c = str2.charCodeAt(i2);
+ if (c > 55295 && c < 57344) {
+ if (lead) {
+ if (c < 56320) {
+ buf[pos++] = 239;
+ buf[pos++] = 191;
+ buf[pos++] = 189;
+ lead = c;
+ continue;
+ } else {
+ c = lead - 55296 << 10 | c - 56320 | 65536;
+ lead = null;
+ }
+ } else {
+ if (c > 56319 || i2 + 1 === str2.length) {
+ buf[pos++] = 239;
+ buf[pos++] = 191;
+ buf[pos++] = 189;
+ } else {
+ lead = c;
+ }
+ continue;
+ }
+ } else if (lead) {
+ buf[pos++] = 239;
+ buf[pos++] = 191;
+ buf[pos++] = 189;
+ lead = null;
+ }
+ if (c < 128) {
+ buf[pos++] = c;
+ } else {
+ if (c < 2048) {
+ buf[pos++] = c >> 6 | 192;
+ } else {
+ if (c < 65536) {
+ buf[pos++] = c >> 12 | 224;
+ } else {
+ buf[pos++] = c >> 18 | 240;
+ buf[pos++] = c >> 12 & 63 | 128;
+ }
+ buf[pos++] = c >> 6 & 63 | 128;
+ }
+ buf[pos++] = c & 63 | 128;
+ }
+ }
+ return pos;
+ }
+ }
+ });
+
+ // node_modules/@mapbox/point-geometry/index.js
+ var require_point_geometry = __commonJS({
+ "node_modules/@mapbox/point-geometry/index.js"(exports2, module2) {
+ "use strict";
+ module2.exports = Point;
+ function Point(x, y) {
+ this.x = x;
+ this.y = y;
+ }
+ Point.prototype = {
+ clone: function() {
+ return new Point(this.x, this.y);
+ },
+ add: function(p) {
+ return this.clone()._add(p);
+ },
+ sub: function(p) {
+ return this.clone()._sub(p);
+ },
+ multByPoint: function(p) {
+ return this.clone()._multByPoint(p);
+ },
+ divByPoint: function(p) {
+ return this.clone()._divByPoint(p);
+ },
+ mult: function(k) {
+ return this.clone()._mult(k);
+ },
+ div: function(k) {
+ return this.clone()._div(k);
+ },
+ rotate: function(a) {
+ return this.clone()._rotate(a);
+ },
+ rotateAround: function(a, p) {
+ return this.clone()._rotateAround(a, p);
+ },
+ matMult: function(m) {
+ return this.clone()._matMult(m);
+ },
+ unit: function() {
+ return this.clone()._unit();
+ },
+ perp: function() {
+ return this.clone()._perp();
+ },
+ round: function() {
+ return this.clone()._round();
+ },
+ mag: function() {
+ return Math.sqrt(this.x * this.x + this.y * this.y);
+ },
+ equals: function(other) {
+ return this.x === other.x && this.y === other.y;
+ },
+ dist: function(p) {
+ return Math.sqrt(this.distSqr(p));
+ },
+ distSqr: function(p) {
+ var dx = p.x - this.x, dy = p.y - this.y;
+ return dx * dx + dy * dy;
+ },
+ angle: function() {
+ return Math.atan2(this.y, this.x);
+ },
+ angleTo: function(b) {
+ return Math.atan2(this.y - b.y, this.x - b.x);
+ },
+ angleWith: function(b) {
+ return this.angleWithSep(b.x, b.y);
+ },
+ angleWithSep: function(x, y) {
+ return Math.atan2(this.x * y - this.y * x, this.x * x + this.y * y);
+ },
+ _matMult: function(m) {
+ var x = m[0] * this.x + m[1] * this.y, y = m[2] * this.x + m[3] * this.y;
+ this.x = x;
+ this.y = y;
+ return this;
+ },
+ _add: function(p) {
+ this.x += p.x;
+ this.y += p.y;
+ return this;
+ },
+ _sub: function(p) {
+ this.x -= p.x;
+ this.y -= p.y;
+ return this;
+ },
+ _mult: function(k) {
+ this.x *= k;
+ this.y *= k;
+ return this;
+ },
+ _div: function(k) {
+ this.x /= k;
+ this.y /= k;
+ return this;
+ },
+ _multByPoint: function(p) {
+ this.x *= p.x;
+ this.y *= p.y;
+ return this;
+ },
+ _divByPoint: function(p) {
+ this.x /= p.x;
+ this.y /= p.y;
+ return this;
+ },
+ _unit: function() {
+ this._div(this.mag());
+ return this;
+ },
+ _perp: function() {
+ var y = this.y;
+ this.y = this.x;
+ this.x = -y;
+ return this;
+ },
+ _rotate: function(angle2) {
+ var cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), x = cos2 * this.x - sin2 * this.y, y = sin2 * this.x + cos2 * this.y;
+ this.x = x;
+ this.y = y;
+ return this;
+ },
+ _rotateAround: function(angle2, p) {
+ var cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), x = p.x + cos2 * (this.x - p.x) - sin2 * (this.y - p.y), y = p.y + sin2 * (this.x - p.x) + cos2 * (this.y - p.y);
+ this.x = x;
+ this.y = y;
+ return this;
+ },
+ _round: function() {
+ this.x = Math.round(this.x);
+ this.y = Math.round(this.y);
+ return this;
+ }
+ };
+ Point.convert = function(a) {
+ if (a instanceof Point) {
+ return a;
+ }
+ if (Array.isArray(a)) {
+ return new Point(a[0], a[1]);
+ }
+ return a;
+ };
+ }
+ });
+
+ // node_modules/@mapbox/vector-tile/lib/vectortilefeature.js
+ var require_vectortilefeature = __commonJS({
+ "node_modules/@mapbox/vector-tile/lib/vectortilefeature.js"(exports2, module2) {
+ "use strict";
+ var Point = require_point_geometry();
+ module2.exports = VectorTileFeature;
+ function VectorTileFeature(pbf, end, extent, keys, values) {
+ this.properties = {};
+ this.extent = extent;
+ this.type = 0;
+ this._pbf = pbf;
+ this._geometry = -1;
+ this._keys = keys;
+ this._values = values;
+ pbf.readFields(readFeature, this, end);
+ }
+ function readFeature(tag, feature3, pbf) {
+ if (tag == 1)
+ feature3.id = pbf.readVarint();
+ else if (tag == 2)
+ readTag(pbf, feature3);
+ else if (tag == 3)
+ feature3.type = pbf.readVarint();
+ else if (tag == 4)
+ feature3._geometry = pbf.pos;
+ }
+ function readTag(pbf, feature3) {
+ var end = pbf.readVarint() + pbf.pos;
+ while (pbf.pos < end) {
+ var key = feature3._keys[pbf.readVarint()], value = feature3._values[pbf.readVarint()];
+ feature3.properties[key] = value;
+ }
+ }
+ VectorTileFeature.types = ["Unknown", "Point", "LineString", "Polygon"];
+ VectorTileFeature.prototype.loadGeometry = function() {
+ var pbf = this._pbf;
+ pbf.pos = this._geometry;
+ var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, lines = [], line;
+ while (pbf.pos < end) {
+ if (length <= 0) {
+ var cmdLen = pbf.readVarint();
+ cmd = cmdLen & 7;
+ length = cmdLen >> 3;
+ }
+ length--;
+ if (cmd === 1 || cmd === 2) {
+ x += pbf.readSVarint();
+ y += pbf.readSVarint();
+ if (cmd === 1) {
+ if (line)
+ lines.push(line);
+ line = [];
+ }
+ line.push(new Point(x, y));
+ } else if (cmd === 7) {
+ if (line) {
+ line.push(line[0].clone());
+ }
+ } else {
+ throw new Error("unknown command " + cmd);
+ }
+ }
+ if (line)
+ lines.push(line);
+ return lines;
+ };
+ VectorTileFeature.prototype.bbox = function() {
+ var pbf = this._pbf;
+ pbf.pos = this._geometry;
+ var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, x12 = Infinity, x2 = -Infinity, y12 = Infinity, y2 = -Infinity;
+ while (pbf.pos < end) {
+ if (length <= 0) {
+ var cmdLen = pbf.readVarint();
+ cmd = cmdLen & 7;
+ length = cmdLen >> 3;
+ }
+ length--;
+ if (cmd === 1 || cmd === 2) {
+ x += pbf.readSVarint();
+ y += pbf.readSVarint();
+ if (x < x12)
+ x12 = x;
+ if (x > x2)
+ x2 = x;
+ if (y < y12)
+ y12 = y;
+ if (y > y2)
+ y2 = y;
+ } else if (cmd !== 7) {
+ throw new Error("unknown command " + cmd);
+ }
+ }
+ return [x12, y12, x2, y2];
+ };
+ VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
+ var size = this.extent * Math.pow(2, z), x05 = this.extent * x, y05 = this.extent * y, coords = this.loadGeometry(), type3 = VectorTileFeature.types[this.type], i2, j2;
+ function project(line) {
+ for (var j3 = 0; j3 < line.length; j3++) {
+ var p = line[j3], y2 = 180 - (p.y + y05) * 360 / size;
+ line[j3] = [
+ (p.x + x05) * 360 / size - 180,
+ 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
+ ];
+ }
+ }
+ switch (this.type) {
+ case 1:
+ var points = [];
+ for (i2 = 0; i2 < coords.length; i2++) {
+ points[i2] = coords[i2][0];
+ }
+ coords = points;
+ project(coords);
+ break;
+ case 2:
+ for (i2 = 0; i2 < coords.length; i2++) {
+ project(coords[i2]);
+ }
+ break;
+ case 3:
+ coords = classifyRings(coords);
+ for (i2 = 0; i2 < coords.length; i2++) {
+ for (j2 = 0; j2 < coords[i2].length; j2++) {
+ project(coords[i2][j2]);
+ }
+ }
+ break;
+ }
+ if (coords.length === 1) {
+ coords = coords[0];
+ } else {
+ type3 = "Multi" + type3;
+ }
+ var result = {
+ type: "Feature",
+ geometry: {
+ type: type3,
+ coordinates: coords
+ },
+ properties: this.properties
+ };
+ if ("id" in this) {
+ result.id = this.id;
+ }
+ return result;
+ };
+ function classifyRings(rings) {
+ var len = rings.length;
+ if (len <= 1)
+ return [rings];
+ var polygons = [], polygon2, ccw;
+ for (var i2 = 0; i2 < len; i2++) {
+ var area = signedArea(rings[i2]);
+ if (area === 0)
+ continue;
+ if (ccw === void 0)
+ ccw = area < 0;
+ if (ccw === area < 0) {
+ if (polygon2)
+ polygons.push(polygon2);
+ polygon2 = [rings[i2]];
+ } else {
+ polygon2.push(rings[i2]);
+ }
+ }
+ if (polygon2)
+ polygons.push(polygon2);
+ return polygons;
+ }
+ function signedArea(ring) {
+ var sum = 0;
+ for (var i2 = 0, len = ring.length, j2 = len - 1, p1, p2; i2 < len; j2 = i2++) {
+ p1 = ring[i2];
+ p2 = ring[j2];
+ sum += (p2.x - p1.x) * (p1.y + p2.y);
+ }
+ return sum;
+ }
+ }
+ });
+
+ // node_modules/@mapbox/vector-tile/lib/vectortilelayer.js
+ var require_vectortilelayer = __commonJS({
+ "node_modules/@mapbox/vector-tile/lib/vectortilelayer.js"(exports2, module2) {
+ "use strict";
+ var VectorTileFeature = require_vectortilefeature();
+ module2.exports = VectorTileLayer;
+ function VectorTileLayer(pbf, end) {
+ this.version = 1;
+ this.name = null;
+ this.extent = 4096;
+ this.length = 0;
+ this._pbf = pbf;
+ this._keys = [];
+ this._values = [];
+ this._features = [];
+ pbf.readFields(readLayer, this, end);
+ this.length = this._features.length;
+ }
+ function readLayer(tag, layer, pbf) {
+ if (tag === 15)
+ layer.version = pbf.readVarint();
+ else if (tag === 1)
+ layer.name = pbf.readString();
+ else if (tag === 5)
+ layer.extent = pbf.readVarint();
+ else if (tag === 2)
+ layer._features.push(pbf.pos);
+ else if (tag === 3)
+ layer._keys.push(pbf.readString());
+ else if (tag === 4)
+ layer._values.push(readValueMessage(pbf));
+ }
+ function readValueMessage(pbf) {
+ var value = null, end = pbf.readVarint() + pbf.pos;
+ while (pbf.pos < end) {
+ var tag = pbf.readVarint() >> 3;
+ value = tag === 1 ? pbf.readString() : tag === 2 ? pbf.readFloat() : tag === 3 ? pbf.readDouble() : tag === 4 ? pbf.readVarint64() : tag === 5 ? pbf.readVarint() : tag === 6 ? pbf.readSVarint() : tag === 7 ? pbf.readBoolean() : null;
+ }
+ return value;
+ }
+ VectorTileLayer.prototype.feature = function(i2) {
+ if (i2 < 0 || i2 >= this._features.length)
+ throw new Error("feature index out of bounds");
+ this._pbf.pos = this._features[i2];
+ var end = this._pbf.readVarint() + this._pbf.pos;
+ return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values);
+ };
+ }
+ });
+
+ // node_modules/@mapbox/vector-tile/lib/vectortile.js
+ var require_vectortile = __commonJS({
+ "node_modules/@mapbox/vector-tile/lib/vectortile.js"(exports2, module2) {
+ "use strict";
+ var VectorTileLayer = require_vectortilelayer();
+ module2.exports = VectorTile2;
+ function VectorTile2(pbf, end) {
+ this.layers = pbf.readFields(readTile, {}, end);
+ }
+ function readTile(tag, layers, pbf) {
+ if (tag === 3) {
+ var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos);
+ if (layer.length)
+ layers[layer.name] = layer;
+ }
+ }
+ }
+ });
+
+ // node_modules/@mapbox/vector-tile/index.js
+ var require_vector_tile = __commonJS({
+ "node_modules/@mapbox/vector-tile/index.js"(exports2, module2) {
+ module2.exports.VectorTile = require_vectortile();
+ module2.exports.VectorTileFeature = require_vectortilefeature();
+ module2.exports.VectorTileLayer = require_vectortilelayer();
+ }
+ });
+
+ // node_modules/fast-json-stable-stringify/index.js
+ var require_fast_json_stable_stringify = __commonJS({
+ "node_modules/fast-json-stable-stringify/index.js"(exports2, module2) {
+ "use strict";
+ module2.exports = function(data, opts) {
+ if (!opts)
+ opts = {};
+ if (typeof opts === "function")
+ opts = { cmp: opts };
+ var cycles = typeof opts.cycles === "boolean" ? opts.cycles : false;
+ var cmp = opts.cmp && function(f2) {
+ return function(node) {
+ return function(a, b) {
+ var aobj = { key: a, value: node[a] };
+ var bobj = { key: b, value: node[b] };
+ return f2(aobj, bobj);
+ };
+ };
+ }(opts.cmp);
+ var seen = [];
+ return function stringify3(node) {
+ if (node && node.toJSON && typeof node.toJSON === "function") {
+ node = node.toJSON();
+ }
+ if (node === void 0)
+ return;
+ if (typeof node == "number")
+ return isFinite(node) ? "" + node : "null";
+ if (typeof node !== "object")
+ return JSON.stringify(node);
+ var i2, out;
+ if (Array.isArray(node)) {
+ out = "[";
+ for (i2 = 0; i2 < node.length; i2++) {
+ if (i2)
+ out += ",";
+ out += stringify3(node[i2]) || "null";
+ }
+ return out + "]";
+ }
+ if (node === null)
+ return "null";
+ if (seen.indexOf(node) !== -1) {
+ if (cycles)
+ return JSON.stringify("__cycle__");
+ throw new TypeError("Converting circular structure to JSON");
+ }
+ var seenIndex = seen.push(node) - 1;
+ var keys = Object.keys(node).sort(cmp && cmp(node));
+ out = "";
+ for (i2 = 0; i2 < keys.length; i2++) {
+ var key = keys[i2];
+ var value = stringify3(node[key]);
+ if (!value)
+ continue;
+ if (out)
+ out += ",";
+ out += JSON.stringify(key) + ":" + value;
+ }
+ seen.splice(seenIndex, 1);
+ return "{" + out + "}";
+ }(data);
+ };
+ }
+ });
+
+ // node_modules/@mapbox/sexagesimal/index.js
+ var require_sexagesimal = __commonJS({
+ "node_modules/@mapbox/sexagesimal/index.js"(exports2, module2) {
+ module2.exports = element;
+ module2.exports.pair = pair2;
+ module2.exports.format = format2;
+ module2.exports.formatPair = formatPair;
+ module2.exports.coordToDMS = coordToDMS;
+ function element(input, dims) {
+ var result = search(input, dims);
+ return result === null ? null : result.val;
+ }
+ function formatPair(input) {
+ return format2(input.lat, "lat") + " " + format2(input.lon, "lon");
+ }
+ function format2(input, dim) {
+ var dms = coordToDMS(input, dim);
+ return dms.whole + "\xB0 " + (dms.minutes ? dms.minutes + "' " : "") + (dms.seconds ? dms.seconds + '" ' : "") + dms.dir;
+ }
+ function coordToDMS(input, dim) {
+ var dirs = { lat: ["N", "S"], lon: ["E", "W"] }[dim] || "";
+ var dir = dirs[input >= 0 ? 0 : 1];
+ var abs3 = Math.abs(input);
+ var whole = Math.floor(abs3);
+ var fraction = abs3 - whole;
+ var fractionMinutes = fraction * 60;
+ var minutes = Math.floor(fractionMinutes);
+ var seconds = Math.floor((fractionMinutes - minutes) * 60);
+ return {
+ whole,
+ minutes,
+ seconds,
+ dir
+ };
+ }
+ function search(input, dims) {
+ if (!dims)
+ dims = "NSEW";
+ if (typeof input !== "string")
+ return null;
+ input = input.toUpperCase();
+ var regex = /^[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)[°º˚]?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/;
+ var m = input.match(regex);
+ if (!m)
+ return null;
+ var matched = m[0];
+ var dim;
+ if (m[1] && m[5]) {
+ dim = m[1];
+ matched = matched.slice(0, -1);
+ } else {
+ dim = m[1] || m[5];
+ }
+ if (dim && dims.indexOf(dim) === -1)
+ return null;
+ var deg = m[2] ? parseFloat(m[2]) : 0;
+ var min3 = m[3] ? parseFloat(m[3]) / 60 : 0;
+ var sec = m[4] ? parseFloat(m[4]) / 3600 : 0;
+ var sign2 = deg < 0 ? -1 : 1;
+ if (dim === "S" || dim === "W")
+ sign2 *= -1;
+ return {
+ val: (Math.abs(deg) + min3 + sec) * sign2,
+ dim,
+ matched,
+ remain: input.slice(matched.length)
+ };
+ }
+ function pair2(input, dims) {
+ input = input.trim();
+ var one2 = search(input, dims);
+ if (!one2)
+ return null;
+ input = one2.remain.trim();
+ var two = search(input, dims);
+ if (!two || two.remain)
+ return null;
+ if (one2.dim) {
+ return swapdim(one2.val, two.val, one2.dim);
+ } else {
+ return [one2.val, two.val];
+ }
+ }
+ function swapdim(a, b, dim) {
+ if (dim === "N" || dim === "S")
+ return [a, b];
+ if (dim === "W" || dim === "E")
+ return [b, a];
+ }
+ }
+ });
+
+ // node_modules/store/src/util.js
+ var require_util = __commonJS({
+ "node_modules/store/src/util.js"(exports2, module2) {
+ var assign = make_assign();
+ var create2 = make_create();
+ var trim = make_trim();
+ var Global = typeof window !== "undefined" ? window : global;
+ module2.exports = {
+ assign,
+ create: create2,
+ trim,
+ bind,
+ slice,
+ each,
+ map: map2,
+ pluck,
+ isList,
+ isFunction,
+ isObject: isObject2,
+ Global
+ };
+ function make_assign() {
+ if (Object.assign) {
+ return Object.assign;
+ } else {
+ return function shimAssign(obj, props1, props2, etc) {
+ for (var i2 = 1; i2 < arguments.length; i2++) {
+ each(Object(arguments[i2]), function(val, key) {
+ obj[key] = val;
+ });
+ }
+ return obj;
+ };
+ }
+ }
+ function make_create() {
+ if (Object.create) {
+ return function create3(obj, assignProps1, assignProps2, etc) {
+ var assignArgsList = slice(arguments, 1);
+ return assign.apply(this, [Object.create(obj)].concat(assignArgsList));
+ };
+ } else {
+ let F2 = function() {
+ };
+ var F = F2;
+ return function create3(obj, assignProps1, assignProps2, etc) {
+ var assignArgsList = slice(arguments, 1);
+ F2.prototype = obj;
+ return assign.apply(this, [new F2()].concat(assignArgsList));
+ };
+ }
+ }
+ function make_trim() {
+ if (String.prototype.trim) {
+ return function trim2(str2) {
+ return String.prototype.trim.call(str2);
+ };
+ } else {
+ return function trim2(str2) {
+ return str2.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
+ };
+ }
+ }
+ function bind(obj, fn) {
+ return function() {
+ return fn.apply(obj, Array.prototype.slice.call(arguments, 0));
+ };
+ }
+ function slice(arr, index) {
+ return Array.prototype.slice.call(arr, index || 0);
+ }
+ function each(obj, fn) {
+ pluck(obj, function(val, key) {
+ fn(val, key);
+ return false;
+ });
+ }
+ function map2(obj, fn) {
+ var res = isList(obj) ? [] : {};
+ pluck(obj, function(v, k) {
+ res[k] = fn(v, k);
+ return false;
+ });
+ return res;
+ }
+ function pluck(obj, fn) {
+ if (isList(obj)) {
+ for (var i2 = 0; i2 < obj.length; i2++) {
+ if (fn(obj[i2], i2)) {
+ return obj[i2];
+ }
+ }
+ } else {
+ for (var key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ if (fn(obj[key], key)) {
+ return obj[key];
+ }
+ }
+ }
+ }
+ }
+ function isList(val) {
+ return val != null && typeof val != "function" && typeof val.length == "number";
+ }
+ function isFunction(val) {
+ return val && {}.toString.call(val) === "[object Function]";
+ }
+ function isObject2(val) {
+ return val && {}.toString.call(val) === "[object Object]";
+ }
+ }
+ });
+
+ // node_modules/store/src/store-engine.js
+ var require_store_engine = __commonJS({
+ "node_modules/store/src/store-engine.js"(exports2, module2) {
+ var util = require_util();
+ var slice = util.slice;
+ var pluck = util.pluck;
+ var each = util.each;
+ var bind = util.bind;
+ var create2 = util.create;
+ var isList = util.isList;
+ var isFunction = util.isFunction;
+ var isObject2 = util.isObject;
+ module2.exports = {
+ createStore
+ };
+ var storeAPI = {
+ version: "2.0.12",
+ enabled: false,
+ get: function(key, optionalDefaultValue) {
+ var data = this.storage.read(this._namespacePrefix + key);
+ return this._deserialize(data, optionalDefaultValue);
+ },
+ set: function(key, value) {
+ if (value === void 0) {
+ return this.remove(key);
+ }
+ this.storage.write(this._namespacePrefix + key, this._serialize(value));
+ return value;
+ },
+ remove: function(key) {
+ this.storage.remove(this._namespacePrefix + key);
+ },
+ each: function(callback) {
+ var self2 = this;
+ this.storage.each(function(val, namespacedKey) {
+ callback.call(self2, self2._deserialize(val), (namespacedKey || "").replace(self2._namespaceRegexp, ""));
+ });
+ },
+ clearAll: function() {
+ this.storage.clearAll();
+ },
+ hasNamespace: function(namespace) {
+ return this._namespacePrefix == "__storejs_" + namespace + "_";
+ },
+ createStore: function() {
+ return createStore.apply(this, arguments);
+ },
+ addPlugin: function(plugin) {
+ this._addPlugin(plugin);
+ },
+ namespace: function(namespace) {
+ return createStore(this.storage, this.plugins, namespace);
+ }
+ };
+ function _warn() {
+ var _console = typeof console == "undefined" ? null : console;
+ if (!_console) {
+ return;
+ }
+ var fn = _console.warn ? _console.warn : _console.log;
+ fn.apply(_console, arguments);
+ }
+ function createStore(storages, plugins, namespace) {
+ if (!namespace) {
+ namespace = "";
+ }
+ if (storages && !isList(storages)) {
+ storages = [storages];
+ }
+ if (plugins && !isList(plugins)) {
+ plugins = [plugins];
+ }
+ var namespacePrefix = namespace ? "__storejs_" + namespace + "_" : "";
+ var namespaceRegexp = namespace ? new RegExp("^" + namespacePrefix) : null;
+ var legalNamespaces = /^[a-zA-Z0-9_\-]*$/;
+ if (!legalNamespaces.test(namespace)) {
+ throw new Error("store.js namespaces can only have alphanumerics + underscores and dashes");
+ }
+ var _privateStoreProps = {
+ _namespacePrefix: namespacePrefix,
+ _namespaceRegexp: namespaceRegexp,
+ _testStorage: function(storage) {
+ try {
+ var testStr = "__storejs__test__";
+ storage.write(testStr, testStr);
+ var ok = storage.read(testStr) === testStr;
+ storage.remove(testStr);
+ return ok;
+ } catch (e) {
+ return false;
+ }
+ },
+ _assignPluginFnProp: function(pluginFnProp, propName) {
+ var oldFn = this[propName];
+ this[propName] = function pluginFn() {
+ var args = slice(arguments, 0);
+ var self2 = this;
+ function super_fn() {
+ if (!oldFn) {
+ return;
+ }
+ each(arguments, function(arg, i2) {
+ args[i2] = arg;
+ });
+ return oldFn.apply(self2, args);
+ }
+ var newFnArgs = [super_fn].concat(args);
+ return pluginFnProp.apply(self2, newFnArgs);
+ };
+ },
+ _serialize: function(obj) {
+ return JSON.stringify(obj);
+ },
+ _deserialize: function(strVal, defaultVal) {
+ if (!strVal) {
+ return defaultVal;
+ }
+ var val = "";
+ try {
+ val = JSON.parse(strVal);
+ } catch (e) {
+ val = strVal;
+ }
+ return val !== void 0 ? val : defaultVal;
+ },
+ _addStorage: function(storage) {
+ if (this.enabled) {
+ return;
+ }
+ if (this._testStorage(storage)) {
+ this.storage = storage;
+ this.enabled = true;
+ }
+ },
+ _addPlugin: function(plugin) {
+ var self2 = this;
+ if (isList(plugin)) {
+ each(plugin, function(plugin2) {
+ self2._addPlugin(plugin2);
+ });
+ return;
+ }
+ var seenPlugin = pluck(this.plugins, function(seenPlugin2) {
+ return plugin === seenPlugin2;
+ });
+ if (seenPlugin) {
+ return;
+ }
+ this.plugins.push(plugin);
+ if (!isFunction(plugin)) {
+ throw new Error("Plugins must be function values that return objects");
+ }
+ var pluginProperties = plugin.call(this);
+ if (!isObject2(pluginProperties)) {
+ throw new Error("Plugins must return an object of function properties");
+ }
+ each(pluginProperties, function(pluginFnProp, propName) {
+ if (!isFunction(pluginFnProp)) {
+ throw new Error("Bad plugin property: " + propName + " from plugin " + plugin.name + ". Plugins should only return functions.");
+ }
+ self2._assignPluginFnProp(pluginFnProp, propName);
+ });
+ },
+ addStorage: function(storage) {
+ _warn("store.addStorage(storage) is deprecated. Use createStore([storages])");
+ this._addStorage(storage);
+ }
+ };
+ var store2 = create2(_privateStoreProps, storeAPI, {
+ plugins: []
+ });
+ store2.raw = {};
+ each(store2, function(prop, propName) {
+ if (isFunction(prop)) {
+ store2.raw[propName] = bind(store2, prop);
+ }
+ });
+ each(storages, function(storage) {
+ store2._addStorage(storage);
+ });
+ each(plugins, function(plugin) {
+ store2._addPlugin(plugin);
+ });
+ return store2;
+ }
+ }
+ });
+
+ // node_modules/store/storages/localStorage.js
+ var require_localStorage = __commonJS({
+ "node_modules/store/storages/localStorage.js"(exports2, module2) {
+ var util = require_util();
+ var Global = util.Global;
+ module2.exports = {
+ name: "localStorage",
+ read,
+ write,
+ each,
+ remove: remove2,
+ clearAll
+ };
+ function localStorage2() {
+ return Global.localStorage;
+ }
+ function read(key) {
+ return localStorage2().getItem(key);
+ }
+ function write(key, data) {
+ return localStorage2().setItem(key, data);
+ }
+ function each(fn) {
+ for (var i2 = localStorage2().length - 1; i2 >= 0; i2--) {
+ var key = localStorage2().key(i2);
+ fn(read(key), key);
+ }
+ }
+ function remove2(key) {
+ return localStorage2().removeItem(key);
+ }
+ function clearAll() {
+ return localStorage2().clear();
+ }
+ }
+ });
+
+ // node_modules/store/storages/oldFF-globalStorage.js
+ var require_oldFF_globalStorage = __commonJS({
+ "node_modules/store/storages/oldFF-globalStorage.js"(exports2, module2) {
+ var util = require_util();
+ var Global = util.Global;
+ module2.exports = {
+ name: "oldFF-globalStorage",
+ read,
+ write,
+ each,
+ remove: remove2,
+ clearAll
+ };
+ var globalStorage = Global.globalStorage;
+ function read(key) {
+ return globalStorage[key];
+ }
+ function write(key, data) {
+ globalStorage[key] = data;
+ }
+ function each(fn) {
+ for (var i2 = globalStorage.length - 1; i2 >= 0; i2--) {
+ var key = globalStorage.key(i2);
+ fn(globalStorage[key], key);
+ }
+ }
+ function remove2(key) {
+ return globalStorage.removeItem(key);
+ }
+ function clearAll() {
+ each(function(key, _) {
+ delete globalStorage[key];
+ });
+ }
+ }
+ });
+
+ // node_modules/store/storages/oldIE-userDataStorage.js
+ var require_oldIE_userDataStorage = __commonJS({
+ "node_modules/store/storages/oldIE-userDataStorage.js"(exports2, module2) {
+ var util = require_util();
+ var Global = util.Global;
+ module2.exports = {
+ name: "oldIE-userDataStorage",
+ write,
+ read,
+ each,
+ remove: remove2,
+ clearAll
+ };
+ var storageName = "storejs";
+ var doc = Global.document;
+ var _withStorageEl = _makeIEStorageElFunction();
+ var disable = (Global.navigator ? Global.navigator.userAgent : "").match(/ (MSIE 8|MSIE 9|MSIE 10)\./);
+ function write(unfixedKey, data) {
+ if (disable) {
+ return;
+ }
+ var fixedKey = fixKey(unfixedKey);
+ _withStorageEl(function(storageEl) {
+ storageEl.setAttribute(fixedKey, data);
+ storageEl.save(storageName);
+ });
+ }
+ function read(unfixedKey) {
+ if (disable) {
+ return;
+ }
+ var fixedKey = fixKey(unfixedKey);
+ var res = null;
+ _withStorageEl(function(storageEl) {
+ res = storageEl.getAttribute(fixedKey);
+ });
+ return res;
+ }
+ function each(callback) {
+ _withStorageEl(function(storageEl) {
+ var attributes = storageEl.XMLDocument.documentElement.attributes;
+ for (var i2 = attributes.length - 1; i2 >= 0; i2--) {
+ var attr = attributes[i2];
+ callback(storageEl.getAttribute(attr.name), attr.name);
+ }
+ });
+ }
+ function remove2(unfixedKey) {
+ var fixedKey = fixKey(unfixedKey);
+ _withStorageEl(function(storageEl) {
+ storageEl.removeAttribute(fixedKey);
+ storageEl.save(storageName);
+ });
+ }
+ function clearAll() {
+ _withStorageEl(function(storageEl) {
+ var attributes = storageEl.XMLDocument.documentElement.attributes;
+ storageEl.load(storageName);
+ for (var i2 = attributes.length - 1; i2 >= 0; i2--) {
+ storageEl.removeAttribute(attributes[i2].name);
+ }
+ storageEl.save(storageName);
+ });
+ }
+ var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
+ function fixKey(key) {
+ return key.replace(/^\d/, "___$&").replace(forbiddenCharsRegex, "___");
+ }
+ function _makeIEStorageElFunction() {
+ if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
+ return null;
+ }
+ var scriptTag = "script", storageOwner, storageContainer, storageEl;
+ try {
+ storageContainer = new ActiveXObject("htmlfile");
+ storageContainer.open();
+ storageContainer.write("<" + scriptTag + ">document.w=window</" + scriptTag + '><iframe src="/favicon.ico"></iframe>');
+ storageContainer.close();
+ storageOwner = storageContainer.w.frames[0].document;
+ storageEl = storageOwner.createElement("div");
+ } catch (e) {
+ storageEl = doc.createElement("div");
+ storageOwner = doc.body;
+ }
+ return function(storeFunction) {
+ var args = [].slice.call(arguments, 0);
+ args.unshift(storageEl);
+ storageOwner.appendChild(storageEl);
+ storageEl.addBehavior("#default#userData");
+ storageEl.load(storageName);
+ storeFunction.apply(this, args);
+ storageOwner.removeChild(storageEl);
+ return;
+ };
+ }
+ }
+ });
+
+ // node_modules/store/storages/cookieStorage.js
+ var require_cookieStorage = __commonJS({
+ "node_modules/store/storages/cookieStorage.js"(exports2, module2) {
+ var util = require_util();
+ var Global = util.Global;
+ var trim = util.trim;
+ module2.exports = {
+ name: "cookieStorage",
+ read,
+ write,
+ each,
+ remove: remove2,
+ clearAll
+ };
+ var doc = Global.document;
+ function read(key) {
+ if (!key || !_has(key)) {
+ return null;
+ }
+ var regexpStr = "(?:^|.*;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
+ return unescape(doc.cookie.replace(new RegExp(regexpStr), "$1"));
+ }
+ function each(callback) {
+ var cookies = doc.cookie.split(/; ?/g);
+ for (var i2 = cookies.length - 1; i2 >= 0; i2--) {
+ if (!trim(cookies[i2])) {
+ continue;
+ }
+ var kvp = cookies[i2].split("=");
+ var key = unescape(kvp[0]);
+ var val = unescape(kvp[1]);
+ callback(val, key);
+ }
+ }
+ function write(key, data) {
+ if (!key) {
+ return;
+ }
+ doc.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
+ }
+ function remove2(key) {
+ if (!key || !_has(key)) {
+ return;
+ }
+ doc.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
+ }
+ function clearAll() {
+ each(function(_, key) {
+ remove2(key);
+ });
+ }
+ function _has(key) {
+ return new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=").test(doc.cookie);
+ }
+ }
+ });
+
+ // node_modules/store/storages/sessionStorage.js
+ var require_sessionStorage = __commonJS({
+ "node_modules/store/storages/sessionStorage.js"(exports2, module2) {
+ var util = require_util();
+ var Global = util.Global;
+ module2.exports = {
+ name: "sessionStorage",
+ read,
+ write,
+ each,
+ remove: remove2,
+ clearAll
+ };
+ function sessionStorage() {
+ return Global.sessionStorage;
+ }
+ function read(key) {
+ return sessionStorage().getItem(key);
+ }
+ function write(key, data) {
+ return sessionStorage().setItem(key, data);
+ }
+ function each(fn) {
+ for (var i2 = sessionStorage().length - 1; i2 >= 0; i2--) {
+ var key = sessionStorage().key(i2);
+ fn(read(key), key);
+ }
+ }
+ function remove2(key) {
+ return sessionStorage().removeItem(key);
+ }
+ function clearAll() {
+ return sessionStorage().clear();
+ }
+ }
+ });
+
+ // node_modules/store/storages/memoryStorage.js
+ var require_memoryStorage = __commonJS({
+ "node_modules/store/storages/memoryStorage.js"(exports2, module2) {
+ module2.exports = {
+ name: "memoryStorage",
+ read,
+ write,
+ each,
+ remove: remove2,
+ clearAll
+ };
+ var memoryStorage = {};
+ function read(key) {
+ return memoryStorage[key];
+ }
+ function write(key, data) {
+ memoryStorage[key] = data;
+ }
+ function each(callback) {
+ for (var key in memoryStorage) {
+ if (memoryStorage.hasOwnProperty(key)) {
+ callback(memoryStorage[key], key);
+ }
+ }
+ }
+ function remove2(key) {
+ delete memoryStorage[key];
+ }
+ function clearAll(key) {
+ memoryStorage = {};
+ }
+ }
+ });
+
+ // node_modules/store/storages/all.js
+ var require_all = __commonJS({
+ "node_modules/store/storages/all.js"(exports2, module2) {
+ module2.exports = [
+ require_localStorage(),
+ require_oldFF_globalStorage(),
+ require_oldIE_userDataStorage(),
+ require_cookieStorage(),
+ require_sessionStorage(),
+ require_memoryStorage()
+ ];
+ }
+ });
+
+ // node_modules/store/plugins/lib/json2.js
+ var require_json2 = __commonJS({
+ "node_modules/store/plugins/lib/json2.js"(exports, module) {
+ if (typeof JSON !== "object") {
+ JSON = {};
+ }
+ (function() {
+ "use strict";
+ var rx_one = /^[\],:{}\s]*$/;
+ var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
+ var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
+ var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
+ var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+ var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+ function f(n2) {
+ return n2 < 10 ? "0" + n2 : n2;
+ }
+ function this_value() {
+ return this.valueOf();
+ }
+ if (typeof Date.prototype.toJSON !== "function") {
+ Date.prototype.toJSON = function() {
+ return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z" : null;
+ };
+ Boolean.prototype.toJSON = this_value;
+ Number.prototype.toJSON = this_value;
+ String.prototype.toJSON = this_value;
+ }
+ var gap;
+ var indent;
+ var meta;
+ var rep;
+ function quote(string) {
+ rx_escapable.lastIndex = 0;
+ return rx_escapable.test(string) ? '"' + string.replace(rx_escapable, function(a) {
+ var c = meta[a];
+ return typeof c === "string" ? c : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
+ }) + '"' : '"' + string + '"';
+ }
+ function str(key, holder) {
+ var i2;
+ var k;
+ var v;
+ var length;
+ var mind = gap;
+ var partial;
+ var value = holder[key];
+ if (value && typeof value === "object" && typeof value.toJSON === "function") {
+ value = value.toJSON(key);
+ }
+ if (typeof rep === "function") {
+ value = rep.call(holder, key, value);
+ }
+ switch (typeof value) {
+ case "string":
+ return quote(value);
+ case "number":
+ return isFinite(value) ? String(value) : "null";
+ case "boolean":
+ case "null":
+ return String(value);
+ case "object":
+ if (!value) {
+ return "null";
+ }
+ gap += indent;
+ partial = [];
+ if (Object.prototype.toString.apply(value) === "[object Array]") {
+ length = value.length;
+ for (i2 = 0; i2 < length; i2 += 1) {
+ partial[i2] = str(i2, value) || "null";
+ }
+ v = partial.length === 0 ? "[]" : gap ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" : "[" + partial.join(",") + "]";
+ gap = mind;
+ return v;
+ }
+ if (rep && typeof rep === "object") {
+ length = rep.length;
+ for (i2 = 0; i2 < length; i2 += 1) {
+ if (typeof rep[i2] === "string") {
+ k = rep[i2];
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (gap ? ": " : ":") + v);
+ }
+ }
+ }
+ } else {
+ for (k in value) {
+ if (Object.prototype.hasOwnProperty.call(value, k)) {
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (gap ? ": " : ":") + v);
+ }
+ }
+ }
+ }
+ v = partial.length === 0 ? "{}" : gap ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" : "{" + partial.join(",") + "}";
+ gap = mind;
+ return v;
+ }
+ }
+ if (typeof JSON.stringify !== "function") {
+ meta = {
+ "\b": "\\b",
+ " ": "\\t",
+ "\n": "\\n",
+ "\f": "\\f",
+ "\r": "\\r",
+ '"': '\\"',
+ "\\": "\\\\"
+ };
+ JSON.stringify = function(value, replacer, space) {
+ var i2;
+ gap = "";
+ indent = "";
+ if (typeof space === "number") {
+ for (i2 = 0; i2 < space; i2 += 1) {
+ indent += " ";
+ }
+ } else if (typeof space === "string") {
+ indent = space;
+ }
+ rep = replacer;
+ if (replacer && typeof replacer !== "function" && (typeof replacer !== "object" || typeof replacer.length !== "number")) {
+ throw new Error("JSON.stringify");
+ }
+ return str("", { "": value });
+ };
+ }
+ if (typeof JSON.parse !== "function") {
+ JSON.parse = function(text, reviver) {
+ var j;
+ function walk(holder, key) {
+ var k;
+ var v;
+ var value = holder[key];
+ if (value && typeof value === "object") {
+ for (k in value) {
+ if (Object.prototype.hasOwnProperty.call(value, k)) {
+ v = walk(value, k);
+ if (v !== void 0) {
+ value[k] = v;
+ } else {
+ delete value[k];
+ }
+ }
+ }
+ }
+ return reviver.call(holder, key, value);
+ }
+ text = String(text);
+ rx_dangerous.lastIndex = 0;
+ if (rx_dangerous.test(text)) {
+ text = text.replace(rx_dangerous, function(a) {
+ return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
+ });
+ }
+ if (rx_one.test(text.replace(rx_two, "@").replace(rx_three, "]").replace(rx_four, ""))) {
+ j = eval("(" + text + ")");
+ return typeof reviver === "function" ? walk({ "": j }, "") : j;
+ }
+ throw new SyntaxError("JSON.parse");
+ };
+ }
+ })();
+ }
+ });
+
+ // node_modules/store/plugins/json2.js
+ var require_json22 = __commonJS({
+ "node_modules/store/plugins/json2.js"(exports2, module2) {
+ module2.exports = json2Plugin;
+ function json2Plugin() {
+ require_json2();
+ return {};
+ }
+ }
+ });
+
+ // node_modules/store/dist/store.legacy.js
+ var require_store_legacy = __commonJS({
+ "node_modules/store/dist/store.legacy.js"(exports2, module2) {
+ var engine = require_store_engine();
+ var storages = require_all();
+ var plugins = [require_json22()];
+ module2.exports = engine.createStore(storages, plugins);
+ }
+ });
+
+ // node_modules/whatwg-fetch/fetch.js
+ var global2 = typeof globalThis !== "undefined" && globalThis || typeof self !== "undefined" && self || typeof global2 !== "undefined" && global2;
+ var support = {
+ searchParams: "URLSearchParams" in global2,
+ iterable: "Symbol" in global2 && "iterator" in Symbol,
+ blob: "FileReader" in global2 && "Blob" in global2 && function() {
+ try {
+ new Blob();
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }(),
+ formData: "FormData" in global2,
+ arrayBuffer: "ArrayBuffer" in global2
+ };
+ function isDataView(obj) {
+ return obj && DataView.prototype.isPrototypeOf(obj);
+ }
+ if (support.arrayBuffer) {
+ viewClasses = [
+ "[object Int8Array]",
+ "[object Uint8Array]",
+ "[object Uint8ClampedArray]",
+ "[object Int16Array]",
+ "[object Uint16Array]",
+ "[object Int32Array]",
+ "[object Uint32Array]",
+ "[object Float32Array]",
+ "[object Float64Array]"
+ ];
+ isArrayBufferView = ArrayBuffer.isView || function(obj) {
+ return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1;
+ };
+ }
+ var viewClasses;
+ var isArrayBufferView;
+ function normalizeName(name2) {
+ if (typeof name2 !== "string") {
+ name2 = String(name2);
+ }
+ if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name2) || name2 === "") {
+ throw new TypeError('Invalid character in header field name: "' + name2 + '"');
+ }
+ return name2.toLowerCase();
+ }
+ function normalizeValue(value) {
+ if (typeof value !== "string") {
+ value = String(value);
+ }
+ return value;
+ }
+ function iteratorFor(items) {
+ var iterator = {
+ next: function() {
+ var value = items.shift();
+ return { done: value === void 0, value };
+ }
+ };
+ if (support.iterable) {
+ iterator[Symbol.iterator] = function() {
+ return iterator;
+ };
+ }
+ return iterator;
+ }
+ function Headers(headers) {
+ this.map = {};
+ if (headers instanceof Headers) {
+ headers.forEach(function(value, name2) {
+ this.append(name2, value);
+ }, this);
+ } else if (Array.isArray(headers)) {
+ headers.forEach(function(header) {
+ this.append(header[0], header[1]);
+ }, this);
+ } else if (headers) {
+ Object.getOwnPropertyNames(headers).forEach(function(name2) {
+ this.append(name2, headers[name2]);
+ }, this);
+ }
+ }
+ Headers.prototype.append = function(name2, value) {
+ name2 = normalizeName(name2);
+ value = normalizeValue(value);
+ var oldValue = this.map[name2];
+ this.map[name2] = oldValue ? oldValue + ", " + value : value;
+ };
+ Headers.prototype["delete"] = function(name2) {
+ delete this.map[normalizeName(name2)];
+ };
+ Headers.prototype.get = function(name2) {
+ name2 = normalizeName(name2);
+ return this.has(name2) ? this.map[name2] : null;
+ };
+ Headers.prototype.has = function(name2) {
+ return this.map.hasOwnProperty(normalizeName(name2));
+ };
+ Headers.prototype.set = function(name2, value) {
+ this.map[normalizeName(name2)] = normalizeValue(value);
+ };
+ Headers.prototype.forEach = function(callback, thisArg) {
+ for (var name2 in this.map) {
+ if (this.map.hasOwnProperty(name2)) {
+ callback.call(thisArg, this.map[name2], name2, this);
+ }
+ }
+ };
+ Headers.prototype.keys = function() {
+ var items = [];
+ this.forEach(function(value, name2) {
+ items.push(name2);
+ });
+ return iteratorFor(items);
+ };
+ Headers.prototype.values = function() {
+ var items = [];
+ this.forEach(function(value) {
+ items.push(value);
+ });
+ return iteratorFor(items);
+ };
+ Headers.prototype.entries = function() {
+ var items = [];
+ this.forEach(function(value, name2) {
+ items.push([name2, value]);
+ });
+ return iteratorFor(items);
+ };
+ if (support.iterable) {
+ Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
+ }
+ function consumed(body) {
+ if (body.bodyUsed) {
+ return Promise.reject(new TypeError("Already read"));
+ }
+ body.bodyUsed = true;
+ }
+ function fileReaderReady(reader) {
+ return new Promise(function(resolve, reject) {
+ reader.onload = function() {
+ resolve(reader.result);
+ };
+ reader.onerror = function() {
+ reject(reader.error);
+ };
+ });
+ }
+ function readBlobAsArrayBuffer(blob) {
+ var reader = new FileReader();
+ var promise = fileReaderReady(reader);
+ reader.readAsArrayBuffer(blob);
+ return promise;
+ }
+ function readBlobAsText(blob) {
+ var reader = new FileReader();
+ var promise = fileReaderReady(reader);
+ reader.readAsText(blob);
+ return promise;
+ }
+ function readArrayBufferAsText(buf) {
+ var view = new Uint8Array(buf);
+ var chars = new Array(view.length);
+ for (var i2 = 0; i2 < view.length; i2++) {
+ chars[i2] = String.fromCharCode(view[i2]);
+ }
+ return chars.join("");
+ }
+ function bufferClone(buf) {
+ if (buf.slice) {
+ return buf.slice(0);
+ } else {
+ var view = new Uint8Array(buf.byteLength);
+ view.set(new Uint8Array(buf));
+ return view.buffer;
+ }
+ }
+ function Body() {
+ this.bodyUsed = false;
+ this._initBody = function(body) {
+ this.bodyUsed = this.bodyUsed;
+ this._bodyInit = body;
+ if (!body) {
+ this._bodyText = "";
+ } else if (typeof body === "string") {
+ this._bodyText = body;
+ } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
+ this._bodyBlob = body;
+ } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
+ this._bodyFormData = body;
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this._bodyText = body.toString();
+ } else if (support.arrayBuffer && support.blob && isDataView(body)) {
+ this._bodyArrayBuffer = bufferClone(body.buffer);
+ this._bodyInit = new Blob([this._bodyArrayBuffer]);
+ } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
+ this._bodyArrayBuffer = bufferClone(body);
+ } else {
+ this._bodyText = body = Object.prototype.toString.call(body);
+ }
+ if (!this.headers.get("content-type")) {
+ if (typeof body === "string") {
+ this.headers.set("content-type", "text/plain;charset=UTF-8");
+ } else if (this._bodyBlob && this._bodyBlob.type) {
+ this.headers.set("content-type", this._bodyBlob.type);
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this.headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
+ }
+ }
+ };
+ if (support.blob) {
+ this.blob = function() {
+ var rejected = consumed(this);
+ if (rejected) {
+ return rejected;
+ }
+ if (this._bodyBlob) {
+ return Promise.resolve(this._bodyBlob);
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(new Blob([this._bodyArrayBuffer]));
+ } else if (this._bodyFormData) {
+ throw new Error("could not read FormData body as blob");
+ } else {
+ return Promise.resolve(new Blob([this._bodyText]));
+ }
+ };
+ this.arrayBuffer = function() {
+ if (this._bodyArrayBuffer) {
+ var isConsumed = consumed(this);
+ if (isConsumed) {
+ return isConsumed;
+ }
+ if (ArrayBuffer.isView(this._bodyArrayBuffer)) {
+ return Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset, this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength));
+ } else {
+ return Promise.resolve(this._bodyArrayBuffer);
+ }
+ } else {
+ return this.blob().then(readBlobAsArrayBuffer);
+ }
+ };
+ }
+ this.text = function() {
+ var rejected = consumed(this);
+ if (rejected) {
+ return rejected;
+ }
+ if (this._bodyBlob) {
+ return readBlobAsText(this._bodyBlob);
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer));
+ } else if (this._bodyFormData) {
+ throw new Error("could not read FormData body as text");
+ } else {
+ return Promise.resolve(this._bodyText);
+ }
+ };
+ if (support.formData) {
+ this.formData = function() {
+ return this.text().then(decode);
+ };
+ }
+ this.json = function() {
+ return this.text().then(JSON.parse);
+ };
+ return this;
+ }
+ var methods = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"];
+ function normalizeMethod(method) {
+ var upcased = method.toUpperCase();
+ return methods.indexOf(upcased) > -1 ? upcased : method;
+ }
+ function Request(input, options2) {
+ if (!(this instanceof Request)) {
+ throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
+ }
+ options2 = options2 || {};
+ var body = options2.body;
+ if (input instanceof Request) {
+ if (input.bodyUsed) {
+ throw new TypeError("Already read");
+ }
+ this.url = input.url;
+ this.credentials = input.credentials;
+ if (!options2.headers) {
+ this.headers = new Headers(input.headers);
+ }
+ this.method = input.method;
+ this.mode = input.mode;
+ this.signal = input.signal;
+ if (!body && input._bodyInit != null) {
+ body = input._bodyInit;
+ input.bodyUsed = true;
+ }
+ } else {
+ this.url = String(input);
+ }
+ this.credentials = options2.credentials || this.credentials || "same-origin";
+ if (options2.headers || !this.headers) {
+ this.headers = new Headers(options2.headers);
+ }
+ this.method = normalizeMethod(options2.method || this.method || "GET");
+ this.mode = options2.mode || this.mode || null;
+ this.signal = options2.signal || this.signal;
+ this.referrer = null;
+ if ((this.method === "GET" || this.method === "HEAD") && body) {
+ throw new TypeError("Body not allowed for GET or HEAD requests");
+ }
+ this._initBody(body);
+ if (this.method === "GET" || this.method === "HEAD") {
+ if (options2.cache === "no-store" || options2.cache === "no-cache") {
+ var reParamSearch = /([?&])_=[^&]*/;
+ if (reParamSearch.test(this.url)) {
+ this.url = this.url.replace(reParamSearch, "$1_=" + new Date().getTime());
+ } else {
+ var reQueryString = /\?/;
+ this.url += (reQueryString.test(this.url) ? "&" : "?") + "_=" + new Date().getTime();
+ }
+ }
+ }
+ }
+ Request.prototype.clone = function() {
+ return new Request(this, { body: this._bodyInit });
+ };
+ function decode(body) {
+ var form = new FormData();
+ body.trim().split("&").forEach(function(bytes) {
+ if (bytes) {
+ var split = bytes.split("=");
+ var name2 = split.shift().replace(/\+/g, " ");
+ var value = split.join("=").replace(/\+/g, " ");
+ form.append(decodeURIComponent(name2), decodeURIComponent(value));
+ }
+ });
+ return form;
+ }
+ function parseHeaders(rawHeaders) {
+ var headers = new Headers();
+ var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, " ");
+ preProcessedHeaders.split("\r").map(function(header) {
+ return header.indexOf("\n") === 0 ? header.substr(1, header.length) : header;
+ }).forEach(function(line) {
+ var parts = line.split(":");
+ var key = parts.shift().trim();
+ if (key) {
+ var value = parts.join(":").trim();
+ headers.append(key, value);
+ }
+ });
+ return headers;
+ }
+ Body.call(Request.prototype);
+ function Response(bodyInit, options2) {
+ if (!(this instanceof Response)) {
+ throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
+ }
+ if (!options2) {
+ options2 = {};
+ }
+ this.type = "default";
+ this.status = options2.status === void 0 ? 200 : options2.status;
+ this.ok = this.status >= 200 && this.status < 300;
+ this.statusText = options2.statusText === void 0 ? "" : "" + options2.statusText;
+ this.headers = new Headers(options2.headers);
+ this.url = options2.url || "";
+ this._initBody(bodyInit);
+ }
+ Body.call(Response.prototype);
+ Response.prototype.clone = function() {
+ return new Response(this._bodyInit, {
+ status: this.status,
+ statusText: this.statusText,
+ headers: new Headers(this.headers),
+ url: this.url
+ });
+ };
+ Response.error = function() {
+ var response = new Response(null, { status: 0, statusText: "" });
+ response.type = "error";
+ return response;
+ };
+ var redirectStatuses = [301, 302, 303, 307, 308];
+ Response.redirect = function(url, status) {
+ if (redirectStatuses.indexOf(status) === -1) {
+ throw new RangeError("Invalid status code");
+ }
+ return new Response(null, { status, headers: { location: url } });
+ };
+ var DOMException2 = global2.DOMException;
+ try {
+ new DOMException2();
+ } catch (err) {
+ DOMException2 = function(message, name2) {
+ this.message = message;
+ this.name = name2;
+ var error = Error(message);
+ this.stack = error.stack;
+ };
+ DOMException2.prototype = Object.create(Error.prototype);
+ DOMException2.prototype.constructor = DOMException2;
+ }
+ function fetch2(input, init2) {
+ return new Promise(function(resolve, reject) {
+ var request3 = new Request(input, init2);
+ if (request3.signal && request3.signal.aborted) {
+ return reject(new DOMException2("Aborted", "AbortError"));
+ }
+ var xhr = new XMLHttpRequest();
+ function abortXhr() {
+ xhr.abort();
+ }
+ xhr.onload = function() {
+ var options2 = {
+ status: xhr.status,
+ statusText: xhr.statusText,
+ headers: parseHeaders(xhr.getAllResponseHeaders() || "")
+ };
+ options2.url = "responseURL" in xhr ? xhr.responseURL : options2.headers.get("X-Request-URL");
+ var body = "response" in xhr ? xhr.response : xhr.responseText;
+ setTimeout(function() {
+ resolve(new Response(body, options2));
+ }, 0);
+ };
+ xhr.onerror = function() {
+ setTimeout(function() {
+ reject(new TypeError("Network request failed"));
+ }, 0);
+ };
+ xhr.ontimeout = function() {
+ setTimeout(function() {
+ reject(new TypeError("Network request failed"));
+ }, 0);
+ };
+ xhr.onabort = function() {
+ setTimeout(function() {
+ reject(new DOMException2("Aborted", "AbortError"));
+ }, 0);
+ };
+ function fixUrl(url) {
+ try {
+ return url === "" && global2.location.href ? global2.location.href : url;
+ } catch (e) {
+ return url;
+ }
+ }
+ xhr.open(request3.method, fixUrl(request3.url), true);
+ if (request3.credentials === "include") {
+ xhr.withCredentials = true;
+ } else if (request3.credentials === "omit") {
+ xhr.withCredentials = false;
+ }
+ if ("responseType" in xhr) {
+ if (support.blob) {
+ xhr.responseType = "blob";
+ } else if (support.arrayBuffer && request3.headers.get("Content-Type") && request3.headers.get("Content-Type").indexOf("application/octet-stream") !== -1) {
+ xhr.responseType = "arraybuffer";
+ }
+ }
+ if (init2 && typeof init2.headers === "object" && !(init2.headers instanceof Headers)) {
+ Object.getOwnPropertyNames(init2.headers).forEach(function(name2) {
+ xhr.setRequestHeader(name2, normalizeValue(init2.headers[name2]));
+ });
+ } else {
+ request3.headers.forEach(function(value, name2) {
+ xhr.setRequestHeader(name2, value);
+ });
+ }
+ if (request3.signal) {
+ request3.signal.addEventListener("abort", abortXhr);
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState === 4) {
+ request3.signal.removeEventListener("abort", abortXhr);
+ }
+ };
+ }
+ xhr.send(typeof request3._bodyInit === "undefined" ? null : request3._bodyInit);
+ });
+ }
+ fetch2.polyfill = true;
+ if (!global2.fetch) {
+ global2.fetch = fetch2;
+ global2.Headers = Headers;
+ global2.Request = Request;
+ global2.Response = Response;
+ }
+
+ // node_modules/abortcontroller-polyfill/dist/polyfill-patch-fetch.js
+ (function(factory) {
+ typeof define === "function" && define.amd ? define(factory) : factory();
+ })(function() {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+ function _defineProperties(target, props) {
+ for (var i2 = 0; i2 < props.length; i2++) {
+ var descriptor = props[i2];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor)
+ descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps)
+ _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps)
+ _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function");
+ }
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ writable: true,
+ configurable: true
+ }
+ });
+ if (superClass)
+ _setPrototypeOf(subClass, superClass);
+ }
+ function _getPrototypeOf(o) {
+ _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) {
+ return o2.__proto__ || Object.getPrototypeOf(o2);
+ };
+ return _getPrototypeOf(o);
+ }
+ function _setPrototypeOf(o, p) {
+ _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) {
+ o2.__proto__ = p2;
+ return o2;
+ };
+ return _setPrototypeOf(o, p);
+ }
+ function _isNativeReflectConstruct() {
+ if (typeof Reflect === "undefined" || !Reflect.construct)
+ return false;
+ if (Reflect.construct.sham)
+ return false;
+ if (typeof Proxy === "function")
+ return true;
+ try {
+ Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
+ }));
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+ function _assertThisInitialized(self2) {
+ if (self2 === void 0) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }
+ return self2;
+ }
+ function _possibleConstructorReturn(self2, call) {
+ if (call && (typeof call === "object" || typeof call === "function")) {
+ return call;
+ }
+ return _assertThisInitialized(self2);
+ }
+ function _createSuper(Derived) {
+ var hasNativeReflectConstruct = _isNativeReflectConstruct();
+ return function _createSuperInternal() {
+ var Super = _getPrototypeOf(Derived), result;
+ if (hasNativeReflectConstruct) {
+ var NewTarget = _getPrototypeOf(this).constructor;
+ result = Reflect.construct(Super, arguments, NewTarget);
+ } else {
+ result = Super.apply(this, arguments);
+ }
+ return _possibleConstructorReturn(this, result);
+ };
+ }
+ function _superPropBase(object, property) {
+ while (!Object.prototype.hasOwnProperty.call(object, property)) {
+ object = _getPrototypeOf(object);
+ if (object === null)
+ break;
+ }
+ return object;
+ }
+ function _get(target, property, receiver) {
+ if (typeof Reflect !== "undefined" && Reflect.get) {
+ _get = Reflect.get;
+ } else {
+ _get = function _get2(target2, property2, receiver2) {
+ var base = _superPropBase(target2, property2);
+ if (!base)
+ return;
+ var desc = Object.getOwnPropertyDescriptor(base, property2);
+ if (desc.get) {
+ return desc.get.call(receiver2);
+ }
+ return desc.value;
+ };
+ }
+ return _get(target, property, receiver || target);
+ }
+ var Emitter = /* @__PURE__ */ function() {
+ function Emitter2() {
+ _classCallCheck(this, Emitter2);
+ Object.defineProperty(this, "listeners", {
+ value: {},
+ writable: true,
+ configurable: true
+ });
+ }
+ _createClass(Emitter2, [{
+ key: "addEventListener",
+ value: function addEventListener(type3, callback, options2) {
+ if (!(type3 in this.listeners)) {
+ this.listeners[type3] = [];
+ }
+ this.listeners[type3].push({
+ callback,
+ options: options2
+ });
+ }
+ }, {
+ key: "removeEventListener",
+ value: function removeEventListener(type3, callback) {
+ if (!(type3 in this.listeners)) {
+ return;
+ }
+ var stack = this.listeners[type3];
+ for (var i2 = 0, l = stack.length; i2 < l; i2++) {
+ if (stack[i2].callback === callback) {
+ stack.splice(i2, 1);
+ return;
+ }
+ }
+ }
+ }, {
+ key: "dispatchEvent",
+ value: function dispatchEvent2(event) {
+ if (!(event.type in this.listeners)) {
+ return;
+ }
+ var stack = this.listeners[event.type];
+ var stackToCall = stack.slice();
+ for (var i2 = 0, l = stackToCall.length; i2 < l; i2++) {
+ var listener = stackToCall[i2];
+ try {
+ listener.callback.call(this, event);
+ } catch (e) {
+ Promise.resolve().then(function() {
+ throw e;
+ });
+ }
+ if (listener.options && listener.options.once) {
+ this.removeEventListener(event.type, listener.callback);
+ }
+ }
+ return !event.defaultPrevented;
+ }
+ }]);
+ return Emitter2;
+ }();
+ var AbortSignal = /* @__PURE__ */ function(_Emitter) {
+ _inherits(AbortSignal2, _Emitter);
+ var _super = _createSuper(AbortSignal2);
+ function AbortSignal2() {
+ var _this;
+ _classCallCheck(this, AbortSignal2);
+ _this = _super.call(this);
+ if (!_this.listeners) {
+ Emitter.call(_assertThisInitialized(_this));
+ }
+ Object.defineProperty(_assertThisInitialized(_this), "aborted", {
+ value: false,
+ writable: true,
+ configurable: true
+ });
+ Object.defineProperty(_assertThisInitialized(_this), "onabort", {
+ value: null,
+ writable: true,
+ configurable: true
+ });
+ return _this;
+ }
+ _createClass(AbortSignal2, [{
+ key: "toString",
+ value: function toString2() {
+ return "[object AbortSignal]";
+ }
+ }, {
+ key: "dispatchEvent",
+ value: function dispatchEvent2(event) {
+ if (event.type === "abort") {
+ this.aborted = true;
+ if (typeof this.onabort === "function") {
+ this.onabort.call(this, event);
+ }
+ }
+ _get(_getPrototypeOf(AbortSignal2.prototype), "dispatchEvent", this).call(this, event);
+ }
+ }]);
+ return AbortSignal2;
+ }(Emitter);
+ var AbortController2 = /* @__PURE__ */ function() {
+ function AbortController3() {
+ _classCallCheck(this, AbortController3);
+ Object.defineProperty(this, "signal", {
+ value: new AbortSignal(),
+ writable: true,
+ configurable: true
+ });
+ }
+ _createClass(AbortController3, [{
+ key: "abort",
+ value: function abort() {
+ var event;
+ try {
+ event = new Event("abort");
+ } catch (e) {
+ if (typeof document !== "undefined") {
+ if (!document.createEvent) {
+ event = document.createEventObject();
+ event.type = "abort";
+ } else {
+ event = document.createEvent("Event");
+ event.initEvent("abort", false, false);
+ }
+ } else {
+ event = {
+ type: "abort",
+ bubbles: false,
+ cancelable: false
+ };
+ }
+ }
+ this.signal.dispatchEvent(event);
+ }
+ }, {
+ key: "toString",
+ value: function toString2() {
+ return "[object AbortController]";
+ }
+ }]);
+ return AbortController3;
+ }();
+ if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
+ AbortController2.prototype[Symbol.toStringTag] = "AbortController";
+ AbortSignal.prototype[Symbol.toStringTag] = "AbortSignal";
+ }
+ function polyfillNeeded(self2) {
+ if (self2.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
+ console.log("__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill");
+ return true;
+ }
+ return typeof self2.Request === "function" && !self2.Request.prototype.hasOwnProperty("signal") || !self2.AbortController;
+ }
+ function abortableFetchDecorator(patchTargets) {
+ if (typeof patchTargets === "function") {
+ patchTargets = {
+ fetch: patchTargets
+ };
+ }
+ var _patchTargets = patchTargets, fetch3 = _patchTargets.fetch, _patchTargets$Request = _patchTargets.Request, NativeRequest = _patchTargets$Request === void 0 ? fetch3.Request : _patchTargets$Request, NativeAbortController = _patchTargets.AbortController, _patchTargets$__FORCE = _patchTargets.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL, __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL = _patchTargets$__FORCE === void 0 ? false : _patchTargets$__FORCE;
+ if (!polyfillNeeded({
+ fetch: fetch3,
+ Request: NativeRequest,
+ AbortController: NativeAbortController,
+ __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL
+ })) {
+ return {
+ fetch: fetch3,
+ Request: Request2
+ };
+ }
+ var Request2 = NativeRequest;
+ if (Request2 && !Request2.prototype.hasOwnProperty("signal") || __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
+ Request2 = function Request3(input, init2) {
+ var signal;
+ if (init2 && init2.signal) {
+ signal = init2.signal;
+ delete init2.signal;
+ }
+ var request3 = new NativeRequest(input, init2);
+ if (signal) {
+ Object.defineProperty(request3, "signal", {
+ writable: false,
+ enumerable: false,
+ configurable: true,
+ value: signal
+ });
+ }
+ return request3;
+ };
+ Request2.prototype = NativeRequest.prototype;
+ }
+ var realFetch = fetch3;
+ var abortableFetch = function abortableFetch2(input, init2) {
+ var signal = Request2 && Request2.prototype.isPrototypeOf(input) ? input.signal : init2 ? init2.signal : void 0;
+ if (signal) {
+ var abortError;
+ try {
+ abortError = new DOMException("Aborted", "AbortError");
+ } catch (err) {
+ abortError = new Error("Aborted");
+ abortError.name = "AbortError";
+ }
+ if (signal.aborted) {
+ return Promise.reject(abortError);
+ }
+ var cancellation = new Promise(function(_, reject) {
+ signal.addEventListener("abort", function() {
+ return reject(abortError);
+ }, {
+ once: true
+ });
+ });
+ if (init2 && init2.signal) {
+ delete init2.signal;
+ }
+ return Promise.race([cancellation, realFetch(input, init2)]);
+ }
+ return realFetch(input, init2);
+ };
+ return {
+ fetch: abortableFetch,
+ Request: Request2
+ };
+ }
+ (function(self2) {
+ if (!polyfillNeeded(self2)) {
+ return;
+ }
+ if (!self2.fetch) {
+ console.warn("fetch() is not available, cannot install abortcontroller-polyfill");
+ return;
+ }
+ var _abortableFetch = abortableFetchDecorator(self2), fetch3 = _abortableFetch.fetch, Request2 = _abortableFetch.Request;
+ self2.fetch = fetch3;
+ self2.Request = Request2;
+ Object.defineProperty(self2, "AbortController", {
+ writable: true,
+ enumerable: false,
+ configurable: true,
+ value: AbortController2
+ });
+ Object.defineProperty(self2, "AbortSignal", {
+ writable: true,
+ enumerable: false,
+ configurable: true,
+ value: AbortSignal
+ });
+ })(typeof self !== "undefined" ? self : global);
+ });
+
+ // modules/index.js
+ var modules_exports = {};
+ __export(modules_exports, {
+ QAItem: () => QAItem,
+ actionAddEntity: () => actionAddEntity,
+ actionAddMember: () => actionAddMember,
+ actionAddMidpoint: () => actionAddMidpoint,
+ actionAddVertex: () => actionAddVertex,
+ actionChangeMember: () => actionChangeMember,
+ actionChangePreset: () => actionChangePreset,
+ actionChangeTags: () => actionChangeTags,
+ actionCircularize: () => actionCircularize,
+ actionConnect: () => actionConnect,
+ actionCopyEntities: () => actionCopyEntities,
+ actionDeleteMember: () => actionDeleteMember,
+ actionDeleteMultiple: () => actionDeleteMultiple,
+ actionDeleteNode: () => actionDeleteNode,
+ actionDeleteRelation: () => actionDeleteRelation,
+ actionDeleteWay: () => actionDeleteWay,
+ actionDiscardTags: () => actionDiscardTags,
+ actionDisconnect: () => actionDisconnect,
+ actionExtract: () => actionExtract,
+ actionJoin: () => actionJoin,
+ actionMerge: () => actionMerge,
+ actionMergeNodes: () => actionMergeNodes,
+ actionMergePolygon: () => actionMergePolygon,
+ actionMergeRemoteChanges: () => actionMergeRemoteChanges,
+ actionMove: () => actionMove,
+ actionMoveMember: () => actionMoveMember,
+ actionMoveNode: () => actionMoveNode,
+ actionNoop: () => actionNoop,
+ actionOrthogonalize: () => actionOrthogonalize,
+ actionReflect: () => actionReflect,
+ actionRestrictTurn: () => actionRestrictTurn,
+ actionReverse: () => actionReverse,
+ actionRevert: () => actionRevert,
+ actionRotate: () => actionRotate,
+ actionScale: () => actionScale,
+ actionSplit: () => actionSplit,
+ actionStraightenNodes: () => actionStraightenNodes,
+ actionStraightenWay: () => actionStraightenWay,
+ actionUnrestrictTurn: () => actionUnrestrictTurn,
+ actionUpgradeTags: () => actionUpgradeTags,
+ behaviorAddWay: () => behaviorAddWay,
+ behaviorBreathe: () => behaviorBreathe,
+ behaviorDrag: () => behaviorDrag,
+ behaviorDraw: () => behaviorDraw,
+ behaviorDrawWay: () => behaviorDrawWay,
+ behaviorEdit: () => behaviorEdit,
+ behaviorHash: () => behaviorHash,
+ behaviorHover: () => behaviorHover,
+ behaviorLasso: () => behaviorLasso,
+ behaviorOperation: () => behaviorOperation,
+ behaviorPaste: () => behaviorPaste,
+ behaviorSelect: () => behaviorSelect,
+ coreContext: () => coreContext,
+ coreDifference: () => coreDifference,
+ coreFileFetcher: () => coreFileFetcher,
+ coreGraph: () => coreGraph,
+ coreHistory: () => coreHistory,
+ coreLocalizer: () => coreLocalizer,
+ coreLocations: () => coreLocations,
+ coreTree: () => coreTree,
+ coreUploader: () => coreUploader,
+ coreValidator: () => coreValidator,
+ d3: () => d3,
+ debug: () => debug,
+ fileFetcher: () => _mainFileFetcher,
+ geoAngle: () => geoAngle,
+ geoChooseEdge: () => geoChooseEdge,
+ geoEdgeEqual: () => geoEdgeEqual,
+ geoExtent: () => geoExtent,
+ geoGetSmallestSurroundingRectangle: () => geoGetSmallestSurroundingRectangle,
+ geoHasLineIntersections: () => geoHasLineIntersections,
+ geoHasSelfIntersections: () => geoHasSelfIntersections,
+ geoLatToMeters: () => geoLatToMeters,
+ geoLineIntersection: () => geoLineIntersection,
+ geoLonToMeters: () => geoLonToMeters,
+ geoMetersToLat: () => geoMetersToLat,
+ geoMetersToLon: () => geoMetersToLon,
+ geoMetersToOffset: () => geoMetersToOffset,
+ geoOffsetToMeters: () => geoOffsetToMeters,
+ geoOrthoCalcScore: () => geoOrthoCalcScore,
+ geoOrthoCanOrthogonalize: () => geoOrthoCanOrthogonalize,
+ geoOrthoMaxOffsetAngle: () => geoOrthoMaxOffsetAngle,
+ geoOrthoNormalizedDotProduct: () => geoOrthoNormalizedDotProduct,
+ geoPathHasIntersections: () => geoPathHasIntersections,
+ geoPathIntersections: () => geoPathIntersections,
+ geoPathLength: () => geoPathLength,
+ geoPointInPolygon: () => geoPointInPolygon,
+ geoPolygonContainsPolygon: () => geoPolygonContainsPolygon,
+ geoPolygonIntersectsPolygon: () => geoPolygonIntersectsPolygon,
+ geoRawMercator: () => geoRawMercator,
+ geoRotate: () => geoRotate,
+ geoScaleToZoom: () => geoScaleToZoom,
+ geoSphericalClosestNode: () => geoSphericalClosestNode,
+ geoSphericalDistance: () => geoSphericalDistance,
+ geoVecAdd: () => geoVecAdd,
+ geoVecAngle: () => geoVecAngle,
+ geoVecCross: () => geoVecCross,
+ geoVecDot: () => geoVecDot,
+ geoVecEqual: () => geoVecEqual,
+ geoVecFloor: () => geoVecFloor,
+ geoVecInterp: () => geoVecInterp,
+ geoVecLength: () => geoVecLength,
+ geoVecLengthSquare: () => geoVecLengthSquare,
+ geoVecNormalize: () => geoVecNormalize,
+ geoVecNormalizedDot: () => geoVecNormalizedDot,
+ geoVecProject: () => geoVecProject,
+ geoVecScale: () => geoVecScale,
+ geoVecSubtract: () => geoVecSubtract,
+ geoViewportEdge: () => geoViewportEdge,
+ geoZoomToScale: () => geoZoomToScale,
+ localizer: () => _mainLocalizer,
+ locationManager: () => _mainLocations,
+ modeAddArea: () => modeAddArea,
+ modeAddLine: () => modeAddLine,
+ modeAddNote: () => modeAddNote,
+ modeAddPoint: () => modeAddPoint,
+ modeBrowse: () => modeBrowse,
+ modeDragNode: () => modeDragNode,
+ modeDragNote: () => modeDragNote,
+ modeDrawArea: () => modeDrawArea,
+ modeDrawLine: () => modeDrawLine,
+ modeMove: () => modeMove,
+ modeRotate: () => modeRotate,
+ modeSave: () => modeSave,
+ modeSelect: () => modeSelect,
+ modeSelectData: () => modeSelectData,
+ modeSelectError: () => modeSelectError,
+ modeSelectNote: () => modeSelectNote,
+ operationCircularize: () => operationCircularize,
+ operationContinue: () => operationContinue,
+ operationCopy: () => operationCopy,
+ operationDelete: () => operationDelete,
+ operationDisconnect: () => operationDisconnect,
+ operationDowngrade: () => operationDowngrade,
+ operationExtract: () => operationExtract,
+ operationMerge: () => operationMerge,
+ operationMove: () => operationMove,
+ operationOrthogonalize: () => operationOrthogonalize,
+ operationPaste: () => operationPaste,
+ operationReflectLong: () => operationReflectLong,
+ operationReflectShort: () => operationReflectShort,
+ operationReverse: () => operationReverse,
+ operationRotate: () => operationRotate,
+ operationSplit: () => operationSplit,
+ operationStraighten: () => operationStraighten,
+ osmAreaKeys: () => osmAreaKeys,
+ osmChangeset: () => osmChangeset,
+ osmEntity: () => osmEntity,
+ osmFlowingWaterwayTagValues: () => osmFlowingWaterwayTagValues,
+ osmInferRestriction: () => osmInferRestriction,
+ osmIntersection: () => osmIntersection,
+ osmIsInterestingTag: () => osmIsInterestingTag,
+ osmIsOldMultipolygonOuterMember: () => osmIsOldMultipolygonOuterMember,
+ osmJoinWays: () => osmJoinWays,
+ osmLanes: () => osmLanes,
+ osmNode: () => osmNode,
+ osmNodeGeometriesForTags: () => osmNodeGeometriesForTags,
+ osmNote: () => osmNote,
+ osmOldMultipolygonOuterMember: () => osmOldMultipolygonOuterMember,
+ osmOldMultipolygonOuterMemberOfRelation: () => osmOldMultipolygonOuterMemberOfRelation,
+ osmOneWayTags: () => osmOneWayTags,
+ osmPavedTags: () => osmPavedTags,
+ osmPointTags: () => osmPointTags,
+ osmRailwayTrackTagValues: () => osmRailwayTrackTagValues,
+ osmRelation: () => osmRelation,
+ osmRoutableHighwayTagValues: () => osmRoutableHighwayTagValues,
+ osmSetAreaKeys: () => osmSetAreaKeys,
+ osmSetPointTags: () => osmSetPointTags,
+ osmSetVertexTags: () => osmSetVertexTags,
+ osmTagSuggestingArea: () => osmTagSuggestingArea,
+ osmTurn: () => osmTurn,
+ osmVertexTags: () => osmVertexTags,
+ osmWay: () => osmWay,
+ prefs: () => corePreferences,
+ presetCategory: () => presetCategory,
+ presetCollection: () => presetCollection,
+ presetField: () => presetField,
+ presetIndex: () => presetIndex,
+ presetManager: () => _mainPresetIndex,
+ presetPreset: () => presetPreset,
+ rendererBackground: () => rendererBackground,
+ rendererBackgroundSource: () => rendererBackgroundSource,
+ rendererFeatures: () => rendererFeatures,
+ rendererMap: () => rendererMap,
+ rendererPhotos: () => rendererPhotos,
+ rendererTileLayer: () => rendererTileLayer,
+ serviceImproveOSM: () => improveOSM_default,
+ serviceKartaview: () => kartaview_default,
+ serviceKeepRight: () => keepRight_default,
+ serviceMapRules: () => maprules_default,
+ serviceMapillary: () => mapillary_default,
+ serviceNominatim: () => nominatim_default,
+ serviceNsi: () => nsi_default,
+ serviceOsm: () => osm_default,
+ serviceOsmWikibase: () => osm_wikibase_default,
+ serviceOsmose: () => osmose_default,
+ serviceStreetside: () => streetside_default,
+ serviceTaginfo: () => taginfo_default,
+ serviceVectorTile: () => vector_tile_default,
+ serviceWikidata: () => wikidata_default,
+ serviceWikipedia: () => wikipedia_default,
+ services: () => services,
+ svgAreas: () => svgAreas,
+ svgData: () => svgData,
+ svgDebug: () => svgDebug,
+ svgDefs: () => svgDefs,
+ svgGeolocate: () => svgGeolocate,
+ svgIcon: () => svgIcon,
+ svgKartaviewImages: () => svgKartaviewImages,
+ svgKeepRight: () => svgKeepRight,
+ svgLabels: () => svgLabels,
+ svgLayers: () => svgLayers,
+ svgLines: () => svgLines,
+ svgMapillaryImages: () => svgMapillaryImages,
+ svgMapillarySigns: () => svgMapillarySigns,
+ svgMarkerSegments: () => svgMarkerSegments,
+ svgMidpoints: () => svgMidpoints,
+ svgNotes: () => svgNotes,
+ svgOsm: () => svgOsm,
+ svgPassiveVertex: () => svgPassiveVertex,
+ svgPath: () => svgPath,
+ svgPointTransform: () => svgPointTransform,
+ svgPoints: () => svgPoints,
+ svgRelationMemberTags: () => svgRelationMemberTags,
+ svgSegmentWay: () => svgSegmentWay,
+ svgStreetside: () => svgStreetside,
+ svgTagClasses: () => svgTagClasses,
+ svgTagPattern: () => svgTagPattern,
+ svgTouch: () => svgTouch,
+ svgTurns: () => svgTurns,
+ svgVertices: () => svgVertices,
+ t: () => _t,
+ uiAccount: () => uiAccount,
+ uiAttribution: () => uiAttribution,
+ uiChangesetEditor: () => uiChangesetEditor,
+ uiCmd: () => uiCmd,
+ uiCombobox: () => uiCombobox,
+ uiCommit: () => uiCommit,
+ uiCommitWarnings: () => uiCommitWarnings,
+ uiConfirm: () => uiConfirm,
+ uiConflicts: () => uiConflicts,
+ uiContributors: () => uiContributors,
+ uiCurtain: () => uiCurtain,
+ uiDataEditor: () => uiDataEditor,
+ uiDataHeader: () => uiDataHeader,
+ uiDisclosure: () => uiDisclosure,
+ uiEditMenu: () => uiEditMenu,
+ uiEntityEditor: () => uiEntityEditor,
+ uiFeatureInfo: () => uiFeatureInfo,
+ uiFeatureList: () => uiFeatureList,
+ uiField: () => uiField,
+ uiFieldAccess: () => uiFieldAccess,
+ uiFieldAddress: () => uiFieldAddress,
+ uiFieldCheck: () => uiFieldCheck,
+ uiFieldCombo: () => uiFieldCombo,
+ uiFieldCycleway: () => uiFieldCycleway,
+ uiFieldDefaultCheck: () => uiFieldCheck,
+ uiFieldEmail: () => uiFieldText,
+ uiFieldHelp: () => uiFieldHelp,
+ uiFieldIdentifier: () => uiFieldText,
+ uiFieldLanes: () => uiFieldLanes,
+ uiFieldLocalized: () => uiFieldLocalized,
+ uiFieldManyCombo: () => uiFieldCombo,
+ uiFieldMultiCombo: () => uiFieldCombo,
+ uiFieldNetworkCombo: () => uiFieldCombo,
+ uiFieldNumber: () => uiFieldText,
+ uiFieldOnewayCheck: () => uiFieldCheck,
+ uiFieldRadio: () => uiFieldRadio,
+ uiFieldRestrictions: () => uiFieldRestrictions,
+ uiFieldRoadheight: () => uiFieldRoadheight,
+ uiFieldRoadspeed: () => uiFieldRoadspeed,
+ uiFieldSemiCombo: () => uiFieldCombo,
+ uiFieldStructureRadio: () => uiFieldRadio,
+ uiFieldTel: () => uiFieldText,
+ uiFieldText: () => uiFieldText,
+ uiFieldTextarea: () => uiFieldTextarea,
+ uiFieldTypeCombo: () => uiFieldCombo,
+ uiFieldUrl: () => uiFieldText,
+ uiFieldWikidata: () => uiFieldWikidata,
+ uiFieldWikipedia: () => uiFieldWikipedia,
+ uiFields: () => uiFields,
+ uiFlash: () => uiFlash,
+ uiFormFields: () => uiFormFields,
+ uiFullScreen: () => uiFullScreen,
+ uiGeolocate: () => uiGeolocate,
+ uiImproveOsmComments: () => uiImproveOsmComments,
+ uiImproveOsmDetails: () => uiImproveOsmDetails,
+ uiImproveOsmEditor: () => uiImproveOsmEditor,
+ uiImproveOsmHeader: () => uiImproveOsmHeader,
+ uiInfo: () => uiInfo,
+ uiInfoPanels: () => uiInfoPanels,
+ uiInit: () => uiInit,
+ uiInspector: () => uiInspector,
+ uiIntro: () => uiIntro,
+ uiIssuesInfo: () => uiIssuesInfo,
+ uiKeepRightDetails: () => uiKeepRightDetails,
+ uiKeepRightEditor: () => uiKeepRightEditor,
+ uiKeepRightHeader: () => uiKeepRightHeader,
+ uiLasso: () => uiLasso,
+ uiLoading: () => uiLoading,
+ uiMapInMap: () => uiMapInMap,
+ uiModal: () => uiModal,
+ uiNoteComments: () => uiNoteComments,
+ uiNoteEditor: () => uiNoteEditor,
+ uiNoteHeader: () => uiNoteHeader,
+ uiNoteReport: () => uiNoteReport,
+ uiNotice: () => uiNotice,
+ uiPaneBackground: () => uiPaneBackground,
+ uiPaneHelp: () => uiPaneHelp,
+ uiPaneIssues: () => uiPaneIssues,
+ uiPaneMapData: () => uiPaneMapData,
+ uiPanePreferences: () => uiPanePreferences,
+ uiPanelBackground: () => uiPanelBackground,
+ uiPanelHistory: () => uiPanelHistory,
+ uiPanelLocation: () => uiPanelLocation,
+ uiPanelMeasurement: () => uiPanelMeasurement,
+ uiPopover: () => uiPopover,
+ uiPresetIcon: () => uiPresetIcon,
+ uiPresetList: () => uiPresetList,
+ uiRestore: () => uiRestore,
+ uiScale: () => uiScale,
+ uiSectionBackgroundDisplayOptions: () => uiSectionBackgroundDisplayOptions,
+ uiSectionBackgroundList: () => uiSectionBackgroundList,
+ uiSectionBackgroundOffset: () => uiSectionBackgroundOffset,
+ uiSectionChanges: () => uiSectionChanges,
+ uiSectionDataLayers: () => uiSectionDataLayers,
+ uiSectionEntityIssues: () => uiSectionEntityIssues,
+ uiSectionFeatureType: () => uiSectionFeatureType,
+ uiSectionMapFeatures: () => uiSectionMapFeatures,
+ uiSectionMapStyleOptions: () => uiSectionMapStyleOptions,
+ uiSectionOverlayList: () => uiSectionOverlayList,
+ uiSectionPhotoOverlays: () => uiSectionPhotoOverlays,
+ uiSectionPresetFields: () => uiSectionPresetFields,
+ uiSectionPrivacy: () => uiSectionPrivacy,
+ uiSectionRawMemberEditor: () => uiSectionRawMemberEditor,
+ uiSectionRawMembershipEditor: () => uiSectionRawMembershipEditor,
+ uiSectionRawTagEditor: () => uiSectionRawTagEditor,
+ uiSectionSelectionList: () => uiSectionSelectionList,
+ uiSectionValidationIssues: () => uiSectionValidationIssues,
+ uiSectionValidationOptions: () => uiSectionValidationOptions,
+ uiSectionValidationRules: () => uiSectionValidationRules,
+ uiSectionValidationStatus: () => uiSectionValidationStatus,
+ uiSettingsCustomBackground: () => uiSettingsCustomBackground,
+ uiSettingsCustomData: () => uiSettingsCustomData,
+ uiSidebar: () => uiSidebar,
+ uiSourceSwitch: () => uiSourceSwitch,
+ uiSpinner: () => uiSpinner,
+ uiSplash: () => uiSplash,
+ uiStatus: () => uiStatus,
+ uiSuccess: () => uiSuccess,
+ uiTagReference: () => uiTagReference,
+ uiToggle: () => uiToggle,
+ uiTooltip: () => uiTooltip,
+ uiVersion: () => uiVersion,
+ uiViewOnKeepRight: () => uiViewOnKeepRight,
+ uiViewOnOSM: () => uiViewOnOSM,
+ uiZoom: () => uiZoom,
+ utilAesDecrypt: () => utilAesDecrypt,
+ utilAesEncrypt: () => utilAesEncrypt,
+ utilArrayChunk: () => utilArrayChunk,
+ utilArrayDifference: () => utilArrayDifference,
+ utilArrayFlatten: () => utilArrayFlatten,
+ utilArrayGroupBy: () => utilArrayGroupBy,
+ utilArrayIdentical: () => utilArrayIdentical,
+ utilArrayIntersection: () => utilArrayIntersection,
+ utilArrayUnion: () => utilArrayUnion,
+ utilArrayUniq: () => utilArrayUniq,
+ utilArrayUniqBy: () => utilArrayUniqBy,
+ utilAsyncMap: () => utilAsyncMap,
+ utilCleanTags: () => utilCleanTags,
+ utilCombinedTags: () => utilCombinedTags,
+ utilCompareIDs: () => utilCompareIDs,
+ utilDeepMemberSelector: () => utilDeepMemberSelector,
+ utilDetect: () => utilDetect,
+ utilDisplayLabel: () => utilDisplayLabel,
+ utilDisplayName: () => utilDisplayName,
+ utilDisplayNameForPath: () => utilDisplayNameForPath,
+ utilDisplayType: () => utilDisplayType,
+ utilEditDistance: () => utilEditDistance,
+ utilEntityAndDeepMemberIDs: () => utilEntityAndDeepMemberIDs,
+ utilEntityOrDeepMemberSelector: () => utilEntityOrDeepMemberSelector,
+ utilEntityOrMemberSelector: () => utilEntityOrMemberSelector,
+ utilEntityRoot: () => utilEntityRoot,
+ utilEntitySelector: () => utilEntitySelector,
+ utilFastMouse: () => utilFastMouse,
+ utilFunctor: () => utilFunctor,
+ utilGetAllNodes: () => utilGetAllNodes,
+ utilGetSetValue: () => utilGetSetValue,
+ utilHashcode: () => utilHashcode,
+ utilHighlightEntities: () => utilHighlightEntities,
+ utilKeybinding: () => utilKeybinding,
+ utilNoAuto: () => utilNoAuto,
+ utilObjectOmit: () => utilObjectOmit,
+ utilOldestID: () => utilOldestID,
+ utilPrefixCSSProperty: () => utilPrefixCSSProperty,
+ utilPrefixDOMProperty: () => utilPrefixDOMProperty,
+ utilQsString: () => utilQsString,
+ utilRebind: () => utilRebind,
+ utilSafeClassName: () => utilSafeClassName,
+ utilSessionMutex: () => utilSessionMutex,
+ utilSetTransform: () => utilSetTransform,
+ utilStringQs: () => utilStringQs,
+ utilTagDiff: () => utilTagDiff,
+ utilTagText: () => utilTagText,
+ utilTiler: () => utilTiler,
+ utilTotalExtent: () => utilTotalExtent,
+ utilTriggerEvent: () => utilTriggerEvent,
+ utilUnicodeCharsCount: () => utilUnicodeCharsCount,
+ utilUnicodeCharsTruncated: () => utilUnicodeCharsTruncated,
+ utilUniqueDomId: () => utilUniqueDomId,
+ utilWrap: () => utilWrap,
+ validationAlmostJunction: () => validationAlmostJunction,
+ validationCloseNodes: () => validationCloseNodes,
+ validationCrossingWays: () => validationCrossingWays,
+ validationDisconnectedWay: () => validationDisconnectedWay,
+ validationFormatting: () => validationFormatting,
+ validationHelpRequest: () => validationHelpRequest,
+ validationImpossibleOneway: () => validationImpossibleOneway,
+ validationIncompatibleSource: () => validationIncompatibleSource,
+ validationMaprules: () => validationMaprules,
+ validationMismatchedGeometry: () => validationMismatchedGeometry,
+ validationMissingRole: () => validationMissingRole,
+ validationMissingTag: () => validationMissingTag,
+ validationOutdatedTags: () => validationOutdatedTags,
+ validationPrivateData: () => validationPrivateData,
+ validationSuspiciousName: () => validationSuspiciousName,
+ validationUnsquareWay: () => validationUnsquareWay
+ });
+
+ // modules/actions/add_entity.js
+ function actionAddEntity(way) {
+ return function(graph) {
+ return graph.replace(way);
+ };
+ }
+
+ // modules/actions/reverse.js
+ function actionReverse(entityID, options2) {
+ var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
+ var numeric = /^([+\-]?)(?=[\d.])/;
+ var directionKey = /direction$/;
+ var turn_lanes = /^turn:lanes:?/;
+ var keyReplacements = [
+ [/:right$/, ":left"],
+ [/:left$/, ":right"],
+ [/:forward$/, ":backward"],
+ [/:backward$/, ":forward"],
+ [/:right:/, ":left:"],
+ [/:left:/, ":right:"],
+ [/:forward:/, ":backward:"],
+ [/:backward:/, ":forward:"]
+ ];
+ var valueReplacements = {
+ left: "right",
+ right: "left",
+ up: "down",
+ down: "up",
+ forward: "backward",
+ backward: "forward",
+ forwards: "backward",
+ backwards: "forward"
+ };
+ var roleReplacements = {
+ forward: "backward",
+ backward: "forward",
+ forwards: "backward",
+ backwards: "forward"
+ };
+ var onewayReplacements = {
+ yes: "-1",
+ "1": "-1",
+ "-1": "yes"
+ };
+ var compassReplacements = {
+ N: "S",
+ NNE: "SSW",
+ NE: "SW",
+ ENE: "WSW",
+ E: "W",
+ ESE: "WNW",
+ SE: "NW",
+ SSE: "NNW",
+ S: "N",
+ SSW: "NNE",
+ SW: "NE",
+ WSW: "ENE",
+ W: "E",
+ WNW: "ESE",
+ NW: "SE",
+ NNW: "SSE"
+ };
+ function reverseKey(key) {
+ for (var i2 = 0; i2 < keyReplacements.length; ++i2) {
+ var replacement = keyReplacements[i2];
+ if (replacement[0].test(key)) {
+ return key.replace(replacement[0], replacement[1]);
+ }
+ }
+ return key;
+ }
+ function reverseValue(key, value, includeAbsolute) {
+ if (ignoreKey.test(key))
+ return value;
+ if (turn_lanes.test(key)) {
+ return value;
+ } else if (key === "incline" && numeric.test(value)) {
+ return value.replace(numeric, function(_, sign2) {
+ return sign2 === "-" ? "" : "-";
+ });
+ } else if (options2 && options2.reverseOneway && key === "oneway") {
+ return onewayReplacements[value] || value;
+ } else if (includeAbsolute && directionKey.test(key)) {
+ if (compassReplacements[value])
+ return compassReplacements[value];
+ var degrees3 = parseFloat(value);
+ if (typeof degrees3 === "number" && !isNaN(degrees3)) {
+ if (degrees3 < 180) {
+ degrees3 += 180;
+ } else {
+ degrees3 -= 180;
+ }
+ return degrees3.toString();
+ }
+ }
+ return valueReplacements[value] || value;
+ }
+ function reverseNodeTags(graph, nodeIDs) {
+ for (var i2 = 0; i2 < nodeIDs.length; i2++) {
+ var node = graph.hasEntity(nodeIDs[i2]);
+ if (!node || !Object.keys(node.tags).length)
+ continue;
+ var tags = {};
+ for (var key in node.tags) {
+ tags[reverseKey(key)] = reverseValue(key, node.tags[key], node.id === entityID);
+ }
+ graph = graph.replace(node.update({ tags }));
+ }
+ return graph;
+ }
+ function reverseWay(graph, way) {
+ var nodes = way.nodes.slice().reverse();
+ var tags = {};
+ var role;
+ for (var key in way.tags) {
+ tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
+ }
+ graph.parentRelations(way).forEach(function(relation) {
+ relation.members.forEach(function(member, index) {
+ if (member.id === way.id && (role = roleReplacements[member.role])) {
+ relation = relation.updateMember({ role }, index);
+ graph = graph.replace(relation);
+ }
+ });
+ });
+ return reverseNodeTags(graph, nodes).replace(way.update({ nodes, tags }));
+ }
+ var action = function(graph) {
+ var entity = graph.entity(entityID);
+ if (entity.type === "way") {
+ return reverseWay(graph, entity);
+ }
+ return reverseNodeTags(graph, [entityID]);
+ };
+ action.disabled = function(graph) {
+ var entity = graph.hasEntity(entityID);
+ if (!entity || entity.type === "way")
+ return false;
+ for (var key in entity.tags) {
+ var value = entity.tags[key];
+ if (reverseKey(key) !== key || reverseValue(key, value, true) !== value) {
+ return false;
+ }
+ }
+ return "nondirectional_node";
+ };
+ action.entityID = function() {
+ return entityID;
+ };
+ return action;
+ }
+
+ // modules/osm/tags.js
+ function osmIsInterestingTag(key) {
+ return key !== "attribution" && key !== "created_by" && key !== "source" && key !== "odbl" && key.indexOf("source:") !== 0 && key.indexOf("source_ref") !== 0 && key.indexOf("tiger:") !== 0;
+ }
+ var osmAreaKeys = {};
+ function osmSetAreaKeys(value) {
+ osmAreaKeys = value;
+ }
+ var osmAreaKeysExceptions = {
+ highway: {
+ elevator: true,
+ rest_area: true,
+ services: true
+ },
+ public_transport: {
+ platform: true
+ },
+ railway: {
+ platform: true,
+ roundhouse: true,
+ station: true,
+ traverser: true,
+ turntable: true,
+ wash: true
+ },
+ waterway: {
+ dam: true
+ }
+ };
+ function osmTagSuggestingArea(tags) {
+ if (tags.area === "yes")
+ return { area: "yes" };
+ if (tags.area === "no")
+ return null;
+ var returnTags = {};
+ for (var key in tags) {
+ if (key in osmAreaKeys && !(tags[key] in osmAreaKeys[key])) {
+ returnTags[key] = tags[key];
+ return returnTags;
+ }
+ if (key in osmAreaKeysExceptions && tags[key] in osmAreaKeysExceptions[key]) {
+ returnTags[key] = tags[key];
+ return returnTags;
+ }
+ }
+ return null;
+ }
+ var osmPointTags = {};
+ function osmSetPointTags(value) {
+ osmPointTags = value;
+ }
+ var osmVertexTags = {};
+ function osmSetVertexTags(value) {
+ osmVertexTags = value;
+ }
+ function osmNodeGeometriesForTags(nodeTags) {
+ var geometries = {};
+ for (var key in nodeTags) {
+ if (osmPointTags[key] && (osmPointTags[key]["*"] || osmPointTags[key][nodeTags[key]])) {
+ geometries.point = true;
+ }
+ if (osmVertexTags[key] && (osmVertexTags[key]["*"] || osmVertexTags[key][nodeTags[key]])) {
+ geometries.vertex = true;
+ }
+ if (geometries.point && geometries.vertex)
+ break;
+ }
+ return geometries;
+ }
+ var osmOneWayTags = {
+ "aerialway": {
+ "chair_lift": true,
+ "drag_lift": true,
+ "j-bar": true,
+ "magic_carpet": true,
+ "mixed_lift": true,
+ "platter": true,
+ "rope_tow": true,
+ "t-bar": true,
+ "zip_line": true
+ },
+ "highway": {
+ "motorway": true
+ },
+ "junction": {
+ "circular": true,
+ "roundabout": true
+ },
+ "man_made": {
+ "goods_conveyor": true,
+ "piste:halfpipe": true
+ },
+ "piste:type": {
+ "downhill": true,
+ "sled": true,
+ "yes": true
+ },
+ "seamark:type": {
+ "separation_lane": true,
+ "separation_roundabout": true
+ },
+ "waterway": {
+ "canal": true,
+ "ditch": true,
+ "drain": true,
+ "fish_pass": true,
+ "river": true,
+ "stream": true,
+ "tidal_channel": true
+ }
+ };
+ var osmPavedTags = {
+ "surface": {
+ "paved": true,
+ "asphalt": true,
+ "concrete": true,
+ "concrete:lanes": true,
+ "concrete:plates": true
+ },
+ "tracktype": {
+ "grade1": true
+ }
+ };
+ var osmSemipavedTags = {
+ "surface": {
+ "cobblestone": true,
+ "cobblestone:flattened": true,
+ "unhewn_cobblestone": true,
+ "sett": true,
+ "paving_stones": true,
+ "metal": true,
+ "wood": true
+ }
+ };
+ var osmRightSideIsInsideTags = {
+ "natural": {
+ "cliff": true,
+ "coastline": "coastline"
+ },
+ "barrier": {
+ "retaining_wall": true,
+ "kerb": true,
+ "guard_rail": true,
+ "city_wall": true
+ },
+ "man_made": {
+ "embankment": true
+ },
+ "waterway": {
+ "weir": true
+ }
+ };
+ var osmRoutableHighwayTagValues = {
+ motorway: true,
+ trunk: true,
+ primary: true,
+ secondary: true,
+ tertiary: true,
+ residential: true,
+ motorway_link: true,
+ trunk_link: true,
+ primary_link: true,
+ secondary_link: true,
+ tertiary_link: true,
+ unclassified: true,
+ road: true,
+ service: true,
+ track: true,
+ living_street: true,
+ bus_guideway: true,
+ path: true,
+ footway: true,
+ cycleway: true,
+ bridleway: true,
+ pedestrian: true,
+ corridor: true,
+ steps: true
+ };
+ var osmPathHighwayTagValues = {
+ path: true,
+ footway: true,
+ cycleway: true,
+ bridleway: true,
+ pedestrian: true,
+ corridor: true,
+ steps: true
+ };
+ var osmRailwayTrackTagValues = {
+ rail: true,
+ light_rail: true,
+ tram: true,
+ subway: true,
+ monorail: true,
+ funicular: true,
+ miniature: true,
+ narrow_gauge: true,
+ disused: true,
+ preserved: true
+ };
+ var osmFlowingWaterwayTagValues = {
+ canal: true,
+ ditch: true,
+ drain: true,
+ fish_pass: true,
+ river: true,
+ stream: true,
+ tidal_channel: true
+ };
+
+ // node_modules/d3-array/src/ascending.js
+ function ascending(a, b) {
+ return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+ }
+
+ // node_modules/d3-array/src/descending.js
+ function descending(a, b) {
+ return a == null || b == null ? NaN : b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
+ }
+
+ // node_modules/d3-array/src/bisector.js
+ function bisector(f2) {
+ let compare1, compare2, delta;
+ if (f2.length !== 2) {
+ compare1 = ascending;
+ compare2 = (d, x) => ascending(f2(d), x);
+ delta = (d, x) => f2(d) - x;
+ } else {
+ compare1 = f2 === ascending || f2 === descending ? f2 : zero;
+ compare2 = f2;
+ delta = f2;
+ }
+ function left(a, x, lo = 0, hi = a.length) {
+ if (lo < hi) {
+ if (compare1(x, x) !== 0)
+ return hi;
+ do {
+ const mid = lo + hi >>> 1;
+ if (compare2(a[mid], x) < 0)
+ lo = mid + 1;
+ else
+ hi = mid;
+ } while (lo < hi);
+ }
+ return lo;
+ }
+ function right(a, x, lo = 0, hi = a.length) {
+ if (lo < hi) {
+ if (compare1(x, x) !== 0)
+ return hi;
+ do {
+ const mid = lo + hi >>> 1;
+ if (compare2(a[mid], x) <= 0)
+ lo = mid + 1;
+ else
+ hi = mid;
+ } while (lo < hi);
+ }
+ return lo;
+ }
+ function center(a, x, lo = 0, hi = a.length) {
+ const i2 = left(a, x, lo, hi - 1);
+ return i2 > lo && delta(a[i2 - 1], x) > -delta(a[i2], x) ? i2 - 1 : i2;
+ }
+ return { left, center, right };
+ }
+ function zero() {
+ return 0;
+ }
+
+ // node_modules/d3-array/src/number.js
+ function number(x) {
+ return x === null ? NaN : +x;
+ }
+ function* numbers(values, valueof) {
+ if (valueof === void 0) {
+ for (let value of values) {
+ if (value != null && (value = +value) >= value) {
+ yield value;
+ }
+ }
+ } else {
+ let index = -1;
+ for (let value of values) {
+ if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {
+ yield value;
+ }
+ }
+ }
+ }
+
+ // node_modules/d3-array/src/bisect.js
+ var ascendingBisect = bisector(ascending);
+ var bisectRight = ascendingBisect.right;
+ var bisectLeft = ascendingBisect.left;
+ var bisectCenter = bisector(number).center;
+ var bisect_default = bisectRight;
+
+ // node_modules/d3-array/src/fsum.js
+ var Adder = class {
+ constructor() {
+ this._partials = new Float64Array(32);
+ this._n = 0;
+ }
+ add(x) {
+ const p = this._partials;
+ let i2 = 0;
+ for (let j2 = 0; j2 < this._n && j2 < 32; j2++) {
+ const y = p[j2], hi = x + y, lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x);
+ if (lo)
+ p[i2++] = lo;
+ x = hi;
+ }
+ p[i2] = x;
+ this._n = i2 + 1;
+ return this;
+ }
+ valueOf() {
+ const p = this._partials;
+ let n2 = this._n, x, y, lo, hi = 0;
+ if (n2 > 0) {
+ hi = p[--n2];
+ while (n2 > 0) {
+ x = hi;
+ y = p[--n2];
+ hi = x + y;
+ lo = y - (hi - x);
+ if (lo)
+ break;
+ }
+ if (n2 > 0 && (lo < 0 && p[n2 - 1] < 0 || lo > 0 && p[n2 - 1] > 0)) {
+ y = lo * 2;
+ x = hi + y;
+ if (y == x - hi)
+ hi = x;
+ }
+ }
+ return hi;
+ }
+ };
+
+ // node_modules/d3-array/src/sort.js
+ function compareDefined(compare = ascending) {
+ if (compare === ascending)
+ return ascendingDefined;
+ if (typeof compare !== "function")
+ throw new TypeError("compare is not a function");
+ return (a, b) => {
+ const x = compare(a, b);
+ if (x || x === 0)
+ return x;
+ return (compare(b, b) === 0) - (compare(a, a) === 0);
+ };
+ }
+ function ascendingDefined(a, b) {
+ return (a == null || !(a >= a)) - (b == null || !(b >= b)) || (a < b ? -1 : a > b ? 1 : 0);
+ }
+
+ // node_modules/d3-array/src/ticks.js
+ var e10 = Math.sqrt(50);
+ var e5 = Math.sqrt(10);
+ var e2 = Math.sqrt(2);
+ function ticks(start2, stop, count) {
+ var reverse, i2 = -1, n2, ticks2, step;
+ stop = +stop, start2 = +start2, count = +count;
+ if (start2 === stop && count > 0)
+ return [start2];
+ if (reverse = stop < start2)
+ n2 = start2, start2 = stop, stop = n2;
+ if ((step = tickIncrement(start2, stop, count)) === 0 || !isFinite(step))
+ return [];
+ if (step > 0) {
+ let r0 = Math.round(start2 / step), r1 = Math.round(stop / step);
+ if (r0 * step < start2)
+ ++r0;
+ if (r1 * step > stop)
+ --r1;
+ ticks2 = new Array(n2 = r1 - r0 + 1);
+ while (++i2 < n2)
+ ticks2[i2] = (r0 + i2) * step;
+ } else {
+ step = -step;
+ let r0 = Math.round(start2 * step), r1 = Math.round(stop * step);
+ if (r0 / step < start2)
+ ++r0;
+ if (r1 / step > stop)
+ --r1;
+ ticks2 = new Array(n2 = r1 - r0 + 1);
+ while (++i2 < n2)
+ ticks2[i2] = (r0 + i2) / step;
+ }
+ if (reverse)
+ ticks2.reverse();
+ return ticks2;
+ }
+ function tickIncrement(start2, stop, count) {
+ var step = (stop - start2) / Math.max(0, count), power = Math.floor(Math.log(step) / Math.LN10), error = step / Math.pow(10, power);
+ return power >= 0 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
+ }
+ function tickStep(start2, stop, count) {
+ var step0 = Math.abs(stop - start2) / Math.max(0, count), step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), error = step0 / step1;
+ if (error >= e10)
+ step1 *= 10;
+ else if (error >= e5)
+ step1 *= 5;
+ else if (error >= e2)
+ step1 *= 2;
+ return stop < start2 ? -step1 : step1;
+ }
+
+ // node_modules/d3-array/src/max.js
+ function max(values, valueof) {
+ let max3;
+ if (valueof === void 0) {
+ for (const value of values) {
+ if (value != null && (max3 < value || max3 === void 0 && value >= value)) {
+ max3 = value;
+ }
+ }
+ } else {
+ let index = -1;
+ for (let value of values) {
+ if ((value = valueof(value, ++index, values)) != null && (max3 < value || max3 === void 0 && value >= value)) {
+ max3 = value;
+ }
+ }
+ }
+ return max3;
+ }
+
+ // node_modules/d3-array/src/min.js
+ function min(values, valueof) {
+ let min3;
+ if (valueof === void 0) {
+ for (const value of values) {
+ if (value != null && (min3 > value || min3 === void 0 && value >= value)) {
+ min3 = value;
+ }
+ }
+ } else {
+ let index = -1;
+ for (let value of values) {
+ if ((value = valueof(value, ++index, values)) != null && (min3 > value || min3 === void 0 && value >= value)) {
+ min3 = value;
+ }
+ }
+ }
+ return min3;
+ }
+
+ // node_modules/d3-array/src/quickselect.js
+ function quickselect(array2, k, left = 0, right = array2.length - 1, compare) {
+ compare = compare === void 0 ? ascendingDefined : compareDefined(compare);
+ while (right > left) {
+ if (right - left > 600) {
+ const n2 = right - left + 1;
+ const m = k - left + 1;
+ const z = Math.log(n2);
+ const s = 0.5 * Math.exp(2 * z / 3);
+ const sd = 0.5 * Math.sqrt(z * s * (n2 - s) / n2) * (m - n2 / 2 < 0 ? -1 : 1);
+ const newLeft = Math.max(left, Math.floor(k - m * s / n2 + sd));
+ const newRight = Math.min(right, Math.floor(k + (n2 - m) * s / n2 + sd));
+ quickselect(array2, k, newLeft, newRight, compare);
+ }
+ const t = array2[k];
+ let i2 = left;
+ let j2 = right;
+ swap(array2, left, k);
+ if (compare(array2[right], t) > 0)
+ swap(array2, left, right);
+ while (i2 < j2) {
+ swap(array2, i2, j2), ++i2, --j2;
+ while (compare(array2[i2], t) < 0)
+ ++i2;
+ while (compare(array2[j2], t) > 0)
+ --j2;
+ }
+ if (compare(array2[left], t) === 0)
+ swap(array2, left, j2);
+ else
+ ++j2, swap(array2, j2, right);
+ if (j2 <= k)
+ left = j2 + 1;
+ if (k <= j2)
+ right = j2 - 1;
+ }
+ return array2;
+ }
+ function swap(array2, i2, j2) {
+ const t = array2[i2];
+ array2[i2] = array2[j2];
+ array2[j2] = t;
+ }
+
+ // node_modules/d3-array/src/quantile.js
+ function quantile(values, p, valueof) {
+ values = Float64Array.from(numbers(values, valueof));
+ if (!(n2 = values.length))
+ return;
+ if ((p = +p) <= 0 || n2 < 2)
+ return min(values);
+ if (p >= 1)
+ return max(values);
+ var n2, i2 = (n2 - 1) * p, i0 = Math.floor(i2), value0 = max(quickselect(values, i0).subarray(0, i0 + 1)), value1 = min(values.subarray(i0 + 1));
+ return value0 + (value1 - value0) * (i2 - i0);
+ }
+
+ // node_modules/d3-array/src/median.js
+ function median(values, valueof) {
+ return quantile(values, 0.5, valueof);
+ }
+
+ // node_modules/d3-array/src/merge.js
+ function* flatten(arrays) {
+ for (const array2 of arrays) {
+ yield* array2;
+ }
+ }
+ function merge(arrays) {
+ return Array.from(flatten(arrays));
+ }
+
+ // node_modules/d3-array/src/range.js
+ function range(start2, stop, step) {
+ start2 = +start2, stop = +stop, step = (n2 = arguments.length) < 2 ? (stop = start2, start2 = 0, 1) : n2 < 3 ? 1 : +step;
+ var i2 = -1, n2 = Math.max(0, Math.ceil((stop - start2) / step)) | 0, range3 = new Array(n2);
+ while (++i2 < n2) {
+ range3[i2] = start2 + i2 * step;
+ }
+ return range3;
+ }
+
+ // node_modules/d3-geo/src/math.js
+ var epsilon = 1e-6;
+ var epsilon2 = 1e-12;
+ var pi = Math.PI;
+ var halfPi = pi / 2;
+ var quarterPi = pi / 4;
+ var tau = pi * 2;
+ var degrees = 180 / pi;
+ var radians = pi / 180;
+ var abs = Math.abs;
+ var atan = Math.atan;
+ var atan2 = Math.atan2;
+ var cos = Math.cos;
+ var exp = Math.exp;
+ var log = Math.log;
+ var sin = Math.sin;
+ var sign = Math.sign || function(x) {
+ return x > 0 ? 1 : x < 0 ? -1 : 0;
+ };
+ var sqrt = Math.sqrt;
+ var tan = Math.tan;
+ function acos(x) {
+ return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);
+ }
+ function asin(x) {
+ return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);
+ }
+
+ // node_modules/d3-geo/src/noop.js
+ function noop() {
+ }
+
+ // node_modules/d3-geo/src/stream.js
+ function streamGeometry(geometry, stream) {
+ if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
+ streamGeometryType[geometry.type](geometry, stream);
+ }
+ }
+ var streamObjectType = {
+ Feature: function(object, stream) {
+ streamGeometry(object.geometry, stream);
+ },
+ FeatureCollection: function(object, stream) {
+ var features2 = object.features, i2 = -1, n2 = features2.length;
+ while (++i2 < n2)
+ streamGeometry(features2[i2].geometry, stream);
+ }
+ };
+ var streamGeometryType = {
+ Sphere: function(object, stream) {
+ stream.sphere();
+ },
+ Point: function(object, stream) {
+ object = object.coordinates;
+ stream.point(object[0], object[1], object[2]);
+ },
+ MultiPoint: function(object, stream) {
+ var coordinates = object.coordinates, i2 = -1, n2 = coordinates.length;
+ while (++i2 < n2)
+ object = coordinates[i2], stream.point(object[0], object[1], object[2]);
+ },
+ LineString: function(object, stream) {
+ streamLine(object.coordinates, stream, 0);
+ },
+ MultiLineString: function(object, stream) {
+ var coordinates = object.coordinates, i2 = -1, n2 = coordinates.length;
+ while (++i2 < n2)
+ streamLine(coordinates[i2], stream, 0);
+ },
+ Polygon: function(object, stream) {
+ streamPolygon(object.coordinates, stream);
+ },
+ MultiPolygon: function(object, stream) {
+ var coordinates = object.coordinates, i2 = -1, n2 = coordinates.length;
+ while (++i2 < n2)
+ streamPolygon(coordinates[i2], stream);
+ },
+ GeometryCollection: function(object, stream) {
+ var geometries = object.geometries, i2 = -1, n2 = geometries.length;
+ while (++i2 < n2)
+ streamGeometry(geometries[i2], stream);
+ }
+ };
+ function streamLine(coordinates, stream, closed) {
+ var i2 = -1, n2 = coordinates.length - closed, coordinate;
+ stream.lineStart();
+ while (++i2 < n2)
+ coordinate = coordinates[i2], stream.point(coordinate[0], coordinate[1], coordinate[2]);
+ stream.lineEnd();
+ }
+ function streamPolygon(coordinates, stream) {
+ var i2 = -1, n2 = coordinates.length;
+ stream.polygonStart();
+ while (++i2 < n2)
+ streamLine(coordinates[i2], stream, 1);
+ stream.polygonEnd();
+ }
+ function stream_default(object, stream) {
+ if (object && streamObjectType.hasOwnProperty(object.type)) {
+ streamObjectType[object.type](object, stream);
+ } else {
+ streamGeometry(object, stream);
+ }
+ }
+
+ // node_modules/d3-geo/src/area.js
+ var areaRingSum = new Adder();
+ var areaSum = new Adder();
+ var lambda00;
+ var phi00;
+ var lambda0;
+ var cosPhi0;
+ var sinPhi0;
+ var areaStream = {
+ point: noop,
+ lineStart: noop,
+ lineEnd: noop,
+ polygonStart: function() {
+ areaRingSum = new Adder();
+ areaStream.lineStart = areaRingStart;
+ areaStream.lineEnd = areaRingEnd;
+ },
+ polygonEnd: function() {
+ var areaRing = +areaRingSum;
+ areaSum.add(areaRing < 0 ? tau + areaRing : areaRing);
+ this.lineStart = this.lineEnd = this.point = noop;
+ },
+ sphere: function() {
+ areaSum.add(tau);
+ }
+ };
+ function areaRingStart() {
+ areaStream.point = areaPointFirst;
+ }
+ function areaRingEnd() {
+ areaPoint(lambda00, phi00);
+ }
+ function areaPointFirst(lambda, phi) {
+ areaStream.point = areaPoint;
+ lambda00 = lambda, phi00 = phi;
+ lambda *= radians, phi *= radians;
+ lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi);
+ }
+ function areaPoint(lambda, phi) {
+ lambda *= radians, phi *= radians;
+ phi = phi / 2 + quarterPi;
+ var dLambda = lambda - lambda0, sdLambda = dLambda >= 0 ? 1 : -1, adLambda = sdLambda * dLambda, cosPhi = cos(phi), sinPhi = sin(phi), k = sinPhi0 * sinPhi, u = cosPhi0 * cosPhi + k * cos(adLambda), v = k * sdLambda * sin(adLambda);
+ areaRingSum.add(atan2(v, u));
+ lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
+ }
+ function area_default(object) {
+ areaSum = new Adder();
+ stream_default(object, areaStream);
+ return areaSum * 2;
+ }
+
+ // node_modules/d3-geo/src/cartesian.js
+ function spherical(cartesian2) {
+ return [atan2(cartesian2[1], cartesian2[0]), asin(cartesian2[2])];
+ }
+ function cartesian(spherical2) {
+ var lambda = spherical2[0], phi = spherical2[1], cosPhi = cos(phi);
+ return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)];
+ }
+ function cartesianDot(a, b) {
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+ }
+ function cartesianCross(a, b) {
+ 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]];
+ }
+ function cartesianAddInPlace(a, b) {
+ a[0] += b[0], a[1] += b[1], a[2] += b[2];
+ }
+ function cartesianScale(vector, k) {
+ return [vector[0] * k, vector[1] * k, vector[2] * k];
+ }
+ function cartesianNormalizeInPlace(d) {
+ var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
+ d[0] /= l, d[1] /= l, d[2] /= l;
+ }
+
+ // node_modules/d3-geo/src/bounds.js
+ var lambda02;
+ var phi0;
+ var lambda1;
+ var phi1;
+ var lambda2;
+ var lambda002;
+ var phi002;
+ var p0;
+ var deltaSum;
+ var ranges;
+ var range2;
+ var boundsStream = {
+ point: boundsPoint,
+ lineStart: boundsLineStart,
+ lineEnd: boundsLineEnd,
+ polygonStart: function() {
+ boundsStream.point = boundsRingPoint;
+ boundsStream.lineStart = boundsRingStart;
+ boundsStream.lineEnd = boundsRingEnd;
+ deltaSum = new Adder();
+ areaStream.polygonStart();
+ },
+ polygonEnd: function() {
+ areaStream.polygonEnd();
+ boundsStream.point = boundsPoint;
+ boundsStream.lineStart = boundsLineStart;
+ boundsStream.lineEnd = boundsLineEnd;
+ if (areaRingSum < 0)
+ lambda02 = -(lambda1 = 180), phi0 = -(phi1 = 90);
+ else if (deltaSum > epsilon)
+ phi1 = 90;
+ else if (deltaSum < -epsilon)
+ phi0 = -90;
+ range2[0] = lambda02, range2[1] = lambda1;
+ },
+ sphere: function() {
+ lambda02 = -(lambda1 = 180), phi0 = -(phi1 = 90);
+ }
+ };
+ function boundsPoint(lambda, phi) {
+ ranges.push(range2 = [lambda02 = lambda, lambda1 = lambda]);
+ if (phi < phi0)
+ phi0 = phi;
+ if (phi > phi1)
+ phi1 = phi;
+ }
+ function linePoint(lambda, phi) {
+ var p = cartesian([lambda * radians, phi * radians]);
+ if (p0) {
+ var normal = cartesianCross(p0, p), equatorial = [normal[1], -normal[0], 0], inflection = cartesianCross(equatorial, normal);
+ cartesianNormalizeInPlace(inflection);
+ inflection = spherical(inflection);
+ var delta = lambda - lambda2, sign2 = delta > 0 ? 1 : -1, lambdai = inflection[0] * degrees * sign2, phii, antimeridian = abs(delta) > 180;
+ if (antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {
+ phii = inflection[1] * degrees;
+ if (phii > phi1)
+ phi1 = phii;
+ } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {
+ phii = -inflection[1] * degrees;
+ if (phii < phi0)
+ phi0 = phii;
+ } else {
+ if (phi < phi0)
+ phi0 = phi;
+ if (phi > phi1)
+ phi1 = phi;
+ }
+ if (antimeridian) {
+ if (lambda < lambda2) {
+ if (angle(lambda02, lambda) > angle(lambda02, lambda1))
+ lambda1 = lambda;
+ } else {
+ if (angle(lambda, lambda1) > angle(lambda02, lambda1))
+ lambda02 = lambda;
+ }
+ } else {
+ if (lambda1 >= lambda02) {
+ if (lambda < lambda02)
+ lambda02 = lambda;
+ if (lambda > lambda1)
+ lambda1 = lambda;
+ } else {
+ if (lambda > lambda2) {
+ if (angle(lambda02, lambda) > angle(lambda02, lambda1))
+ lambda1 = lambda;
+ } else {
+ if (angle(lambda, lambda1) > angle(lambda02, lambda1))
+ lambda02 = lambda;
+ }
+ }
+ }
+ } else {
+ ranges.push(range2 = [lambda02 = lambda, lambda1 = lambda]);
+ }
+ if (phi < phi0)
+ phi0 = phi;
+ if (phi > phi1)
+ phi1 = phi;
+ p0 = p, lambda2 = lambda;
+ }
+ function boundsLineStart() {
+ boundsStream.point = linePoint;
+ }
+ function boundsLineEnd() {
+ range2[0] = lambda02, range2[1] = lambda1;
+ boundsStream.point = boundsPoint;
+ p0 = null;
+ }
+ function boundsRingPoint(lambda, phi) {
+ if (p0) {
+ var delta = lambda - lambda2;
+ deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
+ } else {
+ lambda002 = lambda, phi002 = phi;
+ }
+ areaStream.point(lambda, phi);
+ linePoint(lambda, phi);
+ }
+ function boundsRingStart() {
+ areaStream.lineStart();
+ }
+ function boundsRingEnd() {
+ boundsRingPoint(lambda002, phi002);
+ areaStream.lineEnd();
+ if (abs(deltaSum) > epsilon)
+ lambda02 = -(lambda1 = 180);
+ range2[0] = lambda02, range2[1] = lambda1;
+ p0 = null;
+ }
+ function angle(lambda04, lambda12) {
+ return (lambda12 -= lambda04) < 0 ? lambda12 + 360 : lambda12;
+ }
+ function rangeCompare(a, b) {
+ return a[0] - b[0];
+ }
+ function rangeContains(range3, x) {
+ return range3[0] <= range3[1] ? range3[0] <= x && x <= range3[1] : x < range3[0] || range3[1] < x;
+ }
+ function bounds_default(feature3) {
+ var i2, n2, a, b, merged, deltaMax, delta;
+ phi1 = lambda1 = -(lambda02 = phi0 = Infinity);
+ ranges = [];
+ stream_default(feature3, boundsStream);
+ if (n2 = ranges.length) {
+ ranges.sort(rangeCompare);
+ for (i2 = 1, a = ranges[0], merged = [a]; i2 < n2; ++i2) {
+ b = ranges[i2];
+ if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
+ if (angle(a[0], b[1]) > angle(a[0], a[1]))
+ a[1] = b[1];
+ if (angle(b[0], a[1]) > angle(a[0], a[1]))
+ a[0] = b[0];
+ } else {
+ merged.push(a = b);
+ }
+ }
+ for (deltaMax = -Infinity, n2 = merged.length - 1, i2 = 0, a = merged[n2]; i2 <= n2; a = b, ++i2) {
+ b = merged[i2];
+ if ((delta = angle(a[1], b[0])) > deltaMax)
+ deltaMax = delta, lambda02 = b[0], lambda1 = a[1];
+ }
+ }
+ ranges = range2 = null;
+ return lambda02 === Infinity || phi0 === Infinity ? [[NaN, NaN], [NaN, NaN]] : [[lambda02, phi0], [lambda1, phi1]];
+ }
+
+ // node_modules/d3-geo/src/compose.js
+ function compose_default(a, b) {
+ function compose(x, y) {
+ return x = a(x, y), b(x[0], x[1]);
+ }
+ if (a.invert && b.invert)
+ compose.invert = function(x, y) {
+ return x = b.invert(x, y), x && a.invert(x[0], x[1]);
+ };
+ return compose;
+ }
+
+ // node_modules/d3-geo/src/rotation.js
+ function rotationIdentity(lambda, phi) {
+ return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi];
+ }
+ rotationIdentity.invert = rotationIdentity;
+ function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
+ return (deltaLambda %= tau) ? deltaPhi || deltaGamma ? compose_default(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity;
+ }
+ function forwardRotationLambda(deltaLambda) {
+ return function(lambda, phi) {
+ return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi];
+ };
+ }
+ function rotationLambda(deltaLambda) {
+ var rotation = forwardRotationLambda(deltaLambda);
+ rotation.invert = forwardRotationLambda(-deltaLambda);
+ return rotation;
+ }
+ function rotationPhiGamma(deltaPhi, deltaGamma) {
+ var cosDeltaPhi = cos(deltaPhi), sinDeltaPhi = sin(deltaPhi), cosDeltaGamma = cos(deltaGamma), sinDeltaGamma = sin(deltaGamma);
+ function rotation(lambda, phi) {
+ var cosPhi = cos(phi), x = cos(lambda) * cosPhi, y = sin(lambda) * cosPhi, z = sin(phi), k = z * cosDeltaPhi + x * sinDeltaPhi;
+ return [
+ atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
+ asin(k * cosDeltaGamma + y * sinDeltaGamma)
+ ];
+ }
+ rotation.invert = function(lambda, phi) {
+ var cosPhi = cos(phi), x = cos(lambda) * cosPhi, y = sin(lambda) * cosPhi, z = sin(phi), k = z * cosDeltaGamma - y * sinDeltaGamma;
+ return [
+ atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
+ asin(k * cosDeltaPhi - x * sinDeltaPhi)
+ ];
+ };
+ return rotation;
+ }
+ function rotation_default(rotate) {
+ rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
+ function forward(coordinates) {
+ coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
+ return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;
+ }
+ forward.invert = function(coordinates) {
+ coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
+ return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;
+ };
+ return forward;
+ }
+
+ // node_modules/d3-geo/src/circle.js
+ function circleStream(stream, radius, delta, direction, t0, t1) {
+ if (!delta)
+ return;
+ var cosRadius = cos(radius), sinRadius = sin(radius), step = direction * delta;
+ if (t0 == null) {
+ t0 = radius + direction * tau;
+ t1 = radius - step / 2;
+ } else {
+ t0 = circleRadius(cosRadius, t0);
+ t1 = circleRadius(cosRadius, t1);
+ if (direction > 0 ? t0 < t1 : t0 > t1)
+ t0 += direction * tau;
+ }
+ for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
+ point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);
+ stream.point(point[0], point[1]);
+ }
+ }
+ function circleRadius(cosRadius, point) {
+ point = cartesian(point), point[0] -= cosRadius;
+ cartesianNormalizeInPlace(point);
+ var radius = acos(-point[1]);
+ return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau;
+ }
+
+ // node_modules/d3-geo/src/clip/buffer.js
+ function buffer_default() {
+ var lines = [], line;
+ return {
+ point: function(x, y, m) {
+ line.push([x, y, m]);
+ },
+ lineStart: function() {
+ lines.push(line = []);
+ },
+ lineEnd: noop,
+ rejoin: function() {
+ if (lines.length > 1)
+ lines.push(lines.pop().concat(lines.shift()));
+ },
+ result: function() {
+ var result = lines;
+ lines = [];
+ line = null;
+ return result;
+ }
+ };
+ }
+
+ // node_modules/d3-geo/src/pointEqual.js
+ function pointEqual_default(a, b) {
+ return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon;
+ }
+
+ // node_modules/d3-geo/src/clip/rejoin.js
+ function Intersection(point, points, other, entry) {
+ this.x = point;
+ this.z = points;
+ this.o = other;
+ this.e = entry;
+ this.v = false;
+ this.n = this.p = null;
+ }
+ function rejoin_default(segments, compareIntersection2, startInside, interpolate, stream) {
+ var subject = [], clip = [], i2, n2;
+ segments.forEach(function(segment) {
+ if ((n3 = segment.length - 1) <= 0)
+ return;
+ var n3, p02 = segment[0], p1 = segment[n3], x;
+ if (pointEqual_default(p02, p1)) {
+ if (!p02[2] && !p1[2]) {
+ stream.lineStart();
+ for (i2 = 0; i2 < n3; ++i2)
+ stream.point((p02 = segment[i2])[0], p02[1]);
+ stream.lineEnd();
+ return;
+ }
+ p1[0] += 2 * epsilon;
+ }
+ subject.push(x = new Intersection(p02, segment, null, true));
+ clip.push(x.o = new Intersection(p02, null, x, false));
+ subject.push(x = new Intersection(p1, segment, null, false));
+ clip.push(x.o = new Intersection(p1, null, x, true));
+ });
+ if (!subject.length)
+ return;
+ clip.sort(compareIntersection2);
+ link(subject);
+ link(clip);
+ for (i2 = 0, n2 = clip.length; i2 < n2; ++i2) {
+ clip[i2].e = startInside = !startInside;
+ }
+ var start2 = subject[0], points, point;
+ while (1) {
+ var current = start2, isSubject = true;
+ while (current.v)
+ if ((current = current.n) === start2)
+ return;
+ points = current.z;
+ stream.lineStart();
+ do {
+ current.v = current.o.v = true;
+ if (current.e) {
+ if (isSubject) {
+ for (i2 = 0, n2 = points.length; i2 < n2; ++i2)
+ stream.point((point = points[i2])[0], point[1]);
+ } else {
+ interpolate(current.x, current.n.x, 1, stream);
+ }
+ current = current.n;
+ } else {
+ if (isSubject) {
+ points = current.p.z;
+ for (i2 = points.length - 1; i2 >= 0; --i2)
+ stream.point((point = points[i2])[0], point[1]);
+ } else {
+ interpolate(current.x, current.p.x, -1, stream);
+ }
+ current = current.p;
+ }
+ current = current.o;
+ points = current.z;
+ isSubject = !isSubject;
+ } while (!current.v);
+ stream.lineEnd();
+ }
+ }
+ function link(array2) {
+ if (!(n2 = array2.length))
+ return;
+ var n2, i2 = 0, a = array2[0], b;
+ while (++i2 < n2) {
+ a.n = b = array2[i2];
+ b.p = a;
+ a = b;
+ }
+ a.n = b = array2[0];
+ b.p = a;
+ }
+
+ // node_modules/d3-geo/src/polygonContains.js
+ function longitude(point) {
+ return abs(point[0]) <= pi ? point[0] : sign(point[0]) * ((abs(point[0]) + pi) % tau - pi);
+ }
+ function polygonContains_default(polygon2, point) {
+ var lambda = longitude(point), phi = point[1], sinPhi = sin(phi), normal = [sin(lambda), -cos(lambda), 0], angle2 = 0, winding = 0;
+ var sum = new Adder();
+ if (sinPhi === 1)
+ phi = halfPi + epsilon;
+ else if (sinPhi === -1)
+ phi = -halfPi - epsilon;
+ for (var i2 = 0, n2 = polygon2.length; i2 < n2; ++i2) {
+ if (!(m = (ring = polygon2[i2]).length))
+ continue;
+ var ring, m, point0 = ring[m - 1], lambda04 = longitude(point0), phi02 = point0[1] / 2 + quarterPi, sinPhi03 = sin(phi02), cosPhi03 = cos(phi02);
+ for (var j2 = 0; j2 < m; ++j2, lambda04 = lambda12, sinPhi03 = sinPhi1, cosPhi03 = cosPhi1, point0 = point1) {
+ var point1 = ring[j2], lambda12 = longitude(point1), phi12 = point1[1] / 2 + quarterPi, sinPhi1 = sin(phi12), cosPhi1 = cos(phi12), delta = lambda12 - lambda04, sign2 = delta >= 0 ? 1 : -1, absDelta = sign2 * delta, antimeridian = absDelta > pi, k = sinPhi03 * sinPhi1;
+ sum.add(atan2(k * sign2 * sin(absDelta), cosPhi03 * cosPhi1 + k * cos(absDelta)));
+ angle2 += antimeridian ? delta + sign2 * tau : delta;
+ if (antimeridian ^ lambda04 >= lambda ^ lambda12 >= lambda) {
+ var arc = cartesianCross(cartesian(point0), cartesian(point1));
+ cartesianNormalizeInPlace(arc);
+ var intersection = cartesianCross(normal, arc);
+ cartesianNormalizeInPlace(intersection);
+ var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
+ if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
+ winding += antimeridian ^ delta >= 0 ? 1 : -1;
+ }
+ }
+ }
+ }
+ return (angle2 < -epsilon || angle2 < epsilon && sum < -epsilon2) ^ winding & 1;
+ }
+
+ // node_modules/d3-geo/src/clip/index.js
+ function clip_default(pointVisible, clipLine, interpolate, start2) {
+ return function(sink) {
+ var line = clipLine(sink), ringBuffer = buffer_default(), ringSink = clipLine(ringBuffer), polygonStarted = false, polygon2, segments, ring;
+ var clip = {
+ point,
+ lineStart,
+ lineEnd,
+ polygonStart: function() {
+ clip.point = pointRing;
+ clip.lineStart = ringStart;
+ clip.lineEnd = ringEnd;
+ segments = [];
+ polygon2 = [];
+ },
+ polygonEnd: function() {
+ clip.point = point;
+ clip.lineStart = lineStart;
+ clip.lineEnd = lineEnd;
+ segments = merge(segments);
+ var startInside = polygonContains_default(polygon2, start2);
+ if (segments.length) {
+ if (!polygonStarted)
+ sink.polygonStart(), polygonStarted = true;
+ rejoin_default(segments, compareIntersection, startInside, interpolate, sink);
+ } else if (startInside) {
+ if (!polygonStarted)
+ sink.polygonStart(), polygonStarted = true;
+ sink.lineStart();
+ interpolate(null, null, 1, sink);
+ sink.lineEnd();
+ }
+ if (polygonStarted)
+ sink.polygonEnd(), polygonStarted = false;
+ segments = polygon2 = null;
+ },
+ sphere: function() {
+ sink.polygonStart();
+ sink.lineStart();
+ interpolate(null, null, 1, sink);
+ sink.lineEnd();
+ sink.polygonEnd();
+ }
+ };
+ function point(lambda, phi) {
+ if (pointVisible(lambda, phi))
+ sink.point(lambda, phi);
+ }
+ function pointLine(lambda, phi) {
+ line.point(lambda, phi);
+ }
+ function lineStart() {
+ clip.point = pointLine;
+ line.lineStart();
+ }
+ function lineEnd() {
+ clip.point = point;
+ line.lineEnd();
+ }
+ function pointRing(lambda, phi) {
+ ring.push([lambda, phi]);
+ ringSink.point(lambda, phi);
+ }
+ function ringStart() {
+ ringSink.lineStart();
+ ring = [];
+ }
+ function ringEnd() {
+ pointRing(ring[0][0], ring[0][1]);
+ ringSink.lineEnd();
+ var clean2 = ringSink.clean(), ringSegments = ringBuffer.result(), i2, n2 = ringSegments.length, m, segment, point2;
+ ring.pop();
+ polygon2.push(ring);
+ ring = null;
+ if (!n2)
+ return;
+ if (clean2 & 1) {
+ segment = ringSegments[0];
+ if ((m = segment.length - 1) > 0) {
+ if (!polygonStarted)
+ sink.polygonStart(), polygonStarted = true;
+ sink.lineStart();
+ for (i2 = 0; i2 < m; ++i2)
+ sink.point((point2 = segment[i2])[0], point2[1]);
+ sink.lineEnd();
+ }
+ return;
+ }
+ if (n2 > 1 && clean2 & 2)
+ ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
+ segments.push(ringSegments.filter(validSegment));
+ }
+ return clip;
+ };
+ }
+ function validSegment(segment) {
+ return segment.length > 1;
+ }
+ function compareIntersection(a, b) {
+ return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]);
+ }
+
+ // node_modules/d3-geo/src/clip/antimeridian.js
+ var antimeridian_default = clip_default(function() {
+ return true;
+ }, clipAntimeridianLine, clipAntimeridianInterpolate, [-pi, -halfPi]);
+ function clipAntimeridianLine(stream) {
+ var lambda04 = NaN, phi02 = NaN, sign0 = NaN, clean2;
+ return {
+ lineStart: function() {
+ stream.lineStart();
+ clean2 = 1;
+ },
+ point: function(lambda12, phi12) {
+ var sign1 = lambda12 > 0 ? pi : -pi, delta = abs(lambda12 - lambda04);
+ if (abs(delta - pi) < epsilon) {
+ stream.point(lambda04, phi02 = (phi02 + phi12) / 2 > 0 ? halfPi : -halfPi);
+ stream.point(sign0, phi02);
+ stream.lineEnd();
+ stream.lineStart();
+ stream.point(sign1, phi02);
+ stream.point(lambda12, phi02);
+ clean2 = 0;
+ } else if (sign0 !== sign1 && delta >= pi) {
+ if (abs(lambda04 - sign0) < epsilon)
+ lambda04 -= sign0 * epsilon;
+ if (abs(lambda12 - sign1) < epsilon)
+ lambda12 -= sign1 * epsilon;
+ phi02 = clipAntimeridianIntersect(lambda04, phi02, lambda12, phi12);
+ stream.point(sign0, phi02);
+ stream.lineEnd();
+ stream.lineStart();
+ stream.point(sign1, phi02);
+ clean2 = 0;
+ }
+ stream.point(lambda04 = lambda12, phi02 = phi12);
+ sign0 = sign1;
+ },
+ lineEnd: function() {
+ stream.lineEnd();
+ lambda04 = phi02 = NaN;
+ },
+ clean: function() {
+ return 2 - clean2;
+ }
+ };
+ }
+ function clipAntimeridianIntersect(lambda04, phi02, lambda12, phi12) {
+ var cosPhi03, cosPhi1, sinLambda0Lambda1 = sin(lambda04 - lambda12);
+ return abs(sinLambda0Lambda1) > epsilon ? atan((sin(phi02) * (cosPhi1 = cos(phi12)) * sin(lambda12) - sin(phi12) * (cosPhi03 = cos(phi02)) * sin(lambda04)) / (cosPhi03 * cosPhi1 * sinLambda0Lambda1)) : (phi02 + phi12) / 2;
+ }
+ function clipAntimeridianInterpolate(from, to, direction, stream) {
+ var phi;
+ if (from == null) {
+ phi = direction * halfPi;
+ stream.point(-pi, phi);
+ stream.point(0, phi);
+ stream.point(pi, phi);
+ stream.point(pi, 0);
+ stream.point(pi, -phi);
+ stream.point(0, -phi);
+ stream.point(-pi, -phi);
+ stream.point(-pi, 0);
+ stream.point(-pi, phi);
+ } else if (abs(from[0] - to[0]) > epsilon) {
+ var lambda = from[0] < to[0] ? pi : -pi;
+ phi = direction * lambda / 2;
+ stream.point(-lambda, phi);
+ stream.point(0, phi);
+ stream.point(lambda, phi);
+ } else {
+ stream.point(to[0], to[1]);
+ }
+ }
+
+ // node_modules/d3-geo/src/clip/circle.js
+ function circle_default(radius) {
+ var cr = cos(radius), delta = 6 * radians, smallRadius = cr > 0, notHemisphere = abs(cr) > epsilon;
+ function interpolate(from, to, direction, stream) {
+ circleStream(stream, radius, delta, direction, from, to);
+ }
+ function visible(lambda, phi) {
+ return cos(lambda) * cos(phi) > cr;
+ }
+ function clipLine(stream) {
+ var point0, c0, v0, v00, clean2;
+ return {
+ lineStart: function() {
+ v00 = v0 = false;
+ clean2 = 1;
+ },
+ point: function(lambda, phi) {
+ var point1 = [lambda, phi], point2, v = visible(lambda, phi), c = smallRadius ? v ? 0 : code(lambda, phi) : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0;
+ if (!point0 && (v00 = v0 = v))
+ stream.lineStart();
+ if (v !== v0) {
+ point2 = intersect2(point0, point1);
+ if (!point2 || pointEqual_default(point0, point2) || pointEqual_default(point1, point2))
+ point1[2] = 1;
+ }
+ if (v !== v0) {
+ clean2 = 0;
+ if (v) {
+ stream.lineStart();
+ point2 = intersect2(point1, point0);
+ stream.point(point2[0], point2[1]);
+ } else {
+ point2 = intersect2(point0, point1);
+ stream.point(point2[0], point2[1], 2);
+ stream.lineEnd();
+ }
+ point0 = point2;
+ } else if (notHemisphere && point0 && smallRadius ^ v) {
+ var t;
+ if (!(c & c0) && (t = intersect2(point1, point0, true))) {
+ clean2 = 0;
+ if (smallRadius) {
+ stream.lineStart();
+ stream.point(t[0][0], t[0][1]);
+ stream.point(t[1][0], t[1][1]);
+ stream.lineEnd();
+ } else {
+ stream.point(t[1][0], t[1][1]);
+ stream.lineEnd();
+ stream.lineStart();
+ stream.point(t[0][0], t[0][1], 3);
+ }
+ }
+ }
+ if (v && (!point0 || !pointEqual_default(point0, point1))) {
+ stream.point(point1[0], point1[1]);
+ }
+ point0 = point1, v0 = v, c0 = c;
+ },
+ lineEnd: function() {
+ if (v0)
+ stream.lineEnd();
+ point0 = null;
+ },
+ clean: function() {
+ return clean2 | (v00 && v0) << 1;
+ }
+ };
+ }
+ function intersect2(a, b, two) {
+ var pa = cartesian(a), pb = cartesian(b);
+ var n1 = [1, 0, 0], n2 = cartesianCross(pa, pb), n2n2 = cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;
+ if (!determinant)
+ return !two && a;
+ var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = cartesianCross(n1, n2), A = cartesianScale(n1, c1), B = cartesianScale(n2, c2);
+ cartesianAddInPlace(A, B);
+ var u = n1xn2, w = cartesianDot(A, u), uu = cartesianDot(u, u), t2 = w * w - uu * (cartesianDot(A, A) - 1);
+ if (t2 < 0)
+ return;
+ var t = sqrt(t2), q = cartesianScale(u, (-w - t) / uu);
+ cartesianAddInPlace(q, A);
+ q = spherical(q);
+ if (!two)
+ return q;
+ var lambda04 = a[0], lambda12 = b[0], phi02 = a[1], phi12 = b[1], z;
+ if (lambda12 < lambda04)
+ z = lambda04, lambda04 = lambda12, lambda12 = z;
+ var delta2 = lambda12 - lambda04, polar = abs(delta2 - pi) < epsilon, meridian = polar || delta2 < epsilon;
+ if (!polar && phi12 < phi02)
+ z = phi02, phi02 = phi12, phi12 = z;
+ if (meridian ? polar ? phi02 + phi12 > 0 ^ q[1] < (abs(q[0] - lambda04) < epsilon ? phi02 : phi12) : phi02 <= q[1] && q[1] <= phi12 : delta2 > pi ^ (lambda04 <= q[0] && q[0] <= lambda12)) {
+ var q1 = cartesianScale(u, (-w + t) / uu);
+ cartesianAddInPlace(q1, A);
+ return [q, spherical(q1)];
+ }
+ }
+ function code(lambda, phi) {
+ var r = smallRadius ? radius : pi - radius, code2 = 0;
+ if (lambda < -r)
+ code2 |= 1;
+ else if (lambda > r)
+ code2 |= 2;
+ if (phi < -r)
+ code2 |= 4;
+ else if (phi > r)
+ code2 |= 8;
+ return code2;
+ }
+ return clip_default(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]);
+ }
+
+ // node_modules/d3-geo/src/clip/line.js
+ function line_default(a, b, x05, y05, x12, y12) {
+ var ax = a[0], ay = a[1], bx = b[0], by = b[1], t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;
+ r = x05 - ax;
+ if (!dx && r > 0)
+ return;
+ r /= dx;
+ if (dx < 0) {
+ if (r < t0)
+ return;
+ if (r < t1)
+ t1 = r;
+ } else if (dx > 0) {
+ if (r > t1)
+ return;
+ if (r > t0)
+ t0 = r;
+ }
+ r = x12 - ax;
+ if (!dx && r < 0)
+ return;
+ r /= dx;
+ if (dx < 0) {
+ if (r > t1)
+ return;
+ if (r > t0)
+ t0 = r;
+ } else if (dx > 0) {
+ if (r < t0)
+ return;
+ if (r < t1)
+ t1 = r;
+ }
+ r = y05 - ay;
+ if (!dy && r > 0)
+ return;
+ r /= dy;
+ if (dy < 0) {
+ if (r < t0)
+ return;
+ if (r < t1)
+ t1 = r;
+ } else if (dy > 0) {
+ if (r > t1)
+ return;
+ if (r > t0)
+ t0 = r;
+ }
+ r = y12 - ay;
+ if (!dy && r < 0)
+ return;
+ r /= dy;
+ if (dy < 0) {
+ if (r > t1)
+ return;
+ if (r > t0)
+ t0 = r;
+ } else if (dy > 0) {
+ if (r < t0)
+ return;
+ if (r < t1)
+ t1 = r;
+ }
+ if (t0 > 0)
+ a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
+ if (t1 < 1)
+ b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
+ return true;
+ }
+
+ // node_modules/d3-geo/src/clip/rectangle.js
+ var clipMax = 1e9;
+ var clipMin = -clipMax;
+ function clipRectangle(x05, y05, x12, y12) {
+ function visible(x, y) {
+ return x05 <= x && x <= x12 && y05 <= y && y <= y12;
+ }
+ function interpolate(from, to, direction, stream) {
+ var a = 0, a1 = 0;
+ if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) {
+ do
+ stream.point(a === 0 || a === 3 ? x05 : x12, a > 1 ? y12 : y05);
+ while ((a = (a + direction + 4) % 4) !== a1);
+ } else {
+ stream.point(to[0], to[1]);
+ }
+ }
+ function corner(p, direction) {
+ return abs(p[0] - x05) < epsilon ? direction > 0 ? 0 : 3 : abs(p[0] - x12) < epsilon ? direction > 0 ? 2 : 1 : abs(p[1] - y05) < epsilon ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;
+ }
+ function compareIntersection2(a, b) {
+ return comparePoint(a.x, b.x);
+ }
+ function comparePoint(a, b) {
+ var ca = corner(a, 1), cb = corner(b, 1);
+ return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];
+ }
+ return function(stream) {
+ var activeStream = stream, bufferStream = buffer_default(), segments, polygon2, ring, x__, y__, v__, x_, y_, v_, first, clean2;
+ var clipStream = {
+ point,
+ lineStart,
+ lineEnd,
+ polygonStart,
+ polygonEnd
+ };
+ function point(x, y) {
+ if (visible(x, y))
+ activeStream.point(x, y);
+ }
+ function polygonInside() {
+ var winding = 0;
+ for (var i2 = 0, n2 = polygon2.length; i2 < n2; ++i2) {
+ for (var ring2 = polygon2[i2], j2 = 1, m = ring2.length, point2 = ring2[0], a0, a1, b0 = point2[0], b1 = point2[1]; j2 < m; ++j2) {
+ a0 = b0, a1 = b1, point2 = ring2[j2], b0 = point2[0], b1 = point2[1];
+ if (a1 <= y12) {
+ if (b1 > y12 && (b0 - a0) * (y12 - a1) > (b1 - a1) * (x05 - a0))
+ ++winding;
+ } else {
+ if (b1 <= y12 && (b0 - a0) * (y12 - a1) < (b1 - a1) * (x05 - a0))
+ --winding;
+ }
+ }
+ }
+ return winding;
+ }
+ function polygonStart() {
+ activeStream = bufferStream, segments = [], polygon2 = [], clean2 = true;
+ }
+ function polygonEnd() {
+ var startInside = polygonInside(), cleanInside = clean2 && startInside, visible2 = (segments = merge(segments)).length;
+ if (cleanInside || visible2) {
+ stream.polygonStart();
+ if (cleanInside) {
+ stream.lineStart();
+ interpolate(null, null, 1, stream);
+ stream.lineEnd();
+ }
+ if (visible2) {
+ rejoin_default(segments, compareIntersection2, startInside, interpolate, stream);
+ }
+ stream.polygonEnd();
+ }
+ activeStream = stream, segments = polygon2 = ring = null;
+ }
+ function lineStart() {
+ clipStream.point = linePoint2;
+ if (polygon2)
+ polygon2.push(ring = []);
+ first = true;
+ v_ = false;
+ x_ = y_ = NaN;
+ }
+ function lineEnd() {
+ if (segments) {
+ linePoint2(x__, y__);
+ if (v__ && v_)
+ bufferStream.rejoin();
+ segments.push(bufferStream.result());
+ }
+ clipStream.point = point;
+ if (v_)
+ activeStream.lineEnd();
+ }
+ function linePoint2(x, y) {
+ var v = visible(x, y);
+ if (polygon2)
+ ring.push([x, y]);
+ if (first) {
+ x__ = x, y__ = y, v__ = v;
+ first = false;
+ if (v) {
+ activeStream.lineStart();
+ activeStream.point(x, y);
+ }
+ } else {
+ if (v && v_)
+ activeStream.point(x, y);
+ else {
+ var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
+ if (line_default(a, b, x05, y05, x12, y12)) {
+ if (!v_) {
+ activeStream.lineStart();
+ activeStream.point(a[0], a[1]);
+ }
+ activeStream.point(b[0], b[1]);
+ if (!v)
+ activeStream.lineEnd();
+ clean2 = false;
+ } else if (v) {
+ activeStream.lineStart();
+ activeStream.point(x, y);
+ clean2 = false;
+ }
+ }
+ }
+ x_ = x, y_ = y, v_ = v;
+ }
+ return clipStream;
+ };
+ }
+
+ // node_modules/d3-geo/src/length.js
+ var lengthSum;
+ var lambda03;
+ var sinPhi02;
+ var cosPhi02;
+ var lengthStream = {
+ sphere: noop,
+ point: noop,
+ lineStart: lengthLineStart,
+ lineEnd: noop,
+ polygonStart: noop,
+ polygonEnd: noop
+ };
+ function lengthLineStart() {
+ lengthStream.point = lengthPointFirst;
+ lengthStream.lineEnd = lengthLineEnd;
+ }
+ function lengthLineEnd() {
+ lengthStream.point = lengthStream.lineEnd = noop;
+ }
+ function lengthPointFirst(lambda, phi) {
+ lambda *= radians, phi *= radians;
+ lambda03 = lambda, sinPhi02 = sin(phi), cosPhi02 = cos(phi);
+ lengthStream.point = lengthPoint;
+ }
+ function lengthPoint(lambda, phi) {
+ lambda *= radians, phi *= radians;
+ var sinPhi = sin(phi), cosPhi = cos(phi), delta = abs(lambda - lambda03), cosDelta = cos(delta), sinDelta = sin(delta), x = cosPhi * sinDelta, y = cosPhi02 * sinPhi - sinPhi02 * cosPhi * cosDelta, z = sinPhi02 * sinPhi + cosPhi02 * cosPhi * cosDelta;
+ lengthSum.add(atan2(sqrt(x * x + y * y), z));
+ lambda03 = lambda, sinPhi02 = sinPhi, cosPhi02 = cosPhi;
+ }
+ function length_default(object) {
+ lengthSum = new Adder();
+ stream_default(object, lengthStream);
+ return +lengthSum;
+ }
+
+ // node_modules/d3-geo/src/identity.js
+ var identity_default = (x) => x;
+
+ // node_modules/d3-geo/src/path/area.js
+ var areaSum2 = new Adder();
+ var areaRingSum2 = new Adder();
+ var x00;
+ var y00;
+ var x0;
+ var y0;
+ var areaStream2 = {
+ point: noop,
+ lineStart: noop,
+ lineEnd: noop,
+ polygonStart: function() {
+ areaStream2.lineStart = areaRingStart2;
+ areaStream2.lineEnd = areaRingEnd2;
+ },
+ polygonEnd: function() {
+ areaStream2.lineStart = areaStream2.lineEnd = areaStream2.point = noop;
+ areaSum2.add(abs(areaRingSum2));
+ areaRingSum2 = new Adder();
+ },
+ result: function() {
+ var area = areaSum2 / 2;
+ areaSum2 = new Adder();
+ return area;
+ }
+ };
+ function areaRingStart2() {
+ areaStream2.point = areaPointFirst2;
+ }
+ function areaPointFirst2(x, y) {
+ areaStream2.point = areaPoint2;
+ x00 = x0 = x, y00 = y0 = y;
+ }
+ function areaPoint2(x, y) {
+ areaRingSum2.add(y0 * x - x0 * y);
+ x0 = x, y0 = y;
+ }
+ function areaRingEnd2() {
+ areaPoint2(x00, y00);
+ }
+ var area_default2 = areaStream2;
+
+ // node_modules/d3-geo/src/path/bounds.js
+ var x02 = Infinity;
+ var y02 = x02;
+ var x1 = -x02;
+ var y1 = x1;
+ var boundsStream2 = {
+ point: boundsPoint2,
+ lineStart: noop,
+ lineEnd: noop,
+ polygonStart: noop,
+ polygonEnd: noop,
+ result: function() {
+ var bounds = [[x02, y02], [x1, y1]];
+ x1 = y1 = -(y02 = x02 = Infinity);
+ return bounds;
+ }
+ };
+ function boundsPoint2(x, y) {
+ if (x < x02)
+ x02 = x;
+ if (x > x1)
+ x1 = x;
+ if (y < y02)
+ y02 = y;
+ if (y > y1)
+ y1 = y;
+ }
+ var bounds_default2 = boundsStream2;
+
+ // node_modules/d3-geo/src/path/centroid.js
+ var X0 = 0;
+ var Y0 = 0;
+ var Z0 = 0;
+ var X1 = 0;
+ var Y1 = 0;
+ var Z1 = 0;
+ var X2 = 0;
+ var Y2 = 0;
+ var Z2 = 0;
+ var x002;
+ var y002;
+ var x03;
+ var y03;
+ var centroidStream = {
+ point: centroidPoint,
+ lineStart: centroidLineStart,
+ lineEnd: centroidLineEnd,
+ polygonStart: function() {
+ centroidStream.lineStart = centroidRingStart;
+ centroidStream.lineEnd = centroidRingEnd;
+ },
+ polygonEnd: function() {
+ centroidStream.point = centroidPoint;
+ centroidStream.lineStart = centroidLineStart;
+ centroidStream.lineEnd = centroidLineEnd;
+ },
+ result: function() {
+ var centroid = Z2 ? [X2 / Z2, Y2 / Z2] : Z1 ? [X1 / Z1, Y1 / Z1] : Z0 ? [X0 / Z0, Y0 / Z0] : [NaN, NaN];
+ X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;
+ return centroid;
+ }
+ };
+ function centroidPoint(x, y) {
+ X0 += x;
+ Y0 += y;
+ ++Z0;
+ }
+ function centroidLineStart() {
+ centroidStream.point = centroidPointFirstLine;
+ }
+ function centroidPointFirstLine(x, y) {
+ centroidStream.point = centroidPointLine;
+ centroidPoint(x03 = x, y03 = y);
+ }
+ function centroidPointLine(x, y) {
+ var dx = x - x03, dy = y - y03, z = sqrt(dx * dx + dy * dy);
+ X1 += z * (x03 + x) / 2;
+ Y1 += z * (y03 + y) / 2;
+ Z1 += z;
+ centroidPoint(x03 = x, y03 = y);
+ }
+ function centroidLineEnd() {
+ centroidStream.point = centroidPoint;
+ }
+ function centroidRingStart() {
+ centroidStream.point = centroidPointFirstRing;
+ }
+ function centroidRingEnd() {
+ centroidPointRing(x002, y002);
+ }
+ function centroidPointFirstRing(x, y) {
+ centroidStream.point = centroidPointRing;
+ centroidPoint(x002 = x03 = x, y002 = y03 = y);
+ }
+ function centroidPointRing(x, y) {
+ var dx = x - x03, dy = y - y03, z = sqrt(dx * dx + dy * dy);
+ X1 += z * (x03 + x) / 2;
+ Y1 += z * (y03 + y) / 2;
+ Z1 += z;
+ z = y03 * x - x03 * y;
+ X2 += z * (x03 + x);
+ Y2 += z * (y03 + y);
+ Z2 += z * 3;
+ centroidPoint(x03 = x, y03 = y);
+ }
+ var centroid_default = centroidStream;
+
+ // node_modules/d3-geo/src/path/context.js
+ function PathContext(context) {
+ this._context = context;
+ }
+ PathContext.prototype = {
+ _radius: 4.5,
+ pointRadius: function(_) {
+ return this._radius = _, this;
+ },
+ polygonStart: function() {
+ this._line = 0;
+ },
+ polygonEnd: function() {
+ this._line = NaN;
+ },
+ lineStart: function() {
+ this._point = 0;
+ },
+ lineEnd: function() {
+ if (this._line === 0)
+ this._context.closePath();
+ this._point = NaN;
+ },
+ point: function(x, y) {
+ switch (this._point) {
+ case 0: {
+ this._context.moveTo(x, y);
+ this._point = 1;
+ break;
+ }
+ case 1: {
+ this._context.lineTo(x, y);
+ break;
+ }
+ default: {
+ this._context.moveTo(x + this._radius, y);
+ this._context.arc(x, y, this._radius, 0, tau);
+ break;
+ }
+ }
+ },
+ result: noop
+ };
+
+ // node_modules/d3-geo/src/path/measure.js
+ var lengthSum2 = new Adder();
+ var lengthRing;
+ var x003;
+ var y003;
+ var x04;
+ var y04;
+ var lengthStream2 = {
+ point: noop,
+ lineStart: function() {
+ lengthStream2.point = lengthPointFirst2;
+ },
+ lineEnd: function() {
+ if (lengthRing)
+ lengthPoint2(x003, y003);
+ lengthStream2.point = noop;
+ },
+ polygonStart: function() {
+ lengthRing = true;
+ },
+ polygonEnd: function() {
+ lengthRing = null;
+ },
+ result: function() {
+ var length = +lengthSum2;
+ lengthSum2 = new Adder();
+ return length;
+ }
+ };
+ function lengthPointFirst2(x, y) {
+ lengthStream2.point = lengthPoint2;
+ x003 = x04 = x, y003 = y04 = y;
+ }
+ function lengthPoint2(x, y) {
+ x04 -= x, y04 -= y;
+ lengthSum2.add(sqrt(x04 * x04 + y04 * y04));
+ x04 = x, y04 = y;
+ }
+ var measure_default = lengthStream2;
+
+ // node_modules/d3-geo/src/path/string.js
+ function PathString() {
+ this._string = [];
+ }
+ PathString.prototype = {
+ _radius: 4.5,
+ _circle: circle(4.5),
+ pointRadius: function(_) {
+ if ((_ = +_) !== this._radius)
+ this._radius = _, this._circle = null;
+ return this;
+ },
+ polygonStart: function() {
+ this._line = 0;
+ },
+ polygonEnd: function() {
+ this._line = NaN;
+ },
+ lineStart: function() {
+ this._point = 0;
+ },
+ lineEnd: function() {
+ if (this._line === 0)
+ this._string.push("Z");
+ this._point = NaN;
+ },
+ point: function(x, y) {
+ switch (this._point) {
+ case 0: {
+ this._string.push("M", x, ",", y);
+ this._point = 1;
+ break;
+ }
+ case 1: {
+ this._string.push("L", x, ",", y);
+ break;
+ }
+ default: {
+ if (this._circle == null)
+ this._circle = circle(this._radius);
+ this._string.push("M", x, ",", y, this._circle);
+ break;
+ }
+ }
+ },
+ result: function() {
+ if (this._string.length) {
+ var result = this._string.join("");
+ this._string = [];
+ return result;
+ } else {
+ return null;
+ }
+ }
+ };
+ function circle(radius) {
+ return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z";
+ }
+
+ // node_modules/d3-geo/src/path/index.js
+ function path_default(projection2, context) {
+ var pointRadius = 4.5, projectionStream, contextStream;
+ function path(object) {
+ if (object) {
+ if (typeof pointRadius === "function")
+ contextStream.pointRadius(+pointRadius.apply(this, arguments));
+ stream_default(object, projectionStream(contextStream));
+ }
+ return contextStream.result();
+ }
+ path.area = function(object) {
+ stream_default(object, projectionStream(area_default2));
+ return area_default2.result();
+ };
+ path.measure = function(object) {
+ stream_default(object, projectionStream(measure_default));
+ return measure_default.result();
+ };
+ path.bounds = function(object) {
+ stream_default(object, projectionStream(bounds_default2));
+ return bounds_default2.result();
+ };
+ path.centroid = function(object) {
+ stream_default(object, projectionStream(centroid_default));
+ return centroid_default.result();
+ };
+ path.projection = function(_) {
+ return arguments.length ? (projectionStream = _ == null ? (projection2 = null, identity_default) : (projection2 = _).stream, path) : projection2;
+ };
+ path.context = function(_) {
+ if (!arguments.length)
+ return context;
+ contextStream = _ == null ? (context = null, new PathString()) : new PathContext(context = _);
+ if (typeof pointRadius !== "function")
+ contextStream.pointRadius(pointRadius);
+ return path;
+ };
+ path.pointRadius = function(_) {
+ if (!arguments.length)
+ return pointRadius;
+ pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
+ return path;
+ };
+ return path.projection(projection2).context(context);
+ }
+
+ // node_modules/d3-geo/src/transform.js
+ function transform_default(methods2) {
+ return {
+ stream: transformer(methods2)
+ };
+ }
+ function transformer(methods2) {
+ return function(stream) {
+ var s = new TransformStream();
+ for (var key in methods2)
+ s[key] = methods2[key];
+ s.stream = stream;
+ return s;
+ };
+ }
+ function TransformStream() {
+ }
+ TransformStream.prototype = {
+ constructor: TransformStream,
+ point: function(x, y) {
+ this.stream.point(x, y);
+ },
+ sphere: function() {
+ this.stream.sphere();
+ },
+ lineStart: function() {
+ this.stream.lineStart();
+ },
+ lineEnd: function() {
+ this.stream.lineEnd();
+ },
+ polygonStart: function() {
+ this.stream.polygonStart();
+ },
+ polygonEnd: function() {
+ this.stream.polygonEnd();
+ }
+ };
+
+ // node_modules/d3-geo/src/projection/fit.js
+ function fit(projection2, fitBounds, object) {
+ var clip = projection2.clipExtent && projection2.clipExtent();
+ projection2.scale(150).translate([0, 0]);
+ if (clip != null)
+ projection2.clipExtent(null);
+ stream_default(object, projection2.stream(bounds_default2));
+ fitBounds(bounds_default2.result());
+ if (clip != null)
+ projection2.clipExtent(clip);
+ return projection2;
+ }
+ function fitExtent(projection2, extent, object) {
+ return fit(projection2, function(b) {
+ var w = extent[1][0] - extent[0][0], h = extent[1][1] - extent[0][1], k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
+ projection2.scale(150 * k).translate([x, y]);
+ }, object);
+ }
+ function fitSize(projection2, size, object) {
+ return fitExtent(projection2, [[0, 0], size], object);
+ }
+ function fitWidth(projection2, width, object) {
+ return fit(projection2, function(b) {
+ var w = +width, k = w / (b[1][0] - b[0][0]), x = (w - k * (b[1][0] + b[0][0])) / 2, y = -k * b[0][1];
+ projection2.scale(150 * k).translate([x, y]);
+ }, object);
+ }
+ function fitHeight(projection2, height, object) {
+ return fit(projection2, function(b) {
+ var h = +height, k = h / (b[1][1] - b[0][1]), x = -k * b[0][0], y = (h - k * (b[1][1] + b[0][1])) / 2;
+ projection2.scale(150 * k).translate([x, y]);
+ }, object);
+ }
+
+ // node_modules/d3-geo/src/projection/resample.js
+ var maxDepth = 16;
+ var cosMinDistance = cos(30 * radians);
+ function resample_default(project, delta2) {
+ return +delta2 ? resample(project, delta2) : resampleNone(project);
+ }
+ function resampleNone(project) {
+ return transformer({
+ point: function(x, y) {
+ x = project(x, y);
+ this.stream.point(x[0], x[1]);
+ }
+ });
+ }
+ function resample(project, delta2) {
+ function resampleLineTo(x05, y05, lambda04, a0, b0, c0, x12, y12, lambda12, a1, b1, c1, depth, stream) {
+ var dx = x12 - x05, dy = y12 - y05, d2 = dx * dx + dy * dy;
+ if (d2 > 4 * delta2 && depth--) {
+ var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = sqrt(a * a + b * b + c * c), phi2 = asin(c /= m), lambda22 = abs(abs(c) - 1) < epsilon || abs(lambda04 - lambda12) < epsilon ? (lambda04 + lambda12) / 2 : atan2(b, a), p = project(lambda22, phi2), x2 = p[0], y2 = p[1], dx2 = x2 - x05, dy2 = y2 - y05, dz = dy * dx2 - dx * dy2;
+ if (dz * dz / d2 > delta2 || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {
+ resampleLineTo(x05, y05, lambda04, a0, b0, c0, x2, y2, lambda22, a /= m, b /= m, c, depth, stream);
+ stream.point(x2, y2);
+ resampleLineTo(x2, y2, lambda22, a, b, c, x12, y12, lambda12, a1, b1, c1, depth, stream);
+ }
+ }
+ }
+ return function(stream) {
+ var lambda003, x004, y004, a00, b00, c00, lambda04, x05, y05, a0, b0, c0;
+ var resampleStream = {
+ point,
+ lineStart,
+ lineEnd,
+ polygonStart: function() {
+ stream.polygonStart();
+ resampleStream.lineStart = ringStart;
+ },
+ polygonEnd: function() {
+ stream.polygonEnd();
+ resampleStream.lineStart = lineStart;
+ }
+ };
+ function point(x, y) {
+ x = project(x, y);
+ stream.point(x[0], x[1]);
+ }
+ function lineStart() {
+ x05 = NaN;
+ resampleStream.point = linePoint2;
+ stream.lineStart();
+ }
+ function linePoint2(lambda, phi) {
+ var c = cartesian([lambda, phi]), p = project(lambda, phi);
+ resampleLineTo(x05, y05, lambda04, a0, b0, c0, x05 = p[0], y05 = p[1], lambda04 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
+ stream.point(x05, y05);
+ }
+ function lineEnd() {
+ resampleStream.point = point;
+ stream.lineEnd();
+ }
+ function ringStart() {
+ lineStart();
+ resampleStream.point = ringPoint;
+ resampleStream.lineEnd = ringEnd;
+ }
+ function ringPoint(lambda, phi) {
+ linePoint2(lambda003 = lambda, phi), x004 = x05, y004 = y05, a00 = a0, b00 = b0, c00 = c0;
+ resampleStream.point = linePoint2;
+ }
+ function ringEnd() {
+ resampleLineTo(x05, y05, lambda04, a0, b0, c0, x004, y004, lambda003, a00, b00, c00, maxDepth, stream);
+ resampleStream.lineEnd = lineEnd;
+ lineEnd();
+ }
+ return resampleStream;
+ };
+ }
+
+ // node_modules/d3-geo/src/projection/index.js
+ var transformRadians = transformer({
+ point: function(x, y) {
+ this.stream.point(x * radians, y * radians);
+ }
+ });
+ function transformRotate(rotate) {
+ return transformer({
+ point: function(x, y) {
+ var r = rotate(x, y);
+ return this.stream.point(r[0], r[1]);
+ }
+ });
+ }
+ function scaleTranslate(k, dx, dy, sx, sy) {
+ function transform2(x, y) {
+ x *= sx;
+ y *= sy;
+ return [dx + k * x, dy - k * y];
+ }
+ transform2.invert = function(x, y) {
+ return [(x - dx) / k * sx, (dy - y) / k * sy];
+ };
+ return transform2;
+ }
+ function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {
+ if (!alpha)
+ return scaleTranslate(k, dx, dy, sx, sy);
+ var cosAlpha = cos(alpha), sinAlpha = sin(alpha), a = cosAlpha * k, b = sinAlpha * k, ai = cosAlpha / k, bi = sinAlpha / k, ci = (sinAlpha * dy - cosAlpha * dx) / k, fi = (sinAlpha * dx + cosAlpha * dy) / k;
+ function transform2(x, y) {
+ x *= sx;
+ y *= sy;
+ return [a * x - b * y + dx, dy - b * x - a * y];
+ }
+ transform2.invert = function(x, y) {
+ return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)];
+ };
+ return transform2;
+ }
+ function projection(project) {
+ return projectionMutator(function() {
+ return project;
+ })();
+ }
+ function projectionMutator(projectAt) {
+ var project, k = 150, x = 480, y = 250, lambda = 0, phi = 0, deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, alpha = 0, sx = 1, sy = 1, theta = null, preclip = antimeridian_default, x05 = null, y05, x12, y12, postclip = identity_default, delta2 = 0.5, projectResample, projectTransform, projectRotateTransform, cache, cacheStream;
+ function projection2(point) {
+ return projectRotateTransform(point[0] * radians, point[1] * radians);
+ }
+ function invert(point) {
+ point = projectRotateTransform.invert(point[0], point[1]);
+ return point && [point[0] * degrees, point[1] * degrees];
+ }
+ projection2.stream = function(stream) {
+ return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
+ };
+ projection2.preclip = function(_) {
+ return arguments.length ? (preclip = _, theta = void 0, reset()) : preclip;
+ };
+ projection2.postclip = function(_) {
+ return arguments.length ? (postclip = _, x05 = y05 = x12 = y12 = null, reset()) : postclip;
+ };
+ projection2.clipAngle = function(_) {
+ return arguments.length ? (preclip = +_ ? circle_default(theta = _ * radians) : (theta = null, antimeridian_default), reset()) : theta * degrees;
+ };
+ projection2.clipExtent = function(_) {
+ return arguments.length ? (postclip = _ == null ? (x05 = y05 = x12 = y12 = null, identity_default) : clipRectangle(x05 = +_[0][0], y05 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset()) : x05 == null ? null : [[x05, y05], [x12, y12]];
+ };
+ projection2.scale = function(_) {
+ return arguments.length ? (k = +_, recenter()) : k;
+ };
+ projection2.translate = function(_) {
+ return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
+ };
+ projection2.center = function(_) {
+ return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees];
+ };
+ projection2.rotate = function(_) {
+ return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];
+ };
+ projection2.angle = function(_) {
+ return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;
+ };
+ projection2.reflectX = function(_) {
+ return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;
+ };
+ projection2.reflectY = function(_) {
+ return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;
+ };
+ projection2.precision = function(_) {
+ return arguments.length ? (projectResample = resample_default(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
+ };
+ projection2.fitExtent = function(extent, object) {
+ return fitExtent(projection2, extent, object);
+ };
+ projection2.fitSize = function(size, object) {
+ return fitSize(projection2, size, object);
+ };
+ projection2.fitWidth = function(width, object) {
+ return fitWidth(projection2, width, object);
+ };
+ projection2.fitHeight = function(height, object) {
+ return fitHeight(projection2, height, object);
+ };
+ function recenter() {
+ var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), transform2 = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha);
+ rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);
+ projectTransform = compose_default(project, transform2);
+ projectRotateTransform = compose_default(rotate, projectTransform);
+ projectResample = resample_default(projectTransform, delta2);
+ return reset();
+ }
+ function reset() {
+ cache = cacheStream = null;
+ return projection2;
+ }
+ return function() {
+ project = projectAt.apply(this, arguments);
+ projection2.invert = project.invert && invert;
+ return recenter();
+ };
+ }
+
+ // node_modules/d3-geo/src/projection/mercator.js
+ function mercatorRaw(lambda, phi) {
+ return [lambda, log(tan((halfPi + phi) / 2))];
+ }
+ mercatorRaw.invert = function(x, y) {
+ return [x, 2 * atan(exp(y)) - halfPi];
+ };
+ function mercator_default() {
+ return mercatorProjection(mercatorRaw).scale(961 / tau);
+ }
+ function mercatorProjection(project) {
+ var m = projection(project), center = m.center, scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, x05 = null, y05, x12, y12;
+ m.scale = function(_) {
+ return arguments.length ? (scale(_), reclip()) : scale();
+ };
+ m.translate = function(_) {
+ return arguments.length ? (translate(_), reclip()) : translate();
+ };
+ m.center = function(_) {
+ return arguments.length ? (center(_), reclip()) : center();
+ };
+ m.clipExtent = function(_) {
+ return arguments.length ? (_ == null ? x05 = y05 = x12 = y12 = null : (x05 = +_[0][0], y05 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reclip()) : x05 == null ? null : [[x05, y05], [x12, y12]];
+ };
+ function reclip() {
+ var k = pi * scale(), t = m(rotation_default(m.rotate()).invert([0, 0]));
+ return clipExtent(x05 == null ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw ? [[Math.max(t[0] - k, x05), y05], [Math.min(t[0] + k, x12), y12]] : [[x05, Math.max(t[1] - k, y05)], [x12, Math.min(t[1] + k, y12)]]);
+ }
+ return reclip();
+ }
+
+ // node_modules/d3-geo/src/projection/identity.js
+ function identity_default2() {
+ var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, alpha = 0, ca, sa, x05 = null, y05, x12, y12, kx = 1, ky = 1, transform2 = transformer({
+ point: function(x, y) {
+ var p = projection2([x, y]);
+ this.stream.point(p[0], p[1]);
+ }
+ }), postclip = identity_default, cache, cacheStream;
+ function reset() {
+ kx = k * sx;
+ ky = k * sy;
+ cache = cacheStream = null;
+ return projection2;
+ }
+ function projection2(p) {
+ var x = p[0] * kx, y = p[1] * ky;
+ if (alpha) {
+ var t = y * ca - x * sa;
+ x = x * ca + y * sa;
+ y = t;
+ }
+ return [x + tx, y + ty];
+ }
+ projection2.invert = function(p) {
+ var x = p[0] - tx, y = p[1] - ty;
+ if (alpha) {
+ var t = y * ca + x * sa;
+ x = x * ca - y * sa;
+ y = t;
+ }
+ return [x / kx, y / ky];
+ };
+ projection2.stream = function(stream) {
+ return cache && cacheStream === stream ? cache : cache = transform2(postclip(cacheStream = stream));
+ };
+ projection2.postclip = function(_) {
+ return arguments.length ? (postclip = _, x05 = y05 = x12 = y12 = null, reset()) : postclip;
+ };
+ projection2.clipExtent = function(_) {
+ return arguments.length ? (postclip = _ == null ? (x05 = y05 = x12 = y12 = null, identity_default) : clipRectangle(x05 = +_[0][0], y05 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset()) : x05 == null ? null : [[x05, y05], [x12, y12]];
+ };
+ projection2.scale = function(_) {
+ return arguments.length ? (k = +_, reset()) : k;
+ };
+ projection2.translate = function(_) {
+ return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty];
+ };
+ projection2.angle = function(_) {
+ return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees;
+ };
+ projection2.reflectX = function(_) {
+ return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0;
+ };
+ projection2.reflectY = function(_) {
+ return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0;
+ };
+ projection2.fitExtent = function(extent, object) {
+ return fitExtent(projection2, extent, object);
+ };
+ projection2.fitSize = function(size, object) {
+ return fitSize(projection2, size, object);
+ };
+ projection2.fitWidth = function(width, object) {
+ return fitWidth(projection2, width, object);
+ };
+ projection2.fitHeight = function(height, object) {
+ return fitHeight(projection2, height, object);
+ };
+ return projection2;
+ }
+
+ // modules/geo/geo.js
+ var TAU = 2 * Math.PI;
+ var EQUATORIAL_RADIUS = 6356752314245179e-9;
+ var POLAR_RADIUS = 6378137;
+ function geoLatToMeters(dLat) {
+ return dLat * (TAU * POLAR_RADIUS / 360);
+ }
+ function geoLonToMeters(dLon, atLat) {
+ return Math.abs(atLat) >= 90 ? 0 : dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
+ }
+ function geoMetersToLat(m) {
+ return m / (TAU * POLAR_RADIUS / 360);
+ }
+ function geoMetersToLon(m, atLat) {
+ return Math.abs(atLat) >= 90 ? 0 : m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
+ }
+ function geoMetersToOffset(meters, tileSize) {
+ tileSize = tileSize || 256;
+ return [
+ meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
+ -meters[1] * tileSize / (TAU * POLAR_RADIUS)
+ ];
+ }
+ function geoOffsetToMeters(offset, tileSize) {
+ tileSize = tileSize || 256;
+ return [
+ offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
+ -offset[1] * TAU * POLAR_RADIUS / tileSize
+ ];
+ }
+ function geoSphericalDistance(a, b) {
+ var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
+ var y = geoLatToMeters(a[1] - b[1]);
+ return Math.sqrt(x * x + y * y);
+ }
+ function geoScaleToZoom(k, tileSize) {
+ tileSize = tileSize || 256;
+ var log2ts = Math.log(tileSize) * Math.LOG2E;
+ return Math.log(k * TAU) / Math.LN2 - log2ts;
+ }
+ function geoZoomToScale(z, tileSize) {
+ tileSize = tileSize || 256;
+ return tileSize * Math.pow(2, z) / TAU;
+ }
+ function geoSphericalClosestNode(nodes, point) {
+ var minDistance = Infinity, distance;
+ var indexOfMin;
+ for (var i2 in nodes) {
+ distance = geoSphericalDistance(nodes[i2].loc, point);
+ if (distance < minDistance) {
+ minDistance = distance;
+ indexOfMin = i2;
+ }
+ }
+ if (indexOfMin !== void 0) {
+ return { index: indexOfMin, distance: minDistance, node: nodes[indexOfMin] };
+ } else {
+ return null;
+ }
+ }
+
+ // modules/geo/extent.js
+ function geoExtent(min3, max3) {
+ if (!(this instanceof geoExtent)) {
+ return new geoExtent(min3, max3);
+ } else if (min3 instanceof geoExtent) {
+ return min3;
+ } else if (min3 && min3.length === 2 && min3[0].length === 2 && min3[1].length === 2) {
+ this[0] = min3[0];
+ this[1] = min3[1];
+ } else {
+ this[0] = min3 || [Infinity, Infinity];
+ this[1] = max3 || min3 || [-Infinity, -Infinity];
+ }
+ }
+ geoExtent.prototype = new Array(2);
+ Object.assign(geoExtent.prototype, {
+ equals: function(obj) {
+ return this[0][0] === obj[0][0] && this[0][1] === obj[0][1] && this[1][0] === obj[1][0] && this[1][1] === obj[1][1];
+ },
+ extend: function(obj) {
+ if (!(obj instanceof geoExtent))
+ obj = new geoExtent(obj);
+ return geoExtent([Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])], [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]);
+ },
+ _extend: function(extent) {
+ this[0][0] = Math.min(extent[0][0], this[0][0]);
+ this[0][1] = Math.min(extent[0][1], this[0][1]);
+ this[1][0] = Math.max(extent[1][0], this[1][0]);
+ this[1][1] = Math.max(extent[1][1], this[1][1]);
+ },
+ area: function() {
+ return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
+ },
+ center: function() {
+ return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
+ },
+ rectangle: function() {
+ return [this[0][0], this[0][1], this[1][0], this[1][1]];
+ },
+ bbox: function() {
+ return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
+ },
+ polygon: function() {
+ return [
+ [this[0][0], this[0][1]],
+ [this[0][0], this[1][1]],
+ [this[1][0], this[1][1]],
+ [this[1][0], this[0][1]],
+ [this[0][0], this[0][1]]
+ ];
+ },
+ contains: function(obj) {
+ if (!(obj instanceof geoExtent))
+ obj = new geoExtent(obj);
+ return obj[0][0] >= this[0][0] && obj[0][1] >= this[0][1] && obj[1][0] <= this[1][0] && obj[1][1] <= this[1][1];
+ },
+ intersects: function(obj) {
+ if (!(obj instanceof geoExtent))
+ obj = new geoExtent(obj);
+ return obj[0][0] <= this[1][0] && obj[0][1] <= this[1][1] && obj[1][0] >= this[0][0] && obj[1][1] >= this[0][1];
+ },
+ intersection: function(obj) {
+ if (!this.intersects(obj))
+ return new geoExtent();
+ return new geoExtent([Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])], [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]);
+ },
+ percentContainedIn: function(obj) {
+ if (!(obj instanceof geoExtent))
+ obj = new geoExtent(obj);
+ var a1 = this.intersection(obj).area();
+ var a2 = this.area();
+ if (a1 === Infinity || a2 === Infinity) {
+ return 0;
+ } else if (a1 === 0 || a2 === 0) {
+ if (obj.contains(this)) {
+ return 1;
+ }
+ return 0;
+ } else {
+ return a1 / a2;
+ }
+ },
+ padByMeters: function(meters) {
+ var dLat = geoMetersToLat(meters);
+ var dLon = geoMetersToLon(meters, this.center()[1]);
+ return geoExtent([this[0][0] - dLon, this[0][1] - dLat], [this[1][0] + dLon, this[1][1] + dLat]);
+ },
+ toParam: function() {
+ return this.rectangle().join(",");
+ }
+ });
+
+ // node_modules/d3-polygon/src/area.js
+ function area_default3(polygon2) {
+ var i2 = -1, n2 = polygon2.length, a, b = polygon2[n2 - 1], area = 0;
+ while (++i2 < n2) {
+ a = b;
+ b = polygon2[i2];
+ area += a[1] * b[0] - a[0] * b[1];
+ }
+ return area / 2;
+ }
+
+ // node_modules/d3-polygon/src/centroid.js
+ function centroid_default2(polygon2) {
+ var i2 = -1, n2 = polygon2.length, x = 0, y = 0, a, b = polygon2[n2 - 1], c, k = 0;
+ while (++i2 < n2) {
+ a = b;
+ b = polygon2[i2];
+ k += c = a[0] * b[1] - b[0] * a[1];
+ x += (a[0] + b[0]) * c;
+ y += (a[1] + b[1]) * c;
+ }
+ return k *= 3, [x / k, y / k];
+ }
+
+ // node_modules/d3-polygon/src/cross.js
+ function cross_default(a, b, c) {
+ return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
+ }
+
+ // node_modules/d3-polygon/src/hull.js
+ function lexicographicOrder(a, b) {
+ return a[0] - b[0] || a[1] - b[1];
+ }
+ function computeUpperHullIndexes(points) {
+ const n2 = points.length, indexes = [0, 1];
+ let size = 2, i2;
+ for (i2 = 2; i2 < n2; ++i2) {
+ while (size > 1 && cross_default(points[indexes[size - 2]], points[indexes[size - 1]], points[i2]) <= 0)
+ --size;
+ indexes[size++] = i2;
+ }
+ return indexes.slice(0, size);
+ }
+ function hull_default(points) {
+ if ((n2 = points.length) < 3)
+ return null;
+ var i2, n2, sortedPoints = new Array(n2), flippedPoints = new Array(n2);
+ for (i2 = 0; i2 < n2; ++i2)
+ sortedPoints[i2] = [+points[i2][0], +points[i2][1], i2];
+ sortedPoints.sort(lexicographicOrder);
+ for (i2 = 0; i2 < n2; ++i2)
+ flippedPoints[i2] = [sortedPoints[i2][0], -sortedPoints[i2][1]];
+ var upperIndexes = computeUpperHullIndexes(sortedPoints), lowerIndexes = computeUpperHullIndexes(flippedPoints);
+ var skipLeft = lowerIndexes[0] === upperIndexes[0], skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], hull = [];
+ for (i2 = upperIndexes.length - 1; i2 >= 0; --i2)
+ hull.push(points[sortedPoints[upperIndexes[i2]][2]]);
+ for (i2 = +skipLeft; i2 < lowerIndexes.length - skipRight; ++i2)
+ hull.push(points[sortedPoints[lowerIndexes[i2]][2]]);
+ return hull;
+ }
+
+ // modules/geo/vector.js
+ function geoVecEqual(a, b, epsilon3) {
+ if (epsilon3) {
+ return Math.abs(a[0] - b[0]) <= epsilon3 && Math.abs(a[1] - b[1]) <= epsilon3;
+ } else {
+ return a[0] === b[0] && a[1] === b[1];
+ }
+ }
+ function geoVecAdd(a, b) {
+ return [a[0] + b[0], a[1] + b[1]];
+ }
+ function geoVecSubtract(a, b) {
+ return [a[0] - b[0], a[1] - b[1]];
+ }
+ function geoVecScale(a, mag) {
+ return [a[0] * mag, a[1] * mag];
+ }
+ function geoVecFloor(a) {
+ return [Math.floor(a[0]), Math.floor(a[1])];
+ }
+ function geoVecInterp(a, b, t) {
+ return [
+ a[0] + (b[0] - a[0]) * t,
+ a[1] + (b[1] - a[1]) * t
+ ];
+ }
+ function geoVecLength(a, b) {
+ return Math.sqrt(geoVecLengthSquare(a, b));
+ }
+ function geoVecLengthSquare(a, b) {
+ b = b || [0, 0];
+ var x = a[0] - b[0];
+ var y = a[1] - b[1];
+ return x * x + y * y;
+ }
+ function geoVecNormalize(a) {
+ var length = Math.sqrt(a[0] * a[0] + a[1] * a[1]);
+ if (length !== 0) {
+ return geoVecScale(a, 1 / length);
+ }
+ return [0, 0];
+ }
+ function geoVecAngle(a, b) {
+ return Math.atan2(b[1] - a[1], b[0] - a[0]);
+ }
+ function geoVecDot(a, b, origin) {
+ origin = origin || [0, 0];
+ var p = geoVecSubtract(a, origin);
+ var q = geoVecSubtract(b, origin);
+ return p[0] * q[0] + p[1] * q[1];
+ }
+ function geoVecNormalizedDot(a, b, origin) {
+ origin = origin || [0, 0];
+ var p = geoVecNormalize(geoVecSubtract(a, origin));
+ var q = geoVecNormalize(geoVecSubtract(b, origin));
+ return geoVecDot(p, q);
+ }
+ function geoVecCross(a, b, origin) {
+ origin = origin || [0, 0];
+ var p = geoVecSubtract(a, origin);
+ var q = geoVecSubtract(b, origin);
+ return p[0] * q[1] - p[1] * q[0];
+ }
+ function geoVecProject(a, points) {
+ var min3 = Infinity;
+ var idx;
+ var target;
+ for (var i2 = 0; i2 < points.length - 1; i2++) {
+ var o = points[i2];
+ var s = geoVecSubtract(points[i2 + 1], o);
+ var v = geoVecSubtract(a, o);
+ var proj = geoVecDot(v, s) / geoVecDot(s, s);
+ var p;
+ if (proj < 0) {
+ p = o;
+ } else if (proj > 1) {
+ p = points[i2 + 1];
+ } else {
+ p = [o[0] + proj * s[0], o[1] + proj * s[1]];
+ }
+ var dist = geoVecLength(p, a);
+ if (dist < min3) {
+ min3 = dist;
+ idx = i2 + 1;
+ target = p;
+ }
+ }
+ if (idx !== void 0) {
+ return { index: idx, distance: min3, target };
+ } else {
+ return null;
+ }
+ }
+
+ // modules/geo/geom.js
+ function geoAngle(a, b, projection2) {
+ return geoVecAngle(projection2(a.loc), projection2(b.loc));
+ }
+ function geoEdgeEqual(a, b) {
+ return a[0] === b[0] && a[1] === b[1] || a[0] === b[1] && a[1] === b[0];
+ }
+ function geoRotate(points, angle2, around) {
+ return points.map(function(point) {
+ var radial = geoVecSubtract(point, around);
+ return [
+ radial[0] * Math.cos(angle2) - radial[1] * Math.sin(angle2) + around[0],
+ radial[0] * Math.sin(angle2) + radial[1] * Math.cos(angle2) + around[1]
+ ];
+ });
+ }
+ function geoChooseEdge(nodes, point, projection2, activeID) {
+ var dist = geoVecLength;
+ var points = nodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ var ids = nodes.map(function(n2) {
+ return n2.id;
+ });
+ var min3 = Infinity;
+ var idx;
+ var loc;
+ for (var i2 = 0; i2 < points.length - 1; i2++) {
+ if (ids[i2] === activeID || ids[i2 + 1] === activeID)
+ continue;
+ var o = points[i2];
+ var s = geoVecSubtract(points[i2 + 1], o);
+ var v = geoVecSubtract(point, o);
+ var proj = geoVecDot(v, s) / geoVecDot(s, s);
+ var p;
+ if (proj < 0) {
+ p = o;
+ } else if (proj > 1) {
+ p = points[i2 + 1];
+ } else {
+ p = [o[0] + proj * s[0], o[1] + proj * s[1]];
+ }
+ var d = dist(p, point);
+ if (d < min3) {
+ min3 = d;
+ idx = i2 + 1;
+ loc = projection2.invert(p);
+ }
+ }
+ if (idx !== void 0) {
+ return { index: idx, distance: min3, loc };
+ } else {
+ return null;
+ }
+ }
+ function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
+ var actives = [];
+ var inactives = [];
+ var j2, k, n1, n2, segment;
+ for (j2 = 0; j2 < activeNodes.length - 1; j2++) {
+ n1 = activeNodes[j2];
+ n2 = activeNodes[j2 + 1];
+ segment = [n1.loc, n2.loc];
+ if (n1.id === activeID || n2.id === activeID) {
+ actives.push(segment);
+ }
+ }
+ for (j2 = 0; j2 < inactiveNodes.length - 1; j2++) {
+ n1 = inactiveNodes[j2];
+ n2 = inactiveNodes[j2 + 1];
+ segment = [n1.loc, n2.loc];
+ inactives.push(segment);
+ }
+ for (j2 = 0; j2 < actives.length; j2++) {
+ for (k = 0; k < inactives.length; k++) {
+ var p = actives[j2];
+ var q = inactives[k];
+ var hit = geoLineIntersection(p, q);
+ if (hit) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ function geoHasSelfIntersections(nodes, activeID) {
+ var actives = [];
+ var inactives = [];
+ var j2, k;
+ for (j2 = 0; j2 < nodes.length - 1; j2++) {
+ var n1 = nodes[j2];
+ var n2 = nodes[j2 + 1];
+ var segment = [n1.loc, n2.loc];
+ if (n1.id === activeID || n2.id === activeID) {
+ actives.push(segment);
+ } else {
+ inactives.push(segment);
+ }
+ }
+ for (j2 = 0; j2 < actives.length; j2++) {
+ for (k = 0; k < inactives.length; k++) {
+ var p = actives[j2];
+ var q = inactives[k];
+ if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) || geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1])) {
+ continue;
+ }
+ var hit = geoLineIntersection(p, q);
+ if (hit) {
+ var epsilon3 = 1e-8;
+ if (geoVecEqual(p[1], hit, epsilon3) || geoVecEqual(p[0], hit, epsilon3) || geoVecEqual(q[1], hit, epsilon3) || geoVecEqual(q[0], hit, epsilon3)) {
+ continue;
+ } else {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+ function geoLineIntersection(a, b) {
+ var p = [a[0][0], a[0][1]];
+ var p2 = [a[1][0], a[1][1]];
+ var q = [b[0][0], b[0][1]];
+ var q2 = [b[1][0], b[1][1]];
+ var r = geoVecSubtract(p2, p);
+ var s = geoVecSubtract(q2, q);
+ var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
+ var denominator = geoVecCross(r, s);
+ if (uNumerator && denominator) {
+ var u = uNumerator / denominator;
+ var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
+ if (t >= 0 && t <= 1 && u >= 0 && u <= 1) {
+ return geoVecInterp(p, p2, t);
+ }
+ }
+ return null;
+ }
+ function geoPathIntersections(path1, path2) {
+ var intersections = [];
+ for (var i2 = 0; i2 < path1.length - 1; i2++) {
+ for (var j2 = 0; j2 < path2.length - 1; j2++) {
+ var a = [path1[i2], path1[i2 + 1]];
+ var b = [path2[j2], path2[j2 + 1]];
+ var hit = geoLineIntersection(a, b);
+ if (hit) {
+ intersections.push(hit);
+ }
+ }
+ }
+ return intersections;
+ }
+ function geoPathHasIntersections(path1, path2) {
+ for (var i2 = 0; i2 < path1.length - 1; i2++) {
+ for (var j2 = 0; j2 < path2.length - 1; j2++) {
+ var a = [path1[i2], path1[i2 + 1]];
+ var b = [path2[j2], path2[j2 + 1]];
+ var hit = geoLineIntersection(a, b);
+ if (hit) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ function geoPointInPolygon(point, polygon2) {
+ var x = point[0];
+ var y = point[1];
+ var inside = false;
+ for (var i2 = 0, j2 = polygon2.length - 1; i2 < polygon2.length; j2 = i2++) {
+ var xi = polygon2[i2][0];
+ var yi = polygon2[i2][1];
+ var xj = polygon2[j2][0];
+ var yj = polygon2[j2][1];
+ var intersect2 = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
+ if (intersect2)
+ inside = !inside;
+ }
+ return inside;
+ }
+ function geoPolygonContainsPolygon(outer, inner) {
+ return inner.every(function(point) {
+ return geoPointInPolygon(point, outer);
+ });
+ }
+ function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
+ function testPoints(outer2, inner2) {
+ return inner2.some(function(point) {
+ return geoPointInPolygon(point, outer2);
+ });
+ }
+ return testPoints(outer, inner) || !!checkSegments && geoPathHasIntersections(outer, inner);
+ }
+ function geoGetSmallestSurroundingRectangle(points) {
+ var hull = hull_default(points);
+ var centroid = centroid_default2(hull);
+ var minArea = Infinity;
+ var ssrExtent = [];
+ var ssrAngle = 0;
+ var c1 = hull[0];
+ for (var i2 = 0; i2 <= hull.length - 1; i2++) {
+ var c2 = i2 === hull.length - 1 ? hull[0] : hull[i2 + 1];
+ var angle2 = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]);
+ var poly = geoRotate(hull, -angle2, centroid);
+ var extent = poly.reduce(function(extent2, point) {
+ return extent2.extend(geoExtent(point));
+ }, geoExtent());
+ var area = extent.area();
+ if (area < minArea) {
+ minArea = area;
+ ssrExtent = extent;
+ ssrAngle = angle2;
+ }
+ c1 = c2;
+ }
+ return {
+ poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
+ angle: ssrAngle
+ };
+ }
+ function geoPathLength(path) {
+ var length = 0;
+ for (var i2 = 0; i2 < path.length - 1; i2++) {
+ length += geoVecLength(path[i2], path[i2 + 1]);
+ }
+ return length;
+ }
+ function geoViewportEdge(point, dimensions) {
+ var pad2 = [80, 20, 50, 20];
+ var x = 0;
+ var y = 0;
+ if (point[0] > dimensions[0] - pad2[1]) {
+ x = -10;
+ }
+ if (point[0] < pad2[3]) {
+ x = 10;
+ }
+ if (point[1] > dimensions[1] - pad2[2]) {
+ y = -10;
+ }
+ if (point[1] < pad2[0]) {
+ y = 10;
+ }
+ if (x || y) {
+ return [x, y];
+ } else {
+ return null;
+ }
+ }
+
+ // node_modules/d3-dispatch/src/dispatch.js
+ var noop2 = { value: () => {
+ } };
+ function dispatch() {
+ for (var i2 = 0, n2 = arguments.length, _ = {}, t; i2 < n2; ++i2) {
+ if (!(t = arguments[i2] + "") || t in _ || /[\s.]/.test(t))
+ throw new Error("illegal type: " + t);
+ _[t] = [];
+ }
+ return new Dispatch(_);
+ }
+ function Dispatch(_) {
+ this._ = _;
+ }
+ function parseTypenames(typenames, types) {
+ return typenames.trim().split(/^|\s+/).map(function(t) {
+ var name2 = "", i2 = t.indexOf(".");
+ if (i2 >= 0)
+ name2 = t.slice(i2 + 1), t = t.slice(0, i2);
+ if (t && !types.hasOwnProperty(t))
+ throw new Error("unknown type: " + t);
+ return { type: t, name: name2 };
+ });
+ }
+ Dispatch.prototype = dispatch.prototype = {
+ constructor: Dispatch,
+ on: function(typename, callback) {
+ var _ = this._, T = parseTypenames(typename + "", _), t, i2 = -1, n2 = T.length;
+ if (arguments.length < 2) {
+ while (++i2 < n2)
+ if ((t = (typename = T[i2]).type) && (t = get(_[t], typename.name)))
+ return t;
+ return;
+ }
+ if (callback != null && typeof callback !== "function")
+ throw new Error("invalid callback: " + callback);
+ while (++i2 < n2) {
+ if (t = (typename = T[i2]).type)
+ _[t] = set(_[t], typename.name, callback);
+ else if (callback == null)
+ for (t in _)
+ _[t] = set(_[t], typename.name, null);
+ }
+ return this;
+ },
+ copy: function() {
+ var copy2 = {}, _ = this._;
+ for (var t in _)
+ copy2[t] = _[t].slice();
+ return new Dispatch(copy2);
+ },
+ call: function(type3, that) {
+ if ((n2 = arguments.length - 2) > 0)
+ for (var args = new Array(n2), i2 = 0, n2, t; i2 < n2; ++i2)
+ args[i2] = arguments[i2 + 2];
+ if (!this._.hasOwnProperty(type3))
+ throw new Error("unknown type: " + type3);
+ for (t = this._[type3], i2 = 0, n2 = t.length; i2 < n2; ++i2)
+ t[i2].value.apply(that, args);
+ },
+ apply: function(type3, that, args) {
+ if (!this._.hasOwnProperty(type3))
+ throw new Error("unknown type: " + type3);
+ for (var t = this._[type3], i2 = 0, n2 = t.length; i2 < n2; ++i2)
+ t[i2].value.apply(that, args);
+ }
+ };
+ function get(type3, name2) {
+ for (var i2 = 0, n2 = type3.length, c; i2 < n2; ++i2) {
+ if ((c = type3[i2]).name === name2) {
+ return c.value;
+ }
+ }
+ }
+ function set(type3, name2, callback) {
+ for (var i2 = 0, n2 = type3.length; i2 < n2; ++i2) {
+ if (type3[i2].name === name2) {
+ type3[i2] = noop2, type3 = type3.slice(0, i2).concat(type3.slice(i2 + 1));
+ break;
+ }
+ }
+ if (callback != null)
+ type3.push({ name: name2, value: callback });
+ return type3;
+ }
+ var dispatch_default = dispatch;
+
+ // node_modules/d3-selection/src/namespaces.js
+ var xhtml = "http://www.w3.org/1999/xhtml";
+ var namespaces_default = {
+ svg: "http://www.w3.org/2000/svg",
+ xhtml,
+ xlink: "http://www.w3.org/1999/xlink",
+ xml: "http://www.w3.org/XML/1998/namespace",
+ xmlns: "http://www.w3.org/2000/xmlns/"
+ };
+
+ // node_modules/d3-selection/src/namespace.js
+ function namespace_default(name2) {
+ var prefix = name2 += "", i2 = prefix.indexOf(":");
+ if (i2 >= 0 && (prefix = name2.slice(0, i2)) !== "xmlns")
+ name2 = name2.slice(i2 + 1);
+ return namespaces_default.hasOwnProperty(prefix) ? { space: namespaces_default[prefix], local: name2 } : name2;
+ }
+
+ // node_modules/d3-selection/src/creator.js
+ function creatorInherit(name2) {
+ return function() {
+ var document2 = this.ownerDocument, uri = this.namespaceURI;
+ return uri === xhtml && document2.documentElement.namespaceURI === xhtml ? document2.createElement(name2) : document2.createElementNS(uri, name2);
+ };
+ }
+ function creatorFixed(fullname) {
+ return function() {
+ return this.ownerDocument.createElementNS(fullname.space, fullname.local);
+ };
+ }
+ function creator_default(name2) {
+ var fullname = namespace_default(name2);
+ return (fullname.local ? creatorFixed : creatorInherit)(fullname);
+ }
+
+ // node_modules/d3-selection/src/selector.js
+ function none() {
+ }
+ function selector_default(selector) {
+ return selector == null ? none : function() {
+ return this.querySelector(selector);
+ };
+ }
+
+ // node_modules/d3-selection/src/selection/select.js
+ function select_default(select) {
+ if (typeof select !== "function")
+ select = selector_default(select);
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
+ for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = new Array(n2), node, subnode, i2 = 0; i2 < n2; ++i2) {
+ if ((node = group[i2]) && (subnode = select.call(node, node.__data__, i2, group))) {
+ if ("__data__" in node)
+ subnode.__data__ = node.__data__;
+ subgroup[i2] = subnode;
+ }
+ }
+ }
+ return new Selection(subgroups, this._parents);
+ }
+
+ // node_modules/d3-selection/src/array.js
+ function array(x) {
+ return x == null ? [] : Array.isArray(x) ? x : Array.from(x);
+ }
+
+ // node_modules/d3-selection/src/selectorAll.js
+ function empty() {
+ return [];
+ }
+ function selectorAll_default(selector) {
+ return selector == null ? empty : function() {
+ return this.querySelectorAll(selector);
+ };
+ }
+
+ // node_modules/d3-selection/src/selection/selectAll.js
+ function arrayAll(select) {
+ return function() {
+ return array(select.apply(this, arguments));
+ };
+ }
+ function selectAll_default(select) {
+ if (typeof select === "function")
+ select = arrayAll(select);
+ else
+ select = selectorAll_default(select);
+ for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j2 = 0; j2 < m; ++j2) {
+ for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) {
+ if (node = group[i2]) {
+ subgroups.push(select.call(node, node.__data__, i2, group));
+ parents.push(node);
+ }
+ }
+ }
+ return new Selection(subgroups, parents);
+ }
+
+ // node_modules/d3-selection/src/matcher.js
+ function matcher_default(selector) {
+ return function() {
+ return this.matches(selector);
+ };
+ }
+ function childMatcher(selector) {
+ return function(node) {
+ return node.matches(selector);
+ };
+ }
+
+ // node_modules/d3-selection/src/selection/selectChild.js
+ var find = Array.prototype.find;
+ function childFind(match) {
+ return function() {
+ return find.call(this.children, match);
+ };
+ }
+ function childFirst() {
+ return this.firstElementChild;
+ }
+ function selectChild_default(match) {
+ return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match)));
+ }
+
+ // node_modules/d3-selection/src/selection/selectChildren.js
+ var filter = Array.prototype.filter;
+ function children() {
+ return Array.from(this.children);
+ }
+ function childrenFilter(match) {
+ return function() {
+ return filter.call(this.children, match);
+ };
+ }
+ function selectChildren_default(match) {
+ return this.selectAll(match == null ? children : childrenFilter(typeof match === "function" ? match : childMatcher(match)));
+ }
+
+ // node_modules/d3-selection/src/selection/filter.js
+ function filter_default(match) {
+ if (typeof match !== "function")
+ match = matcher_default(match);
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
+ for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = [], node, i2 = 0; i2 < n2; ++i2) {
+ if ((node = group[i2]) && match.call(node, node.__data__, i2, group)) {
+ subgroup.push(node);
+ }
+ }
+ }
+ return new Selection(subgroups, this._parents);
+ }
+
+ // node_modules/d3-selection/src/selection/sparse.js
+ function sparse_default(update) {
+ return new Array(update.length);
+ }
+
+ // node_modules/d3-selection/src/selection/enter.js
+ function enter_default() {
+ return new Selection(this._enter || this._groups.map(sparse_default), this._parents);
+ }
+ function EnterNode(parent, datum2) {
+ this.ownerDocument = parent.ownerDocument;
+ this.namespaceURI = parent.namespaceURI;
+ this._next = null;
+ this._parent = parent;
+ this.__data__ = datum2;
+ }
+ EnterNode.prototype = {
+ constructor: EnterNode,
+ appendChild: function(child) {
+ return this._parent.insertBefore(child, this._next);
+ },
+ insertBefore: function(child, next) {
+ return this._parent.insertBefore(child, next);
+ },
+ querySelector: function(selector) {
+ return this._parent.querySelector(selector);
+ },
+ querySelectorAll: function(selector) {
+ return this._parent.querySelectorAll(selector);
+ }
+ };
+
+ // node_modules/d3-selection/src/constant.js
+ function constant_default(x) {
+ return function() {
+ return x;
+ };
+ }
+
+ // node_modules/d3-selection/src/selection/data.js
+ function bindIndex(parent, group, enter, update, exit, data) {
+ var i2 = 0, node, groupLength = group.length, dataLength = data.length;
+ for (; i2 < dataLength; ++i2) {
+ if (node = group[i2]) {
+ node.__data__ = data[i2];
+ update[i2] = node;
+ } else {
+ enter[i2] = new EnterNode(parent, data[i2]);
+ }
+ }
+ for (; i2 < groupLength; ++i2) {
+ if (node = group[i2]) {
+ exit[i2] = node;
+ }
+ }
+ }
+ function bindKey(parent, group, enter, update, exit, data, key) {
+ var i2, node, nodeByKeyValue = /* @__PURE__ */ new Map(), groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), keyValue;
+ for (i2 = 0; i2 < groupLength; ++i2) {
+ if (node = group[i2]) {
+ keyValues[i2] = keyValue = key.call(node, node.__data__, i2, group) + "";
+ if (nodeByKeyValue.has(keyValue)) {
+ exit[i2] = node;
+ } else {
+ nodeByKeyValue.set(keyValue, node);
+ }
+ }
+ }
+ for (i2 = 0; i2 < dataLength; ++i2) {
+ keyValue = key.call(parent, data[i2], i2, data) + "";
+ if (node = nodeByKeyValue.get(keyValue)) {
+ update[i2] = node;
+ node.__data__ = data[i2];
+ nodeByKeyValue.delete(keyValue);
+ } else {
+ enter[i2] = new EnterNode(parent, data[i2]);
+ }
+ }
+ for (i2 = 0; i2 < groupLength; ++i2) {
+ if ((node = group[i2]) && nodeByKeyValue.get(keyValues[i2]) === node) {
+ exit[i2] = node;
+ }
+ }
+ }
+ function datum(node) {
+ return node.__data__;
+ }
+ function data_default(value, key) {
+ if (!arguments.length)
+ return Array.from(this, datum);
+ var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups;
+ if (typeof value !== "function")
+ value = constant_default(value);
+ for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j2 = 0; j2 < m; ++j2) {
+ var parent = parents[j2], group = groups[j2], groupLength = group.length, data = arraylike(value.call(parent, parent && parent.__data__, j2, parents)), dataLength = data.length, enterGroup = enter[j2] = new Array(dataLength), updateGroup = update[j2] = new Array(dataLength), exitGroup = exit[j2] = new Array(groupLength);
+ bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
+ for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
+ if (previous = enterGroup[i0]) {
+ if (i0 >= i1)
+ i1 = i0 + 1;
+ while (!(next = updateGroup[i1]) && ++i1 < dataLength)
+ ;
+ previous._next = next || null;
+ }
+ }
+ }
+ update = new Selection(update, parents);
+ update._enter = enter;
+ update._exit = exit;
+ return update;
+ }
+ function arraylike(data) {
+ return typeof data === "object" && "length" in data ? data : Array.from(data);
+ }
+
+ // node_modules/d3-selection/src/selection/exit.js
+ function exit_default() {
+ return new Selection(this._exit || this._groups.map(sparse_default), this._parents);
+ }
+
+ // node_modules/d3-selection/src/selection/join.js
+ function join_default(onenter, onupdate, onexit) {
+ var enter = this.enter(), update = this, exit = this.exit();
+ if (typeof onenter === "function") {
+ enter = onenter(enter);
+ if (enter)
+ enter = enter.selection();
+ } else {
+ enter = enter.append(onenter + "");
+ }
+ if (onupdate != null) {
+ update = onupdate(update);
+ if (update)
+ update = update.selection();
+ }
+ if (onexit == null)
+ exit.remove();
+ else
+ onexit(exit);
+ return enter && update ? enter.merge(update).order() : update;
+ }
+
+ // node_modules/d3-selection/src/selection/merge.js
+ function merge_default(context) {
+ var selection2 = context.selection ? context.selection() : context;
+ for (var groups0 = this._groups, groups1 = selection2._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j2 = 0; j2 < m; ++j2) {
+ for (var group0 = groups0[j2], group1 = groups1[j2], n2 = group0.length, merge3 = merges[j2] = new Array(n2), node, i2 = 0; i2 < n2; ++i2) {
+ if (node = group0[i2] || group1[i2]) {
+ merge3[i2] = node;
+ }
+ }
+ }
+ for (; j2 < m0; ++j2) {
+ merges[j2] = groups0[j2];
+ }
+ return new Selection(merges, this._parents);
+ }
+
+ // node_modules/d3-selection/src/selection/order.js
+ function order_default() {
+ for (var groups = this._groups, j2 = -1, m = groups.length; ++j2 < m; ) {
+ for (var group = groups[j2], i2 = group.length - 1, next = group[i2], node; --i2 >= 0; ) {
+ if (node = group[i2]) {
+ if (next && node.compareDocumentPosition(next) ^ 4)
+ next.parentNode.insertBefore(node, next);
+ next = node;
+ }
+ }
+ }
+ return this;
+ }
+
+ // node_modules/d3-selection/src/selection/sort.js
+ function sort_default(compare) {
+ if (!compare)
+ compare = ascending2;
+ function compareNode(a, b) {
+ return a && b ? compare(a.__data__, b.__data__) : !a - !b;
+ }
+ for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
+ for (var group = groups[j2], n2 = group.length, sortgroup = sortgroups[j2] = new Array(n2), node, i2 = 0; i2 < n2; ++i2) {
+ if (node = group[i2]) {
+ sortgroup[i2] = node;
+ }
+ }
+ sortgroup.sort(compareNode);
+ }
+ return new Selection(sortgroups, this._parents).order();
+ }
+ function ascending2(a, b) {
+ return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+ }
+
+ // node_modules/d3-selection/src/selection/call.js
+ function call_default() {
+ var callback = arguments[0];
+ arguments[0] = this;
+ callback.apply(null, arguments);
+ return this;
+ }
+
+ // node_modules/d3-selection/src/selection/nodes.js
+ function nodes_default() {
+ return Array.from(this);
+ }
+
+ // node_modules/d3-selection/src/selection/node.js
+ function node_default() {
+ for (var groups = this._groups, j2 = 0, m = groups.length; j2 < m; ++j2) {
+ for (var group = groups[j2], i2 = 0, n2 = group.length; i2 < n2; ++i2) {
+ var node = group[i2];
+ if (node)
+ return node;
+ }
+ }
+ return null;
+ }
+
+ // node_modules/d3-selection/src/selection/size.js
+ function size_default() {
+ let size = 0;
+ for (const node of this)
+ ++size;
+ return size;
+ }
+
+ // node_modules/d3-selection/src/selection/empty.js
+ function empty_default() {
+ return !this.node();
+ }
+
+ // node_modules/d3-selection/src/selection/each.js
+ function each_default(callback) {
+ for (var groups = this._groups, j2 = 0, m = groups.length; j2 < m; ++j2) {
+ for (var group = groups[j2], i2 = 0, n2 = group.length, node; i2 < n2; ++i2) {
+ if (node = group[i2])
+ callback.call(node, node.__data__, i2, group);
+ }
+ }
+ return this;
+ }
+
+ // node_modules/d3-selection/src/selection/attr.js
+ function attrRemove(name2) {
+ return function() {
+ this.removeAttribute(name2);
+ };
+ }
+ function attrRemoveNS(fullname) {
+ return function() {
+ this.removeAttributeNS(fullname.space, fullname.local);
+ };
+ }
+ function attrConstant(name2, value) {
+ return function() {
+ this.setAttribute(name2, value);
+ };
+ }
+ function attrConstantNS(fullname, value) {
+ return function() {
+ this.setAttributeNS(fullname.space, fullname.local, value);
+ };
+ }
+ function attrFunction(name2, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null)
+ this.removeAttribute(name2);
+ else
+ this.setAttribute(name2, v);
+ };
+ }
+ function attrFunctionNS(fullname, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null)
+ this.removeAttributeNS(fullname.space, fullname.local);
+ else
+ this.setAttributeNS(fullname.space, fullname.local, v);
+ };
+ }
+ function attr_default(name2, value) {
+ var fullname = namespace_default(name2);
+ if (arguments.length < 2) {
+ var node = this.node();
+ return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname);
+ }
+ return this.each((value == null ? fullname.local ? attrRemoveNS : attrRemove : typeof value === "function" ? fullname.local ? attrFunctionNS : attrFunction : fullname.local ? attrConstantNS : attrConstant)(fullname, value));
+ }
+
+ // node_modules/d3-selection/src/window.js
+ function window_default(node) {
+ return node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView;
+ }
+
+ // node_modules/d3-selection/src/selection/style.js
+ function styleRemove(name2) {
+ return function() {
+ this.style.removeProperty(name2);
+ };
+ }
+ function styleConstant(name2, value, priority) {
+ return function() {
+ this.style.setProperty(name2, value, priority);
+ };
+ }
+ function styleFunction(name2, value, priority) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null)
+ this.style.removeProperty(name2);
+ else
+ this.style.setProperty(name2, v, priority);
+ };
+ }
+ function style_default(name2, value, priority) {
+ return arguments.length > 1 ? this.each((value == null ? styleRemove : typeof value === "function" ? styleFunction : styleConstant)(name2, value, priority == null ? "" : priority)) : styleValue(this.node(), name2);
+ }
+ function styleValue(node, name2) {
+ return node.style.getPropertyValue(name2) || window_default(node).getComputedStyle(node, null).getPropertyValue(name2);
+ }
+
+ // node_modules/d3-selection/src/selection/property.js
+ function propertyRemove(name2) {
+ return function() {
+ delete this[name2];
+ };
+ }
+ function propertyConstant(name2, value) {
+ return function() {
+ this[name2] = value;
+ };
+ }
+ function propertyFunction(name2, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null)
+ delete this[name2];
+ else
+ this[name2] = v;
+ };
+ }
+ function property_default(name2, value) {
+ return arguments.length > 1 ? this.each((value == null ? propertyRemove : typeof value === "function" ? propertyFunction : propertyConstant)(name2, value)) : this.node()[name2];
+ }
+
+ // node_modules/d3-selection/src/selection/classed.js
+ function classArray(string) {
+ return string.trim().split(/^|\s+/);
+ }
+ function classList(node) {
+ return node.classList || new ClassList(node);
+ }
+ function ClassList(node) {
+ this._node = node;
+ this._names = classArray(node.getAttribute("class") || "");
+ }
+ ClassList.prototype = {
+ add: function(name2) {
+ var i2 = this._names.indexOf(name2);
+ if (i2 < 0) {
+ this._names.push(name2);
+ this._node.setAttribute("class", this._names.join(" "));
+ }
+ },
+ remove: function(name2) {
+ var i2 = this._names.indexOf(name2);
+ if (i2 >= 0) {
+ this._names.splice(i2, 1);
+ this._node.setAttribute("class", this._names.join(" "));
+ }
+ },
+ contains: function(name2) {
+ return this._names.indexOf(name2) >= 0;
+ }
+ };
+ function classedAdd(node, names) {
+ var list = classList(node), i2 = -1, n2 = names.length;
+ while (++i2 < n2)
+ list.add(names[i2]);
+ }
+ function classedRemove(node, names) {
+ var list = classList(node), i2 = -1, n2 = names.length;
+ while (++i2 < n2)
+ list.remove(names[i2]);
+ }
+ function classedTrue(names) {
+ return function() {
+ classedAdd(this, names);
+ };
+ }
+ function classedFalse(names) {
+ return function() {
+ classedRemove(this, names);
+ };
+ }
+ function classedFunction(names, value) {
+ return function() {
+ (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
+ };
+ }
+ function classed_default(name2, value) {
+ var names = classArray(name2 + "");
+ if (arguments.length < 2) {
+ var list = classList(this.node()), i2 = -1, n2 = names.length;
+ while (++i2 < n2)
+ if (!list.contains(names[i2]))
+ return false;
+ return true;
+ }
+ return this.each((typeof value === "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value));
+ }
+
+ // node_modules/d3-selection/src/selection/text.js
+ function textRemove() {
+ this.textContent = "";
+ }
+ function textConstant(value) {
+ return function() {
+ this.textContent = value;
+ };
+ }
+ function textFunction(value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ this.textContent = v == null ? "" : v;
+ };
+ }
+ function text_default(value) {
+ return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction : textConstant)(value)) : this.node().textContent;
+ }
+
+ // node_modules/d3-selection/src/selection/html.js
+ function htmlRemove() {
+ this.innerHTML = "";
+ }
+ function htmlConstant(value) {
+ return function() {
+ this.innerHTML = value;
+ };
+ }
+ function htmlFunction(value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ this.innerHTML = v == null ? "" : v;
+ };
+ }
+ function html_default(value) {
+ return arguments.length ? this.each(value == null ? htmlRemove : (typeof value === "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML;
+ }
+
+ // node_modules/d3-selection/src/selection/raise.js
+ function raise() {
+ if (this.nextSibling)
+ this.parentNode.appendChild(this);
+ }
+ function raise_default() {
+ return this.each(raise);
+ }
+
+ // node_modules/d3-selection/src/selection/lower.js
+ function lower() {
+ if (this.previousSibling)
+ this.parentNode.insertBefore(this, this.parentNode.firstChild);
+ }
+ function lower_default() {
+ return this.each(lower);
+ }
+
+ // node_modules/d3-selection/src/selection/append.js
+ function append_default(name2) {
+ var create2 = typeof name2 === "function" ? name2 : creator_default(name2);
+ return this.select(function() {
+ return this.appendChild(create2.apply(this, arguments));
+ });
+ }
+
+ // node_modules/d3-selection/src/selection/insert.js
+ function constantNull() {
+ return null;
+ }
+ function insert_default(name2, before) {
+ var create2 = typeof name2 === "function" ? name2 : creator_default(name2), select = before == null ? constantNull : typeof before === "function" ? before : selector_default(before);
+ return this.select(function() {
+ return this.insertBefore(create2.apply(this, arguments), select.apply(this, arguments) || null);
+ });
+ }
+
+ // node_modules/d3-selection/src/selection/remove.js
+ function remove() {
+ var parent = this.parentNode;
+ if (parent)
+ parent.removeChild(this);
+ }
+ function remove_default() {
+ return this.each(remove);
+ }
+
+ // node_modules/d3-selection/src/selection/clone.js
+ function selection_cloneShallow() {
+ var clone = this.cloneNode(false), parent = this.parentNode;
+ return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
+ }
+ function selection_cloneDeep() {
+ var clone = this.cloneNode(true), parent = this.parentNode;
+ return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
+ }
+ function clone_default(deep) {
+ return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
+ }
+
+ // node_modules/d3-selection/src/selection/datum.js
+ function datum_default(value) {
+ return arguments.length ? this.property("__data__", value) : this.node().__data__;
+ }
+
+ // node_modules/d3-selection/src/selection/on.js
+ function contextListener(listener) {
+ return function(event) {
+ listener.call(this, event, this.__data__);
+ };
+ }
+ function parseTypenames2(typenames) {
+ return typenames.trim().split(/^|\s+/).map(function(t) {
+ var name2 = "", i2 = t.indexOf(".");
+ if (i2 >= 0)
+ name2 = t.slice(i2 + 1), t = t.slice(0, i2);
+ return { type: t, name: name2 };
+ });
+ }
+ function onRemove(typename) {
+ return function() {
+ var on = this.__on;
+ if (!on)
+ return;
+ for (var j2 = 0, i2 = -1, m = on.length, o; j2 < m; ++j2) {
+ if (o = on[j2], (!typename.type || o.type === typename.type) && o.name === typename.name) {
+ this.removeEventListener(o.type, o.listener, o.options);
+ } else {
+ on[++i2] = o;
+ }
+ }
+ if (++i2)
+ on.length = i2;
+ else
+ delete this.__on;
+ };
+ }
+ function onAdd(typename, value, options2) {
+ return function() {
+ var on = this.__on, o, listener = contextListener(value);
+ if (on)
+ for (var j2 = 0, m = on.length; j2 < m; ++j2) {
+ if ((o = on[j2]).type === typename.type && o.name === typename.name) {
+ this.removeEventListener(o.type, o.listener, o.options);
+ this.addEventListener(o.type, o.listener = listener, o.options = options2);
+ o.value = value;
+ return;
+ }
+ }
+ this.addEventListener(typename.type, listener, options2);
+ o = { type: typename.type, name: typename.name, value, listener, options: options2 };
+ if (!on)
+ this.__on = [o];
+ else
+ on.push(o);
+ };
+ }
+ function on_default(typename, value, options2) {
+ var typenames = parseTypenames2(typename + ""), i2, n2 = typenames.length, t;
+ if (arguments.length < 2) {
+ var on = this.node().__on;
+ if (on)
+ for (var j2 = 0, m = on.length, o; j2 < m; ++j2) {
+ for (i2 = 0, o = on[j2]; i2 < n2; ++i2) {
+ if ((t = typenames[i2]).type === o.type && t.name === o.name) {
+ return o.value;
+ }
+ }
+ }
+ return;
+ }
+ on = value ? onAdd : onRemove;
+ for (i2 = 0; i2 < n2; ++i2)
+ this.each(on(typenames[i2], value, options2));
+ return this;
+ }
+
+ // node_modules/d3-selection/src/selection/dispatch.js
+ function dispatchEvent(node, type3, params) {
+ var window2 = window_default(node), event = window2.CustomEvent;
+ if (typeof event === "function") {
+ event = new event(type3, params);
+ } else {
+ event = window2.document.createEvent("Event");
+ if (params)
+ event.initEvent(type3, params.bubbles, params.cancelable), event.detail = params.detail;
+ else
+ event.initEvent(type3, false, false);
+ }
+ node.dispatchEvent(event);
+ }
+ function dispatchConstant(type3, params) {
+ return function() {
+ return dispatchEvent(this, type3, params);
+ };
+ }
+ function dispatchFunction(type3, params) {
+ return function() {
+ return dispatchEvent(this, type3, params.apply(this, arguments));
+ };
+ }
+ function dispatch_default2(type3, params) {
+ return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type3, params));
+ }
+
+ // node_modules/d3-selection/src/selection/iterator.js
+ function* iterator_default() {
+ for (var groups = this._groups, j2 = 0, m = groups.length; j2 < m; ++j2) {
+ for (var group = groups[j2], i2 = 0, n2 = group.length, node; i2 < n2; ++i2) {
+ if (node = group[i2])
+ yield node;
+ }
+ }
+ }
+
+ // node_modules/d3-selection/src/selection/index.js
+ var root = [null];
+ function Selection(groups, parents) {
+ this._groups = groups;
+ this._parents = parents;
+ }
+ function selection() {
+ return new Selection([[document.documentElement]], root);
+ }
+ function selection_selection() {
+ return this;
+ }
+ Selection.prototype = selection.prototype = {
+ constructor: Selection,
+ select: select_default,
+ selectAll: selectAll_default,
+ selectChild: selectChild_default,
+ selectChildren: selectChildren_default,
+ filter: filter_default,
+ data: data_default,
+ enter: enter_default,
+ exit: exit_default,
+ join: join_default,
+ merge: merge_default,
+ selection: selection_selection,
+ order: order_default,
+ sort: sort_default,
+ call: call_default,
+ nodes: nodes_default,
+ node: node_default,
+ size: size_default,
+ empty: empty_default,
+ each: each_default,
+ attr: attr_default,
+ style: style_default,
+ property: property_default,
+ classed: classed_default,
+ text: text_default,
+ html: html_default,
+ raise: raise_default,
+ lower: lower_default,
+ append: append_default,
+ insert: insert_default,
+ remove: remove_default,
+ clone: clone_default,
+ datum: datum_default,
+ on: on_default,
+ dispatch: dispatch_default2,
+ [Symbol.iterator]: iterator_default
+ };
+ var selection_default = selection;
+
+ // node_modules/d3-selection/src/select.js
+ function select_default2(selector) {
+ return typeof selector === "string" ? new Selection([[document.querySelector(selector)]], [document.documentElement]) : new Selection([[selector]], root);
+ }
+
+ // node_modules/d3-selection/src/sourceEvent.js
+ function sourceEvent_default(event) {
+ let sourceEvent;
+ while (sourceEvent = event.sourceEvent)
+ event = sourceEvent;
+ return event;
+ }
+
+ // node_modules/d3-selection/src/pointer.js
+ function pointer_default(event, node) {
+ event = sourceEvent_default(event);
+ if (node === void 0)
+ node = event.currentTarget;
+ if (node) {
+ var svg2 = node.ownerSVGElement || node;
+ if (svg2.createSVGPoint) {
+ var point = svg2.createSVGPoint();
+ point.x = event.clientX, point.y = event.clientY;
+ point = point.matrixTransform(node.getScreenCTM().inverse());
+ return [point.x, point.y];
+ }
+ if (node.getBoundingClientRect) {
+ var rect = node.getBoundingClientRect();
+ return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
+ }
+ }
+ return [event.pageX, event.pageY];
+ }
+
+ // node_modules/d3-selection/src/selectAll.js
+ function selectAll_default2(selector) {
+ return typeof selector === "string" ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) : new Selection([array(selector)], root);
+ }
+
+ // node_modules/d3-drag/src/noevent.js
+ var nonpassive = { passive: false };
+ var nonpassivecapture = { capture: true, passive: false };
+ function nopropagation(event) {
+ event.stopImmediatePropagation();
+ }
+ function noevent_default(event) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ }
+
+ // node_modules/d3-drag/src/nodrag.js
+ function nodrag_default(view) {
+ var root3 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", noevent_default, nonpassivecapture);
+ if ("onselectstart" in root3) {
+ selection2.on("selectstart.drag", noevent_default, nonpassivecapture);
+ } else {
+ root3.__noselect = root3.style.MozUserSelect;
+ root3.style.MozUserSelect = "none";
+ }
+ }
+ function yesdrag(view, noclick) {
+ var root3 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", null);
+ if (noclick) {
+ selection2.on("click.drag", noevent_default, nonpassivecapture);
+ setTimeout(function() {
+ selection2.on("click.drag", null);
+ }, 0);
+ }
+ if ("onselectstart" in root3) {
+ selection2.on("selectstart.drag", null);
+ } else {
+ root3.style.MozUserSelect = root3.__noselect;
+ delete root3.__noselect;
+ }
+ }
+
+ // node_modules/d3-drag/src/constant.js
+ var constant_default2 = (x) => () => x;
+
+ // node_modules/d3-drag/src/event.js
+ function DragEvent(type3, {
+ sourceEvent,
+ subject,
+ target,
+ identifier,
+ active,
+ x,
+ y,
+ dx,
+ dy,
+ dispatch: dispatch10
+ }) {
+ Object.defineProperties(this, {
+ type: { value: type3, enumerable: true, configurable: true },
+ sourceEvent: { value: sourceEvent, enumerable: true, configurable: true },
+ subject: { value: subject, enumerable: true, configurable: true },
+ target: { value: target, enumerable: true, configurable: true },
+ identifier: { value: identifier, enumerable: true, configurable: true },
+ active: { value: active, enumerable: true, configurable: true },
+ x: { value: x, enumerable: true, configurable: true },
+ y: { value: y, enumerable: true, configurable: true },
+ dx: { value: dx, enumerable: true, configurable: true },
+ dy: { value: dy, enumerable: true, configurable: true },
+ _: { value: dispatch10 }
+ });
+ }
+ DragEvent.prototype.on = function() {
+ var value = this._.on.apply(this._, arguments);
+ return value === this._ ? this : value;
+ };
+
+ // node_modules/d3-drag/src/drag.js
+ function defaultFilter(event) {
+ return !event.ctrlKey && !event.button;
+ }
+ function defaultContainer() {
+ return this.parentNode;
+ }
+ function defaultSubject(event, d) {
+ return d == null ? { x: event.x, y: event.y } : d;
+ }
+ function defaultTouchable() {
+ return navigator.maxTouchPoints || "ontouchstart" in this;
+ }
+ function drag_default() {
+ var filter2 = defaultFilter, container = defaultContainer, subject = defaultSubject, touchable = defaultTouchable, gestures = {}, listeners = dispatch_default("start", "drag", "end"), active = 0, mousedownx, mousedowny, mousemoving, touchending, clickDistance2 = 0;
+ function drag(selection2) {
+ selection2.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved, nonpassive).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
+ }
+ function mousedowned(event, d) {
+ if (touchending || !filter2.call(this, event, d))
+ return;
+ var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse");
+ if (!gesture)
+ return;
+ select_default2(event.view).on("mousemove.drag", mousemoved, nonpassivecapture).on("mouseup.drag", mouseupped, nonpassivecapture);
+ nodrag_default(event.view);
+ nopropagation(event);
+ mousemoving = false;
+ mousedownx = event.clientX;
+ mousedowny = event.clientY;
+ gesture("start", event);
+ }
+ function mousemoved(event) {
+ noevent_default(event);
+ if (!mousemoving) {
+ var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
+ mousemoving = dx * dx + dy * dy > clickDistance2;
+ }
+ gestures.mouse("drag", event);
+ }
+ function mouseupped(event) {
+ select_default2(event.view).on("mousemove.drag mouseup.drag", null);
+ yesdrag(event.view, mousemoving);
+ noevent_default(event);
+ gestures.mouse("end", event);
+ }
+ function touchstarted(event, d) {
+ if (!filter2.call(this, event, d))
+ return;
+ var touches = event.changedTouches, c = container.call(this, event, d), n2 = touches.length, i2, gesture;
+ for (i2 = 0; i2 < n2; ++i2) {
+ if (gesture = beforestart(this, c, event, d, touches[i2].identifier, touches[i2])) {
+ nopropagation(event);
+ gesture("start", event, touches[i2]);
+ }
+ }
+ }
+ function touchmoved(event) {
+ var touches = event.changedTouches, n2 = touches.length, i2, gesture;
+ for (i2 = 0; i2 < n2; ++i2) {
+ if (gesture = gestures[touches[i2].identifier]) {
+ noevent_default(event);
+ gesture("drag", event, touches[i2]);
+ }
+ }
+ }
+ function touchended(event) {
+ var touches = event.changedTouches, n2 = touches.length, i2, gesture;
+ if (touchending)
+ clearTimeout(touchending);
+ touchending = setTimeout(function() {
+ touchending = null;
+ }, 500);
+ for (i2 = 0; i2 < n2; ++i2) {
+ if (gesture = gestures[touches[i2].identifier]) {
+ nopropagation(event);
+ gesture("end", event, touches[i2]);
+ }
+ }
+ }
+ function beforestart(that, container2, event, d, identifier, touch) {
+ var dispatch10 = listeners.copy(), p = pointer_default(touch || event, container2), dx, dy, s;
+ if ((s = subject.call(that, new DragEvent("beforestart", {
+ sourceEvent: event,
+ target: drag,
+ identifier,
+ active,
+ x: p[0],
+ y: p[1],
+ dx: 0,
+ dy: 0,
+ dispatch: dispatch10
+ }), d)) == null)
+ return;
+ dx = s.x - p[0] || 0;
+ dy = s.y - p[1] || 0;
+ return function gesture(type3, event2, touch2) {
+ var p02 = p, n2;
+ switch (type3) {
+ case "start":
+ gestures[identifier] = gesture, n2 = active++;
+ break;
+ case "end":
+ delete gestures[identifier], --active;
+ case "drag":
+ p = pointer_default(touch2 || event2, container2), n2 = active;
+ break;
+ }
+ dispatch10.call(type3, that, new DragEvent(type3, {
+ sourceEvent: event2,
+ subject: s,
+ target: drag,
+ identifier,
+ active: n2,
+ x: p[0] + dx,
+ y: p[1] + dy,
+ dx: p[0] - p02[0],
+ dy: p[1] - p02[1],
+ dispatch: dispatch10
+ }), d);
+ };
+ }
+ drag.filter = function(_) {
+ return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default2(!!_), drag) : filter2;
+ };
+ drag.container = function(_) {
+ return arguments.length ? (container = typeof _ === "function" ? _ : constant_default2(_), drag) : container;
+ };
+ drag.subject = function(_) {
+ return arguments.length ? (subject = typeof _ === "function" ? _ : constant_default2(_), drag) : subject;
+ };
+ drag.touchable = function(_) {
+ return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default2(!!_), drag) : touchable;
+ };
+ drag.on = function() {
+ var value = listeners.on.apply(listeners, arguments);
+ return value === listeners ? drag : value;
+ };
+ drag.clickDistance = function(_) {
+ return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
+ };
+ return drag;
+ }
+
+ // node_modules/d3-color/src/define.js
+ function define_default(constructor, factory, prototype) {
+ constructor.prototype = factory.prototype = prototype;
+ prototype.constructor = constructor;
+ }
+ function extend(parent, definition) {
+ var prototype = Object.create(parent.prototype);
+ for (var key in definition)
+ prototype[key] = definition[key];
+ return prototype;
+ }
+
+ // node_modules/d3-color/src/color.js
+ function Color() {
+ }
+ var darker = 0.7;
+ var brighter = 1 / darker;
+ var reI = "\\s*([+-]?\\d+)\\s*";
+ var reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*";
+ var reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*";
+ var reHex = /^#([0-9a-f]{3,8})$/;
+ var reRgbInteger = new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`);
+ var reRgbPercent = new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`);
+ var reRgbaInteger = new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`);
+ var reRgbaPercent = new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`);
+ var reHslPercent = new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`);
+ var reHslaPercent = new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`);
+ var named = {
+ aliceblue: 15792383,
+ antiquewhite: 16444375,
+ aqua: 65535,
+ aquamarine: 8388564,
+ azure: 15794175,
+ beige: 16119260,
+ bisque: 16770244,
+ black: 0,
+ blanchedalmond: 16772045,
+ blue: 255,
+ blueviolet: 9055202,
+ brown: 10824234,
+ burlywood: 14596231,
+ cadetblue: 6266528,
+ chartreuse: 8388352,
+ chocolate: 13789470,
+ coral: 16744272,
+ cornflowerblue: 6591981,
+ cornsilk: 16775388,
+ crimson: 14423100,
+ cyan: 65535,
+ darkblue: 139,
+ darkcyan: 35723,
+ darkgoldenrod: 12092939,
+ darkgray: 11119017,
+ darkgreen: 25600,
+ darkgrey: 11119017,
+ darkkhaki: 12433259,
+ darkmagenta: 9109643,
+ darkolivegreen: 5597999,
+ darkorange: 16747520,
+ darkorchid: 10040012,
+ darkred: 9109504,
+ darksalmon: 15308410,
+ darkseagreen: 9419919,
+ darkslateblue: 4734347,
+ darkslategray: 3100495,
+ darkslategrey: 3100495,
+ darkturquoise: 52945,
+ darkviolet: 9699539,
+ deeppink: 16716947,
+ deepskyblue: 49151,
+ dimgray: 6908265,
+ dimgrey: 6908265,
+ dodgerblue: 2003199,
+ firebrick: 11674146,
+ floralwhite: 16775920,
+ forestgreen: 2263842,
+ fuchsia: 16711935,
+ gainsboro: 14474460,
+ ghostwhite: 16316671,
+ gold: 16766720,
+ goldenrod: 14329120,
+ gray: 8421504,
+ green: 32768,
+ greenyellow: 11403055,
+ grey: 8421504,
+ honeydew: 15794160,
+ hotpink: 16738740,
+ indianred: 13458524,
+ indigo: 4915330,
+ ivory: 16777200,
+ khaki: 15787660,
+ lavender: 15132410,
+ lavenderblush: 16773365,
+ lawngreen: 8190976,
+ lemonchiffon: 16775885,
+ lightblue: 11393254,
+ lightcoral: 15761536,
+ lightcyan: 14745599,
+ lightgoldenrodyellow: 16448210,
+ lightgray: 13882323,
+ lightgreen: 9498256,
+ lightgrey: 13882323,
+ lightpink: 16758465,
+ lightsalmon: 16752762,
+ lightseagreen: 2142890,
+ lightskyblue: 8900346,
+ lightslategray: 7833753,
+ lightslategrey: 7833753,
+ lightsteelblue: 11584734,
+ lightyellow: 16777184,
+ lime: 65280,
+ limegreen: 3329330,
+ linen: 16445670,
+ magenta: 16711935,
+ maroon: 8388608,
+ mediumaquamarine: 6737322,
+ mediumblue: 205,
+ mediumorchid: 12211667,
+ mediumpurple: 9662683,
+ mediumseagreen: 3978097,
+ mediumslateblue: 8087790,
+ mediumspringgreen: 64154,
+ mediumturquoise: 4772300,
+ mediumvioletred: 13047173,
+ midnightblue: 1644912,
+ mintcream: 16121850,
+ mistyrose: 16770273,
+ moccasin: 16770229,
+ navajowhite: 16768685,
+ navy: 128,
+ oldlace: 16643558,
+ olive: 8421376,
+ olivedrab: 7048739,
+ orange: 16753920,
+ orangered: 16729344,
+ orchid: 14315734,
+ palegoldenrod: 15657130,
+ palegreen: 10025880,
+ paleturquoise: 11529966,
+ palevioletred: 14381203,
+ papayawhip: 16773077,
+ peachpuff: 16767673,
+ peru: 13468991,
+ pink: 16761035,
+ plum: 14524637,
+ powderblue: 11591910,
+ purple: 8388736,
+ rebeccapurple: 6697881,
+ red: 16711680,
+ rosybrown: 12357519,
+ royalblue: 4286945,
+ saddlebrown: 9127187,
+ salmon: 16416882,
+ sandybrown: 16032864,
+ seagreen: 3050327,
+ seashell: 16774638,
+ sienna: 10506797,
+ silver: 12632256,
+ skyblue: 8900331,
+ slateblue: 6970061,
+ slategray: 7372944,
+ slategrey: 7372944,
+ snow: 16775930,
+ springgreen: 65407,
+ steelblue: 4620980,
+ tan: 13808780,
+ teal: 32896,
+ thistle: 14204888,
+ tomato: 16737095,
+ turquoise: 4251856,
+ violet: 15631086,
+ wheat: 16113331,
+ white: 16777215,
+ whitesmoke: 16119285,
+ yellow: 16776960,
+ yellowgreen: 10145074
+ };
+ define_default(Color, color, {
+ copy(channels) {
+ return Object.assign(new this.constructor(), this, channels);
+ },
+ displayable() {
+ return this.rgb().displayable();
+ },
+ hex: color_formatHex,
+ formatHex: color_formatHex,
+ formatHex8: color_formatHex8,
+ formatHsl: color_formatHsl,
+ formatRgb: color_formatRgb,
+ toString: color_formatRgb
+ });
+ function color_formatHex() {
+ return this.rgb().formatHex();
+ }
+ function color_formatHex8() {
+ return this.rgb().formatHex8();
+ }
+ function color_formatHsl() {
+ return hslConvert(this).formatHsl();
+ }
+ function color_formatRgb() {
+ return this.rgb().formatRgb();
+ }
+ function color(format2) {
+ var m, l;
+ format2 = (format2 + "").trim().toLowerCase();
+ return (m = reHex.exec(format2)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) : l === 3 ? new Rgb(m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | m & 240, (m & 15) << 4 | m & 15, 1) : l === 8 ? rgba(m >> 24 & 255, m >> 16 & 255, m >> 8 & 255, (m & 255) / 255) : l === 4 ? rgba(m >> 12 & 15 | m >> 8 & 240, m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | m & 240, ((m & 15) << 4 | m & 15) / 255) : null) : (m = reRgbInteger.exec(format2)) ? new Rgb(m[1], m[2], m[3], 1) : (m = reRgbPercent.exec(format2)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) : (m = reRgbaInteger.exec(format2)) ? rgba(m[1], m[2], m[3], m[4]) : (m = reRgbaPercent.exec(format2)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) : (m = reHslPercent.exec(format2)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) : (m = reHslaPercent.exec(format2)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) : named.hasOwnProperty(format2) ? rgbn(named[format2]) : format2 === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null;
+ }
+ function rgbn(n2) {
+ return new Rgb(n2 >> 16 & 255, n2 >> 8 & 255, n2 & 255, 1);
+ }
+ function rgba(r, g, b, a) {
+ if (a <= 0)
+ r = g = b = NaN;
+ return new Rgb(r, g, b, a);
+ }
+ function rgbConvert(o) {
+ if (!(o instanceof Color))
+ o = color(o);
+ if (!o)
+ return new Rgb();
+ o = o.rgb();
+ return new Rgb(o.r, o.g, o.b, o.opacity);
+ }
+ function rgb(r, g, b, opacity) {
+ return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
+ }
+ function Rgb(r, g, b, opacity) {
+ this.r = +r;
+ this.g = +g;
+ this.b = +b;
+ this.opacity = +opacity;
+ }
+ define_default(Rgb, rgb, extend(Color, {
+ brighter(k) {
+ k = k == null ? brighter : Math.pow(brighter, k);
+ return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
+ },
+ darker(k) {
+ k = k == null ? darker : Math.pow(darker, k);
+ return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
+ },
+ rgb() {
+ return this;
+ },
+ clamp() {
+ return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));
+ },
+ displayable() {
+ return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1);
+ },
+ hex: rgb_formatHex,
+ formatHex: rgb_formatHex,
+ formatHex8: rgb_formatHex8,
+ formatRgb: rgb_formatRgb,
+ toString: rgb_formatRgb
+ }));
+ function rgb_formatHex() {
+ return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;
+ }
+ function rgb_formatHex8() {
+ return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;
+ }
+ function rgb_formatRgb() {
+ const a = clampa(this.opacity);
+ return `${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `, ${a})`}`;
+ }
+ function clampa(opacity) {
+ return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));
+ }
+ function clampi(value) {
+ return Math.max(0, Math.min(255, Math.round(value) || 0));
+ }
+ function hex(value) {
+ value = clampi(value);
+ return (value < 16 ? "0" : "") + value.toString(16);
+ }
+ function hsla(h, s, l, a) {
+ if (a <= 0)
+ h = s = l = NaN;
+ else if (l <= 0 || l >= 1)
+ h = s = NaN;
+ else if (s <= 0)
+ h = NaN;
+ return new Hsl(h, s, l, a);
+ }
+ function hslConvert(o) {
+ if (o instanceof Hsl)
+ return new Hsl(o.h, o.s, o.l, o.opacity);
+ if (!(o instanceof Color))
+ o = color(o);
+ if (!o)
+ return new Hsl();
+ if (o instanceof Hsl)
+ return o;
+ o = o.rgb();
+ var r = o.r / 255, g = o.g / 255, b = o.b / 255, min3 = Math.min(r, g, b), max3 = Math.max(r, g, b), h = NaN, s = max3 - min3, l = (max3 + min3) / 2;
+ if (s) {
+ if (r === max3)
+ h = (g - b) / s + (g < b) * 6;
+ else if (g === max3)
+ h = (b - r) / s + 2;
+ else
+ h = (r - g) / s + 4;
+ s /= l < 0.5 ? max3 + min3 : 2 - max3 - min3;
+ h *= 60;
+ } else {
+ s = l > 0 && l < 1 ? 0 : h;
+ }
+ return new Hsl(h, s, l, o.opacity);
+ }
+ function hsl(h, s, l, opacity) {
+ return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
+ }
+ function Hsl(h, s, l, opacity) {
+ this.h = +h;
+ this.s = +s;
+ this.l = +l;
+ this.opacity = +opacity;
+ }
+ define_default(Hsl, hsl, extend(Color, {
+ brighter(k) {
+ k = k == null ? brighter : Math.pow(brighter, k);
+ return new Hsl(this.h, this.s, this.l * k, this.opacity);
+ },
+ darker(k) {
+ k = k == null ? darker : Math.pow(darker, k);
+ return new Hsl(this.h, this.s, this.l * k, this.opacity);
+ },
+ rgb() {
+ var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;
+ return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);
+ },
+ clamp() {
+ return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));
+ },
+ displayable() {
+ return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1);
+ },
+ formatHsl() {
+ const a = clampa(this.opacity);
+ return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`;
+ }
+ }));
+ function clamph(value) {
+ value = (value || 0) % 360;
+ return value < 0 ? value + 360 : value;
+ }
+ function clampt(value) {
+ return Math.max(0, Math.min(1, value || 0));
+ }
+ function hsl2rgb(h, m1, m2) {
+ return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;
+ }
+
+ // node_modules/d3-interpolate/src/basis.js
+ function basis(t1, v0, v1, v2, v3) {
+ var t2 = t1 * t1, t3 = t2 * t1;
+ return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;
+ }
+ function basis_default(values) {
+ var n2 = values.length - 1;
+ return function(t) {
+ var i2 = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n2 - 1) : Math.floor(t * n2), v1 = values[i2], v2 = values[i2 + 1], v0 = i2 > 0 ? values[i2 - 1] : 2 * v1 - v2, v3 = i2 < n2 - 1 ? values[i2 + 2] : 2 * v2 - v1;
+ return basis((t - i2 / n2) * n2, v0, v1, v2, v3);
+ };
+ }
+
+ // node_modules/d3-interpolate/src/basisClosed.js
+ function basisClosed_default(values) {
+ var n2 = values.length;
+ return function(t) {
+ var i2 = Math.floor(((t %= 1) < 0 ? ++t : t) * n2), v0 = values[(i2 + n2 - 1) % n2], v1 = values[i2 % n2], v2 = values[(i2 + 1) % n2], v3 = values[(i2 + 2) % n2];
+ return basis((t - i2 / n2) * n2, v0, v1, v2, v3);
+ };
+ }
+
+ // node_modules/d3-interpolate/src/constant.js
+ var constant_default3 = (x) => () => x;
+
+ // node_modules/d3-interpolate/src/color.js
+ function linear(a, d) {
+ return function(t) {
+ return a + t * d;
+ };
+ }
+ function exponential(a, b, y) {
+ return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
+ return Math.pow(a + t * b, y);
+ };
+ }
+ function gamma(y) {
+ return (y = +y) === 1 ? nogamma : function(a, b) {
+ return b - a ? exponential(a, b, y) : constant_default3(isNaN(a) ? b : a);
+ };
+ }
+ function nogamma(a, b) {
+ var d = b - a;
+ return d ? linear(a, d) : constant_default3(isNaN(a) ? b : a);
+ }
+
+ // node_modules/d3-interpolate/src/rgb.js
+ var rgb_default = function rgbGamma(y) {
+ var color2 = gamma(y);
+ function rgb2(start2, end) {
+ var r = color2((start2 = rgb(start2)).r, (end = rgb(end)).r), g = color2(start2.g, end.g), b = color2(start2.b, end.b), opacity = nogamma(start2.opacity, end.opacity);
+ return function(t) {
+ start2.r = r(t);
+ start2.g = g(t);
+ start2.b = b(t);
+ start2.opacity = opacity(t);
+ return start2 + "";
+ };
+ }
+ rgb2.gamma = rgbGamma;
+ return rgb2;
+ }(1);
+ function rgbSpline(spline) {
+ return function(colors) {
+ var n2 = colors.length, r = new Array(n2), g = new Array(n2), b = new Array(n2), i2, color2;
+ for (i2 = 0; i2 < n2; ++i2) {
+ color2 = rgb(colors[i2]);
+ r[i2] = color2.r || 0;
+ g[i2] = color2.g || 0;
+ b[i2] = color2.b || 0;
+ }
+ r = spline(r);
+ g = spline(g);
+ b = spline(b);
+ color2.opacity = 1;
+ return function(t) {
+ color2.r = r(t);
+ color2.g = g(t);
+ color2.b = b(t);
+ return color2 + "";
+ };
+ };
+ }
+ var rgbBasis = rgbSpline(basis_default);
+ var rgbBasisClosed = rgbSpline(basisClosed_default);
+
+ // node_modules/d3-interpolate/src/numberArray.js
+ function numberArray_default(a, b) {
+ if (!b)
+ b = [];
+ var n2 = a ? Math.min(b.length, a.length) : 0, c = b.slice(), i2;
+ return function(t) {
+ for (i2 = 0; i2 < n2; ++i2)
+ c[i2] = a[i2] * (1 - t) + b[i2] * t;
+ return c;
+ };
+ }
+ function isNumberArray(x) {
+ return ArrayBuffer.isView(x) && !(x instanceof DataView);
+ }
+
+ // node_modules/d3-interpolate/src/array.js
+ function genericArray(a, b) {
+ var nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb), i2;
+ for (i2 = 0; i2 < na; ++i2)
+ x[i2] = value_default(a[i2], b[i2]);
+ for (; i2 < nb; ++i2)
+ c[i2] = b[i2];
+ return function(t) {
+ for (i2 = 0; i2 < na; ++i2)
+ c[i2] = x[i2](t);
+ return c;
+ };
+ }
+
+ // node_modules/d3-interpolate/src/date.js
+ function date_default(a, b) {
+ var d = new Date();
+ return a = +a, b = +b, function(t) {
+ return d.setTime(a * (1 - t) + b * t), d;
+ };
+ }
+
+ // node_modules/d3-interpolate/src/number.js
+ function number_default(a, b) {
+ return a = +a, b = +b, function(t) {
+ return a * (1 - t) + b * t;
+ };
+ }
+
+ // node_modules/d3-interpolate/src/object.js
+ function object_default(a, b) {
+ var i2 = {}, c = {}, k;
+ if (a === null || typeof a !== "object")
+ a = {};
+ if (b === null || typeof b !== "object")
+ b = {};
+ for (k in b) {
+ if (k in a) {
+ i2[k] = value_default(a[k], b[k]);
+ } else {
+ c[k] = b[k];
+ }
+ }
+ return function(t) {
+ for (k in i2)
+ c[k] = i2[k](t);
+ return c;
+ };
+ }
+
+ // node_modules/d3-interpolate/src/string.js
+ var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
+ var reB = new RegExp(reA.source, "g");
+ function zero2(b) {
+ return function() {
+ return b;
+ };
+ }
+ function one(b) {
+ return function(t) {
+ return b(t) + "";
+ };
+ }
+ function string_default(a, b) {
+ var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i2 = -1, s = [], q = [];
+ a = a + "", b = b + "";
+ while ((am = reA.exec(a)) && (bm = reB.exec(b))) {
+ if ((bs = bm.index) > bi) {
+ bs = b.slice(bi, bs);
+ if (s[i2])
+ s[i2] += bs;
+ else
+ s[++i2] = bs;
+ }
+ if ((am = am[0]) === (bm = bm[0])) {
+ if (s[i2])
+ s[i2] += bm;
+ else
+ s[++i2] = bm;
+ } else {
+ s[++i2] = null;
+ q.push({ i: i2, x: number_default(am, bm) });
+ }
+ bi = reB.lastIndex;
+ }
+ if (bi < b.length) {
+ bs = b.slice(bi);
+ if (s[i2])
+ s[i2] += bs;
+ else
+ s[++i2] = bs;
+ }
+ return s.length < 2 ? q[0] ? one(q[0].x) : zero2(b) : (b = q.length, function(t) {
+ for (var i3 = 0, o; i3 < b; ++i3)
+ s[(o = q[i3]).i] = o.x(t);
+ return s.join("");
+ });
+ }
+
+ // node_modules/d3-interpolate/src/value.js
+ function value_default(a, b) {
+ var t = typeof b, c;
+ return b == null || t === "boolean" ? constant_default3(b) : (t === "number" ? number_default : t === "string" ? (c = color(b)) ? (b = c, rgb_default) : string_default : b instanceof color ? rgb_default : b instanceof Date ? date_default : isNumberArray(b) ? numberArray_default : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object_default : number_default)(a, b);
+ }
+
+ // node_modules/d3-interpolate/src/round.js
+ function round_default(a, b) {
+ return a = +a, b = +b, function(t) {
+ return Math.round(a * (1 - t) + b * t);
+ };
+ }
+
+ // node_modules/d3-interpolate/src/transform/decompose.js
+ var degrees2 = 180 / Math.PI;
+ var identity = {
+ translateX: 0,
+ translateY: 0,
+ rotate: 0,
+ skewX: 0,
+ scaleX: 1,
+ scaleY: 1
+ };
+ function decompose_default(a, b, c, d, e, f2) {
+ var scaleX, scaleY, skewX;
+ if (scaleX = Math.sqrt(a * a + b * b))
+ a /= scaleX, b /= scaleX;
+ if (skewX = a * c + b * d)
+ c -= a * skewX, d -= b * skewX;
+ if (scaleY = Math.sqrt(c * c + d * d))
+ c /= scaleY, d /= scaleY, skewX /= scaleY;
+ if (a * d < b * c)
+ a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
+ return {
+ translateX: e,
+ translateY: f2,
+ rotate: Math.atan2(b, a) * degrees2,
+ skewX: Math.atan(skewX) * degrees2,
+ scaleX,
+ scaleY
+ };
+ }
+
+ // node_modules/d3-interpolate/src/transform/parse.js
+ var svgNode;
+ function parseCss(value) {
+ const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + "");
+ return m.isIdentity ? identity : decompose_default(m.a, m.b, m.c, m.d, m.e, m.f);
+ }
+ function parseSvg(value) {
+ if (value == null)
+ return identity;
+ if (!svgNode)
+ svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
+ svgNode.setAttribute("transform", value);
+ if (!(value = svgNode.transform.baseVal.consolidate()))
+ return identity;
+ value = value.matrix;
+ return decompose_default(value.a, value.b, value.c, value.d, value.e, value.f);
+ }
+
+ // node_modules/d3-interpolate/src/transform/index.js
+ function interpolateTransform(parse, pxComma, pxParen, degParen) {
+ function pop(s) {
+ return s.length ? s.pop() + " " : "";
+ }
+ function translate(xa, ya, xb, yb, s, q) {
+ if (xa !== xb || ya !== yb) {
+ var i2 = s.push("translate(", null, pxComma, null, pxParen);
+ q.push({ i: i2 - 4, x: number_default(xa, xb) }, { i: i2 - 2, x: number_default(ya, yb) });
+ } else if (xb || yb) {
+ s.push("translate(" + xb + pxComma + yb + pxParen);
+ }
+ }
+ function rotate(a, b, s, q) {
+ if (a !== b) {
+ if (a - b > 180)
+ b += 360;
+ else if (b - a > 180)
+ a += 360;
+ q.push({ i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number_default(a, b) });
+ } else if (b) {
+ s.push(pop(s) + "rotate(" + b + degParen);
+ }
+ }
+ function skewX(a, b, s, q) {
+ if (a !== b) {
+ q.push({ i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number_default(a, b) });
+ } else if (b) {
+ s.push(pop(s) + "skewX(" + b + degParen);
+ }
+ }
+ function scale(xa, ya, xb, yb, s, q) {
+ if (xa !== xb || ya !== yb) {
+ var i2 = s.push(pop(s) + "scale(", null, ",", null, ")");
+ q.push({ i: i2 - 4, x: number_default(xa, xb) }, { i: i2 - 2, x: number_default(ya, yb) });
+ } else if (xb !== 1 || yb !== 1) {
+ s.push(pop(s) + "scale(" + xb + "," + yb + ")");
+ }
+ }
+ return function(a, b) {
+ var s = [], q = [];
+ a = parse(a), b = parse(b);
+ translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
+ rotate(a.rotate, b.rotate, s, q);
+ skewX(a.skewX, b.skewX, s, q);
+ scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
+ a = b = null;
+ return function(t) {
+ var i2 = -1, n2 = q.length, o;
+ while (++i2 < n2)
+ s[(o = q[i2]).i] = o.x(t);
+ return s.join("");
+ };
+ };
+ }
+ var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
+ var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
+
+ // node_modules/d3-interpolate/src/zoom.js
+ var epsilon22 = 1e-12;
+ function cosh(x) {
+ return ((x = Math.exp(x)) + 1 / x) / 2;
+ }
+ function sinh(x) {
+ return ((x = Math.exp(x)) - 1 / x) / 2;
+ }
+ function tanh(x) {
+ return ((x = Math.exp(2 * x)) - 1) / (x + 1);
+ }
+ var zoom_default = function zoomRho(rho, rho2, rho4) {
+ function zoom(p02, p1) {
+ var ux0 = p02[0], uy0 = p02[1], w0 = p02[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i2, S;
+ if (d2 < epsilon22) {
+ S = Math.log(w1 / w0) / rho;
+ i2 = function(t) {
+ return [
+ ux0 + t * dx,
+ uy0 + t * dy,
+ w0 * Math.exp(rho * t * S)
+ ];
+ };
+ } else {
+ var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
+ S = (r1 - r0) / rho;
+ i2 = function(t) {
+ var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
+ return [
+ ux0 + u * dx,
+ uy0 + u * dy,
+ w0 * coshr0 / cosh(rho * s + r0)
+ ];
+ };
+ }
+ i2.duration = S * 1e3 * rho / Math.SQRT2;
+ return i2;
+ }
+ zoom.rho = function(_) {
+ var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;
+ return zoomRho(_1, _2, _4);
+ };
+ return zoom;
+ }(Math.SQRT2, 2, 4);
+
+ // node_modules/d3-interpolate/src/quantize.js
+ function quantize_default(interpolator, n2) {
+ var samples = new Array(n2);
+ for (var i2 = 0; i2 < n2; ++i2)
+ samples[i2] = interpolator(i2 / (n2 - 1));
+ return samples;
+ }
+
+ // node_modules/d3-timer/src/timer.js
+ var frame = 0;
+ var timeout = 0;
+ var interval = 0;
+ var pokeDelay = 1e3;
+ var taskHead;
+ var taskTail;
+ var clockLast = 0;
+ var clockNow = 0;
+ var clockSkew = 0;
+ var clock = typeof performance === "object" && performance.now ? performance : Date;
+ var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f2) {
+ setTimeout(f2, 17);
+ };
+ function now() {
+ return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
+ }
+ function clearNow() {
+ clockNow = 0;
+ }
+ function Timer() {
+ this._call = this._time = this._next = null;
+ }
+ Timer.prototype = timer.prototype = {
+ constructor: Timer,
+ restart: function(callback, delay, time) {
+ if (typeof callback !== "function")
+ throw new TypeError("callback is not a function");
+ time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
+ if (!this._next && taskTail !== this) {
+ if (taskTail)
+ taskTail._next = this;
+ else
+ taskHead = this;
+ taskTail = this;
+ }
+ this._call = callback;
+ this._time = time;
+ sleep();
+ },
+ stop: function() {
+ if (this._call) {
+ this._call = null;
+ this._time = Infinity;
+ sleep();
+ }
+ }
+ };
+ function timer(callback, delay, time) {
+ var t = new Timer();
+ t.restart(callback, delay, time);
+ return t;
+ }
+ function timerFlush() {
+ now();
+ ++frame;
+ var t = taskHead, e;
+ while (t) {
+ if ((e = clockNow - t._time) >= 0)
+ t._call.call(void 0, e);
+ t = t._next;
+ }
+ --frame;
+ }
+ function wake() {
+ clockNow = (clockLast = clock.now()) + clockSkew;
+ frame = timeout = 0;
+ try {
+ timerFlush();
+ } finally {
+ frame = 0;
+ nap();
+ clockNow = 0;
+ }
+ }
+ function poke() {
+ var now3 = clock.now(), delay = now3 - clockLast;
+ if (delay > pokeDelay)
+ clockSkew -= delay, clockLast = now3;
+ }
+ function nap() {
+ var t0, t1 = taskHead, t2, time = Infinity;
+ while (t1) {
+ if (t1._call) {
+ if (time > t1._time)
+ time = t1._time;
+ t0 = t1, t1 = t1._next;
+ } else {
+ t2 = t1._next, t1._next = null;
+ t1 = t0 ? t0._next = t2 : taskHead = t2;
+ }
+ }
+ taskTail = t0;
+ sleep(time);
+ }
+ function sleep(time) {
+ if (frame)
+ return;
+ if (timeout)
+ timeout = clearTimeout(timeout);
+ var delay = time - clockNow;
+ if (delay > 24) {
+ if (time < Infinity)
+ timeout = setTimeout(wake, time - clock.now() - clockSkew);
+ if (interval)
+ interval = clearInterval(interval);
+ } else {
+ if (!interval)
+ clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
+ frame = 1, setFrame(wake);
+ }
+ }
+
+ // node_modules/d3-timer/src/timeout.js
+ function timeout_default(callback, delay, time) {
+ var t = new Timer();
+ delay = delay == null ? 0 : +delay;
+ t.restart((elapsed) => {
+ t.stop();
+ callback(elapsed + delay);
+ }, delay, time);
+ return t;
+ }
+
+ // node_modules/d3-transition/src/transition/schedule.js
+ var emptyOn = dispatch_default("start", "end", "cancel", "interrupt");
+ var emptyTween = [];
+ var CREATED = 0;
+ var SCHEDULED = 1;
+ var STARTING = 2;
+ var STARTED = 3;
+ var RUNNING = 4;
+ var ENDING = 5;
+ var ENDED = 6;
+ function schedule_default(node, name2, id2, index, group, timing) {
+ var schedules = node.__transition;
+ if (!schedules)
+ node.__transition = {};
+ else if (id2 in schedules)
+ return;
+ create(node, id2, {
+ name: name2,
+ index,
+ group,
+ on: emptyOn,
+ tween: emptyTween,
+ time: timing.time,
+ delay: timing.delay,
+ duration: timing.duration,
+ ease: timing.ease,
+ timer: null,
+ state: CREATED
+ });
+ }
+ function init(node, id2) {
+ var schedule = get2(node, id2);
+ if (schedule.state > CREATED)
+ throw new Error("too late; already scheduled");
+ return schedule;
+ }
+ function set2(node, id2) {
+ var schedule = get2(node, id2);
+ if (schedule.state > STARTED)
+ throw new Error("too late; already running");
+ return schedule;
+ }
+ function get2(node, id2) {
+ var schedule = node.__transition;
+ if (!schedule || !(schedule = schedule[id2]))
+ throw new Error("transition not found");
+ return schedule;
+ }
+ function create(node, id2, self2) {
+ var schedules = node.__transition, tween;
+ schedules[id2] = self2;
+ self2.timer = timer(schedule, 0, self2.time);
+ function schedule(elapsed) {
+ self2.state = SCHEDULED;
+ self2.timer.restart(start2, self2.delay, self2.time);
+ if (self2.delay <= elapsed)
+ start2(elapsed - self2.delay);
+ }
+ function start2(elapsed) {
+ var i2, j2, n2, o;
+ if (self2.state !== SCHEDULED)
+ return stop();
+ for (i2 in schedules) {
+ o = schedules[i2];
+ if (o.name !== self2.name)
+ continue;
+ if (o.state === STARTED)
+ return timeout_default(start2);
+ if (o.state === RUNNING) {
+ o.state = ENDED;
+ o.timer.stop();
+ o.on.call("interrupt", node, node.__data__, o.index, o.group);
+ delete schedules[i2];
+ } else if (+i2 < id2) {
+ o.state = ENDED;
+ o.timer.stop();
+ o.on.call("cancel", node, node.__data__, o.index, o.group);
+ delete schedules[i2];
+ }
+ }
+ timeout_default(function() {
+ if (self2.state === STARTED) {
+ self2.state = RUNNING;
+ self2.timer.restart(tick, self2.delay, self2.time);
+ tick(elapsed);
+ }
+ });
+ self2.state = STARTING;
+ self2.on.call("start", node, node.__data__, self2.index, self2.group);
+ if (self2.state !== STARTING)
+ return;
+ self2.state = STARTED;
+ tween = new Array(n2 = self2.tween.length);
+ for (i2 = 0, j2 = -1; i2 < n2; ++i2) {
+ if (o = self2.tween[i2].value.call(node, node.__data__, self2.index, self2.group)) {
+ tween[++j2] = o;
+ }
+ }
+ tween.length = j2 + 1;
+ }
+ function tick(elapsed) {
+ var t = elapsed < self2.duration ? self2.ease.call(null, elapsed / self2.duration) : (self2.timer.restart(stop), self2.state = ENDING, 1), i2 = -1, n2 = tween.length;
+ while (++i2 < n2) {
+ tween[i2].call(node, t);
+ }
+ if (self2.state === ENDING) {
+ self2.on.call("end", node, node.__data__, self2.index, self2.group);
+ stop();
+ }
+ }
+ function stop() {
+ self2.state = ENDED;
+ self2.timer.stop();
+ delete schedules[id2];
+ for (var i2 in schedules)
+ return;
+ delete node.__transition;
+ }
+ }
+
+ // node_modules/d3-transition/src/interrupt.js
+ function interrupt_default(node, name2) {
+ var schedules = node.__transition, schedule, active, empty2 = true, i2;
+ if (!schedules)
+ return;
+ name2 = name2 == null ? null : name2 + "";
+ for (i2 in schedules) {
+ if ((schedule = schedules[i2]).name !== name2) {
+ empty2 = false;
+ continue;
+ }
+ active = schedule.state > STARTING && schedule.state < ENDING;
+ schedule.state = ENDED;
+ schedule.timer.stop();
+ schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
+ delete schedules[i2];
+ }
+ if (empty2)
+ delete node.__transition;
+ }
+
+ // node_modules/d3-transition/src/selection/interrupt.js
+ function interrupt_default2(name2) {
+ return this.each(function() {
+ interrupt_default(this, name2);
+ });
+ }
+
+ // node_modules/d3-transition/src/transition/tween.js
+ function tweenRemove(id2, name2) {
+ var tween0, tween1;
+ return function() {
+ var schedule = set2(this, id2), tween = schedule.tween;
+ if (tween !== tween0) {
+ tween1 = tween0 = tween;
+ for (var i2 = 0, n2 = tween1.length; i2 < n2; ++i2) {
+ if (tween1[i2].name === name2) {
+ tween1 = tween1.slice();
+ tween1.splice(i2, 1);
+ break;
+ }
+ }
+ }
+ schedule.tween = tween1;
+ };
+ }
+ function tweenFunction(id2, name2, value) {
+ var tween0, tween1;
+ if (typeof value !== "function")
+ throw new Error();
+ return function() {
+ var schedule = set2(this, id2), tween = schedule.tween;
+ if (tween !== tween0) {
+ tween1 = (tween0 = tween).slice();
+ for (var t = { name: name2, value }, i2 = 0, n2 = tween1.length; i2 < n2; ++i2) {
+ if (tween1[i2].name === name2) {
+ tween1[i2] = t;
+ break;
+ }
+ }
+ if (i2 === n2)
+ tween1.push(t);
+ }
+ schedule.tween = tween1;
+ };
+ }
+ function tween_default(name2, value) {
+ var id2 = this._id;
+ name2 += "";
+ if (arguments.length < 2) {
+ var tween = get2(this.node(), id2).tween;
+ for (var i2 = 0, n2 = tween.length, t; i2 < n2; ++i2) {
+ if ((t = tween[i2]).name === name2) {
+ return t.value;
+ }
+ }
+ return null;
+ }
+ return this.each((value == null ? tweenRemove : tweenFunction)(id2, name2, value));
+ }
+ function tweenValue(transition2, name2, value) {
+ var id2 = transition2._id;
+ transition2.each(function() {
+ var schedule = set2(this, id2);
+ (schedule.value || (schedule.value = {}))[name2] = value.apply(this, arguments);
+ });
+ return function(node) {
+ return get2(node, id2).value[name2];
+ };
+ }
+
+ // node_modules/d3-transition/src/transition/interpolate.js
+ function interpolate_default(a, b) {
+ var c;
+ return (typeof b === "number" ? number_default : b instanceof color ? rgb_default : (c = color(b)) ? (b = c, rgb_default) : string_default)(a, b);
+ }
+
+ // node_modules/d3-transition/src/transition/attr.js
+ function attrRemove2(name2) {
+ return function() {
+ this.removeAttribute(name2);
+ };
+ }
+ function attrRemoveNS2(fullname) {
+ return function() {
+ this.removeAttributeNS(fullname.space, fullname.local);
+ };
+ }
+ function attrConstant2(name2, interpolate, value1) {
+ var string00, string1 = value1 + "", interpolate0;
+ return function() {
+ var string0 = this.getAttribute(name2);
+ return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
+ };
+ }
+ function attrConstantNS2(fullname, interpolate, value1) {
+ var string00, string1 = value1 + "", interpolate0;
+ return function() {
+ var string0 = this.getAttributeNS(fullname.space, fullname.local);
+ return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
+ };
+ }
+ function attrFunction2(name2, interpolate, value) {
+ var string00, string10, interpolate0;
+ return function() {
+ var string0, value1 = value(this), string1;
+ if (value1 == null)
+ return void this.removeAttribute(name2);
+ string0 = this.getAttribute(name2);
+ string1 = value1 + "";
+ return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+ };
+ }
+ function attrFunctionNS2(fullname, interpolate, value) {
+ var string00, string10, interpolate0;
+ return function() {
+ var string0, value1 = value(this), string1;
+ if (value1 == null)
+ return void this.removeAttributeNS(fullname.space, fullname.local);
+ string0 = this.getAttributeNS(fullname.space, fullname.local);
+ string1 = value1 + "";
+ return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+ };
+ }
+ function attr_default2(name2, value) {
+ var fullname = namespace_default(name2), i2 = fullname === "transform" ? interpolateTransformSvg : interpolate_default;
+ return this.attrTween(name2, typeof value === "function" ? (fullname.local ? attrFunctionNS2 : attrFunction2)(fullname, i2, tweenValue(this, "attr." + name2, value)) : value == null ? (fullname.local ? attrRemoveNS2 : attrRemove2)(fullname) : (fullname.local ? attrConstantNS2 : attrConstant2)(fullname, i2, value));
+ }
+
+ // node_modules/d3-transition/src/transition/attrTween.js
+ function attrInterpolate(name2, i2) {
+ return function(t) {
+ this.setAttribute(name2, i2.call(this, t));
+ };
+ }
+ function attrInterpolateNS(fullname, i2) {
+ return function(t) {
+ this.setAttributeNS(fullname.space, fullname.local, i2.call(this, t));
+ };
+ }
+ function attrTweenNS(fullname, value) {
+ var t0, i0;
+ function tween() {
+ var i2 = value.apply(this, arguments);
+ if (i2 !== i0)
+ t0 = (i0 = i2) && attrInterpolateNS(fullname, i2);
+ return t0;
+ }
+ tween._value = value;
+ return tween;
+ }
+ function attrTween(name2, value) {
+ var t0, i0;
+ function tween() {
+ var i2 = value.apply(this, arguments);
+ if (i2 !== i0)
+ t0 = (i0 = i2) && attrInterpolate(name2, i2);
+ return t0;
+ }
+ tween._value = value;
+ return tween;
+ }
+ function attrTween_default(name2, value) {
+ var key = "attr." + name2;
+ if (arguments.length < 2)
+ return (key = this.tween(key)) && key._value;
+ if (value == null)
+ return this.tween(key, null);
+ if (typeof value !== "function")
+ throw new Error();
+ var fullname = namespace_default(name2);
+ return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
+ }
+
+ // node_modules/d3-transition/src/transition/delay.js
+ function delayFunction(id2, value) {
+ return function() {
+ init(this, id2).delay = +value.apply(this, arguments);
+ };
+ }
+ function delayConstant(id2, value) {
+ return value = +value, function() {
+ init(this, id2).delay = value;
+ };
+ }
+ function delay_default(value) {
+ var id2 = this._id;
+ return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id2, value)) : get2(this.node(), id2).delay;
+ }
+
+ // node_modules/d3-transition/src/transition/duration.js
+ function durationFunction(id2, value) {
+ return function() {
+ set2(this, id2).duration = +value.apply(this, arguments);
+ };
+ }
+ function durationConstant(id2, value) {
+ return value = +value, function() {
+ set2(this, id2).duration = value;
+ };
+ }
+ function duration_default(value) {
+ var id2 = this._id;
+ return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id2, value)) : get2(this.node(), id2).duration;
+ }
+
+ // node_modules/d3-transition/src/transition/ease.js
+ function easeConstant(id2, value) {
+ if (typeof value !== "function")
+ throw new Error();
+ return function() {
+ set2(this, id2).ease = value;
+ };
+ }
+ function ease_default(value) {
+ var id2 = this._id;
+ return arguments.length ? this.each(easeConstant(id2, value)) : get2(this.node(), id2).ease;
+ }
+
+ // node_modules/d3-transition/src/transition/easeVarying.js
+ function easeVarying(id2, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (typeof v !== "function")
+ throw new Error();
+ set2(this, id2).ease = v;
+ };
+ }
+ function easeVarying_default(value) {
+ if (typeof value !== "function")
+ throw new Error();
+ return this.each(easeVarying(this._id, value));
+ }
+
+ // node_modules/d3-transition/src/transition/filter.js
+ function filter_default2(match) {
+ if (typeof match !== "function")
+ match = matcher_default(match);
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
+ for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = [], node, i2 = 0; i2 < n2; ++i2) {
+ if ((node = group[i2]) && match.call(node, node.__data__, i2, group)) {
+ subgroup.push(node);
+ }
+ }
+ }
+ return new Transition(subgroups, this._parents, this._name, this._id);
+ }
+
+ // node_modules/d3-transition/src/transition/merge.js
+ function merge_default2(transition2) {
+ if (transition2._id !== this._id)
+ throw new Error();
+ for (var groups0 = this._groups, groups1 = transition2._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j2 = 0; j2 < m; ++j2) {
+ for (var group0 = groups0[j2], group1 = groups1[j2], n2 = group0.length, merge3 = merges[j2] = new Array(n2), node, i2 = 0; i2 < n2; ++i2) {
+ if (node = group0[i2] || group1[i2]) {
+ merge3[i2] = node;
+ }
+ }
+ }
+ for (; j2 < m0; ++j2) {
+ merges[j2] = groups0[j2];
+ }
+ return new Transition(merges, this._parents, this._name, this._id);
+ }
+
+ // node_modules/d3-transition/src/transition/on.js
+ function start(name2) {
+ return (name2 + "").trim().split(/^|\s+/).every(function(t) {
+ var i2 = t.indexOf(".");
+ if (i2 >= 0)
+ t = t.slice(0, i2);
+ return !t || t === "start";
+ });
+ }
+ function onFunction(id2, name2, listener) {
+ var on0, on1, sit = start(name2) ? init : set2;
+ return function() {
+ var schedule = sit(this, id2), on = schedule.on;
+ if (on !== on0)
+ (on1 = (on0 = on).copy()).on(name2, listener);
+ schedule.on = on1;
+ };
+ }
+ function on_default2(name2, listener) {
+ var id2 = this._id;
+ return arguments.length < 2 ? get2(this.node(), id2).on.on(name2) : this.each(onFunction(id2, name2, listener));
+ }
+
+ // node_modules/d3-transition/src/transition/remove.js
+ function removeFunction(id2) {
+ return function() {
+ var parent = this.parentNode;
+ for (var i2 in this.__transition)
+ if (+i2 !== id2)
+ return;
+ if (parent)
+ parent.removeChild(this);
+ };
+ }
+ function remove_default2() {
+ return this.on("end.remove", removeFunction(this._id));
+ }
+
+ // node_modules/d3-transition/src/transition/select.js
+ function select_default3(select) {
+ var name2 = this._name, id2 = this._id;
+ if (typeof select !== "function")
+ select = selector_default(select);
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
+ for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = new Array(n2), node, subnode, i2 = 0; i2 < n2; ++i2) {
+ if ((node = group[i2]) && (subnode = select.call(node, node.__data__, i2, group))) {
+ if ("__data__" in node)
+ subnode.__data__ = node.__data__;
+ subgroup[i2] = subnode;
+ schedule_default(subgroup[i2], name2, id2, i2, subgroup, get2(node, id2));
+ }
+ }
+ }
+ return new Transition(subgroups, this._parents, name2, id2);
+ }
+
+ // node_modules/d3-transition/src/transition/selectAll.js
+ function selectAll_default3(select) {
+ var name2 = this._name, id2 = this._id;
+ if (typeof select !== "function")
+ select = selectorAll_default(select);
+ for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j2 = 0; j2 < m; ++j2) {
+ for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) {
+ if (node = group[i2]) {
+ for (var children2 = select.call(node, node.__data__, i2, group), child, inherit2 = get2(node, id2), k = 0, l = children2.length; k < l; ++k) {
+ if (child = children2[k]) {
+ schedule_default(child, name2, id2, k, children2, inherit2);
+ }
+ }
+ subgroups.push(children2);
+ parents.push(node);
+ }
+ }
+ }
+ return new Transition(subgroups, parents, name2, id2);
+ }
+
+ // node_modules/d3-transition/src/transition/selection.js
+ var Selection2 = selection_default.prototype.constructor;
+ function selection_default2() {
+ return new Selection2(this._groups, this._parents);
+ }
+
+ // node_modules/d3-transition/src/transition/style.js
+ function styleNull(name2, interpolate) {
+ var string00, string10, interpolate0;
+ return function() {
+ var string0 = styleValue(this, name2), string1 = (this.style.removeProperty(name2), styleValue(this, name2));
+ return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = interpolate(string00 = string0, string10 = string1);
+ };
+ }
+ function styleRemove2(name2) {
+ return function() {
+ this.style.removeProperty(name2);
+ };
+ }
+ function styleConstant2(name2, interpolate, value1) {
+ var string00, string1 = value1 + "", interpolate0;
+ return function() {
+ var string0 = styleValue(this, name2);
+ return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
+ };
+ }
+ function styleFunction2(name2, interpolate, value) {
+ var string00, string10, interpolate0;
+ return function() {
+ var string0 = styleValue(this, name2), value1 = value(this), string1 = value1 + "";
+ if (value1 == null)
+ string1 = value1 = (this.style.removeProperty(name2), styleValue(this, name2));
+ return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+ };
+ }
+ function styleMaybeRemove(id2, name2) {
+ var on0, on1, listener0, key = "style." + name2, event = "end." + key, remove2;
+ return function() {
+ var schedule = set2(this, id2), on = schedule.on, listener = schedule.value[key] == null ? remove2 || (remove2 = styleRemove2(name2)) : void 0;
+ if (on !== on0 || listener0 !== listener)
+ (on1 = (on0 = on).copy()).on(event, listener0 = listener);
+ schedule.on = on1;
+ };
+ }
+ function style_default2(name2, value, priority) {
+ var i2 = (name2 += "") === "transform" ? interpolateTransformCss : interpolate_default;
+ return value == null ? this.styleTween(name2, styleNull(name2, i2)).on("end.style." + name2, styleRemove2(name2)) : typeof value === "function" ? this.styleTween(name2, styleFunction2(name2, i2, tweenValue(this, "style." + name2, value))).each(styleMaybeRemove(this._id, name2)) : this.styleTween(name2, styleConstant2(name2, i2, value), priority).on("end.style." + name2, null);
+ }
+
+ // node_modules/d3-transition/src/transition/styleTween.js
+ function styleInterpolate(name2, i2, priority) {
+ return function(t) {
+ this.style.setProperty(name2, i2.call(this, t), priority);
+ };
+ }
+ function styleTween(name2, value, priority) {
+ var t, i0;
+ function tween() {
+ var i2 = value.apply(this, arguments);
+ if (i2 !== i0)
+ t = (i0 = i2) && styleInterpolate(name2, i2, priority);
+ return t;
+ }
+ tween._value = value;
+ return tween;
+ }
+ function styleTween_default(name2, value, priority) {
+ var key = "style." + (name2 += "");
+ if (arguments.length < 2)
+ return (key = this.tween(key)) && key._value;
+ if (value == null)
+ return this.tween(key, null);
+ if (typeof value !== "function")
+ throw new Error();
+ return this.tween(key, styleTween(name2, value, priority == null ? "" : priority));
+ }
+
+ // node_modules/d3-transition/src/transition/text.js
+ function textConstant2(value) {
+ return function() {
+ this.textContent = value;
+ };
+ }
+ function textFunction2(value) {
+ return function() {
+ var value1 = value(this);
+ this.textContent = value1 == null ? "" : value1;
+ };
+ }
+ function text_default2(value) {
+ return this.tween("text", typeof value === "function" ? textFunction2(tweenValue(this, "text", value)) : textConstant2(value == null ? "" : value + ""));
+ }
+
+ // node_modules/d3-transition/src/transition/textTween.js
+ function textInterpolate(i2) {
+ return function(t) {
+ this.textContent = i2.call(this, t);
+ };
+ }
+ function textTween(value) {
+ var t0, i0;
+ function tween() {
+ var i2 = value.apply(this, arguments);
+ if (i2 !== i0)
+ t0 = (i0 = i2) && textInterpolate(i2);
+ return t0;
+ }
+ tween._value = value;
+ return tween;
+ }
+ function textTween_default(value) {
+ var key = "text";
+ if (arguments.length < 1)
+ return (key = this.tween(key)) && key._value;
+ if (value == null)
+ return this.tween(key, null);
+ if (typeof value !== "function")
+ throw new Error();
+ return this.tween(key, textTween(value));
+ }
+
+ // node_modules/d3-transition/src/transition/transition.js
+ function transition_default() {
+ var name2 = this._name, id0 = this._id, id1 = newId();
+ for (var groups = this._groups, m = groups.length, j2 = 0; j2 < m; ++j2) {
+ for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) {
+ if (node = group[i2]) {
+ var inherit2 = get2(node, id0);
+ schedule_default(node, name2, id1, i2, group, {
+ time: inherit2.time + inherit2.delay + inherit2.duration,
+ delay: 0,
+ duration: inherit2.duration,
+ ease: inherit2.ease
+ });
+ }
+ }
+ }
+ return new Transition(groups, this._parents, name2, id1);
+ }
+
+ // node_modules/d3-transition/src/transition/end.js
+ function end_default() {
+ var on0, on1, that = this, id2 = that._id, size = that.size();
+ return new Promise(function(resolve, reject) {
+ var cancel = { value: reject }, end = { value: function() {
+ if (--size === 0)
+ resolve();
+ } };
+ that.each(function() {
+ var schedule = set2(this, id2), on = schedule.on;
+ if (on !== on0) {
+ on1 = (on0 = on).copy();
+ on1._.cancel.push(cancel);
+ on1._.interrupt.push(cancel);
+ on1._.end.push(end);
+ }
+ schedule.on = on1;
+ });
+ if (size === 0)
+ resolve();
+ });
+ }
+
+ // node_modules/d3-transition/src/transition/index.js
+ var id = 0;
+ function Transition(groups, parents, name2, id2) {
+ this._groups = groups;
+ this._parents = parents;
+ this._name = name2;
+ this._id = id2;
+ }
+ function transition(name2) {
+ return selection_default().transition(name2);
+ }
+ function newId() {
+ return ++id;
+ }
+ var selection_prototype = selection_default.prototype;
+ Transition.prototype = transition.prototype = {
+ constructor: Transition,
+ select: select_default3,
+ selectAll: selectAll_default3,
+ selectChild: selection_prototype.selectChild,
+ selectChildren: selection_prototype.selectChildren,
+ filter: filter_default2,
+ merge: merge_default2,
+ selection: selection_default2,
+ transition: transition_default,
+ call: selection_prototype.call,
+ nodes: selection_prototype.nodes,
+ node: selection_prototype.node,
+ size: selection_prototype.size,
+ empty: selection_prototype.empty,
+ each: selection_prototype.each,
+ on: on_default2,
+ attr: attr_default2,
+ attrTween: attrTween_default,
+ style: style_default2,
+ styleTween: styleTween_default,
+ text: text_default2,
+ textTween: textTween_default,
+ remove: remove_default2,
+ tween: tween_default,
+ delay: delay_default,
+ duration: duration_default,
+ ease: ease_default,
+ easeVarying: easeVarying_default,
+ end: end_default,
+ [Symbol.iterator]: selection_prototype[Symbol.iterator]
+ };
+
+ // node_modules/d3-ease/src/linear.js
+ var linear2 = (t) => +t;
+
+ // node_modules/d3-ease/src/cubic.js
+ function cubicInOut(t) {
+ return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
+ }
+
+ // node_modules/d3-transition/src/selection/transition.js
+ var defaultTiming = {
+ time: null,
+ delay: 0,
+ duration: 250,
+ ease: cubicInOut
+ };
+ function inherit(node, id2) {
+ var timing;
+ while (!(timing = node.__transition) || !(timing = timing[id2])) {
+ if (!(node = node.parentNode)) {
+ throw new Error(`transition ${id2} not found`);
+ }
+ }
+ return timing;
+ }
+ function transition_default2(name2) {
+ var id2, timing;
+ if (name2 instanceof Transition) {
+ id2 = name2._id, name2 = name2._name;
+ } else {
+ id2 = newId(), (timing = defaultTiming).time = now(), name2 = name2 == null ? null : name2 + "";
+ }
+ for (var groups = this._groups, m = groups.length, j2 = 0; j2 < m; ++j2) {
+ for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) {
+ if (node = group[i2]) {
+ schedule_default(node, name2, id2, i2, group, timing || inherit(node, id2));
+ }
+ }
+ }
+ return new Transition(groups, this._parents, name2, id2);
+ }
+
+ // node_modules/d3-transition/src/selection/index.js
+ selection_default.prototype.interrupt = interrupt_default2;
+ selection_default.prototype.transition = transition_default2;
+
+ // node_modules/d3-zoom/src/constant.js
+ var constant_default4 = (x) => () => x;
+
+ // node_modules/d3-zoom/src/event.js
+ function ZoomEvent(type3, {
+ sourceEvent,
+ target,
+ transform: transform2,
+ dispatch: dispatch10
+ }) {
+ Object.defineProperties(this, {
+ type: { value: type3, enumerable: true, configurable: true },
+ sourceEvent: { value: sourceEvent, enumerable: true, configurable: true },
+ target: { value: target, enumerable: true, configurable: true },
+ transform: { value: transform2, enumerable: true, configurable: true },
+ _: { value: dispatch10 }
+ });
+ }
+
+ // node_modules/d3-zoom/src/transform.js
+ function Transform(k, x, y) {
+ this.k = k;
+ this.x = x;
+ this.y = y;
+ }
+ Transform.prototype = {
+ constructor: Transform,
+ scale: function(k) {
+ return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
+ },
+ translate: function(x, y) {
+ return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
+ },
+ apply: function(point) {
+ return [point[0] * this.k + this.x, point[1] * this.k + this.y];
+ },
+ applyX: function(x) {
+ return x * this.k + this.x;
+ },
+ applyY: function(y) {
+ return y * this.k + this.y;
+ },
+ invert: function(location) {
+ return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
+ },
+ invertX: function(x) {
+ return (x - this.x) / this.k;
+ },
+ invertY: function(y) {
+ return (y - this.y) / this.k;
+ },
+ rescaleX: function(x) {
+ return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
+ },
+ rescaleY: function(y) {
+ return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
+ },
+ toString: function() {
+ return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
+ }
+ };
+ var identity2 = new Transform(1, 0, 0);
+ transform.prototype = Transform.prototype;
+ function transform(node) {
+ while (!node.__zoom)
+ if (!(node = node.parentNode))
+ return identity2;
+ return node.__zoom;
+ }
+
+ // node_modules/d3-zoom/src/noevent.js
+ function nopropagation2(event) {
+ event.stopImmediatePropagation();
+ }
+ function noevent_default2(event) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ }
+
+ // node_modules/d3-zoom/src/zoom.js
+ function defaultFilter2(event) {
+ return (!event.ctrlKey || event.type === "wheel") && !event.button;
+ }
+ function defaultExtent() {
+ var e = this;
+ if (e instanceof SVGElement) {
+ e = e.ownerSVGElement || e;
+ if (e.hasAttribute("viewBox")) {
+ e = e.viewBox.baseVal;
+ return [[e.x, e.y], [e.x + e.width, e.y + e.height]];
+ }
+ return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];
+ }
+ return [[0, 0], [e.clientWidth, e.clientHeight]];
+ }
+ function defaultTransform() {
+ return this.__zoom || identity2;
+ }
+ function defaultWheelDelta(event) {
+ return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 2e-3) * (event.ctrlKey ? 10 : 1);
+ }
+ function defaultTouchable2() {
+ return navigator.maxTouchPoints || "ontouchstart" in this;
+ }
+ function defaultConstrain(transform2, extent, translateExtent) {
+ var dx0 = transform2.invertX(extent[0][0]) - translateExtent[0][0], dx1 = transform2.invertX(extent[1][0]) - translateExtent[1][0], dy0 = transform2.invertY(extent[0][1]) - translateExtent[0][1], dy1 = transform2.invertY(extent[1][1]) - translateExtent[1][1];
+ return transform2.translate(dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1));
+ }
+ function zoom_default2() {
+ var filter2 = defaultFilter2, extent = defaultExtent, constrain = defaultConstrain, wheelDelta = defaultWheelDelta, touchable = defaultTouchable2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], duration = 250, interpolate = zoom_default, listeners = dispatch_default("start", "zoom", "end"), touchstarting, touchfirst, touchending, touchDelay = 500, wheelDelay = 150, clickDistance2 = 0, tapDistance = 10;
+ function zoom(selection2) {
+ selection2.property("__zoom", defaultTransform).on("wheel.zoom", wheeled, { passive: false }).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
+ }
+ zoom.transform = function(collection, transform2, point, event) {
+ var selection2 = collection.selection ? collection.selection() : collection;
+ selection2.property("__zoom", defaultTransform);
+ if (collection !== selection2) {
+ schedule(collection, transform2, point, event);
+ } else {
+ selection2.interrupt().each(function() {
+ gesture(this, arguments).event(event).start().zoom(null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end();
+ });
+ }
+ };
+ zoom.scaleBy = function(selection2, k, p, event) {
+ zoom.scaleTo(selection2, function() {
+ var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k;
+ return k0 * k1;
+ }, p, event);
+ };
+ zoom.scaleTo = function(selection2, k, p, event) {
+ zoom.transform(selection2, function() {
+ var e = extent.apply(this, arguments), t0 = this.__zoom, p02 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t0.invert(p02), k1 = typeof k === "function" ? k.apply(this, arguments) : k;
+ return constrain(translate(scale(t0, k1), p02, p1), e, translateExtent);
+ }, p, event);
+ };
+ zoom.translateBy = function(selection2, x, y, event) {
+ zoom.transform(selection2, function() {
+ return constrain(this.__zoom.translate(typeof x === "function" ? x.apply(this, arguments) : x, typeof y === "function" ? y.apply(this, arguments) : y), extent.apply(this, arguments), translateExtent);
+ }, null, event);
+ };
+ zoom.translateTo = function(selection2, x, y, p, event) {
+ zoom.transform(selection2, function() {
+ var e = extent.apply(this, arguments), t = this.__zoom, p02 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p;
+ return constrain(identity2.translate(p02[0], p02[1]).scale(t.k).translate(typeof x === "function" ? -x.apply(this, arguments) : -x, typeof y === "function" ? -y.apply(this, arguments) : -y), e, translateExtent);
+ }, p, event);
+ };
+ function scale(transform2, k) {
+ k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
+ return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y);
+ }
+ function translate(transform2, p02, p1) {
+ var x = p02[0] - p1[0] * transform2.k, y = p02[1] - p1[1] * transform2.k;
+ return x === transform2.x && y === transform2.y ? transform2 : new Transform(transform2.k, x, y);
+ }
+ function centroid(extent2) {
+ return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2];
+ }
+ function schedule(transition2, transform2, point, event) {
+ transition2.on("start.zoom", function() {
+ gesture(this, arguments).event(event).start();
+ }).on("interrupt.zoom end.zoom", function() {
+ gesture(this, arguments).event(event).end();
+ }).tween("zoom", function() {
+ var that = this, args = arguments, g = gesture(that, args).event(event), e = extent.apply(that, args), p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a = that.__zoom, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i2 = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
+ return function(t) {
+ if (t === 1)
+ t = b;
+ else {
+ var l = i2(t), k = w / l[2];
+ t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
+ }
+ g.zoom(null, t);
+ };
+ });
+ }
+ function gesture(that, args, clean2) {
+ return !clean2 && that.__zooming || new Gesture(that, args);
+ }
+ function Gesture(that, args) {
+ this.that = that;
+ this.args = args;
+ this.active = 0;
+ this.sourceEvent = null;
+ this.extent = extent.apply(that, args);
+ this.taps = 0;
+ }
+ Gesture.prototype = {
+ event: function(event) {
+ if (event)
+ this.sourceEvent = event;
+ return this;
+ },
+ start: function() {
+ if (++this.active === 1) {
+ this.that.__zooming = this;
+ this.emit("start");
+ }
+ return this;
+ },
+ zoom: function(key, transform2) {
+ if (this.mouse && key !== "mouse")
+ this.mouse[1] = transform2.invert(this.mouse[0]);
+ if (this.touch0 && key !== "touch")
+ this.touch0[1] = transform2.invert(this.touch0[0]);
+ if (this.touch1 && key !== "touch")
+ this.touch1[1] = transform2.invert(this.touch1[0]);
+ this.that.__zoom = transform2;
+ this.emit("zoom");
+ return this;
+ },
+ end: function() {
+ if (--this.active === 0) {
+ delete this.that.__zooming;
+ this.emit("end");
+ }
+ return this;
+ },
+ emit: function(type3) {
+ var d = select_default2(this.that).datum();
+ listeners.call(type3, this.that, new ZoomEvent(type3, {
+ sourceEvent: this.sourceEvent,
+ target: zoom,
+ type: type3,
+ transform: this.that.__zoom,
+ dispatch: listeners
+ }), d);
+ }
+ };
+ function wheeled(event, ...args) {
+ if (!filter2.apply(this, arguments))
+ return;
+ var g = gesture(this, args).event(event), t = this.__zoom, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = pointer_default(event);
+ if (g.wheel) {
+ if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
+ g.mouse[1] = t.invert(g.mouse[0] = p);
+ }
+ clearTimeout(g.wheel);
+ } else if (t.k === k)
+ return;
+ else {
+ g.mouse = [p, t.invert(p)];
+ interrupt_default(this);
+ g.start();
+ }
+ noevent_default2(event);
+ g.wheel = setTimeout(wheelidled, wheelDelay);
+ g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
+ function wheelidled() {
+ g.wheel = null;
+ g.end();
+ }
+ }
+ function mousedowned(event, ...args) {
+ if (touchending || !filter2.apply(this, arguments))
+ return;
+ var currentTarget = event.currentTarget, g = gesture(this, args, true).event(event), v = select_default2(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), p = pointer_default(event, currentTarget), x05 = event.clientX, y05 = event.clientY;
+ nodrag_default(event.view);
+ nopropagation2(event);
+ g.mouse = [p, this.__zoom.invert(p)];
+ interrupt_default(this);
+ g.start();
+ function mousemoved(event2) {
+ noevent_default2(event2);
+ if (!g.moved) {
+ var dx = event2.clientX - x05, dy = event2.clientY - y05;
+ g.moved = dx * dx + dy * dy > clickDistance2;
+ }
+ g.event(event2).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer_default(event2, currentTarget), g.mouse[1]), g.extent, translateExtent));
+ }
+ function mouseupped(event2) {
+ v.on("mousemove.zoom mouseup.zoom", null);
+ yesdrag(event2.view, g.moved);
+ noevent_default2(event2);
+ g.event(event2).end();
+ }
+ }
+ function dblclicked(event, ...args) {
+ if (!filter2.apply(this, arguments))
+ return;
+ var t0 = this.__zoom, p02 = pointer_default(event.changedTouches ? event.changedTouches[0] : event, this), p1 = t0.invert(p02), k1 = t0.k * (event.shiftKey ? 0.5 : 2), t1 = constrain(translate(scale(t0, k1), p02, p1), extent.apply(this, args), translateExtent);
+ noevent_default2(event);
+ if (duration > 0)
+ select_default2(this).transition().duration(duration).call(schedule, t1, p02, event);
+ else
+ select_default2(this).call(zoom.transform, t1, p02, event);
+ }
+ function touchstarted(event, ...args) {
+ if (!filter2.apply(this, arguments))
+ return;
+ var touches = event.touches, n2 = touches.length, g = gesture(this, args, event.changedTouches.length === n2).event(event), started, i2, t, p;
+ nopropagation2(event);
+ for (i2 = 0; i2 < n2; ++i2) {
+ t = touches[i2], p = pointer_default(t, this);
+ p = [p, this.__zoom.invert(p), t.identifier];
+ if (!g.touch0)
+ g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;
+ else if (!g.touch1 && g.touch0[2] !== p[2])
+ g.touch1 = p, g.taps = 0;
+ }
+ if (touchstarting)
+ touchstarting = clearTimeout(touchstarting);
+ if (started) {
+ if (g.taps < 2)
+ touchfirst = p[0], touchstarting = setTimeout(function() {
+ touchstarting = null;
+ }, touchDelay);
+ interrupt_default(this);
+ g.start();
+ }
+ }
+ function touchmoved(event, ...args) {
+ if (!this.__zooming)
+ return;
+ var g = gesture(this, args).event(event), touches = event.changedTouches, n2 = touches.length, i2, t, p, l;
+ noevent_default2(event);
+ for (i2 = 0; i2 < n2; ++i2) {
+ t = touches[i2], p = pointer_default(t, this);
+ if (g.touch0 && g.touch0[2] === t.identifier)
+ g.touch0[0] = p;
+ else if (g.touch1 && g.touch1[2] === t.identifier)
+ g.touch1[0] = p;
+ }
+ t = g.that.__zoom;
+ if (g.touch1) {
+ var p02 = g.touch0[0], l0 = g.touch0[1], p1 = g.touch1[0], l1 = g.touch1[1], dp = (dp = p1[0] - p02[0]) * dp + (dp = p1[1] - p02[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
+ t = scale(t, Math.sqrt(dp / dl));
+ p = [(p02[0] + p1[0]) / 2, (p02[1] + p1[1]) / 2];
+ l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
+ } else if (g.touch0)
+ p = g.touch0[0], l = g.touch0[1];
+ else
+ return;
+ g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
+ }
+ function touchended(event, ...args) {
+ if (!this.__zooming)
+ return;
+ var g = gesture(this, args).event(event), touches = event.changedTouches, n2 = touches.length, i2, t;
+ nopropagation2(event);
+ if (touchending)
+ clearTimeout(touchending);
+ touchending = setTimeout(function() {
+ touchending = null;
+ }, touchDelay);
+ for (i2 = 0; i2 < n2; ++i2) {
+ t = touches[i2];
+ if (g.touch0 && g.touch0[2] === t.identifier)
+ delete g.touch0;
+ else if (g.touch1 && g.touch1[2] === t.identifier)
+ delete g.touch1;
+ }
+ if (g.touch1 && !g.touch0)
+ g.touch0 = g.touch1, delete g.touch1;
+ if (g.touch0)
+ g.touch0[1] = this.__zoom.invert(g.touch0[0]);
+ else {
+ g.end();
+ if (g.taps === 2) {
+ t = pointer_default(t, this);
+ if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {
+ var p = select_default2(this).on("dblclick.zoom");
+ if (p)
+ p.apply(this, arguments);
+ }
+ }
+ }
+ }
+ zoom.wheelDelta = function(_) {
+ return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant_default4(+_), zoom) : wheelDelta;
+ };
+ zoom.filter = function(_) {
+ return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default4(!!_), zoom) : filter2;
+ };
+ zoom.touchable = function(_) {
+ return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default4(!!_), zoom) : touchable;
+ };
+ zoom.extent = function(_) {
+ return arguments.length ? (extent = typeof _ === "function" ? _ : constant_default4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
+ };
+ zoom.scaleExtent = function(_) {
+ return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
+ };
+ zoom.translateExtent = function(_) {
+ 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]]];
+ };
+ zoom.constrain = function(_) {
+ return arguments.length ? (constrain = _, zoom) : constrain;
+ };
+ zoom.duration = function(_) {
+ return arguments.length ? (duration = +_, zoom) : duration;
+ };
+ zoom.interpolate = function(_) {
+ return arguments.length ? (interpolate = _, zoom) : interpolate;
+ };
+ zoom.on = function() {
+ var value = listeners.on.apply(listeners, arguments);
+ return value === listeners ? zoom : value;
+ };
+ zoom.clickDistance = function(_) {
+ return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
+ };
+ zoom.tapDistance = function(_) {
+ return arguments.length ? (tapDistance = +_, zoom) : tapDistance;
+ };
+ return zoom;
+ }
+
+ // modules/geo/raw_mercator.js
+ function geoRawMercator() {
+ var project = mercatorRaw;
+ var k = 512 / Math.PI;
+ var x = 0;
+ var y = 0;
+ var clipExtent = [[0, 0], [0, 0]];
+ function projection2(point) {
+ point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
+ return [point[0] * k + x, y - point[1] * k];
+ }
+ projection2.invert = function(point) {
+ point = project.invert((point[0] - x) / k, (y - point[1]) / k);
+ return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
+ };
+ projection2.scale = function(_) {
+ if (!arguments.length)
+ return k;
+ k = +_;
+ return projection2;
+ };
+ projection2.translate = function(_) {
+ if (!arguments.length)
+ return [x, y];
+ x = +_[0];
+ y = +_[1];
+ return projection2;
+ };
+ projection2.clipExtent = function(_) {
+ if (!arguments.length)
+ return clipExtent;
+ clipExtent = _;
+ return projection2;
+ };
+ projection2.transform = function(obj) {
+ if (!arguments.length)
+ return identity2.translate(x, y).scale(k);
+ x = +obj.x;
+ y = +obj.y;
+ k = +obj.k;
+ return projection2;
+ };
+ projection2.stream = transform_default({
+ point: function(x2, y2) {
+ var vec = projection2([x2, y2]);
+ this.stream.point(vec[0], vec[1]);
+ }
+ }).stream;
+ return projection2;
+ }
+
+ // modules/geo/ortho.js
+ function geoOrthoNormalizedDotProduct(a, b, origin) {
+ if (geoVecEqual(origin, a) || geoVecEqual(origin, b)) {
+ return 1;
+ }
+ return geoVecNormalizedDot(a, b, origin);
+ }
+ function geoOrthoFilterDotProduct(dotp, epsilon3, lowerThreshold, upperThreshold, allowStraightAngles) {
+ var val = Math.abs(dotp);
+ if (val < epsilon3) {
+ return 0;
+ } else if (allowStraightAngles && Math.abs(val - 1) < epsilon3) {
+ return 0;
+ } else if (val < lowerThreshold || val > upperThreshold) {
+ return dotp;
+ } else {
+ return null;
+ }
+ }
+ function geoOrthoCalcScore(points, isClosed, epsilon3, threshold) {
+ var score = 0;
+ var first = isClosed ? 0 : 1;
+ var last = isClosed ? points.length : points.length - 1;
+ var coords = points.map(function(p) {
+ return p.coord;
+ });
+ var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
+ var upperThreshold = Math.cos(threshold * Math.PI / 180);
+ for (var i2 = first; i2 < last; i2++) {
+ var a = coords[(i2 - 1 + coords.length) % coords.length];
+ var origin = coords[i2];
+ var b = coords[(i2 + 1) % coords.length];
+ var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon3, lowerThreshold, upperThreshold);
+ if (dotp === null)
+ continue;
+ score = score + 2 * Math.min(Math.abs(dotp - 1), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
+ }
+ return score;
+ }
+ function geoOrthoMaxOffsetAngle(coords, isClosed, lessThan) {
+ var max3 = -Infinity;
+ var first = isClosed ? 0 : 1;
+ var last = isClosed ? coords.length : coords.length - 1;
+ for (var i2 = first; i2 < last; i2++) {
+ var a = coords[(i2 - 1 + coords.length) % coords.length];
+ var origin = coords[i2];
+ var b = coords[(i2 + 1) % coords.length];
+ var normalizedDotP = geoOrthoNormalizedDotProduct(a, b, origin);
+ var angle2 = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI;
+ if (angle2 > 45)
+ angle2 = 90 - angle2;
+ if (angle2 >= lessThan)
+ continue;
+ if (angle2 > max3)
+ max3 = angle2;
+ }
+ if (max3 === -Infinity)
+ return null;
+ return max3;
+ }
+ function geoOrthoCanOrthogonalize(coords, isClosed, epsilon3, threshold, allowStraightAngles) {
+ var score = null;
+ var first = isClosed ? 0 : 1;
+ var last = isClosed ? coords.length : coords.length - 1;
+ var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
+ var upperThreshold = Math.cos(threshold * Math.PI / 180);
+ for (var i2 = first; i2 < last; i2++) {
+ var a = coords[(i2 - 1 + coords.length) % coords.length];
+ var origin = coords[i2];
+ var b = coords[(i2 + 1) % coords.length];
+ var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon3, lowerThreshold, upperThreshold, allowStraightAngles);
+ if (dotp === null)
+ continue;
+ if (Math.abs(dotp) > 0)
+ return 1;
+ score = 0;
+ }
+ return score;
+ }
+
+ // modules/util/array.js
+ function utilArrayIdentical(a, b) {
+ if (a === b)
+ return true;
+ var i2 = a.length;
+ if (i2 !== b.length)
+ return false;
+ while (i2--) {
+ if (a[i2] !== b[i2])
+ return false;
+ }
+ return true;
+ }
+ function utilArrayDifference(a, b) {
+ var other = new Set(b);
+ return Array.from(new Set(a)).filter(function(v) {
+ return !other.has(v);
+ });
+ }
+ function utilArrayIntersection(a, b) {
+ var other = new Set(b);
+ return Array.from(new Set(a)).filter(function(v) {
+ return other.has(v);
+ });
+ }
+ function utilArrayUnion(a, b) {
+ var result = new Set(a);
+ b.forEach(function(v) {
+ result.add(v);
+ });
+ return Array.from(result);
+ }
+ function utilArrayUniq(a) {
+ return Array.from(new Set(a));
+ }
+ function utilArrayChunk(a, chunkSize) {
+ if (!chunkSize || chunkSize < 0)
+ return [a.slice()];
+ var result = new Array(Math.ceil(a.length / chunkSize));
+ return Array.from(result, function(item, i2) {
+ return a.slice(i2 * chunkSize, i2 * chunkSize + chunkSize);
+ });
+ }
+ function utilArrayFlatten(a) {
+ return a.reduce(function(acc, val) {
+ return acc.concat(val);
+ }, []);
+ }
+ function utilArrayGroupBy(a, key) {
+ return a.reduce(function(acc, item) {
+ var group = typeof key === "function" ? key(item) : item[key];
+ (acc[group] = acc[group] || []).push(item);
+ return acc;
+ }, {});
+ }
+ function utilArrayUniqBy(a, key) {
+ var seen = /* @__PURE__ */ new Set();
+ return a.reduce(function(acc, item) {
+ var val = typeof key === "function" ? key(item) : item[key];
+ if (val && !seen.has(val)) {
+ seen.add(val);
+ acc.push(item);
+ }
+ return acc;
+ }, []);
+ }
+
+ // modules/util/util.js
+ var import_diacritics = __toESM(require_diacritics());
+
+ // modules/util/svg_paths_rtl_fix.js
+ var import_alif_toolkit = __toESM(require_lib());
+ var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0750-\u07BF\u08A0–\u08BF]/;
+ function fixRTLTextForSvg(inputText) {
+ var ret = "", rtlBuffer = [];
+ var arabicRegex = /[\u0600-\u06FF]/g;
+ var arabicDiacritics = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06ED]/g;
+ var arabicMath = /[\u0660-\u066C\u06F0-\u06F9]+/g;
+ var thaanaVowel = /[\u07A6-\u07B0]/;
+ var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
+ if (arabicRegex.test(inputText)) {
+ inputText = (0, import_alif_toolkit.WordShaper)(inputText);
+ }
+ for (var n2 = 0; n2 < inputText.length; n2++) {
+ var c = inputText[n2];
+ if (arabicMath.test(c)) {
+ ret += rtlBuffer.reverse().join("");
+ rtlBuffer = [c];
+ } else {
+ if (rtlBuffer.length && arabicMath.test(rtlBuffer[rtlBuffer.length - 1])) {
+ ret += rtlBuffer.reverse().join("");
+ rtlBuffer = [];
+ }
+ if ((thaanaVowel.test(c) || hebrewSign.test(c) || arabicDiacritics.test(c)) && rtlBuffer.length) {
+ rtlBuffer[rtlBuffer.length - 1] += c;
+ } else if (rtlRegex.test(c) || c.charCodeAt(0) >= 64336 && c.charCodeAt(0) <= 65023 || c.charCodeAt(0) >= 65136 && c.charCodeAt(0) <= 65279) {
+ rtlBuffer.push(c);
+ } else if (c === " " && rtlBuffer.length) {
+ rtlBuffer = [rtlBuffer.reverse().join("") + " "];
+ } else {
+ ret += rtlBuffer.reverse().join("") + c;
+ rtlBuffer = [];
+ }
+ }
+ }
+ ret += rtlBuffer.reverse().join("");
+ return ret;
+ }
+
+ // modules/core/preferences.js
+ var _storage;
+ try {
+ _storage = localStorage;
+ } catch (e) {
+ }
+ _storage = _storage || (() => {
+ let s = {};
+ return {
+ getItem: (k) => s[k],
+ setItem: (k, v) => s[k] = v,
+ removeItem: (k) => delete s[k]
+ };
+ })();
+ var _listeners = {};
+ function corePreferences(k, v) {
+ try {
+ if (v === void 0)
+ return _storage.getItem(k);
+ else if (v === null)
+ _storage.removeItem(k);
+ else
+ _storage.setItem(k, v);
+ if (_listeners[k]) {
+ _listeners[k].forEach((handler) => handler(v));
+ }
+ return true;
+ } catch (e) {
+ if (typeof console !== "undefined") {
+ console.error("localStorage quota exceeded");
+ }
+ return false;
+ }
+ }
+ corePreferences.onChange = function(k, handler) {
+ _listeners[k] = _listeners[k] || [];
+ _listeners[k].push(handler);
+ };
+
+ // modules/core/file_fetcher.js
+ var import_vparse = __toESM(require_vparse());
+
+ // package.json
+ var name = "iD";
+ var version = "2.21.1";
+ var description = "A friendly editor for OpenStreetMap";
+ var main = "dist/iD.min.js";
+ var repository = "github:openstreetmap/iD";
+ var homepage = "https://github.com/openstreetmap/iD";
+ var bugs = "https://github.com/openstreetmap/iD/issues";
+ var keywords = [
+ "editor",
+ "openstreetmap"
+ ];
+ var license = "ISC";
+ var scripts = {
+ all: "run-s clean build dist",
+ build: "run-s build:css build:data build:js",
+ "build:css": "node scripts/build_css.js",
+ "build:data": "shx mkdir -p dist/data && node scripts/build_data.js",
+ "build:stats": "esbuild-visualizer --metadata dist/esbuild.json --exclude *.png --filename docs/statistics.html",
+ "build:js": "node config/esbuild.config.mjs",
+ "build:js:watch": "node config/esbuild.config.mjs --watch",
+ clean: "shx rm -f dist/esbuild.json dist/*.js dist/*.map dist/*.css dist/img/*.svg",
+ dist: "run-p dist:**",
+ "dist:mapillary": "shx mkdir -p dist/mapillary-js && shx cp -R node_modules/mapillary-js/dist/* dist/mapillary-js/",
+ "dist:pannellum": "shx mkdir -p dist/pannellum-streetside && shx cp -R node_modules/pannellum/build/* dist/pannellum-streetside/",
+ "dist:min": "node config/esbuild.config.min.mjs",
+ "dist:svg:iD": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "iD-%s" --symbol-sprite dist/img/iD-sprite.svg "svg/iD-sprite/**/*.svg"',
+ "dist:svg:community": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "community-%s" --symbol-sprite dist/img/community-sprite.svg node_modules/osm-community-index/dist/img/*.svg',
+ "dist:svg:fa": "svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/fa-sprite.svg svg/fontawesome/*.svg",
+ "dist:svg:maki": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "maki-%s" --symbol-sprite dist/img/maki-sprite.svg node_modules/@mapbox/maki/icons/*.svg',
+ "dist:svg:mapillary:signs": "svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/mapillary-sprite.svg node_modules/mapillary_sprite_source/package_signs/*.svg",
+ "dist:svg:mapillary:objects": "svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/mapillary-object-sprite.svg node_modules/mapillary_sprite_source/package_objects/*.svg",
+ "dist:svg:temaki": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "temaki-%s" --symbol-sprite dist/img/temaki-sprite.svg node_modules/@ideditor/temaki/icons/*.svg',
+ imagery: "node scripts/update_imagery.js",
+ lint: "eslint scripts test/spec modules",
+ "lint:fix": "eslint scripts test/spec modules --fix",
+ start: "run-s build:js start:server",
+ "start:watch": "run-p build:js:watch start:server",
+ "start:server": "node scripts/server.js",
+ test: "npm-run-all -s lint build test:spec",
+ "test:spec": "karma start karma.conf.js",
+ translations: "node scripts/update_locales.js"
+ };
+ var dependencies = {
+ "@ideditor/country-coder": "~5.0.3",
+ "@ideditor/location-conflation": "~1.0.2",
+ "@mapbox/geojson-area": "^0.2.2",
+ "@mapbox/sexagesimal": "1.2.0",
+ "@mapbox/vector-tile": "^1.3.1",
+ "@tmcw/togeojson": "^4.5.0",
+ "@turf/bbox-clip": "^6.0.0",
+ "abortcontroller-polyfill": "^1.4.0",
+ "aes-js": "^3.1.2",
+ "alif-toolkit": "^1.2.9",
+ "core-js-bundle": "^3.19.0",
+ diacritics: "1.3.0",
+ "fast-deep-equal": "~3.1.1",
+ "fast-json-stable-stringify": "2.1.0",
+ "lodash-es": "~4.17.15",
+ marked: "~4.0.12",
+ "node-diff3": "~3.1.0",
+ "osm-auth": "~2.0.0",
+ pannellum: "2.5.6",
+ pbf: "^3.2.1",
+ "polygon-clipping": "~0.15.1",
+ rbush: "3.0.1",
+ "whatwg-fetch": "^3.4.1",
+ "which-polygon": "2.2.0"
+ };
+ var devDependencies = {
+ "@fortawesome/fontawesome-svg-core": "~6.1.0",
+ "@fortawesome/free-brands-svg-icons": "~6.1.0",
+ "@fortawesome/free-regular-svg-icons": "~6.1.0",
+ "@fortawesome/free-solid-svg-icons": "~6.1.0",
+ "@ideditor/temaki": "~5.1.0",
+ "@mapbox/maki": "^7.1.0",
+ autoprefixer: "^10.0.1",
+ btoa: "^1.2.1",
+ chai: "^4.3.4",
+ "cldr-core": "37.0.0",
+ "cldr-localenames-full": "37.0.0",
+ chalk: "^4.1.2",
+ "concat-files": "^0.1.1",
+ d3: "~7.4.4",
+ "editor-layer-index": "github:osmlab/editor-layer-index#gh-pages",
+ esbuild: "^0.14.17",
+ "esbuild-visualizer": "^0.3.1",
+ eslint: "^8.8.0",
+ "fetch-mock": "^9.11.0",
+ gaze: "^1.1.3",
+ glob: "^8.0.3",
+ happen: "^0.3.2",
+ "js-yaml": "^4.0.0",
+ "json-stringify-pretty-compact": "^3.0.0",
+ karma: "^6.3.5",
+ "karma-chrome-launcher": "^3.1.0",
+ "karma-coverage": "2.1.1",
+ "karma-mocha": "^2.0.1",
+ "karma-remap-istanbul": "^0.6.0",
+ "mapillary-js": "4.1.0",
+ mapillary_sprite_source: "^1.8.0",
+ minimist: "^1.2.3",
+ mocha: "^9.2.0",
+ "name-suggestion-index": "~6.0",
+ "node-fetch": "^2.6.1",
+ "npm-run-all": "^4.0.0",
+ "osm-community-index": "~5.1.0",
+ postcss: "^8.1.1",
+ "postcss-selector-prepend": "^0.5.0",
+ shelljs: "^0.8.0",
+ shx: "^0.3.0",
+ sinon: "^11.1.2",
+ "sinon-chai": "^3.7.0",
+ smash: "0.0",
+ "static-server": "^2.2.1",
+ "svg-sprite": "1.5.4",
+ vparse: "~1.1.0"
+ };
+ var engines = {
+ node: ">=12"
+ };
+ var browserslist = [
+ "> 0.2%, last 6 major versions, Firefox ESR, maintained node versions"
+ ];
+ var package_default = {
+ name,
+ version,
+ description,
+ main,
+ repository,
+ homepage,
+ bugs,
+ keywords,
+ license,
+ scripts,
+ dependencies,
+ devDependencies,
+ engines,
+ browserslist
+ };
+
+ // modules/core/file_fetcher.js
+ var _mainFileFetcher = coreFileFetcher();
+ function coreFileFetcher() {
+ const ociVersion = package_default.dependencies["osm-community-index"] || package_default.devDependencies["osm-community-index"];
+ const v = (0, import_vparse.default)(ociVersion);
+ const vMinor = `${v.major}.${v.minor}`;
+ let _this = {};
+ let _inflight4 = {};
+ let _fileMap = {
+ "address_formats": "data/address_formats.min.json",
+ "deprecated": "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/deprecated.min.json",
+ "discarded": "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/discarded.min.json",
+ "imagery": "data/imagery.min.json",
+ "intro_graph": "data/intro_graph.min.json",
+ "keepRight": "data/keepRight.min.json",
+ "languages": "data/languages.min.json",
+ "locales": "locales/index.min.json",
+ "oci_defaults": `https://cdn.jsdelivr.net/npm/osm-community-index@${vMinor}/dist/defaults.min.json`,
+ "oci_features": `https://cdn.jsdelivr.net/npm/osm-community-index@${vMinor}/dist/featureCollection.min.json`,
+ "oci_resources": `https://cdn.jsdelivr.net/npm/osm-community-index@${vMinor}/dist/resources.min.json`,
+ "preset_categories": "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/preset_categories.min.json",
+ "preset_defaults": "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/preset_defaults.min.json",
+ "preset_fields": "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/fields.min.json",
+ "preset_presets": "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/presets.min.json",
+ "phone_formats": "data/phone_formats.min.json",
+ "qa_data": "data/qa_data.min.json",
+ "shortcuts": "data/shortcuts.min.json",
+ "territory_languages": "data/territory_languages.min.json",
+ "wmf_sitematrix": "https://cdn.jsdelivr.net/npm/wmf-sitematrix@0.1/wikipedia.min.json"
+ };
+ let _cachedData = {};
+ _this.cache = () => _cachedData;
+ _this.get = (which) => {
+ if (_cachedData[which]) {
+ return Promise.resolve(_cachedData[which]);
+ }
+ const file = _fileMap[which];
+ const url = file && _this.asset(file);
+ if (!url) {
+ return Promise.reject(`Unknown data file for "${which}"`);
+ }
+ let prom = _inflight4[url];
+ if (!prom) {
+ _inflight4[url] = prom = fetch(url).then((response) => {
+ if (!response.ok || !response.json) {
+ throw new Error(response.status + " " + response.statusText);
+ }
+ if (response.status === 204 || response.status === 205)
+ return;
+ return response.json();
+ }).then((result) => {
+ delete _inflight4[url];
+ if (!result) {
+ throw new Error(`No data loaded for "${which}"`);
+ }
+ _cachedData[which] = result;
+ return result;
+ }).catch((err) => {
+ delete _inflight4[url];
+ throw err;
+ });
+ }
+ return prom;
+ };
+ _this.fileMap = function(val) {
+ if (!arguments.length)
+ return _fileMap;
+ _fileMap = val;
+ return _this;
+ };
+ let _assetPath = "";
+ _this.assetPath = function(val) {
+ if (!arguments.length)
+ return _assetPath;
+ _assetPath = val;
+ return _this;
+ };
+ let _assetMap = {};
+ _this.assetMap = function(val) {
+ if (!arguments.length)
+ return _assetMap;
+ _assetMap = val;
+ return _this;
+ };
+ _this.asset = (val) => {
+ if (/^http(s)?:\/\//i.test(val))
+ return val;
+ const filename = _assetPath + val;
+ return _assetMap[filename] || filename;
+ };
+ return _this;
+ }
+
+ // node_modules/@ideditor/country-coder/dist/country-coder.mjs
+ var import_which_polygon = __toESM(require_which_polygon(), 1);
+ var type = "FeatureCollection";
+ var features = [
+ { type: "Feature", properties: { wikidata: "Q21", nameEn: "England", aliases: ["GB-ENG"], country: "GB", groups: ["Q23666", "Q3336843", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-6.03913, 51.13217], [-7.74976, 48.64773], [1.17405, 50.74239], [2.18458, 51.52087], [2.56575, 51.85301], [0.792, 57.56437], [-2.30613, 55.62698], [-2.17058, 55.45916], [-2.6095, 55.28488], [-2.63532, 55.19452], [-3.02906, 55.04606], [-3.09361, 54.94924], [-3.38407, 54.94278], [-4.1819, 54.57861], [-3.5082, 53.54318], [-3.08228, 53.25526], [-3.03675, 53.25092], [-2.92329, 53.19383], [-2.92022, 53.17685], [-2.98598, 53.15589], [-2.90649, 53.10964], [-2.87469, 53.12337], [-2.89131, 53.09374], [-2.83133, 52.99184], [-2.7251, 52.98389], [-2.72221, 52.92969], [-2.80549, 52.89428], [-2.85897, 52.94487], [-2.92401, 52.93836], [-2.97243, 52.9651], [-3.13576, 52.895], [-3.15744, 52.84947], [-3.16105, 52.79599], [-3.08734, 52.77504], [-3.01001, 52.76636], [-2.95581, 52.71794], [-3.01724, 52.72083], [-3.04398, 52.65435], [-3.13648, 52.58208], [-3.12926, 52.5286], [-3.09746, 52.53077], [-3.08662, 52.54811], [-3.00929, 52.57774], [-2.99701, 52.551], [-3.03603, 52.49969], [-3.13359, 52.49174], [-3.22971, 52.45344], [-3.22754, 52.42526], [-3.04687, 52.34504], [-2.95364, 52.3501], [-2.99701, 52.323], [-3.00785, 52.2753], [-3.09289, 52.20546], [-3.12638, 52.08114], [-2.97111, 51.90456], [-2.8818, 51.93196], [-2.78742, 51.88833], [-2.74277, 51.84367], [-2.66234, 51.83555], [-2.66336, 51.59504], [-3.20563, 51.31615], [-6.03913, 51.13217]]]] } },
+ { type: "Feature", properties: { wikidata: "Q22", nameEn: "Scotland", aliases: ["GB-SCT"], country: "GB", groups: ["Q23666", "Q3336843", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44"] }, geometry: { type: "MultiPolygon", coordinates: [[[[0.792, 57.56437], [-0.3751, 61.32236], [-14.78497, 57.60709], [-6.82333, 55.83103], [-4.69044, 54.3629], [-3.38407, 54.94278], [-3.09361, 54.94924], [-3.02906, 55.04606], [-2.63532, 55.19452], [-2.6095, 55.28488], [-2.17058, 55.45916], [-2.30613, 55.62698], [0.792, 57.56437]]]] } },
+ { type: "Feature", properties: { wikidata: "Q25", nameEn: "Wales", aliases: ["GB-WLS"], country: "GB", groups: ["Q23666", "Q3336843", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-3.5082, 53.54318], [-5.37267, 53.63269], [-6.03913, 51.13217], [-3.20563, 51.31615], [-2.66336, 51.59504], [-2.66234, 51.83555], [-2.74277, 51.84367], [-2.78742, 51.88833], [-2.8818, 51.93196], [-2.97111, 51.90456], [-3.12638, 52.08114], [-3.09289, 52.20546], [-3.00785, 52.2753], [-2.99701, 52.323], [-2.95364, 52.3501], [-3.04687, 52.34504], [-3.22754, 52.42526], [-3.22971, 52.45344], [-3.13359, 52.49174], [-3.03603, 52.49969], [-2.99701, 52.551], [-3.00929, 52.57774], [-3.08662, 52.54811], [-3.09746, 52.53077], [-3.12926, 52.5286], [-3.13648, 52.58208], [-3.04398, 52.65435], [-3.01724, 52.72083], [-2.95581, 52.71794], [-3.01001, 52.76636], [-3.08734, 52.77504], [-3.16105, 52.79599], [-3.15744, 52.84947], [-3.13576, 52.895], [-2.97243, 52.9651], [-2.92401, 52.93836], [-2.85897, 52.94487], [-2.80549, 52.89428], [-2.72221, 52.92969], [-2.7251, 52.98389], [-2.83133, 52.99184], [-2.89131, 53.09374], [-2.87469, 53.12337], [-2.90649, 53.10964], [-2.98598, 53.15589], [-2.92022, 53.17685], [-2.92329, 53.19383], [-3.03675, 53.25092], [-3.08228, 53.25526], [-3.5082, 53.54318]]]] } },
+ { type: "Feature", properties: { wikidata: "Q26", nameEn: "Northern Ireland", aliases: ["GB-NIR"], country: "GB", groups: ["Q22890", "Q3336843", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-6.34755, 55.49206], [-7.2471, 55.06933], [-7.34464, 55.04688], [-7.4033, 55.00391], [-7.40004, 54.94498], [-7.44404, 54.9403], [-7.4473, 54.87003], [-7.47626, 54.83084], [-7.54508, 54.79401], [-7.54671, 54.74606], [-7.64449, 54.75265], [-7.75041, 54.7103], [-7.83352, 54.73854], [-7.93293, 54.66603], [-7.70315, 54.62077], [-7.8596, 54.53671], [-7.99812, 54.54427], [-8.04538, 54.48941], [-8.179, 54.46763], [-8.04555, 54.36292], [-7.87101, 54.29299], [-7.8596, 54.21779], [-7.81397, 54.20159], [-7.69501, 54.20731], [-7.55812, 54.12239], [-7.4799, 54.12239], [-7.44567, 54.1539], [-7.32834, 54.11475], [-7.30553, 54.11869], [-7.34005, 54.14698], [-7.29157, 54.17191], [-7.28017, 54.16714], [-7.29687, 54.1354], [-7.29493, 54.12013], [-7.26316, 54.13863], [-7.25012, 54.20063], [-7.14908, 54.22732], [-7.19145, 54.31296], [-7.02034, 54.4212], [-6.87775, 54.34682], [-6.85179, 54.29176], [-6.81583, 54.22791], [-6.74575, 54.18788], [-6.70175, 54.20218], [-6.6382, 54.17071], [-6.66264, 54.0666], [-6.62842, 54.03503], [-6.47849, 54.06947], [-6.36605, 54.07234], [-6.36279, 54.11248], [-6.32694, 54.09337], [-6.29003, 54.11278], [-6.26218, 54.09785], [-5.83481, 53.87749], [-4.69044, 54.3629], [-6.34755, 55.49206]]]] } },
+ { type: "Feature", properties: { wikidata: "Q35", nameEn: "Denmark", country: "DK", groups: ["EU", "154", "150", "UN"], callingCodes: ["45"] }, geometry: { type: "MultiPolygon", coordinates: [[[[12.16597, 56.60205], [10.40861, 58.38489], [7.28637, 57.35913], [8.02459, 55.09613], [8.45719, 55.06747], [8.55769, 54.91837], [8.63979, 54.91069], [8.76387, 54.8948], [8.81178, 54.90518], [8.92795, 54.90452], [9.04629, 54.87249], [9.14275, 54.87421], [9.20571, 54.85841], [9.24631, 54.84726], [9.23445, 54.83432], [9.2474, 54.8112], [9.32771, 54.80602], [9.33849, 54.80233], [9.36496, 54.81749], [9.38532, 54.83968], [9.41213, 54.84254], [9.43155, 54.82586], [9.4659, 54.83131], [9.58937, 54.88785], [9.62734, 54.88057], [9.61187, 54.85548], [9.73563, 54.8247], [9.89314, 54.84171], [10.16755, 54.73883], [10.31111, 54.65968], [11.00303, 54.63689], [11.90309, 54.38543], [12.85844, 54.82438], [13.93395, 54.84044], [15.36991, 54.73263], [15.79951, 55.54655], [14.89259, 55.5623], [14.28399, 55.1553], [12.84405, 55.13257], [12.60345, 55.42675], [12.88472, 55.63369], [12.6372, 55.91371], [12.65312, 56.04345], [12.07466, 56.29488], [12.16597, 56.60205]]]] } },
+ { type: "Feature", properties: { wikidata: "Q55", nameEn: "Netherlands", country: "NL", groups: ["EU", "155", "150", "UN"], callingCodes: ["31"] }, geometry: { type: "MultiPolygon", coordinates: [[[[5.45168, 54.20039], [2.56575, 51.85301], [3.36263, 51.37112], [3.38696, 51.33436], [3.35847, 51.31572], [3.38289, 51.27331], [3.41704, 51.25933], [3.43488, 51.24135], [3.52698, 51.2458], [3.51502, 51.28697], [3.58939, 51.30064], [3.78999, 51.25766], [3.78783, 51.2151], [3.90125, 51.20371], [3.97889, 51.22537], [4.01957, 51.24504], [4.05165, 51.24171], [4.16721, 51.29348], [4.24024, 51.35371], [4.21923, 51.37443], [4.33265, 51.37687], [4.34086, 51.35738], [4.39292, 51.35547], [4.43777, 51.36989], [4.38064, 51.41965], [4.39747, 51.43316], [4.38122, 51.44905], [4.47736, 51.4778], [4.5388, 51.48184], [4.54675, 51.47265], [4.52846, 51.45002], [4.53521, 51.4243], [4.57489, 51.4324], [4.65442, 51.42352], [4.72935, 51.48424], [4.74578, 51.48937], [4.77321, 51.50529], [4.78803, 51.50284], [4.84139, 51.4799], [4.82409, 51.44736], [4.82946, 51.4213], [4.78314, 51.43319], [4.76577, 51.43046], [4.77229, 51.41337], [4.78941, 51.41102], [4.84988, 51.41502], [4.90016, 51.41404], [4.92152, 51.39487], [5.00393, 51.44406], [5.0106, 51.47167], [5.03281, 51.48679], [5.04774, 51.47022], [5.07891, 51.4715], [5.10456, 51.43163], [5.07102, 51.39469], [5.13105, 51.34791], [5.13377, 51.31592], [5.16222, 51.31035], [5.2002, 51.32243], [5.24244, 51.30495], [5.22542, 51.26888], [5.23814, 51.26064], [5.26461, 51.26693], [5.29716, 51.26104], [5.33886, 51.26314], [5.347, 51.27502], [5.41672, 51.26248], [5.4407, 51.28169], [5.46519, 51.2849], [5.48476, 51.30053], [5.515, 51.29462], [5.5569, 51.26544], [5.5603, 51.22249], [5.65145, 51.19788], [5.65528, 51.18736], [5.70344, 51.1829], [5.74617, 51.18928], [5.77735, 51.17845], [5.77697, 51.1522], [5.82564, 51.16753], [5.85508, 51.14445], [5.80798, 51.11661], [5.8109, 51.10861], [5.83226, 51.10585], [5.82921, 51.09328], [5.79903, 51.09371], [5.79835, 51.05834], [5.77258, 51.06196], [5.75961, 51.03113], [5.77688, 51.02483], [5.76242, 50.99703], [5.71864, 50.96092], [5.72875, 50.95428], [5.74752, 50.96202], [5.75927, 50.95601], [5.74644, 50.94723], [5.72545, 50.92312], [5.72644, 50.91167], [5.71626, 50.90796], [5.69858, 50.91046], [5.67886, 50.88142], [5.64504, 50.87107], [5.64009, 50.84742], [5.65259, 50.82309], [5.70118, 50.80764], [5.68995, 50.79641], [5.70107, 50.7827], [5.68091, 50.75804], [5.69469, 50.75529], [5.72216, 50.76398], [5.73904, 50.75674], [5.74356, 50.7691], [5.76533, 50.78159], [5.77513, 50.78308], [5.80673, 50.7558], [5.84548, 50.76542], [5.84888, 50.75448], [5.88734, 50.77092], [5.89129, 50.75125], [5.89132, 50.75124], [5.95942, 50.7622], [5.97545, 50.75441], [6.01976, 50.75398], [6.02624, 50.77453], [5.97497, 50.79992], [5.98404, 50.80988], [6.00462, 50.80065], [6.02328, 50.81694], [6.01921, 50.84435], [6.05623, 50.8572], [6.05702, 50.85179], [6.07431, 50.84674], [6.07693, 50.86025], [6.08805, 50.87223], [6.07486, 50.89307], [6.09297, 50.92066], [6.01615, 50.93367], [6.02697, 50.98303], [5.95282, 50.98728], [5.90296, 50.97356], [5.90493, 51.00198], [5.87849, 51.01969], [5.86735, 51.05182], [5.9134, 51.06736], [5.9541, 51.03496], [5.98292, 51.07469], [6.16706, 51.15677], [6.17384, 51.19589], [6.07889, 51.17038], [6.07889, 51.24432], [6.16977, 51.33169], [6.22674, 51.36135], [6.22641, 51.39948], [6.20654, 51.40049], [6.21724, 51.48568], [6.18017, 51.54096], [6.09055, 51.60564], [6.11759, 51.65609], [6.02767, 51.6742], [6.04091, 51.71821], [5.95003, 51.7493], [5.98665, 51.76944], [5.94568, 51.82786], [5.99848, 51.83195], [6.06705, 51.86136], [6.10337, 51.84829], [6.16902, 51.84094], [6.11551, 51.89769], [6.15349, 51.90439], [6.21443, 51.86801], [6.29872, 51.86801], [6.30593, 51.84998], [6.40704, 51.82771], [6.38815, 51.87257], [6.47179, 51.85395], [6.50231, 51.86313], [6.58556, 51.89386], [6.68386, 51.91861], [6.72319, 51.89518], [6.82357, 51.96711], [6.83035, 51.9905], [6.68128, 52.05052], [6.76117, 52.11895], [6.83984, 52.11728], [6.97189, 52.20329], [6.9897, 52.2271], [7.03729, 52.22695], [7.06365, 52.23789], [7.02703, 52.27941], [7.07044, 52.37805], [7.03417, 52.40237], [6.99041, 52.47235], [6.94293, 52.43597], [6.69507, 52.488], [6.71641, 52.62905], [6.77307, 52.65375], [7.04557, 52.63318], [7.07253, 52.81083], [7.21694, 53.00742], [7.17898, 53.13817], [7.22681, 53.18165], [7.21679, 53.20058], [7.19052, 53.31866], [7.00198, 53.32672], [6.91025, 53.44221], [5.45168, 54.20039]], [[4.93295, 51.44945], [4.95244, 51.45207], [4.9524, 51.45014], [4.93909, 51.44632], [4.93295, 51.44945]], [[4.91493, 51.4353], [4.91935, 51.43634], [4.92227, 51.44252], [4.91811, 51.44621], [4.92287, 51.44741], [4.92811, 51.4437], [4.92566, 51.44273], [4.92815, 51.43856], [4.92879, 51.44161], [4.93544, 51.44634], [4.94025, 51.44193], [4.93416, 51.44185], [4.93471, 51.43861], [4.94265, 51.44003], [4.93986, 51.43064], [4.92952, 51.42984], [4.92652, 51.43329], [4.91493, 51.4353]]]] } },
+ { type: "Feature", properties: { wikidata: "Q782", nameEn: "Hawaii", aliases: ["US-HI"], country: "US", groups: ["Q35657", "061", "009", "UN"], roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-177.8563, 29.18961], [-179.49839, 27.86265], [-151.6784, 9.55515], [-154.05867, 45.51124], [-177.5224, 27.7635], [-177.8563, 29.18961]]]] } },
+ { type: "Feature", properties: { wikidata: "Q797", nameEn: "Alaska", aliases: ["US-AK"], country: "US", groups: ["Q35657", "021", "003", "019", "UN"], roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[169.34848, 52.47228], [180, 51.0171], [179.84401, 55.10087], [169.34848, 52.47228]]], [[[-168.95635, 65.98512], [-169.03888, 65.48473], [-172.76104, 63.77445], [-179.55295, 57.62081], [-179.55295, 50.81807], [-133.92876, 54.62289], [-130.61931, 54.70835], [-130.64499, 54.76912], [-130.44184, 54.85377], [-130.27203, 54.97174], [-130.18765, 55.07744], [-130.08035, 55.21556], [-129.97513, 55.28029], [-130.15373, 55.74895], [-130.00857, 55.91344], [-130.00093, 56.00325], [-130.10173, 56.12178], [-130.33965, 56.10849], [-130.77769, 56.36185], [-131.8271, 56.62247], [-133.38523, 58.42773], [-133.84645, 58.73543], [-134.27175, 58.8634], [-134.48059, 59.13231], [-134.55699, 59.1297], [-134.7047, 59.2458], [-135.00267, 59.28745], [-135.03069, 59.56208], [-135.48007, 59.79937], [-136.31566, 59.59083], [-136.22381, 59.55526], [-136.33727, 59.44466], [-136.47323, 59.46617], [-136.52365, 59.16752], [-136.82619, 59.16198], [-137.4925, 58.89415], [-137.60623, 59.24465], [-138.62145, 59.76431], [-138.71149, 59.90728], [-139.05365, 59.99655], [-139.20603, 60.08896], [-139.05831, 60.35205], [-139.68991, 60.33693], [-139.98024, 60.18027], [-140.45648, 60.30919], [-140.5227, 60.22077], [-141.00116, 60.30648], [-140.97446, 84.39275], [-168.25765, 71.99091], [-168.95635, 65.98512]]]] } },
+ { type: "Feature", properties: { wikidata: "Q3492", nameEn: "Sumatra", aliases: ["ID-SM"], country: "ID", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[109.82788, 2.86812], [110.90339, 7.52694], [105.01437, 3.24936], [104.56723, 1.44271], [104.34728, 1.33529], [104.12282, 1.27714], [104.03085, 1.26954], [103.74084, 1.12902], [103.66049, 1.18825], [103.56591, 1.19719], [103.03657, 1.30383], [96.11174, 6.69841], [74.28481, -3.17525], [102.92489, -8.17146], [106.32259, -5.50116], [106.38511, -5.16715], [109.17017, -4.07401], [109.3962, -2.07276], [108.50935, -2.01066], [107.94791, 1.06924], [109.82788, 2.86812]]]] } },
+ { type: "Feature", properties: { wikidata: "Q3757", nameEn: "Java", aliases: ["ID-JW"], country: "ID", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[109.17017, -4.07401], [106.38511, -5.16715], [106.32259, -5.50116], [102.92489, -8.17146], [116.22542, -10.49172], [114.39575, -8.2889], [114.42235, -8.09762], [114.92859, -7.49253], [116.33992, -7.56171], [116.58433, -5.30385], [109.17017, -4.07401]]]] } },
+ { type: "Feature", properties: { wikidata: "Q3795", nameEn: "Kalimantan", aliases: ["ID-KA"], country: "ID", groups: ["Q36117", "035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[120.02464, 2.83703], [118.06469, 4.16638], [117.67641, 4.16535], [117.47313, 4.18857], [117.25801, 4.35108], [115.90217, 4.37708], [115.58276, 3.93499], [115.53713, 3.14776], [115.11343, 2.82879], [115.1721, 2.49671], [114.80706, 2.21665], [114.80706, 1.92351], [114.57892, 1.5], [114.03788, 1.44787], [113.64677, 1.23933], [113.01448, 1.42832], [113.021, 1.57819], [112.48648, 1.56516], [112.2127, 1.44135], [112.15679, 1.17004], [111.94553, 1.12016], [111.82846, 0.99349], [111.55434, 0.97864], [111.22979, 1.08326], [110.62374, 0.873], [110.49182, 0.88088], [110.35354, 0.98869], [109.66397, 1.60425], [109.66397, 1.79972], [109.57923, 1.80624], [109.53794, 1.91771], [109.62558, 1.99182], [109.82788, 2.86812], [107.94791, 1.06924], [108.50935, -2.01066], [109.3962, -2.07276], [109.17017, -4.07401], [116.58433, -5.30385], [120.02464, 2.83703]]]] } },
+ { type: "Feature", properties: { wikidata: "Q3803", nameEn: "Lesser Sunda Islands", aliases: ["ID-NU"], country: "ID", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[116.96967, -8.01483], [114.92859, -7.49253], [114.42235, -8.09762], [114.39575, -8.2889], [116.22542, -10.49172], [122.14954, -11.52517], [125.68138, -9.85176], [125.09025, -9.46406], [124.97892, -9.19281], [125.04044, -9.17093], [125.09434, -9.19669], [125.18907, -9.16434], [125.18632, -9.03142], [125.11764, -8.96359], [124.97742, -9.08128], [124.94011, -8.85617], [124.46701, -9.13002], [124.45971, -9.30263], [124.38554, -9.3582], [124.35258, -9.43002], [124.3535, -9.48493], [124.28115, -9.50453], [124.28115, -9.42189], [124.21247, -9.36904], [124.14517, -9.42324], [124.10539, -9.41206], [124.04286, -9.34243], [124.04628, -9.22671], [124.33472, -9.11416], [124.92337, -8.75859], [125.87688, -7.49892], [116.96967, -8.01483]]]] } },
+ { type: "Feature", properties: { wikidata: "Q3812", nameEn: "Sulawesi", aliases: ["ID-SL"], country: "ID", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[128.34321, 3.90322], [126.69413, 6.02692], [119.56457, 0.90759], [116.58433, -5.30385], [116.33992, -7.56171], [116.96967, -8.01483], [125.87688, -7.49892], [123.78965, -0.86805], [128.34321, 3.90322]]]] } },
+ { type: "Feature", properties: { wikidata: "Q3827", nameEn: "Maluku Islands", aliases: ["ID-ML"], country: "ID", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[129.63187, 2.21409], [128.34321, 3.90322], [123.78965, -0.86805], [125.87688, -7.49892], [125.58506, -7.95311], [125.87691, -8.31789], [127.42116, -8.22471], [127.55165, -9.05052], [135.49042, -9.2276], [135.35517, -5.01442], [132.8312, -4.70282], [130.8468, -2.61103], [128.40647, -2.30349], [129.71519, -0.24692], [129.63187, 2.21409]]]] } },
+ { type: "Feature", properties: { wikidata: "Q3845", nameEn: "Western New Guinea", aliases: ["ID-PP"], country: "ID", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[135.49042, -9.2276], [141.01842, -9.35091], [141.01763, -6.90181], [140.90448, -6.85033], [140.85295, -6.72996], [140.99813, -6.3233], [141.02352, 0.08993], [129.63187, 2.21409], [129.71519, -0.24692], [128.40647, -2.30349], [130.8468, -2.61103], [132.8312, -4.70282], [135.35517, -5.01442], [135.49042, -9.2276]]]] } },
+ { type: "Feature", properties: { wikidata: "Q5765", nameEn: "Balearic Islands", aliases: ["ES-IB"], country: "ES", groups: ["EU", "039", "150", "UN"], callingCodes: ["34 971"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.27707, 35.35051], [5.10072, 39.89531], [3.75438, 42.33445], [-2.27707, 35.35051]]]] } },
+ { type: "Feature", properties: { wikidata: "Q5823", nameEn: "Ceuta", aliases: ["ES-CE"], country: "ES", groups: ["EA", "EU", "015", "002", "UN"], level: "subterritory", callingCodes: ["34"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-5.38491, 35.92591], [-5.37338, 35.88417], [-5.35844, 35.87375], [-5.34379, 35.8711], [-5.21179, 35.90091], [-5.38491, 35.92591]]]] } },
+ { type: "Feature", properties: { wikidata: "Q5831", nameEn: "Melilla", aliases: ["ES-ML"], country: "ES", groups: ["EA", "EU", "015", "002", "UN"], level: "subterritory", callingCodes: ["34"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.91909, 35.33927], [-2.96038, 35.31609], [-2.96648, 35.30475], [-2.96978, 35.29459], [-2.97035, 35.28852], [-2.96507, 35.28801], [-2.96826, 35.28296], [-2.96516, 35.27967], [-2.95431, 35.2728], [-2.95065, 35.26576], [-2.93893, 35.26737], [-2.92272, 35.27509], [-2.91909, 35.33927]]]] } },
+ { type: "Feature", properties: { wikidata: "Q7835", nameEn: "Crimea", country: "RU", groups: ["151", "150", "UN"], level: "subterritory", callingCodes: ["7"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.5, 44], [36.4883, 45.0488], [36.475, 45.2411], [36.5049, 45.3136], [36.6545, 45.3417], [36.6645, 45.4514], [35.0498, 45.7683], [34.9601, 45.7563], [34.7991, 45.8101], [34.8015, 45.9005], [34.7548, 45.907], [34.6668, 45.9714], [34.6086, 45.9935], [34.5589, 45.9935], [34.5201, 45.951], [34.4873, 45.9427], [34.4415, 45.9599], [34.4122, 46.0025], [34.3391, 46.0611], [34.2511, 46.0532], [34.181, 46.068], [34.1293, 46.1049], [34.0731, 46.1177], [34.0527, 46.1084], [33.9155, 46.1594], [33.8523, 46.1986], [33.7972, 46.2048], [33.7405, 46.1855], [33.646, 46.2303], [33.6152, 46.2261], [33.6385, 46.1415], [33.6147, 46.1356], [33.5732, 46.1032], [33.5909, 46.0601], [33.5597, 46.0307], [31.5, 45.5], [33.5, 44]]]] } },
+ { type: "Feature", properties: { wikidata: "Q12837", nameEn: "Iberia", level: "sharedLandform" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q14056", nameEn: "Jan Mayen", aliases: ["NO-22"], country: "NO", groups: ["SJ", "154", "150", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[-9.18243, 72.23144], [-10.71459, 70.09565], [-5.93364, 70.76368], [-9.18243, 72.23144]]]] } },
+ { type: "Feature", properties: { wikidata: "Q19188", nameEn: "Mainland China", country: "CN", groups: ["030", "142", "UN"], callingCodes: ["86"] }, geometry: { type: "MultiPolygon", coordinates: [[[[125.6131, 53.07229], [125.17522, 53.20225], [124.46078, 53.21881], [123.86158, 53.49391], [123.26989, 53.54843], [122.85966, 53.47395], [122.35063, 53.49565], [121.39213, 53.31888], [120.85633, 53.28499], [120.0451, 52.7359], [120.04049, 52.58773], [120.46454, 52.63811], [120.71673, 52.54099], [120.61346, 52.32447], [120.77337, 52.20805], [120.65907, 51.93544], [120.10963, 51.671], [119.13553, 50.37412], [119.38598, 50.35162], [119.27996, 50.13348], [119.11003, 50.00276], [118.61623, 49.93809], [117.82343, 49.52696], [117.48208, 49.62324], [117.27597, 49.62544], [116.71193, 49.83813], [116.03781, 48.87014], [116.06565, 48.81716], [115.78876, 48.51781], [115.811, 48.25699], [115.52082, 48.15367], [115.57128, 47.91988], [115.94296, 47.67741], [116.21879, 47.88505], [116.4465, 47.83662], [116.67405, 47.89039], [116.9723, 47.87285], [117.37875, 47.63627], [117.50181, 47.77216], [117.80196, 48.01661], [118.03676, 48.00982], [118.11009, 48.04], [118.22677, 48.03853], [118.29654, 48.00246], [118.55766, 47.99277], [118.7564, 47.76947], [119.12343, 47.66458], [119.13995, 47.53997], [119.35892, 47.48104], [119.31964, 47.42617], [119.54918, 47.29505], [119.56019, 47.24874], [119.62403, 47.24575], [119.71209, 47.19192], [119.85518, 46.92196], [119.91242, 46.90091], [119.89261, 46.66423], [119.80455, 46.67631], [119.77373, 46.62947], [119.68127, 46.59015], [119.65265, 46.62342], [119.42827, 46.63783], [119.32827, 46.61433], [119.24978, 46.64761], [119.10448, 46.65516], [119.00541, 46.74273], [118.92616, 46.72765], [118.89974, 46.77139], [118.8337, 46.77742], [118.78747, 46.68689], [118.30534, 46.73519], [117.69554, 46.50991], [117.60748, 46.59771], [117.41782, 46.57862], [117.36609, 46.36335], [116.83166, 46.38637], [116.75551, 46.33083], [116.58612, 46.30211], [116.26678, 45.96479], [116.24012, 45.8778], [116.27366, 45.78637], [116.16989, 45.68603], [115.60329, 45.44717], [114.94546, 45.37377], [114.74612, 45.43585], [114.54801, 45.38337], [114.5166, 45.27189], [113.70918, 44.72891], [112.74662, 44.86297], [112.4164, 45.06858], [111.98695, 45.09074], [111.76275, 44.98032], [111.40498, 44.3461], [111.96289, 43.81596], [111.93776, 43.68709], [111.79758, 43.6637], [111.59087, 43.51207], [111.0149, 43.3289], [110.4327, 42.78293], [110.08401, 42.6411], [109.89402, 42.63111], [109.452, 42.44842], [109.00679, 42.45302], [108.84489, 42.40246], [107.57258, 42.40898], [107.49681, 42.46221], [107.29755, 42.41395], [107.24774, 42.36107], [106.76517, 42.28741], [105.0123, 41.63188], [104.51667, 41.66113], [104.52258, 41.8706], [103.92804, 41.78246], [102.72403, 42.14675], [102.07645, 42.22519], [101.80515, 42.50074], [100.84979, 42.67087], [100.33297, 42.68231], [99.50671, 42.56535], [97.1777, 42.7964], [96.37926, 42.72055], [96.35658, 42.90363], [95.89543, 43.2528], [95.52594, 43.99353], [95.32891, 44.02407], [95.39772, 44.2805], [95.01191, 44.25274], [94.71959, 44.35284], [94.10003, 44.71016], [93.51161, 44.95964], [91.64048, 45.07408], [90.89169, 45.19667], [90.65114, 45.49314], [90.70907, 45.73437], [91.03026, 46.04194], [90.99672, 46.14207], [90.89639, 46.30711], [91.07696, 46.57315], [91.0147, 46.58171], [91.03649, 46.72916], [90.84035, 46.99525], [90.76108, 46.99399], [90.48542, 47.30438], [90.48854, 47.41826], [90.33598, 47.68303], [90.10871, 47.7375], [90.06512, 47.88177], [89.76624, 47.82745], [89.55453, 48.0423], [89.0711, 47.98528], [88.93186, 48.10263], [88.8011, 48.11302], [88.58316, 48.21893], [88.58939, 48.34531], [87.96361, 48.58478], [88.0788, 48.71436], [87.73822, 48.89582], [87.88171, 48.95853], [87.81333, 49.17354], [87.48983, 49.13794], [87.478, 49.07403], [87.28386, 49.11626], [86.87238, 49.12432], [86.73568, 48.99918], [86.75343, 48.70331], [86.38069, 48.46064], [85.73581, 48.3939], [85.5169, 48.05493], [85.61067, 47.49753], [85.69696, 47.2898], [85.54294, 47.06171], [85.22443, 47.04816], [84.93995, 46.87399], [84.73077, 47.01394], [83.92184, 46.98912], [83.04622, 47.19053], [82.21792, 45.56619], [82.58474, 45.40027], [82.51374, 45.1755], [81.73278, 45.3504], [80.11169, 45.03352], [79.8987, 44.89957], [80.38384, 44.63073], [80.40229, 44.23319], [80.40031, 44.10986], [80.75156, 43.44948], [80.69718, 43.32589], [80.77771, 43.30065], [80.78817, 43.14235], [80.62913, 43.141], [80.3735, 43.01557], [80.58999, 42.9011], [80.38169, 42.83142], [80.26886, 42.8366], [80.16892, 42.61137], [80.26841, 42.23797], [80.17807, 42.21166], [80.17842, 42.03211], [79.92977, 42.04113], [78.3732, 41.39603], [78.15757, 41.38565], [78.12873, 41.23091], [77.81287, 41.14307], [77.76206, 41.01574], [77.52723, 41.00227], [77.3693, 41.0375], [77.28004, 41.0033], [76.99302, 41.0696], [76.75681, 40.95354], [76.5261, 40.46114], [76.33659, 40.3482], [75.96168, 40.38064], [75.91361, 40.2948], [75.69663, 40.28642], [75.5854, 40.66874], [75.22834, 40.45382], [75.08243, 40.43945], [74.82013, 40.52197], [74.78168, 40.44886], [74.85996, 40.32857], [74.69875, 40.34668], [74.35063, 40.09742], [74.25533, 40.13191], [73.97049, 40.04378], [73.83006, 39.76136], [73.9051, 39.75073], [73.92354, 39.69565], [73.94683, 39.60733], [73.87018, 39.47879], [73.59831, 39.46425], [73.59241, 39.40843], [73.5004, 39.38402], [73.55396, 39.3543], [73.54572, 39.27567], [73.60638, 39.24534], [73.75823, 39.023], [73.81728, 39.04007], [73.82964, 38.91517], [73.7445, 38.93867], [73.7033, 38.84782], [73.80656, 38.66449], [73.79806, 38.61106], [73.97933, 38.52945], [74.17022, 38.65504], [74.51217, 38.47034], [74.69619, 38.42947], [74.69894, 38.22155], [74.80331, 38.19889], [74.82665, 38.07359], [74.9063, 38.03033], [74.92416, 37.83428], [75.00935, 37.77486], [74.8912, 37.67576], [74.94338, 37.55501], [75.06011, 37.52779], [75.15899, 37.41443], [75.09719, 37.37297], [75.12328, 37.31839], [74.88887, 37.23275], [74.80605, 37.21565], [74.49981, 37.24518], [74.56453, 37.03023], [75.13839, 37.02622], [75.40481, 36.95382], [75.45562, 36.71971], [75.72737, 36.7529], [75.92391, 36.56986], [76.0324, 36.41198], [76.00906, 36.17511], [75.93028, 36.13136], [76.15325, 35.9264], [76.14913, 35.82848], [76.33453, 35.84296], [76.50961, 35.8908], [76.77323, 35.66062], [76.84539, 35.67356], [76.96624, 35.5932], [77.44277, 35.46132], [77.70232, 35.46244], [77.80532, 35.52058], [78.11664, 35.48022], [78.03466, 35.3785], [78.00033, 35.23954], [78.22692, 34.88771], [78.18435, 34.7998], [78.27781, 34.61484], [78.54964, 34.57283], [78.56475, 34.50835], [78.74465, 34.45174], [79.05364, 34.32482], [78.99802, 34.3027], [78.91769, 34.15452], [78.66225, 34.08858], [78.65657, 34.03195], [78.73367, 34.01121], [78.77349, 33.73871], [78.67599, 33.66445], [78.73636, 33.56521], [79.15252, 33.17156], [79.14016, 33.02545], [79.46562, 32.69668], [79.26768, 32.53277], [79.13174, 32.47766], [79.0979, 32.38051], [78.99322, 32.37948], [78.96713, 32.33655], [78.7831, 32.46873], [78.73916, 32.69438], [78.38897, 32.53938], [78.4645, 32.45367], [78.49609, 32.2762], [78.68754, 32.10256], [78.74404, 32.00384], [78.78036, 31.99478], [78.69933, 31.78723], [78.84516, 31.60631], [78.71032, 31.50197], [78.77898, 31.31209], [78.89344, 31.30481], [79.01931, 31.42817], [79.14016, 31.43403], [79.30694, 31.17357], [79.59884, 30.93943], [79.93255, 30.88288], [80.20721, 30.58541], [80.54504, 30.44936], [80.83343, 30.32023], [81.03953, 30.20059], [81.12842, 30.01395], [81.24362, 30.0126], [81.29032, 30.08806], [81.2623, 30.14596], [81.33355, 30.15303], [81.39928, 30.21862], [81.41018, 30.42153], [81.5459, 30.37688], [81.62033, 30.44703], [81.99082, 30.33423], [82.10135, 30.35439], [82.10757, 30.23745], [82.19475, 30.16884], [82.16984, 30.0692], [82.38622, 30.02608], [82.5341, 29.9735], [82.73024, 29.81695], [83.07116, 29.61957], [83.28131, 29.56813], [83.44787, 29.30513], [83.63156, 29.16249], [83.82303, 29.30513], [83.97559, 29.33091], [84.18107, 29.23451], [84.24801, 29.02783], [84.2231, 28.89571], [84.47528, 28.74023], [84.62317, 28.73887], [84.85511, 28.58041], [85.06059, 28.68562], [85.19135, 28.62825], [85.18668, 28.54076], [85.10729, 28.34092], [85.38127, 28.28336], [85.4233, 28.32996], [85.59765, 28.30529], [85.60854, 28.25045], [85.69105, 28.38475], [85.71907, 28.38064], [85.74864, 28.23126], [85.84672, 28.18187], [85.90743, 28.05144], [85.97813, 27.99023], [85.94946, 27.9401], [86.06309, 27.90021], [86.12069, 27.93047], [86.08333, 28.02121], [86.088, 28.09264], [86.18607, 28.17364], [86.22966, 27.9786], [86.42736, 27.91122], [86.51609, 27.96623], [86.56265, 28.09569], [86.74181, 28.10638], [86.75582, 28.04182], [87.03757, 27.94835], [87.11696, 27.84104], [87.56996, 27.84517], [87.72718, 27.80938], [87.82681, 27.95248], [88.13378, 27.88015], [88.1278, 27.95417], [88.25332, 27.9478], [88.54858, 28.06057], [88.63235, 28.12356], [88.83559, 28.01936], [88.88091, 27.85192], [88.77517, 27.45415], [88.82981, 27.38814], [88.91901, 27.32483], [88.93678, 27.33777], [88.96947, 27.30319], [89.00216, 27.32532], [88.95355, 27.4106], [88.97213, 27.51671], [89.0582, 27.60985], [89.12825, 27.62502], [89.59525, 28.16433], [89.79762, 28.23979], [90.13387, 28.19178], [90.58842, 28.02838], [90.69894, 28.07784], [91.20019, 27.98715], [91.25779, 28.07509], [91.46327, 28.0064], [91.48973, 27.93903], [91.5629, 27.84823], [91.6469, 27.76358], [91.84722, 27.76325], [91.87057, 27.7195], [92.27432, 27.89077], [92.32101, 27.79363], [92.42538, 27.80092], [92.7275, 27.98662], [92.73025, 28.05814], [92.65472, 28.07632], [92.67486, 28.15018], [92.93075, 28.25671], [93.14635, 28.37035], [93.18069, 28.50319], [93.44621, 28.67189], [93.72797, 28.68821], [94.35897, 29.01965], [94.2752, 29.11687], [94.69318, 29.31739], [94.81353, 29.17804], [95.0978, 29.14446], [95.11291, 29.09527], [95.2214, 29.10727], [95.26122, 29.07727], [95.3038, 29.13847], [95.41091, 29.13007], [95.50842, 29.13487], [95.72086, 29.20797], [95.75149, 29.32063], [95.84899, 29.31464], [96.05361, 29.38167], [96.31316, 29.18643], [96.18682, 29.11087], [96.20467, 29.02325], [96.3626, 29.10607], [96.61391, 28.72742], [96.40929, 28.51526], [96.48895, 28.42955], [96.6455, 28.61657], [96.85561, 28.4875], [96.88445, 28.39452], [96.98882, 28.32564], [97.1289, 28.3619], [97.34547, 28.21385], [97.41729, 28.29783], [97.47085, 28.2688], [97.50518, 28.49716], [97.56835, 28.55628], [97.70705, 28.5056], [97.79632, 28.33168], [97.90069, 28.3776], [98.15337, 28.12114], [98.13964, 27.9478], [98.32641, 27.51385], [98.42529, 27.55404], [98.43353, 27.67086], [98.69582, 27.56499], [98.7333, 26.85615], [98.77547, 26.61994], [98.72741, 26.36183], [98.67797, 26.24487], [98.7329, 26.17218], [98.66884, 26.09165], [98.63128, 26.15492], [98.57085, 26.11547], [98.60763, 26.01512], [98.70818, 25.86241], [98.63128, 25.79937], [98.54064, 25.85129], [98.40606, 25.61129], [98.31268, 25.55307], [98.25774, 25.6051], [98.16848, 25.62739], [98.18084, 25.56298], [98.12591, 25.50722], [98.14925, 25.41547], [97.92541, 25.20815], [97.83614, 25.2715], [97.77023, 25.11492], [97.72216, 25.08508], [97.72903, 24.91332], [97.79949, 24.85655], [97.76481, 24.8289], [97.73127, 24.83015], [97.70181, 24.84557], [97.64354, 24.79171], [97.56648, 24.76475], [97.56383, 24.75535], [97.5542, 24.74943], [97.54675, 24.74202], [97.56525, 24.72838], [97.56286, 24.54535], [97.52757, 24.43748], [97.60029, 24.4401], [97.66998, 24.45288], [97.7098, 24.35658], [97.65624, 24.33781], [97.66723, 24.30027], [97.71941, 24.29652], [97.76799, 24.26365], [97.72998, 24.2302], [97.72799, 24.18883], [97.75305, 24.16902], [97.72903, 24.12606], [97.62363, 24.00506], [97.5247, 23.94032], [97.64667, 23.84574], [97.72302, 23.89288], [97.79456, 23.94836], [97.79416, 23.95663], [97.84328, 23.97603], [97.86545, 23.97723], [97.88811, 23.97446], [97.8955, 23.97758], [97.89676, 23.97931], [97.89683, 23.98389], [97.88814, 23.98605], [97.88414, 23.99405], [97.88616, 24.00463], [97.90998, 24.02094], [97.93951, 24.01953], [97.98691, 24.03897], [97.99583, 24.04932], [98.04709, 24.07616], [98.05302, 24.07408], [98.05671, 24.07961], [98.0607, 24.07812], [98.06703, 24.08028], [98.07806, 24.07988], [98.20666, 24.11406], [98.54476, 24.13119], [98.59256, 24.08371], [98.85319, 24.13042], [98.87998, 24.15624], [98.89632, 24.10612], [98.67797, 23.9644], [98.68209, 23.80492], [98.79607, 23.77947], [98.82933, 23.72921], [98.81775, 23.694], [98.88396, 23.59555], [98.80294, 23.5345], [98.82877, 23.47908], [98.87683, 23.48995], [98.92104, 23.36946], [98.87573, 23.33038], [98.93958, 23.31414], [98.92515, 23.29535], [98.88597, 23.18656], [99.05975, 23.16382], [99.04601, 23.12215], [99.25741, 23.09025], [99.34127, 23.13099], [99.52214, 23.08218], [99.54218, 22.90014], [99.43537, 22.94086], [99.45654, 22.85726], [99.31243, 22.73893], [99.38247, 22.57544], [99.37972, 22.50188], [99.28771, 22.4105], [99.17318, 22.18025], [99.19176, 22.16983], [99.1552, 22.15874], [99.33166, 22.09656], [99.47585, 22.13345], [99.85351, 22.04183], [99.96612, 22.05965], [99.99084, 21.97053], [99.94003, 21.82782], [99.98654, 21.71064], [100.04956, 21.66843], [100.12679, 21.70539], [100.17486, 21.65306], [100.10757, 21.59945], [100.12542, 21.50365], [100.1625, 21.48704], [100.18447, 21.51898], [100.25863, 21.47043], [100.35201, 21.53176], [100.42892, 21.54325], [100.4811, 21.46148], [100.57861, 21.45637], [100.72143, 21.51898], [100.87265, 21.67396], [101.11744, 21.77659], [101.15156, 21.56129], [101.2124, 21.56422], [101.19349, 21.41959], [101.26912, 21.36482], [101.2229, 21.23271], [101.29326, 21.17254], [101.54563, 21.25668], [101.6068, 21.23329], [101.59491, 21.18621], [101.60886, 21.17947], [101.66977, 21.20004], [101.70548, 21.14911], [101.7622, 21.14813], [101.79266, 21.19025], [101.76745, 21.21571], [101.83887, 21.20983], [101.84412, 21.25291], [101.74014, 21.30967], [101.74224, 21.48276], [101.7727, 21.51794], [101.7475, 21.5873], [101.80001, 21.57461], [101.83257, 21.61562], [101.74555, 21.72852], [101.7791, 21.83019], [101.62566, 21.96574], [101.57525, 22.13026], [101.60675, 22.13513], [101.53638, 22.24794], [101.56789, 22.28876], [101.61306, 22.27515], [101.68973, 22.46843], [101.7685, 22.50337], [101.86828, 22.38397], [101.90714, 22.38688], [101.91344, 22.44417], [101.98487, 22.42766], [102.03633, 22.46164], [102.1245, 22.43372], [102.14099, 22.40092], [102.16621, 22.43336], [102.26428, 22.41321], [102.25339, 22.4607], [102.41061, 22.64184], [102.38415, 22.67919], [102.42618, 22.69212], [102.46665, 22.77108], [102.51802, 22.77969], [102.57095, 22.7036], [102.60675, 22.73376], [102.8636, 22.60735], [102.9321, 22.48659], [103.0722, 22.44775], [103.07843, 22.50097], [103.17961, 22.55705], [103.15782, 22.59873], [103.18895, 22.64471], [103.28079, 22.68063], [103.32282, 22.8127], [103.43179, 22.75816], [103.43646, 22.70648], [103.52675, 22.59155], [103.57812, 22.65764], [103.56255, 22.69499], [103.64506, 22.79979], [103.87904, 22.56683], [103.93286, 22.52703], [103.94513, 22.52553], [103.95191, 22.5134], [103.96352, 22.50584], [103.96783, 22.51173], [103.97384, 22.50634], [103.99247, 22.51958], [104.01088, 22.51823], [104.03734, 22.72945], [104.11384, 22.80363], [104.27084, 22.8457], [104.25683, 22.76534], [104.35593, 22.69353], [104.47225, 22.75813], [104.58122, 22.85571], [104.60457, 22.81841], [104.65283, 22.83419], [104.72755, 22.81984], [104.77114, 22.90017], [104.84942, 22.93631], [104.86765, 22.95178], [104.8334, 23.01484], [104.79478, 23.12934], [104.87382, 23.12854], [104.87992, 23.17141], [104.91435, 23.18666], [104.9486, 23.17235], [104.96532, 23.20463], [104.98712, 23.19176], [105.07002, 23.26248], [105.11672, 23.25247], [105.17276, 23.28679], [105.22569, 23.27249], [105.32376, 23.39684], [105.40782, 23.28107], [105.42805, 23.30824], [105.49966, 23.20669], [105.56037, 23.16806], [105.57594, 23.075], [105.72382, 23.06641], [105.8726, 22.92756], [105.90119, 22.94168], [105.99568, 22.94178], [106.00179, 22.99049], [106.19705, 22.98475], [106.27022, 22.87722], [106.34961, 22.86718], [106.49749, 22.91164], [106.51306, 22.94891], [106.55976, 22.92311], [106.60179, 22.92884], [106.6516, 22.86862], [106.6734, 22.89587], [106.71387, 22.88296], [106.71128, 22.85982], [106.78422, 22.81532], [106.81271, 22.8226], [106.83685, 22.8098], [106.82404, 22.7881], [106.76293, 22.73491], [106.72321, 22.63606], [106.71698, 22.58432], [106.65316, 22.5757], [106.61269, 22.60301], [106.58395, 22.474], [106.55665, 22.46498], [106.57221, 22.37], [106.55976, 22.34841], [106.6516, 22.33977], [106.69986, 22.22309], [106.67495, 22.1885], [106.6983, 22.15102], [106.70142, 22.02409], [106.68274, 21.99811], [106.69276, 21.96013], [106.72551, 21.97923], [106.74345, 22.00965], [106.81038, 21.97934], [106.9178, 21.97357], [106.92714, 21.93459], [106.97228, 21.92592], [106.99252, 21.95191], [107.05634, 21.92303], [107.06101, 21.88982], [107.00964, 21.85948], [107.02615, 21.81981], [107.10771, 21.79879], [107.20734, 21.71493], [107.24625, 21.7077], [107.29296, 21.74674], [107.35834, 21.6672], [107.35989, 21.60063], [107.38636, 21.59774], [107.41593, 21.64839], [107.47197, 21.6672], [107.49532, 21.62958], [107.49065, 21.59774], [107.54047, 21.5934], [107.56537, 21.61945], [107.66967, 21.60787], [107.80355, 21.66141], [107.86114, 21.65128], [107.90006, 21.5905], [107.92652, 21.58906], [107.95232, 21.5388], [107.96774, 21.53601], [107.97074, 21.54072], [107.97383, 21.53961], [107.97932, 21.54503], [108.02926, 21.54997], [108.0569, 21.53604], [108.10003, 21.47338], [108.00365, 17.98159], [111.60491, 13.57105], [118.41371, 24.06775], [118.11703, 24.39734], [118.28244, 24.51231], [118.35291, 24.51645], [118.42453, 24.54644], [118.56434, 24.49266], [120.49232, 25.22863], [121.03532, 26.8787], [123.5458, 31.01942], [122.29378, 31.76513], [122.80525, 33.30571], [123.85601, 37.49093], [123.90497, 38.79949], [124.17532, 39.8232], [124.23201, 39.9248], [124.35029, 39.95639], [124.37089, 40.03004], [124.3322, 40.05573], [124.38556, 40.11047], [124.40719, 40.13655], [124.86913, 40.45387], [125.71172, 40.85223], [125.76869, 40.87908], [126.00335, 40.92835], [126.242, 41.15454], [126.53189, 41.35206], [126.60631, 41.65565], [126.90729, 41.79955], [127.17841, 41.59714], [127.29712, 41.49473], [127.92943, 41.44291], [128.02633, 41.42103], [128.03311, 41.39232], [128.12967, 41.37931], [128.18546, 41.41279], [128.20061, 41.40895], [128.30716, 41.60322], [128.15119, 41.74568], [128.04487, 42.01769], [128.94007, 42.03537], [128.96068, 42.06657], [129.15178, 42.17224], [129.22285, 42.26491], [129.22423, 42.3553], [129.28541, 42.41574], [129.42882, 42.44702], [129.54701, 42.37254], [129.60482, 42.44461], [129.72541, 42.43739], [129.75294, 42.59409], [129.77183, 42.69435], [129.7835, 42.76521], [129.80719, 42.79218], [129.83277, 42.86746], [129.85261, 42.96494], [129.8865, 43.00395], [129.95082, 43.01051], [129.96409, 42.97306], [130.12957, 42.98361], [130.09764, 42.91425], [130.26095, 42.9027], [130.23068, 42.80125], [130.2385, 42.71127], [130.41826, 42.6011], [130.44361, 42.54849], [130.50123, 42.61636], [130.55143, 42.52158], [130.62107, 42.58413], [130.56576, 42.68925], [130.40213, 42.70788], [130.44361, 42.76205], [130.66524, 42.84753], [131.02438, 42.86518], [131.02668, 42.91246], [131.135, 42.94114], [131.10274, 43.04734], [131.20414, 43.13654], [131.19031, 43.21385], [131.30324, 43.39498], [131.29402, 43.46695], [131.19492, 43.53047], [131.21105, 43.82383], [131.26176, 43.94011], [131.23583, 43.96085], [131.25484, 44.03131], [131.30365, 44.04262], [131.1108, 44.70266], [130.95639, 44.85154], [131.48415, 44.99513], [131.68466, 45.12374], [131.66852, 45.2196], [131.76532, 45.22609], [131.86903, 45.33636], [131.99417, 45.2567], [132.83978, 45.05916], [132.96373, 45.0212], [133.12293, 45.1332], [133.09279, 45.25693], [133.19419, 45.51913], [133.41083, 45.57723], [133.48457, 45.86203], [133.60442, 45.90053], [133.67569, 45.9759], [133.72695, 46.05576], [133.68047, 46.14697], [133.88097, 46.25066], [133.91496, 46.4274], [133.84104, 46.46681], [134.03538, 46.75668], [134.20016, 47.33458], [134.50898, 47.4812], [134.7671, 47.72051], [134.55508, 47.98651], [134.67098, 48.1564], [134.75328, 48.36763], [134.49516, 48.42884], [132.66989, 47.96491], [132.57309, 47.71741], [131.90448, 47.68011], [131.2635, 47.73325], [131.09871, 47.6852], [130.95985, 47.6957], [130.90915, 47.90623], [130.65103, 48.10052], [130.84462, 48.30942], [130.52147, 48.61745], [130.66946, 48.88251], [130.43232, 48.90844], [130.2355, 48.86741], [129.85416, 49.11067], [129.67598, 49.29596], [129.50685, 49.42398], [129.40398, 49.44194], [129.35317, 49.3481], [129.23232, 49.40353], [129.11153, 49.36813], [128.72896, 49.58676], [127.83476, 49.5748], [127.53516, 49.84306], [127.49299, 50.01251], [127.60515, 50.23503], [127.37384, 50.28393], [127.36009, 50.43787], [127.28765, 50.46585], [127.36335, 50.58306], [127.28165, 50.72075], [127.14586, 50.91152], [126.93135, 51.0841], [126.90369, 51.3238], [126.68349, 51.70607], [126.44606, 51.98254], [126.558, 52.13738], [125.6131, 53.07229]], [[113.56865, 22.20973], [113.57123, 22.20416], [113.60504, 22.20464], [113.63011, 22.10782], [113.57191, 22.07696], [113.54839, 22.10909], [113.54942, 22.14519], [113.54093, 22.15497], [113.52659, 22.18271], [113.53552, 22.20607], [113.53301, 22.21235], [113.53591, 22.21369], [113.54093, 22.21314], [113.54333, 22.21688], [113.5508, 22.21672], [113.56865, 22.20973]], [[114.50148, 22.15017], [113.92195, 22.13873], [113.83338, 22.1826], [113.81621, 22.2163], [113.86771, 22.42972], [114.03113, 22.5065], [114.05438, 22.5026], [114.05729, 22.51104], [114.06272, 22.51617], [114.07267, 22.51855], [114.07817, 22.52997], [114.08606, 22.53276], [114.09048, 22.53716], [114.09692, 22.53435], [114.1034, 22.5352], [114.11181, 22.52878], [114.11656, 22.53415], [114.12665, 22.54003], [114.13823, 22.54319], [114.1482, 22.54091], [114.15123, 22.55163], [114.1597, 22.56041], [114.17247, 22.55944], [114.18338, 22.55444], [114.20655, 22.55706], [114.22185, 22.55343], [114.22888, 22.5436], [114.25154, 22.55977], [114.44998, 22.55977], [114.50148, 22.15017]]]] } },
+ { type: "Feature", properties: { wikidata: "Q22890", nameEn: "Ireland", level: "sharedLandform" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q23666", nameEn: "Great Britain", country: "GB", level: "sharedLandform" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q23681", nameEn: "Northern Cyprus", groups: ["Q644636", "145", "142"], driveSide: "left", callingCodes: ["90 392"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.67678, 35.03866], [33.67742, 35.05963], [33.68474, 35.06602], [33.69095, 35.06237], [33.70861, 35.07644], [33.7161, 35.07279], [33.70209, 35.04882], [33.71482, 35.03722], [33.73824, 35.05321], [33.76106, 35.04253], [33.78581, 35.05104], [33.82067, 35.07826], [33.84168, 35.06823], [33.8541, 35.07201], [33.87479, 35.08881], [33.87097, 35.09389], [33.87622, 35.10457], [33.87224, 35.12293], [33.88561, 35.12449], [33.88943, 35.12007], [33.88737, 35.11408], [33.89853, 35.11377], [33.91789, 35.08688], [33.91299, 35.07579], [33.90247, 35.07686], [33.89485, 35.06873], [33.88367, 35.07877], [33.85261, 35.0574], [33.8355, 35.05777], [33.82051, 35.0667], [33.8012, 35.04786], [33.81524, 35.04192], [33.83055, 35.02865], [33.82875, 35.01685], [33.84045, 35.00616], [33.85216, 35.00579], [33.85891, 35.001], [33.85621, 34.98956], [33.83505, 34.98108], [33.84811, 34.97075], [33.86432, 34.97592], [33.90075, 34.96623], [33.98684, 34.76642], [35.48515, 34.70851], [35.51152, 36.10954], [32.82353, 35.70297], [32.46489, 35.48584], [32.60361, 35.16647], [32.64864, 35.19967], [32.70947, 35.18328], [32.70779, 35.14127], [32.85733, 35.07742], [32.86406, 35.1043], [32.94471, 35.09422], [33.01192, 35.15639], [33.08249, 35.17319], [33.11105, 35.15639], [33.15138, 35.19504], [33.27068, 35.16815], [33.3072, 35.16816], [33.31955, 35.18096], [33.35056, 35.18328], [33.34964, 35.17803], [33.35596, 35.17942], [33.35612, 35.17402], [33.36569, 35.17479], [33.3717, 35.1788], [33.37248, 35.18698], [33.38575, 35.2018], [33.4076, 35.20062], [33.41675, 35.16325], [33.46813, 35.10564], [33.48136, 35.0636], [33.47825, 35.04103], [33.45178, 35.02078], [33.45256, 35.00288], [33.47666, 35.00701], [33.48915, 35.06594], [33.53975, 35.08151], [33.57478, 35.06049], [33.567, 35.04803], [33.59658, 35.03635], [33.61215, 35.0527], [33.63765, 35.03869], [33.67678, 35.03866]]]] } },
+ { type: "Feature", properties: { wikidata: "Q25231", nameEn: "Svalbard", aliases: ["NO-21"], country: "NO", groups: ["SJ", "154", "150", "UN"], level: "subterritory", callingCodes: ["47 79"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-7.49892, 77.24208], [32.07813, 72.01005], [36.85549, 84.09565], [-7.49892, 77.24208]]]] } },
+ { type: "Feature", properties: { wikidata: "Q25263", nameEn: "Azores", aliases: ["PT-20"], country: "PT", groups: ["Q3320166", "Q2914565", "Q105472", "EU", "039", "150", "UN"], callingCodes: ["351"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-23.12984, 40.26428], [-36.43765, 41.39418], [-22.54767, 33.34416], [-23.12984, 40.26428]]]] } },
+ { type: "Feature", properties: { wikidata: "Q25359", nameEn: "Navassa Island", aliases: ["UM-76"], country: "US", groups: ["UM", "Q1352230", "029", "003", "419", "019", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft" }, geometry: { type: "MultiPolygon", coordinates: [[[[-74.7289, 18.71009], [-75.71816, 18.46438], [-74.76465, 18.06252], [-74.7289, 18.71009]]]] } },
+ { type: "Feature", properties: { wikidata: "Q25396", nameEn: "Bonaire", aliases: ["BQ-BO", "NL-BQ1"], country: "NL", groups: ["Q1451600", "BQ", "029", "003", "419", "019", "UN"], level: "subterritory", callingCodes: ["599 7"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-67.89186, 12.4116], [-68.90012, 12.62309], [-68.33524, 11.78151], [-68.01417, 11.77722], [-67.89186, 12.4116]]]] } },
+ { type: "Feature", properties: { wikidata: "Q25528", nameEn: "Saba", aliases: ["BQ-SA", "NL-BQ2"], country: "NL", groups: ["Q1451600", "BQ", "029", "003", "419", "019", "UN"], level: "subterritory", callingCodes: ["599 4"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.07669, 17.79659], [-63.81314, 17.95045], [-63.22932, 17.32592], [-63.07669, 17.79659]]]] } },
+ { type: "Feature", properties: { wikidata: "Q26180", nameEn: "Sint Eustatius", aliases: ["BQ-SE", "NL-BQ3"], country: "NL", groups: ["Q1451600", "BQ", "029", "003", "419", "019", "UN"], level: "subterritory", callingCodes: ["599 3"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.07669, 17.79659], [-63.34999, 16.94218], [-62.76692, 17.64353], [-63.07669, 17.79659]]]] } },
+ { type: "Feature", properties: { wikidata: "Q26253", nameEn: "Madeira", aliases: ["PT-30"], country: "PT", groups: ["Q3320166", "Q2914565", "Q105472", "EU", "039", "150", "UN"], callingCodes: ["351"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-19.30302, 33.65304], [-16.04789, 29.65076], [-11.68307, 33.12333], [-19.30302, 33.65304]]]] } },
+ { type: "Feature", properties: { wikidata: "Q26927", nameEn: "Lakshadweep", aliases: ["IN-LD"], country: "IN", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["91"] }, geometry: { type: "MultiPolygon", coordinates: [[[[67.64074, 11.57295], [76.59015, 5.591], [72.67494, 13.58102], [67.64074, 11.57295]]]] } },
+ { type: "Feature", properties: { wikidata: "Q27329", nameEn: "Asian Russia", country: "RU", groups: ["142", "UN"], callingCodes: ["7"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-179.99933, 64.74703], [-172.76104, 63.77445], [-169.03888, 65.48473], [-168.95635, 65.98512], [-168.25765, 71.99091], [-179.9843, 71.90735], [-179.99933, 64.74703]]], [[[59.99809, 51.98263], [60.19925, 51.99173], [60.48915, 52.15175], [60.72581, 52.15538], [60.78201, 52.22067], [61.05417, 52.35096], [60.98021, 52.50068], [60.84709, 52.52228], [60.84118, 52.63912], [60.71693, 52.66245], [60.71989, 52.75923], [61.05842, 52.92217], [61.23462, 53.03227], [62.0422, 52.96105], [62.12799, 52.99133], [62.14574, 53.09626], [61.19024, 53.30536], [61.14291, 53.41481], [61.29082, 53.50992], [61.37957, 53.45887], [61.57185, 53.50112], [61.55706, 53.57144], [60.90626, 53.62937], [61.22574, 53.80268], [61.14283, 53.90063], [60.99796, 53.93699], [61.26863, 53.92797], [61.3706, 54.08464], [61.47603, 54.08048], [61.56941, 53.95703], [61.65318, 54.02445], [62.03913, 53.94768], [62.00966, 54.04134], [62.38535, 54.03961], [62.45931, 53.90737], [62.56876, 53.94047], [62.58651, 54.05871], [63.80604, 54.27079], [63.91224, 54.20013], [64.02715, 54.22679], [63.97686, 54.29763], [64.97216, 54.4212], [65.11033, 54.33028], [65.24663, 54.35721], [65.20174, 54.55216], [68.21308, 54.98645], [68.26661, 55.09226], [68.19206, 55.18823], [68.90865, 55.38148], [69.34224, 55.36344], [69.74917, 55.35545], [70.19179, 55.1476], [70.76493, 55.3027], [70.96009, 55.10558], [71.08288, 54.71253], [71.24185, 54.64965], [71.08706, 54.33376], [71.10379, 54.13326], [71.96141, 54.17736], [72.17477, 54.36303], [72.43415, 53.92685], [72.71026, 54.1161], [73.37963, 53.96132], [73.74778, 54.07194], [73.68921, 53.86522], [73.25412, 53.61532], [73.39218, 53.44623], [75.07405, 53.80831], [75.43398, 53.98652], [75.3668, 54.07439], [76.91052, 54.4677], [76.82266, 54.1798], [76.44076, 54.16017], [76.54243, 53.99329], [77.90383, 53.29807], [79.11255, 52.01171], [80.08138, 50.77658], [80.4127, 50.95581], [80.44819, 51.20855], [80.80318, 51.28262], [81.16999, 51.15662], [81.06091, 50.94833], [81.41248, 50.97524], [81.46581, 50.77658], [81.94999, 50.79307], [82.55443, 50.75412], [83.14607, 51.00796], [83.8442, 50.87375], [84.29385, 50.27257], [84.99198, 50.06793], [85.24047, 49.60239], [86.18709, 49.50259], [86.63674, 49.80136], [86.79056, 49.74787], [86.61307, 49.60239], [86.82606, 49.51796], [87.03071, 49.25142], [87.31465, 49.23603], [87.28386, 49.11626], [87.478, 49.07403], [87.48983, 49.13794], [87.81333, 49.17354], [87.98977, 49.18147], [88.15543, 49.30314], [88.17223, 49.46934], [88.42449, 49.48821], [88.82499, 49.44808], [89.70687, 49.72535], [89.59711, 49.90851], [91.86048, 50.73734], [92.07173, 50.69585], [92.44714, 50.78762], [93.01109, 50.79001], [92.99595, 50.63183], [94.30823, 50.57498], [94.39258, 50.22193], [94.49477, 50.17832], [94.6121, 50.04239], [94.97166, 50.04725], [95.02465, 49.96941], [95.74757, 49.97915], [95.80056, 50.04239], [96.97388, 49.88413], [97.24639, 49.74737], [97.56811, 49.84265], [97.56432, 49.92801], [97.76871, 49.99861], [97.85197, 49.91339], [98.29481, 50.33561], [98.31373, 50.4996], [98.06393, 50.61262], [97.9693, 50.78044], [98.01472, 50.86652], [97.83305, 51.00248], [98.05257, 51.46696], [98.22053, 51.46579], [98.33222, 51.71832], [98.74142, 51.8637], [98.87768, 52.14563], [99.27888, 51.96876], [99.75578, 51.90108], [99.89203, 51.74903], [100.61116, 51.73028], [101.39085, 51.45753], [101.5044, 51.50467], [102.14032, 51.35566], [102.32194, 50.67982], [102.71178, 50.38873], [103.70343, 50.13952], [105.32528, 50.4648], [106.05562, 50.40582], [106.07865, 50.33474], [106.47156, 50.31909], [106.49628, 50.32436], [106.51122, 50.34408], [106.58373, 50.34044], [106.80326, 50.30177], [107.00007, 50.1977], [107.1174, 50.04239], [107.36407, 49.97612], [107.96116, 49.93191], [107.95387, 49.66659], [108.27937, 49.53167], [108.53969, 49.32325], [109.18017, 49.34709], [109.51325, 49.22859], [110.24373, 49.16676], [110.39891, 49.25083], [110.64493, 49.1816], [113.02647, 49.60772], [113.20216, 49.83356], [114.325, 50.28098], [114.9703, 50.19254], [115.26068, 49.97367], [115.73602, 49.87688], [116.22402, 50.04477], [116.62502, 49.92919], [116.71193, 49.83813], [117.27597, 49.62544], [117.48208, 49.62324], [117.82343, 49.52696], [118.61623, 49.93809], [119.11003, 50.00276], [119.27996, 50.13348], [119.38598, 50.35162], [119.13553, 50.37412], [120.10963, 51.671], [120.65907, 51.93544], [120.77337, 52.20805], [120.61346, 52.32447], [120.71673, 52.54099], [120.46454, 52.63811], [120.04049, 52.58773], [120.0451, 52.7359], [120.85633, 53.28499], [121.39213, 53.31888], [122.35063, 53.49565], [122.85966, 53.47395], [123.26989, 53.54843], [123.86158, 53.49391], [124.46078, 53.21881], [125.17522, 53.20225], [125.6131, 53.07229], [126.558, 52.13738], [126.44606, 51.98254], [126.68349, 51.70607], [126.90369, 51.3238], [126.93135, 51.0841], [127.14586, 50.91152], [127.28165, 50.72075], [127.36335, 50.58306], [127.28765, 50.46585], [127.36009, 50.43787], [127.37384, 50.28393], [127.60515, 50.23503], [127.49299, 50.01251], [127.53516, 49.84306], [127.83476, 49.5748], [128.72896, 49.58676], [129.11153, 49.36813], [129.23232, 49.40353], [129.35317, 49.3481], [129.40398, 49.44194], [129.50685, 49.42398], [129.67598, 49.29596], [129.85416, 49.11067], [130.2355, 48.86741], [130.43232, 48.90844], [130.66946, 48.88251], [130.52147, 48.61745], [130.84462, 48.30942], [130.65103, 48.10052], [130.90915, 47.90623], [130.95985, 47.6957], [131.09871, 47.6852], [131.2635, 47.73325], [131.90448, 47.68011], [132.57309, 47.71741], [132.66989, 47.96491], [134.49516, 48.42884], [134.75328, 48.36763], [134.67098, 48.1564], [134.55508, 47.98651], [134.7671, 47.72051], [134.50898, 47.4812], [134.20016, 47.33458], [134.03538, 46.75668], [133.84104, 46.46681], [133.91496, 46.4274], [133.88097, 46.25066], [133.68047, 46.14697], [133.72695, 46.05576], [133.67569, 45.9759], [133.60442, 45.90053], [133.48457, 45.86203], [133.41083, 45.57723], [133.19419, 45.51913], [133.09279, 45.25693], [133.12293, 45.1332], [132.96373, 45.0212], [132.83978, 45.05916], [131.99417, 45.2567], [131.86903, 45.33636], [131.76532, 45.22609], [131.66852, 45.2196], [131.68466, 45.12374], [131.48415, 44.99513], [130.95639, 44.85154], [131.1108, 44.70266], [131.30365, 44.04262], [131.25484, 44.03131], [131.23583, 43.96085], [131.26176, 43.94011], [131.21105, 43.82383], [131.19492, 43.53047], [131.29402, 43.46695], [131.30324, 43.39498], [131.19031, 43.21385], [131.20414, 43.13654], [131.10274, 43.04734], [131.135, 42.94114], [131.02668, 42.91246], [131.02438, 42.86518], [130.66524, 42.84753], [130.44361, 42.76205], [130.40213, 42.70788], [130.56576, 42.68925], [130.62107, 42.58413], [130.55143, 42.52158], [130.56835, 42.43281], [130.60805, 42.4317], [130.64181, 42.41422], [130.66367, 42.38024], [130.65022, 42.32281], [131.95041, 41.5445], [140.9182, 45.92937], [145.82343, 44.571], [145.23667, 43.76813], [153.94307, 38.42848], [180, 62.52334], [180, 71.53642], [155.31937, 81.93282], [76.13964, 83.37843], [64.18965, 69.94255], [66.1708, 67.61252], [61.98014, 65.72191], [60.74386, 64.95767], [59.63945, 64.78384], [59.80579, 64.13948], [59.24834, 63.01859], [59.61398, 62.44915], [59.36223, 61.3882], [59.50685, 60.91162], [58.3853, 59.487], [59.15636, 59.14682], [59.40376, 58.45822], [58.71104, 58.07475], [58.81412, 57.71602], [58.13789, 57.68097], [58.07604, 57.08308], [57.28024, 56.87898], [57.51527, 56.08729], [59.28419, 56.15739], [59.49035, 55.60486], [58.81825, 55.03378], [57.25137, 55.26262], [57.14829, 54.84204], [57.95234, 54.39672], [59.95217, 54.85853], [59.70487, 54.14846], [58.94336, 53.953], [58.79644, 52.43392], [59.22409, 52.28437], [59.25033, 52.46803], [60.17516, 52.39457], [60.17253, 52.25814], [59.91279, 52.06924], [59.99809, 51.98263]]]] } },
+ { type: "Feature", properties: { wikidata: "Q34366", nameEn: "Tasmania", aliases: ["AU-TAS"], country: "AU", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["61"] }, geometry: { type: "MultiPolygon", coordinates: [[[[123.64533, -39.13605], [159.69067, -56.28945], [159.74028, -39.1978], [123.64533, -39.13605]]]] } },
+ { type: "Feature", properties: { wikidata: "Q34497", nameEn: "Saint Helena", aliases: ["SH-HL"], country: "GB", groups: ["SH", "BOTS", "011", "202", "002", "UN"], level: "subterritory", driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["290"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-8.3824, -13.9131], [-6.17428, -19.07236], [-3.29308, -15.22647], [-8.3824, -13.9131]]]] } },
+ { type: "Feature", properties: { wikidata: "Q35657", nameEn: "US States", country: "US", level: "subcountryGroup" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q36117", nameEn: "Borneo", level: "sharedLandform" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q36678", nameEn: "West Bank", country: "PS", groups: ["145", "142"], callingCodes: ["970"] }, geometry: { type: "MultiPolygon", coordinates: [[[[35.47672, 31.49578], [35.55941, 31.76535], [35.52758, 31.9131], [35.54375, 31.96587], [35.52012, 32.04076], [35.57111, 32.21877], [35.55807, 32.38674], [35.42078, 32.41562], [35.41048, 32.43706], [35.41598, 32.45593], [35.42034, 32.46009], [35.40224, 32.50136], [35.35212, 32.52047], [35.30685, 32.51024], [35.29306, 32.50947], [35.25049, 32.52453], [35.2244, 32.55289], [35.15937, 32.50466], [35.10882, 32.4757], [35.10024, 32.47856], [35.09236, 32.47614], [35.08564, 32.46948], [35.07059, 32.4585], [35.05423, 32.41754], [35.05311, 32.4024], [35.0421, 32.38242], [35.05142, 32.3667], [35.04243, 32.35008], [35.01772, 32.33863], [35.01119, 32.28684], [35.02939, 32.2671], [35.01841, 32.23981], [34.98885, 32.20758], [34.95703, 32.19522], [34.96009, 32.17503], [34.99039, 32.14626], [34.98507, 32.12606], [34.99437, 32.10962], [34.9863, 32.09551], [35.00261, 32.027], [34.98682, 31.96935], [35.00124, 31.93264], [35.03489, 31.92448], [35.03978, 31.89276], [35.03489, 31.85919], [34.99712, 31.85569], [34.9724, 31.83352], [35.01978, 31.82944], [35.05617, 31.85685], [35.07677, 31.85627], [35.14174, 31.81325], [35.18603, 31.80901], [35.18169, 31.82542], [35.19461, 31.82687], [35.21469, 31.81835], [35.216, 31.83894], [35.21128, 31.863], [35.20381, 31.86716], [35.20673, 31.88151], [35.20791, 31.8821], [35.20945, 31.8815], [35.21016, 31.88237], [35.21276, 31.88153], [35.2136, 31.88241], [35.22014, 31.88264], [35.22294, 31.87889], [35.22567, 31.86745], [35.22817, 31.8638], [35.2249, 31.85433], [35.2304, 31.84222], [35.24816, 31.8458], [35.25753, 31.8387], [35.251, 31.83085], [35.26404, 31.82567], [35.25573, 31.81362], [35.26058, 31.79064], [35.25225, 31.7678], [35.26319, 31.74846], [35.25182, 31.73945], [35.24981, 31.72543], [35.2438, 31.7201], [35.24315, 31.71244], [35.23972, 31.70896], [35.22392, 31.71899], [35.21937, 31.71578], [35.20538, 31.72388], [35.18023, 31.72067], [35.16478, 31.73242], [35.15474, 31.73352], [35.15119, 31.73634], [35.13931, 31.73012], [35.12933, 31.7325], [35.11895, 31.71454], [35.10782, 31.71594], [35.08226, 31.69107], [35.00879, 31.65426], [34.95249, 31.59813], [34.9415, 31.55601], [34.94356, 31.50743], [34.93258, 31.47816], [34.89756, 31.43891], [34.87833, 31.39321], [34.88932, 31.37093], [34.92571, 31.34337], [35.02459, 31.35979], [35.13033, 31.3551], [35.22921, 31.37445], [35.39675, 31.49572], [35.47672, 31.49578]]]] } },
+ { type: "Feature", properties: { wikidata: "Q37362", nameEn: "Akrotiri and Dhekelia", aliases: ["SBA"], country: "GB" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q38095", nameEn: "Gal\xE1pagos Islands", aliases: ["EC-W"], country: "EC", groups: ["005", "419", "019", "UN"], callingCodes: ["593"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-93.12365, 2.64343], [-92.46744, -2.52874], [-87.07749, -0.8849], [-93.12365, 2.64343]]]] } },
+ { type: "Feature", properties: { wikidata: "Q39760", nameEn: "Gaza Strip", country: "PS", groups: ["145", "142"], callingCodes: ["970"] }, geometry: { type: "MultiPolygon", coordinates: [[[[34.052, 31.46619], [34.21853, 31.32363], [34.23572, 31.2966], [34.24012, 31.29591], [34.26742, 31.21998], [34.29417, 31.24194], [34.36523, 31.28963], [34.37381, 31.30598], [34.36505, 31.36404], [34.40077, 31.40926], [34.48892, 31.48365], [34.56797, 31.54197], [34.48681, 31.59711], [34.29262, 31.70393], [34.052, 31.46619]]]] } },
+ { type: "Feature", properties: { wikidata: "Q40888", nameEn: "Andaman and Nicobar Islands", aliases: ["IN-AN"], country: "IN", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["91"] }, geometry: { type: "MultiPolygon", coordinates: [[[[94.42132, 5.96581], [94.6371, 13.81803], [86.7822, 13.41052], [94.42132, 5.96581]]]] } },
+ { type: "Feature", properties: { wikidata: "Q41684", nameEn: "Stewart Island", country: "NZ", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["64"] }, geometry: { type: "MultiPolygon", coordinates: [[[[166.59185, -47.61313], [169.70504, -47.56021], [167.52103, -46.41337], [166.59185, -47.61313]]]] } },
+ { type: "Feature", properties: { wikidata: "Q43296", nameEn: "Wake Island", aliases: ["WK", "WAK", "WKUM", "872", "UM-79"], country: "US", groups: ["UM", "Q1352230", "057", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[167.34779, 18.97692], [166.67967, 20.14834], [165.82549, 18.97692], [167.34779, 18.97692]]]] } },
+ { type: "Feature", properties: { wikidata: "Q46275", nameEn: "New Zealand Subantarctic Islands", country: "NZ", groups: ["Q851132", "053", "009", "UN"], driveSide: "left" }, geometry: { type: "MultiPolygon", coordinates: [[[[164.30551, -47.88072], [161.96603, -56.07661], [179.49541, -50.04657], [179.49541, -47.2902], [169.91032, -47.66283], [164.30551, -47.88072]]]] } },
+ { type: "Feature", properties: { wikidata: "Q46395", nameEn: "British Overseas Territories", aliases: ["BOTS", "UKOTS"], country: "GB", level: "subcountryGroup" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q46772", nameEn: "Kerguelen Islands", country: "FR", groups: ["EU", "TF", "Q1451600", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[61.9216, -49.39746], [70.67507, -51.14192], [74.25129, -45.45074], [61.9216, -49.39746]]]] } },
+ { type: "Feature", properties: { wikidata: "Q46879", nameEn: "Baker Island", aliases: ["UM-81"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft" }, geometry: { type: "MultiPolygon", coordinates: [[[[-175.33482, -1.40631], [-175.31323, 0.5442], [-177.91421, 0.39582], [-175.33482, -1.40631]]]] } },
+ { type: "Feature", properties: { wikidata: "Q47863", nameEn: "Midway Atoll", aliases: ["MI", "MID", "MIUM", "488", "UM-71"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-176.29741, 29.09786], [-177.77531, 29.29793], [-177.5224, 27.7635], [-176.29741, 29.09786]]]] } },
+ { type: "Feature", properties: { wikidata: "Q62218", nameEn: "Jarvis Island", aliases: ["UM-86"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft" }, geometry: { type: "MultiPolygon", coordinates: [[[[-160.42921, -1.4364], [-159.12443, 0.19975], [-160.38779, 0.30331], [-160.42921, -1.4364]]]] } },
+ { type: "Feature", properties: { wikidata: "Q105472", nameEn: "Macaronesia", level: "sharedLandform" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q114935", nameEn: "Kermadec Islands", country: "NZ", groups: ["Q851132", "053", "009", "UN"], driveSide: "left", callingCodes: ["64"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-174.40891, -29.09438], [-180, -24.21376], [-179.96512, -35.00791], [-174.40891, -29.09438]]]] } },
+ { type: "Feature", properties: { wikidata: "Q115459", nameEn: "Chatham Islands", aliases: ["NZ-CIT"], country: "NZ", groups: ["Q851132", "053", "009", "UN"], driveSide: "left", callingCodes: ["64"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-179.93224, -45.18423], [-172.47015, -45.17912], [-176.30998, -41.38382], [-179.93224, -45.18423]]]] } },
+ { type: "Feature", properties: { wikidata: "Q118863", nameEn: "North Island", country: "NZ", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["64"] }, geometry: { type: "MultiPolygon", coordinates: [[[[179.49541, -47.2902], [179.49541, -36.79303], [174.17679, -32.62487], [170.27492, -36.38133], [174.58663, -40.80446], [174.46634, -41.55028], [179.49541, -47.2902]]]] } },
+ { type: "Feature", properties: { wikidata: "Q120755", nameEn: "South Island", country: "NZ", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["64"] }, geometry: { type: "MultiPolygon", coordinates: [[[[169.70504, -47.56021], [179.49541, -47.2902], [174.46634, -41.55028], [174.58663, -40.80446], [170.27492, -36.38133], [166.56976, -39.94841], [164.8365, -46.0205], [167.52103, -46.41337], [169.70504, -47.56021]]]] } },
+ { type: "Feature", properties: { wikidata: "Q123076", nameEn: "Palmyra Atoll", aliases: ["UM-95"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-161.06795, 5.2462], [-161.0731, 7.1291], [-163.24478, 5.24198], [-161.06795, 5.2462]]]] } },
+ { type: "Feature", properties: { wikidata: "Q130574", nameEn: "Chafarinas Islands", country: "ES", groups: ["EU", "Q191011", "015", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.40316, 35.16893], [-2.43262, 35.20652], [-2.45965, 35.16527], [-2.40316, 35.16893]]]] } },
+ { type: "Feature", properties: { wikidata: "Q130895", nameEn: "Kingman Reef", aliases: ["UM-89"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft" }, geometry: { type: "MultiPolygon", coordinates: [[[[-161.0731, 7.1291], [-163.16627, 7.15036], [-163.24478, 5.24198], [-161.0731, 7.1291]]]] } },
+ { type: "Feature", properties: { wikidata: "Q131008", nameEn: "Johnston Atoll", aliases: ["JT", "JTN", "JTUM", "396", "UM-67"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-170.65691, 16.57199], [-168.87689, 16.01159], [-169.2329, 17.4933], [-170.65691, 16.57199]]]] } },
+ { type: "Feature", properties: { wikidata: "Q131305", nameEn: "Howland Island", aliases: ["UM-84"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft" }, geometry: { type: "MultiPolygon", coordinates: [[[[-177.91421, 0.39582], [-175.31323, 0.5442], [-176.74464, 2.28109], [-177.91421, 0.39582]]]] } },
+ { type: "Feature", properties: { wikidata: "Q133888", nameEn: "Ashmore and Cartier Islands", country: "AU", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["61"] }, geometry: { type: "MultiPolygon", coordinates: [[[[123.7463, -11.1783], [120.6877, -13.59408], [125.29076, -12.33139], [123.7463, -11.1783]]]] } },
+ { type: "Feature", properties: { wikidata: "Q153732", nameEn: "Mariana Islands", level: "sharedLandform" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q172216", nameEn: "Coral Sea Islands", country: "AU", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["61"] }, geometry: { type: "MultiPolygon", coordinates: [[[[159.77159, -28.41151], [156.73836, -14.50464], [145.2855, -9.62524], [147.69992, -17.5933], [152.93188, -20.92631], [154.02855, -24.43238], [159.77159, -28.41151]]]] } },
+ { type: "Feature", properties: { wikidata: "Q179313", nameEn: "Alderney", country: "GB", groups: ["GG", "830", "Q185086", "154", "150", "UN"], level: "subterritory", driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44 01481"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.36485, 49.48223], [-2.09454, 49.46288], [-2.02963, 49.91866], [-2.49556, 49.79012], [-2.36485, 49.48223]]]] } },
+ { type: "Feature", properties: { wikidata: "Q185086", nameEn: "Crown Dependencies", country: "GB", level: "subcountryGroup" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q190571", nameEn: "Scattered Islands", country: "FR", groups: ["EU", "TF", "Q1451600", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[53.53458, -16.36909], [54.96649, -16.28353], [54.61476, -15.02273], [53.53458, -16.36909]]], [[[38.55969, -20.75596], [40.68027, -23.38889], [43.52893, -15.62903], [38.55969, -20.75596]]], [[[47.03092, -11.05648], [47.11593, -12.08552], [47.96702, -11.46447], [47.03092, -11.05648]]]] } },
+ { type: "Feature", properties: { wikidata: "Q191011", nameEn: "Plazas de soberan\xEDa", country: "ES" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q191146", nameEn: "Pe\xF1\xF3n de V\xE9lez de la Gomera", country: "ES", groups: ["EU", "Q191011", "015", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[-4.30191, 35.17419], [-4.30112, 35.17058], [-4.29436, 35.17149], [-4.30191, 35.17419]]]] } },
+ { type: "Feature", properties: { wikidata: "Q201698", nameEn: "Crozet Islands", country: "FR", groups: ["EU", "TF", "Q1451600", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[55.03425, -43.65017], [46.31615, -46.28749], [54.5587, -47.93013], [55.03425, -43.65017]]]] } },
+ { type: "Feature", properties: { wikidata: "Q578170", nameEn: "Contiguous United States", aliases: ["CONUS"], country: "US", groups: ["Q35657", "021", "003", "019", "UN"], roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-97.13927, 25.96583], [-96.92418, 25.97377], [-80.57035, 24.0565], [-78.91214, 27.76553], [-61.98255, 37.34815], [-67.16117, 44.20069], [-66.93432, 44.82597], [-66.96824, 44.83078], [-66.98249, 44.87071], [-66.96824, 44.90965], [-67.0216, 44.95333], [-67.11316, 45.11176], [-67.15965, 45.16179], [-67.19603, 45.16771], [-67.20349, 45.1722], [-67.22751, 45.16344], [-67.27039, 45.1934], [-67.29748, 45.18173], [-67.29754, 45.14865], [-67.34927, 45.122], [-67.48201, 45.27351], [-67.42394, 45.37969], [-67.50578, 45.48971], [-67.42144, 45.50584], [-67.43815, 45.59162], [-67.6049, 45.60725], [-67.80705, 45.69528], [-67.80653, 45.80022], [-67.75654, 45.82324], [-67.80961, 45.87531], [-67.75196, 45.91814], [-67.78111, 45.9392], [-67.78578, 47.06473], [-67.87993, 47.10377], [-67.94843, 47.1925], [-68.23244, 47.35712], [-68.37458, 47.35851], [-68.38332, 47.28723], [-68.57914, 47.28431], [-68.60575, 47.24659], [-68.70125, 47.24399], [-68.89222, 47.1807], [-69.05039, 47.2456], [-69.05073, 47.30076], [-69.05148, 47.42012], [-69.22119, 47.46461], [-69.99966, 46.69543], [-70.05812, 46.41768], [-70.18547, 46.35357], [-70.29078, 46.18832], [-70.23855, 46.1453], [-70.31025, 45.96424], [-70.24694, 45.95138], [-70.25976, 45.89675], [-70.41523, 45.79497], [-70.38934, 45.73215], [-70.54019, 45.67291], [-70.68516, 45.56964], [-70.72651, 45.49771], [-70.62518, 45.42286], [-70.65383, 45.37592], [-70.78372, 45.43269], [-70.82638, 45.39828], [-70.80236, 45.37444], [-70.84816, 45.22698], [-70.89864, 45.2398], [-70.91169, 45.29849], [-70.95193, 45.33895], [-71.0107, 45.34819], [-71.01866, 45.31573], [-71.08364, 45.30623], [-71.14568, 45.24128], [-71.19723, 45.25438], [-71.22338, 45.25184], [-71.29371, 45.29996], [-71.37133, 45.24624], [-71.44252, 45.2361], [-71.40364, 45.21382], [-71.42778, 45.12624], [-71.48735, 45.07784], [-71.50067, 45.01357], [-73.35025, 45.00942], [-74.32699, 44.99029], [-74.66689, 45.00646], [-74.8447, 45.00606], [-74.99101, 44.98051], [-75.01363, 44.95608], [-75.2193, 44.87821], [-75.41441, 44.76614], [-75.76813, 44.51537], [-75.8217, 44.43176], [-75.95947, 44.34463], [-76.00018, 44.34896], [-76.16285, 44.28262], [-76.1664, 44.23051], [-76.244, 44.19643], [-76.31222, 44.19894], [-76.35324, 44.13493], [-76.43859, 44.09393], [-76.79706, 43.63099], [-79.25796, 43.54052], [-79.06921, 43.26183], [-79.05512, 43.25375], [-79.05544, 43.21224], [-79.05002, 43.20133], [-79.05384, 43.17418], [-79.04652, 43.16396], [-79.0427, 43.13934], [-79.06881, 43.12029], [-79.05671, 43.10937], [-79.07486, 43.07845], [-79.01055, 43.06659], [-78.99941, 43.05612], [-79.02424, 43.01983], [-79.02074, 42.98444], [-78.98126, 42.97], [-78.96312, 42.95509], [-78.93224, 42.95229], [-78.90905, 42.93022], [-78.90712, 42.89733], [-78.93684, 42.82887], [-82.67862, 41.67615], [-83.11184, 41.95671], [-83.14962, 42.04089], [-83.12724, 42.2376], [-83.09837, 42.28877], [-83.07837, 42.30978], [-83.02253, 42.33045], [-82.82964, 42.37355], [-82.64242, 42.55594], [-82.58873, 42.54984], [-82.57583, 42.5718], [-82.51858, 42.611], [-82.51063, 42.66025], [-82.46613, 42.76615], [-82.4826, 42.8068], [-82.45331, 42.93139], [-82.4253, 42.95423], [-82.4146, 42.97626], [-82.42469, 42.992], [-82.48419, 45.30225], [-83.59589, 45.82131], [-83.43746, 45.99749], [-83.57017, 46.105], [-83.83329, 46.12169], [-83.90453, 46.05922], [-83.95399, 46.05634], [-84.1096, 46.23987], [-84.09756, 46.25512], [-84.11615, 46.2681], [-84.11254, 46.32329], [-84.13451, 46.39218], [-84.11196, 46.50248], [-84.12885, 46.53068], [-84.17723, 46.52753], [-84.1945, 46.54061], [-84.2264, 46.53337], [-84.26351, 46.49508], [-84.29893, 46.49127], [-84.34174, 46.50683], [-84.42101, 46.49853], [-84.4481, 46.48972], [-84.47607, 46.45225], [-84.55635, 46.45974], [-84.85871, 46.88881], [-88.37033, 48.30586], [-89.48837, 48.01412], [-89.57972, 48.00023], [-89.77248, 48.02607], [-89.89974, 47.98109], [-90.07418, 48.11043], [-90.56312, 48.09488], [-90.56444, 48.12184], [-90.75045, 48.09143], [-90.87588, 48.2484], [-91.08016, 48.18096], [-91.25025, 48.08522], [-91.43248, 48.04912], [-91.45829, 48.07454], [-91.58025, 48.04339], [-91.55649, 48.10611], [-91.70451, 48.11805], [-91.71231, 48.19875], [-91.86125, 48.21278], [-91.98929, 48.25409], [-92.05339, 48.35958], [-92.14732, 48.36578], [-92.202, 48.35252], [-92.26662, 48.35651], [-92.30939, 48.31251], [-92.27167, 48.25046], [-92.37185, 48.22259], [-92.48147, 48.36609], [-92.45588, 48.40624], [-92.50712, 48.44921], [-92.65606, 48.43471], [-92.71323, 48.46081], [-92.69927, 48.49573], [-92.62747, 48.50278], [-92.6342, 48.54133], [-92.7287, 48.54005], [-92.94973, 48.60866], [-93.25391, 48.64266], [-93.33946, 48.62787], [-93.3712, 48.60599], [-93.39758, 48.60364], [-93.40693, 48.60948], [-93.44472, 48.59147], [-93.47022, 48.54357], [-93.66382, 48.51845], [-93.79267, 48.51631], [-93.80939, 48.52439], [-93.80676, 48.58232], [-93.83288, 48.62745], [-93.85769, 48.63284], [-94.23215, 48.65202], [-94.25104, 48.65729], [-94.25172, 48.68404], [-94.27153, 48.70232], [-94.4174, 48.71049], [-94.44258, 48.69223], [-94.53826, 48.70216], [-94.54885, 48.71543], [-94.58903, 48.71803], [-94.69335, 48.77883], [-94.69669, 48.80918], [-94.70486, 48.82365], [-94.70087, 48.8339], [-94.687, 48.84077], [-94.75017, 49.09931], [-94.77355, 49.11998], [-94.82487, 49.29483], [-94.8159, 49.32299], [-94.85381, 49.32492], [-94.95681, 49.37035], [-94.99532, 49.36579], [-95.01419, 49.35647], [-95.05825, 49.35311], [-95.12903, 49.37056], [-95.15357, 49.384], [-95.15355, 48.9996], [-123.32163, 49.00419], [-123.0093, 48.83186], [-123.0093, 48.76586], [-123.26565, 48.6959], [-123.15614, 48.35395], [-123.50039, 48.21223], [-125.03842, 48.53282], [-133.98258, 38.06389], [-118.48109, 32.5991], [-117.1243, 32.53427], [-115.88053, 32.63624], [-114.71871, 32.71894], [-114.76736, 32.64094], [-114.80584, 32.62028], [-114.81141, 32.55543], [-114.79524, 32.55731], [-114.82011, 32.49609], [-111.07523, 31.33232], [-108.20979, 31.33316], [-108.20899, 31.78534], [-106.529, 31.784], [-106.52266, 31.77509], [-106.51251, 31.76922], [-106.50962, 31.76155], [-106.50111, 31.75714], [-106.48815, 31.74769], [-106.47298, 31.75054], [-106.46726, 31.75998], [-106.45244, 31.76523], [-106.43419, 31.75478], [-106.41773, 31.75196], [-106.38003, 31.73151], [-106.3718, 31.71165], [-106.34864, 31.69663], [-106.33419, 31.66303], [-106.30305, 31.62154], [-106.28084, 31.56173], [-106.24612, 31.54193], [-106.23711, 31.51262], [-106.20346, 31.46305], [-106.09025, 31.40569], [-106.00363, 31.39181], [-104.77674, 30.4236], [-104.5171, 29.64671], [-104.3969, 29.57105], [-104.39363, 29.55396], [-104.37752, 29.54255], [-103.15787, 28.93865], [-102.60596, 29.8192], [-101.47277, 29.7744], [-101.05686, 29.44738], [-101.01128, 29.36947], [-100.96725, 29.3477], [-100.94579, 29.34523], [-100.94056, 29.33371], [-100.87982, 29.296], [-100.79696, 29.24688], [-100.67294, 29.09744], [-100.63689, 28.90812], [-100.59809, 28.88197], [-100.52313, 28.75598], [-100.5075, 28.74066], [-100.51222, 28.70679], [-100.50029, 28.66117], [-99.55409, 27.61314], [-99.51478, 27.55836], [-99.52955, 27.49747], [-99.50208, 27.50021], [-99.48045, 27.49016], [-99.482, 27.47128], [-99.49744, 27.43746], [-99.53573, 27.30926], [-99.08477, 26.39849], [-99.03053, 26.41249], [-99.00546, 26.3925], [-98.35126, 26.15129], [-98.30491, 26.10475], [-98.27075, 26.09457], [-98.24603, 26.07191], [-97.97017, 26.05232], [-97.95155, 26.0625], [-97.66511, 26.01708], [-97.52025, 25.88518], [-97.49828, 25.89877], [-97.45669, 25.86874], [-97.42511, 25.83969], [-97.37332, 25.83854], [-97.35946, 25.92189], [-97.13927, 25.96583]]]] } },
+ { type: "Feature", properties: { wikidata: "Q620634", nameEn: "Bir Tawil", groups: ["015", "002"], level: "territory" }, geometry: { type: "MultiPolygon", coordinates: [[[[33.17563, 22.00405], [33.57251, 21.72406], [33.99686, 21.76784], [34.0765, 22.00501], [33.17563, 22.00405]]]] } },
+ { type: "Feature", properties: { wikidata: "Q639185", nameEn: "Peros Banhos", country: "GB", groups: ["IO", "BOTS", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[72.12587, -4.02588], [70.1848, -6.37445], [72.09518, -5.61768], [72.12587, -4.02588]]]] } },
+ { type: "Feature", properties: { wikidata: "Q644636", nameEn: "Cyprus", level: "sharedLandform" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q851132", nameEn: "New Zealand Outlying Islands", country: "NZ", level: "subcountryGroup" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q875134", nameEn: "European Russia", country: "RU", groups: ["151", "150", "UN"], callingCodes: ["7"] }, geometry: { type: "MultiPolygon", coordinates: [[[[18.57853, 55.25302], [19.64312, 54.45423], [19.8038, 54.44203], [20.63871, 54.3706], [21.41123, 54.32395], [22.79705, 54.36264], [22.7253, 54.41732], [22.70208, 54.45312], [22.67788, 54.532], [22.71293, 54.56454], [22.68021, 54.58486], [22.7522, 54.63525], [22.74225, 54.64339], [22.75467, 54.6483], [22.73397, 54.66604], [22.73631, 54.72952], [22.87317, 54.79492], [22.85083, 54.88711], [22.76422, 54.92521], [22.68723, 54.9811], [22.65451, 54.97037], [22.60075, 55.01863], [22.58907, 55.07085], [22.47688, 55.04408], [22.31562, 55.0655], [22.14267, 55.05345], [22.11697, 55.02131], [22.06087, 55.02935], [22.02582, 55.05078], [22.03984, 55.07888], [21.99543, 55.08691], [21.96505, 55.07353], [21.85521, 55.09493], [21.64954, 55.1791], [21.55605, 55.20311], [21.51095, 55.18507], [21.46766, 55.21115], [21.38446, 55.29348], [21.35465, 55.28427], [21.26425, 55.24456], [20.95181, 55.27994], [20.60454, 55.40986], [18.57853, 55.25302]]], [[[26.32936, 60.00121], [26.90044, 59.63819], [27.85643, 59.58538], [28.04187, 59.47017], [28.19061, 59.39962], [28.21137, 59.38058], [28.20537, 59.36491], [28.19284, 59.35791], [28.14215, 59.28934], [28.00689, 59.28351], [27.90911, 59.24353], [27.87978, 59.18097], [27.80482, 59.1116], [27.74429, 58.98351], [27.36366, 58.78381], [27.55489, 58.39525], [27.48541, 58.22615], [27.62393, 58.09462], [27.67282, 57.92627], [27.81841, 57.89244], [27.78526, 57.83963], [27.56689, 57.83356], [27.50171, 57.78842], [27.52615, 57.72843], [27.3746, 57.66834], [27.40393, 57.62125], [27.31919, 57.57672], [27.34698, 57.52242], [27.56832, 57.53728], [27.52453, 57.42826], [27.86101, 57.29402], [27.66511, 56.83921], [27.86101, 56.88204], [28.04768, 56.59004], [28.13526, 56.57989], [28.10069, 56.524], [28.19057, 56.44637], [28.16599, 56.37806], [28.23716, 56.27588], [28.15217, 56.16964], [28.30571, 56.06035], [28.36888, 56.05805], [28.37987, 56.11399], [28.43068, 56.09407], [28.5529, 56.11705], [28.68337, 56.10173], [28.63668, 56.07262], [28.73418, 55.97131], [29.08299, 56.03427], [29.21717, 55.98971], [29.44692, 55.95978], [29.3604, 55.75862], [29.51283, 55.70294], [29.61446, 55.77716], [29.80672, 55.79569], [29.97975, 55.87281], [30.12136, 55.8358], [30.27776, 55.86819], [30.30987, 55.83592], [30.48257, 55.81066], [30.51346, 55.78982], [30.51037, 55.76568], [30.63344, 55.73079], [30.67464, 55.64176], [30.72957, 55.66268], [30.7845, 55.58514], [30.86003, 55.63169], [30.93419, 55.6185], [30.95204, 55.50667], [30.90123, 55.46621], [30.93144, 55.3914], [30.8257, 55.3313], [30.81946, 55.27931], [30.87944, 55.28223], [30.97369, 55.17134], [31.02071, 55.06167], [31.00972, 55.02783], [30.94243, 55.03964], [30.9081, 55.02232], [30.95754, 54.98609], [30.93144, 54.9585], [30.81759, 54.94064], [30.8264, 54.90062], [30.75165, 54.80699], [30.95479, 54.74346], [30.97127, 54.71967], [31.0262, 54.70698], [30.98226, 54.68872], [30.99187, 54.67046], [31.19339, 54.66947], [31.21399, 54.63113], [31.08543, 54.50361], [31.22945, 54.46585], [31.3177, 54.34067], [31.30791, 54.25315], [31.57002, 54.14535], [31.89599, 54.0837], [31.88744, 54.03653], [31.85019, 53.91801], [31.77028, 53.80015], [31.89137, 53.78099], [32.12621, 53.81586], [32.36663, 53.7166], [32.45717, 53.74039], [32.50112, 53.68594], [32.40499, 53.6656], [32.47777, 53.5548], [32.74968, 53.45597], [32.73257, 53.33494], [32.51725, 53.28431], [32.40773, 53.18856], [32.15368, 53.07594], [31.82373, 53.10042], [31.787, 53.18033], [31.62496, 53.22886], [31.56316, 53.19432], [31.40523, 53.21406], [31.36403, 53.13504], [31.3915, 53.09712], [31.33519, 53.08805], [31.32283, 53.04101], [31.24147, 53.031], [31.35667, 52.97854], [31.592, 52.79011], [31.57277, 52.71613], [31.50406, 52.69707], [31.63869, 52.55361], [31.56316, 52.51518], [31.61397, 52.48843], [31.62084, 52.33849], [31.57971, 52.32146], [31.70735, 52.26711], [31.6895, 52.1973], [31.77877, 52.18636], [31.7822, 52.11406], [31.81722, 52.09955], [31.85018, 52.11305], [31.96141, 52.08015], [31.92159, 52.05144], [32.08813, 52.03319], [32.23331, 52.08085], [32.2777, 52.10266], [32.34044, 52.1434], [32.33083, 52.23685], [32.38988, 52.24946], [32.3528, 52.32842], [32.54781, 52.32423], [32.69475, 52.25535], [32.85405, 52.27888], [32.89937, 52.2461], [33.18913, 52.3754], [33.51323, 52.35779], [33.48027, 52.31499], [33.55718, 52.30324], [33.78789, 52.37204], [34.05239, 52.20132], [34.11199, 52.14087], [34.09413, 52.00835], [34.41136, 51.82793], [34.42922, 51.72852], [34.07765, 51.67065], [34.17599, 51.63253], [34.30562, 51.5205], [34.22048, 51.4187], [34.33446, 51.363], [34.23009, 51.26429], [34.31661, 51.23936], [34.38802, 51.2746], [34.6613, 51.25053], [34.6874, 51.18], [34.82472, 51.17483], [34.97304, 51.2342], [35.14058, 51.23162], [35.12685, 51.16191], [35.20375, 51.04723], [35.31774, 51.08434], [35.40837, 51.04119], [35.32598, 50.94524], [35.39307, 50.92145], [35.41367, 50.80227], [35.47704, 50.77274], [35.48116, 50.66405], [35.39464, 50.64751], [35.47463, 50.49247], [35.58003, 50.45117], [35.61711, 50.35707], [35.73659, 50.35489], [35.80388, 50.41356], [35.8926, 50.43829], [36.06893, 50.45205], [36.20763, 50.3943], [36.30101, 50.29088], [36.47817, 50.31457], [36.58371, 50.28563], [36.56655, 50.2413], [36.64571, 50.218], [36.69377, 50.26982], [36.91762, 50.34963], [37.08468, 50.34935], [37.48204, 50.46079], [37.47243, 50.36277], [37.62486, 50.29966], [37.62879, 50.24481], [37.61113, 50.21976], [37.75807, 50.07896], [37.79515, 50.08425], [37.90776, 50.04194], [38.02999, 49.94482], [38.02999, 49.90592], [38.21675, 49.98104], [38.18517, 50.08161], [38.32524, 50.08866], [38.35408, 50.00664], [38.65688, 49.97176], [38.68677, 50.00904], [38.73311, 49.90238], [38.90477, 49.86787], [38.9391, 49.79524], [39.1808, 49.88911], [39.27968, 49.75976], [39.44496, 49.76067], [39.59142, 49.73758], [39.65047, 49.61761], [39.84548, 49.56064], [40.13249, 49.61672], [40.16683, 49.56865], [40.03636, 49.52321], [40.03087, 49.45452], [40.1141, 49.38798], [40.14912, 49.37681], [40.18331, 49.34996], [40.22176, 49.25683], [40.01988, 49.1761], [39.93437, 49.05709], [39.6836, 49.05121], [39.6683, 48.99454], [39.71353, 48.98959], [39.72649, 48.9754], [39.74874, 48.98675], [39.78368, 48.91596], [39.98967, 48.86901], [40.03636, 48.91957], [40.08168, 48.87443], [39.97182, 48.79398], [39.79466, 48.83739], [39.73104, 48.7325], [39.71765, 48.68673], [39.67226, 48.59368], [39.79764, 48.58668], [39.84548, 48.57821], [39.86196, 48.46633], [39.88794, 48.44226], [39.94847, 48.35055], [39.84136, 48.33321], [39.84273, 48.30947], [39.90041, 48.3049], [39.91465, 48.26743], [39.95248, 48.29972], [39.9693, 48.29904], [39.97325, 48.31399], [39.99241, 48.31768], [40.00752, 48.22445], [39.94847, 48.22811], [39.83724, 48.06501], [39.88256, 48.04482], [39.77544, 48.04206], [39.82213, 47.96396], [39.73935, 47.82876], [38.87979, 47.87719], [38.79628, 47.81109], [38.76379, 47.69346], [38.35062, 47.61631], [38.28679, 47.53552], [38.28954, 47.39255], [38.22225, 47.30788], [38.33074, 47.30508], [38.32112, 47.2585], [38.23049, 47.2324], [38.22955, 47.12069], [38.3384, 46.98085], [38.12112, 46.86078], [37.62608, 46.82615], [35.23066, 45.79231], [35.04991, 45.76827], [36.6645, 45.4514], [36.6545, 45.3417], [36.5049, 45.3136], [36.475, 45.2411], [36.4883, 45.0488], [33.5943, 44.03313], [39.81147, 43.06294], [40.0078, 43.38551], [40.00853, 43.40578], [40.01552, 43.42025], [40.01007, 43.42411], [40.03312, 43.44262], [40.04445, 43.47776], [40.10657, 43.57344], [40.65957, 43.56212], [41.64935, 43.22331], [42.40563, 43.23226], [42.66667, 43.13917], [42.75889, 43.19651], [43.03322, 43.08883], [43.0419, 43.02413], [43.81453, 42.74297], [43.73119, 42.62043], [43.95517, 42.55396], [44.54202, 42.75699], [44.70002, 42.74679], [44.80941, 42.61277], [44.88754, 42.74934], [45.15318, 42.70598], [45.36501, 42.55268], [45.78692, 42.48358], [45.61676, 42.20768], [46.42738, 41.91323], [46.5332, 41.87389], [46.58924, 41.80547], [46.75269, 41.8623], [46.8134, 41.76252], [47.00955, 41.63583], [46.99554, 41.59743], [47.03757, 41.55434], [47.10762, 41.59044], [47.34579, 41.27884], [47.49004, 41.26366], [47.54504, 41.20275], [47.62288, 41.22969], [47.75831, 41.19455], [47.87973, 41.21798], [48.07587, 41.49957], [48.22064, 41.51472], [48.2878, 41.56221], [48.40277, 41.60441], [48.42301, 41.65444], [48.55078, 41.77917], [48.5867, 41.84306], [48.80971, 41.95365], [49.2134, 44.84989], [49.88945, 46.04554], [49.32259, 46.26944], [49.16518, 46.38542], [48.54988, 46.56267], [48.51142, 46.69268], [49.01136, 46.72716], [48.52326, 47.4102], [48.45173, 47.40818], [48.15348, 47.74545], [47.64973, 47.76559], [47.41689, 47.83687], [47.38731, 47.68176], [47.12107, 47.83687], [47.11516, 48.27188], [46.49011, 48.43019], [46.78392, 48.95352], [47.00857, 49.04921], [47.04658, 49.19834], [46.78398, 49.34026], [46.9078, 49.86707], [47.18319, 49.93721], [47.34589, 50.09308], [47.30448, 50.30894], [47.58551, 50.47867], [48.10044, 50.09242], [48.24519, 49.86099], [48.42564, 49.82283], [48.68352, 49.89546], [48.90782, 50.02281], [48.57946, 50.63278], [48.86936, 50.61589], [49.12673, 50.78639], [49.41959, 50.85927], [49.39001, 51.09396], [49.76866, 51.11067], [49.97277, 51.2405], [50.26859, 51.28677], [50.59695, 51.61859], [51.26254, 51.68466], [51.301, 51.48799], [51.77431, 51.49536], [51.8246, 51.67916], [52.36119, 51.74161], [52.54329, 51.48444], [53.46165, 51.49445], [53.69299, 51.23466], [54.12248, 51.11542], [54.46331, 50.85554], [54.41894, 50.61214], [54.55797, 50.52006], [54.71476, 50.61214], [54.56685, 51.01958], [54.72067, 51.03261], [55.67774, 50.54508], [56.11398, 50.7471], [56.17906, 50.93204], [57.17302, 51.11253], [57.44221, 50.88354], [57.74986, 50.93017], [57.75578, 51.13852], [58.3208, 51.15151], [58.87974, 50.70852], [59.48928, 50.64216], [59.51886, 50.49937], [59.81172, 50.54451], [60.01288, 50.8163], [60.17262, 50.83312], [60.31914, 50.67705], [60.81833, 50.6629], [61.4431, 50.80679], [61.56889, 51.23679], [61.6813, 51.25716], [61.55114, 51.32746], [61.50677, 51.40687], [60.95655, 51.48615], [60.92401, 51.61124], [60.5424, 51.61675], [60.36787, 51.66815], [60.50986, 51.7964], [60.09867, 51.87135], [59.99809, 51.98263], [59.91279, 52.06924], [60.17253, 52.25814], [60.17516, 52.39457], [59.25033, 52.46803], [59.22409, 52.28437], [58.79644, 52.43392], [58.94336, 53.953], [59.70487, 54.14846], [59.95217, 54.85853], [57.95234, 54.39672], [57.14829, 54.84204], [57.25137, 55.26262], [58.81825, 55.03378], [59.49035, 55.60486], [59.28419, 56.15739], [57.51527, 56.08729], [57.28024, 56.87898], [58.07604, 57.08308], [58.13789, 57.68097], [58.81412, 57.71602], [58.71104, 58.07475], [59.40376, 58.45822], [59.15636, 59.14682], [58.3853, 59.487], [59.50685, 60.91162], [59.36223, 61.3882], [59.61398, 62.44915], [59.24834, 63.01859], [59.80579, 64.13948], [59.63945, 64.78384], [60.74386, 64.95767], [61.98014, 65.72191], [66.1708, 67.61252], [64.18965, 69.94255], [76.13964, 83.37843], [36.85549, 84.09565], [32.07813, 72.01005], [31.59909, 70.16571], [30.84095, 69.80584], [30.95011, 69.54699], [30.52662, 69.54699], [30.16363, 69.65244], [29.97205, 69.41623], [29.27631, 69.2811], [29.26623, 69.13794], [29.0444, 69.0119], [28.91738, 69.04774], [28.45957, 68.91417], [28.78224, 68.86696], [28.43941, 68.53366], [28.62982, 68.19816], [29.34179, 68.06655], [29.66955, 67.79872], [30.02041, 67.67523], [29.91155, 67.51507], [28.9839, 66.94139], [29.91155, 66.13863], [30.16363, 65.66935], [29.97205, 65.70256], [29.74013, 65.64025], [29.84096, 65.56945], [29.68972, 65.31803], [29.61914, 65.23791], [29.8813, 65.22101], [29.84096, 65.1109], [29.61914, 65.05993], [29.68972, 64.80789], [30.05271, 64.79072], [30.12329, 64.64862], [30.01238, 64.57513], [30.06279, 64.35782], [30.4762, 64.25728], [30.55687, 64.09036], [30.25437, 63.83364], [29.98213, 63.75795], [30.49637, 63.46666], [31.23244, 63.22239], [31.29294, 63.09035], [31.58535, 62.91642], [31.38369, 62.66284], [31.10136, 62.43042], [29.01829, 61.17448], [28.82816, 61.1233], [28.47974, 60.93365], [27.77352, 60.52722], [27.71177, 60.3893], [27.44953, 60.22766], [26.32936, 60.00121]]]] } },
+ { type: "Feature", properties: { wikidata: "Q1083368", nameEn: "Mainland Finland", country: "FI", groups: ["EU", "154", "150", "UN"], callingCodes: ["358"] }, geometry: { type: "MultiPolygon", coordinates: [[[[29.12697, 69.69193], [28.36883, 69.81658], [28.32849, 69.88605], [27.97558, 69.99671], [27.95542, 70.0965], [27.57226, 70.06215], [27.05802, 69.92069], [26.64461, 69.96565], [26.40261, 69.91377], [25.96904, 69.68397], [25.69679, 69.27039], [25.75729, 68.99383], [25.61613, 68.89602], [25.42455, 68.90328], [25.12206, 68.78684], [25.10189, 68.63307], [24.93048, 68.61102], [24.90023, 68.55579], [24.74898, 68.65143], [24.18432, 68.73936], [24.02299, 68.81601], [23.781, 68.84514], [23.68017, 68.70276], [23.13064, 68.64684], [22.53321, 68.74393], [22.38367, 68.71561], [22.27276, 68.89514], [21.63833, 69.27485], [21.27827, 69.31281], [21.00732, 69.22755], [20.98641, 69.18809], [21.11099, 69.10291], [21.05775, 69.0356], [20.72171, 69.11874], [20.55258, 69.06069], [20.78802, 69.03087], [20.91658, 68.96764], [20.85104, 68.93142], [20.90649, 68.89696], [21.03001, 68.88969], [22.00429, 68.50692], [22.73028, 68.40881], [23.10336, 68.26551], [23.15377, 68.14759], [23.26469, 68.15134], [23.40081, 68.05545], [23.65793, 67.9497], [23.45627, 67.85297], [23.54701, 67.59306], [23.39577, 67.46974], [23.75372, 67.43688], [23.75372, 67.29914], [23.54701, 67.25435], [23.58735, 67.20752], [23.56214, 67.17038], [23.98563, 66.84149], [23.98059, 66.79585], [23.89488, 66.772], [23.85959, 66.56434], [23.63776, 66.43568], [23.67591, 66.3862], [23.64982, 66.30603], [23.71339, 66.21299], [23.90497, 66.15802], [24.15791, 65.85385], [24.14798, 65.83466], [24.15107, 65.81427], [24.14112, 65.39731], [20.15877, 63.06556], [19.23413, 60.61414], [20.96741, 60.71528], [21.15143, 60.54555], [21.08159, 60.20167], [21.02509, 60.12142], [21.35468, 59.67511], [20.5104, 59.15546], [26.32936, 60.00121], [27.44953, 60.22766], [27.71177, 60.3893], [27.77352, 60.52722], [28.47974, 60.93365], [28.82816, 61.1233], [29.01829, 61.17448], [31.10136, 62.43042], [31.38369, 62.66284], [31.58535, 62.91642], [31.29294, 63.09035], [31.23244, 63.22239], [30.49637, 63.46666], [29.98213, 63.75795], [30.25437, 63.83364], [30.55687, 64.09036], [30.4762, 64.25728], [30.06279, 64.35782], [30.01238, 64.57513], [30.12329, 64.64862], [30.05271, 64.79072], [29.68972, 64.80789], [29.61914, 65.05993], [29.84096, 65.1109], [29.8813, 65.22101], [29.61914, 65.23791], [29.68972, 65.31803], [29.84096, 65.56945], [29.74013, 65.64025], [29.97205, 65.70256], [30.16363, 65.66935], [29.91155, 66.13863], [28.9839, 66.94139], [29.91155, 67.51507], [30.02041, 67.67523], [29.66955, 67.79872], [29.34179, 68.06655], [28.62982, 68.19816], [28.43941, 68.53366], [28.78224, 68.86696], [28.45957, 68.91417], [28.91738, 69.04774], [28.81248, 69.11997], [28.8629, 69.22395], [29.31664, 69.47994], [29.12697, 69.69193]]]] } },
+ { type: "Feature", properties: { wikidata: "Q1184963", nameEn: "Alhucemas Islands", country: "ES", groups: ["EU", "Q191011", "015", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[-3.90602, 35.21494], [-3.88372, 35.20767], [-3.89343, 35.22728], [-3.90602, 35.21494]]]] } },
+ { type: "Feature", properties: { wikidata: "Q1298289", nameEn: "Egmont Islands", country: "GB", groups: ["IO", "BOTS", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[70.1848, -6.37445], [70.67958, -8.2663], [72.17991, -6.68509], [70.1848, -6.37445]]]] } },
+ { type: "Feature", properties: { wikidata: "Q1352230", nameEn: "US Territories", country: "US", level: "subcountryGroup" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q1451600", nameEn: "Overseas Countries and Territories of the EU", aliases: ["OCT"], level: "subunion" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q1544253", nameEn: "Great Chagos Bank", country: "GB", groups: ["IO", "BOTS", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[70.1848, -6.37445], [72.17991, -6.68509], [73.20573, -5.20727], [70.1848, -6.37445]]]] } },
+ { type: "Feature", properties: { wikidata: "Q1585511", nameEn: "Salomon Atoll", country: "GB", groups: ["IO", "BOTS", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[72.09518, -5.61768], [73.20573, -5.20727], [72.12587, -4.02588], [72.09518, -5.61768]]]] } },
+ { type: "Feature", properties: { wikidata: "Q1681727", nameEn: "Saint-Paul and Amsterdam", country: "FR", groups: ["EU", "TF", "Q1451600", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[76.31747, -42.16264], [80.15867, -36.04977], [71.22311, -38.75287], [76.31747, -42.16264]]]] } },
+ { type: "Feature", properties: { wikidata: "Q1901211", nameEn: "East Malaysia", country: "MY", groups: ["Q36117", "035", "142", "UN"], driveSide: "left", callingCodes: ["60"] }, geometry: { type: "MultiPolygon", coordinates: [[[[110.90339, 7.52694], [109.82788, 2.86812], [109.62558, 1.99182], [109.53794, 1.91771], [109.57923, 1.80624], [109.66397, 1.79972], [109.66397, 1.60425], [110.35354, 0.98869], [110.49182, 0.88088], [110.62374, 0.873], [111.22979, 1.08326], [111.55434, 0.97864], [111.82846, 0.99349], [111.94553, 1.12016], [112.15679, 1.17004], [112.2127, 1.44135], [112.48648, 1.56516], [113.021, 1.57819], [113.01448, 1.42832], [113.64677, 1.23933], [114.03788, 1.44787], [114.57892, 1.5], [114.80706, 1.92351], [114.80706, 2.21665], [115.1721, 2.49671], [115.11343, 2.82879], [115.53713, 3.14776], [115.58276, 3.93499], [115.90217, 4.37708], [117.25801, 4.35108], [117.47313, 4.18857], [117.67641, 4.16535], [118.06469, 4.16638], [118.93936, 4.09009], [119.52945, 5.35672], [117.98544, 6.27477], [117.93857, 6.89845], [117.17735, 7.52841], [116.79524, 7.43869], [115.02521, 5.35005], [115.16236, 5.01011], [115.15092, 4.87604], [115.20737, 4.8256], [115.27819, 4.63661], [115.2851, 4.42295], [115.36346, 4.33563], [115.31275, 4.30806], [115.09978, 4.39123], [115.07737, 4.53418], [115.04064, 4.63706], [115.02278, 4.74137], [115.02955, 4.82087], [115.05038, 4.90275], [114.99417, 4.88201], [114.96982, 4.81146], [114.88841, 4.81905], [114.8266, 4.75062], [114.77303, 4.72871], [114.83189, 4.42387], [114.88039, 4.4257], [114.78539, 4.12205], [114.64211, 4.00694], [114.49922, 4.13108], [114.4416, 4.27588], [114.32176, 4.2552], [114.32176, 4.34942], [114.26876, 4.49878], [114.15813, 4.57], [114.07448, 4.58441], [114.10166, 4.76112], [110.90339, 7.52694]]]] } },
+ { type: "Feature", properties: { wikidata: "Q1973345", nameEn: "Peninsular Malaysia", country: "MY", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["60"] }, geometry: { type: "MultiPolygon", coordinates: [[[[102.46318, 7.22462], [102.09086, 6.23546], [102.08127, 6.22679], [102.07732, 6.193], [102.09182, 6.14161], [102.01835, 6.05407], [101.99209, 6.04075], [101.97114, 6.01992], [101.9714, 6.00575], [101.94712, 5.98421], [101.92819, 5.85511], [101.91776, 5.84269], [101.89188, 5.8386], [101.80144, 5.74505], [101.75074, 5.79091], [101.69773, 5.75881], [101.58019, 5.93534], [101.25524, 5.78633], [101.25755, 5.71065], [101.14062, 5.61613], [100.98815, 5.79464], [101.02708, 5.91013], [101.087, 5.9193], [101.12388, 6.11411], [101.06165, 6.14161], [101.12618, 6.19431], [101.10313, 6.25617], [100.85884, 6.24929], [100.81045, 6.45086], [100.74822, 6.46231], [100.74361, 6.50811], [100.66986, 6.45086], [100.43027, 6.52389], [100.42351, 6.51762], [100.41791, 6.5189], [100.41152, 6.52299], [100.35413, 6.54932], [100.31929, 6.65413], [100.32607, 6.65933], [100.32671, 6.66526], [100.31884, 6.66423], [100.31618, 6.66781], [100.30828, 6.66462], [100.29651, 6.68439], [100.19511, 6.72559], [100.12, 6.42105], [100.0756, 6.4045], [99.91873, 6.50233], [99.50117, 6.44501], [99.31854, 5.99868], [99.75778, 3.86466], [103.03657, 1.30383], [103.56591, 1.19719], [103.62738, 1.35255], [103.67468, 1.43166], [103.7219, 1.46108], [103.74161, 1.4502], [103.76395, 1.45183], [103.81181, 1.47953], [103.86383, 1.46288], [103.89565, 1.42841], [103.93384, 1.42926], [104.00131, 1.42405], [104.02277, 1.4438], [104.04622, 1.44691], [104.07348, 1.43322], [104.08871, 1.42015], [104.09162, 1.39694], [104.08072, 1.35998], [104.12282, 1.27714], [104.34728, 1.33529], [104.56723, 1.44271], [105.01437, 3.24936], [102.46318, 7.22462]]]] } },
+ { type: "Feature", properties: { wikidata: "Q2093907", nameEn: "Three Kings Islands", country: "NZ", groups: ["Q851132", "053", "009", "UN"], driveSide: "left" }, geometry: { type: "MultiPolygon", coordinates: [[[[174.17679, -32.62487], [170.93268, -32.97889], [171.97383, -34.64644], [174.17679, -32.62487]]]] } },
+ { type: "Feature", properties: { wikidata: "Q2298216", nameEn: "Solander Islands", country: "NZ", groups: ["Q851132", "053", "009", "UN"], driveSide: "left" }, geometry: { type: "MultiPolygon", coordinates: [[[[167.39068, -46.49187], [166.5534, -46.39484], [166.84561, -46.84889], [167.39068, -46.49187]]]] } },
+ { type: "Feature", properties: { wikidata: "Q2872203", nameEn: "Mainland Australia", country: "AU", groups: ["053", "009", "UN"], level: "subcountryGroup", driveSide: "left", callingCodes: ["61"] }, geometry: { type: "MultiPolygon", coordinates: [[[[88.16419, -23.49578], [123.64533, -39.13605], [159.74028, -39.1978], [159.76765, -29.76946], [154.02855, -24.43238], [152.93188, -20.92631], [147.69992, -17.5933], [145.2855, -9.62524], [143.87386, -9.02382], [143.29772, -9.33993], [142.48658, -9.36754], [142.19246, -9.15378], [141.88934, -9.36111], [141.01842, -9.35091], [135.49042, -9.2276], [127.55165, -9.05052], [125.29076, -12.33139], [88.16419, -23.49578]]]] } },
+ { type: "Feature", properties: { wikidata: "Q2914565", nameEn: "Autonomous Regions of Portugal", country: "PT", level: "subcountryGroup" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q2915956", nameEn: "Mainland Portugal", country: "PT", groups: ["Q12837", "EU", "039", "150", "UN"], level: "subcountryGroup", callingCodes: ["351"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-10.39881, 36.12218], [-7.37282, 36.96896], [-7.39769, 37.16868], [-7.41133, 37.20314], [-7.41854, 37.23813], [-7.43227, 37.25152], [-7.43974, 37.38913], [-7.46878, 37.47127], [-7.51759, 37.56119], [-7.41981, 37.75729], [-7.33441, 37.81193], [-7.27314, 37.90145], [-7.24544, 37.98884], [-7.12648, 38.00296], [-7.10366, 38.04404], [-7.05966, 38.01966], [-7.00375, 38.01914], [-6.93418, 38.21454], [-7.09389, 38.17227], [-7.15581, 38.27597], [-7.32529, 38.44336], [-7.265, 38.61674], [-7.26174, 38.72107], [-7.03848, 38.87221], [-7.051, 38.907], [-6.95211, 39.0243], [-6.97004, 39.07619], [-7.04011, 39.11919], [-7.10692, 39.10275], [-7.14929, 39.11287], [-7.12811, 39.17101], [-7.23566, 39.20132], [-7.23403, 39.27579], [-7.3149, 39.34857], [-7.2927, 39.45847], [-7.49477, 39.58794], [-7.54121, 39.66717], [-7.33507, 39.64569], [-7.24707, 39.66576], [-7.01613, 39.66877], [-6.97492, 39.81488], [-6.91463, 39.86618], [-6.86737, 40.01986], [-6.94233, 40.10716], [-7.00589, 40.12087], [-7.02544, 40.18564], [-7.00426, 40.23169], [-6.86085, 40.26776], [-6.86085, 40.2976], [-6.80218, 40.33239], [-6.78426, 40.36468], [-6.84618, 40.42177], [-6.84944, 40.46394], [-6.7973, 40.51723], [-6.80218, 40.55067], [-6.84292, 40.56801], [-6.79567, 40.65955], [-6.82826, 40.74603], [-6.82337, 40.84472], [-6.79892, 40.84842], [-6.80707, 40.88047], [-6.84292, 40.89771], [-6.8527, 40.93958], [-6.9357, 41.02888], [-6.913, 41.03922], [-6.88843, 41.03027], [-6.84781, 41.02692], [-6.80942, 41.03629], [-6.79241, 41.05397], [-6.75655, 41.10187], [-6.77319, 41.13049], [-6.69711, 41.1858], [-6.68286, 41.21641], [-6.65046, 41.24725], [-6.55937, 41.24417], [-6.38551, 41.35274], [-6.38553, 41.38655], [-6.3306, 41.37677], [-6.26777, 41.48796], [-6.19128, 41.57638], [-6.29863, 41.66432], [-6.44204, 41.68258], [-6.49907, 41.65823], [-6.54633, 41.68623], [-6.56426, 41.74219], [-6.51374, 41.8758], [-6.56752, 41.88429], [-6.5447, 41.94371], [-6.58544, 41.96674], [-6.61967, 41.94008], [-6.75004, 41.94129], [-6.76959, 41.98734], [-6.81196, 41.99097], [-6.82174, 41.94493], [-6.94396, 41.94403], [-6.95537, 41.96553], [-6.98144, 41.9728], [-7.01078, 41.94977], [-7.07596, 41.94977], [-7.08574, 41.97401], [-7.14115, 41.98855], [-7.18549, 41.97515], [-7.18677, 41.88793], [-7.32366, 41.8406], [-7.37092, 41.85031], [-7.42864, 41.80589], [-7.42854, 41.83262], [-7.44759, 41.84451], [-7.45566, 41.86488], [-7.49803, 41.87095], [-7.52737, 41.83939], [-7.62188, 41.83089], [-7.58603, 41.87944], [-7.65774, 41.88308], [-7.69848, 41.90977], [-7.84188, 41.88065], [-7.88055, 41.84571], [-7.88751, 41.92553], [-7.90707, 41.92432], [-7.92336, 41.8758], [-7.9804, 41.87337], [-8.01136, 41.83453], [-8.0961, 41.81024], [-8.16455, 41.81753], [-8.16944, 41.87944], [-8.19551, 41.87459], [-8.2185, 41.91237], [-8.16232, 41.9828], [-8.08796, 42.01398], [-8.08847, 42.05767], [-8.11729, 42.08537], [-8.18178, 42.06436], [-8.19406, 42.12141], [-8.18947, 42.13853], [-8.1986, 42.15402], [-8.22406, 42.1328], [-8.24681, 42.13993], [-8.2732, 42.12396], [-8.29809, 42.106], [-8.32161, 42.10218], [-8.33912, 42.08358], [-8.36353, 42.09065], [-8.38323, 42.07683], [-8.40143, 42.08052], [-8.42512, 42.07199], [-8.44123, 42.08218], [-8.48185, 42.0811], [-8.52837, 42.07658], [-8.5252, 42.06264], [-8.54563, 42.0537], [-8.58086, 42.05147], [-8.59493, 42.05708], [-8.63791, 42.04691], [-8.64626, 42.03668], [-8.65832, 42.02972], [-8.6681, 41.99703], [-8.69071, 41.98862], [-8.7478, 41.96282], [-8.74606, 41.9469], [-8.75712, 41.92833], [-8.81794, 41.90375], [-8.87157, 41.86488], [-11.19304, 41.83075], [-10.39881, 36.12218]]]] } },
+ { type: "Feature", properties: { wikidata: "Q3311985", nameEn: "Guernsey", country: "GB", groups: ["GG", "830", "Q185086", "154", "150", "UN"], level: "subterritory", driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44 01481"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.49556, 49.79012], [-3.28154, 49.57329], [-2.65349, 49.15373], [-2.36485, 49.48223], [-2.49556, 49.79012]]]] } },
+ { type: "Feature", properties: { wikidata: "Q3320166", nameEn: "Outermost Regions of the EU", aliases: ["OMR"], level: "subunion" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q3336843", nameEn: "Countries of the United Kingdom", aliases: ["GB-UKM"], country: "GB", level: "subcountryGroup" }, geometry: null },
+ { type: "Feature", properties: { wikidata: "Q6736667", nameEn: "Mainland India", country: "IN", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["91"] }, geometry: { type: "MultiPolygon", coordinates: [[[[89.08044, 21.41871], [89.07114, 22.15335], [88.9367, 22.58527], [88.94614, 22.66941], [88.9151, 22.75228], [88.96713, 22.83346], [88.87063, 22.95235], [88.88327, 23.03885], [88.86377, 23.08759], [88.99148, 23.21134], [88.71133, 23.2492], [88.79254, 23.46028], [88.79351, 23.50535], [88.74841, 23.47361], [88.56507, 23.64044], [88.58087, 23.87105], [88.66189, 23.87607], [88.73743, 23.91751], [88.6976, 24.14703], [88.74841, 24.1959], [88.68801, 24.31464], [88.50934, 24.32474], [88.12296, 24.51301], [88.08786, 24.63232], [88.00683, 24.66477], [88.15515, 24.85806], [88.14004, 24.93529], [88.21832, 24.96642], [88.27325, 24.88796], [88.33917, 24.86803], [88.46277, 25.07468], [88.44766, 25.20149], [88.94067, 25.18534], [89.00463, 25.26583], [89.01105, 25.30303], [88.85278, 25.34679], [88.81296, 25.51546], [88.677, 25.46959], [88.4559, 25.59227], [88.45103, 25.66245], [88.242, 25.80811], [88.13138, 25.78773], [88.08804, 25.91334], [88.16581, 26.0238], [88.1844, 26.14417], [88.34757, 26.22216], [88.35153, 26.29123], [88.51649, 26.35923], [88.48749, 26.45855], [88.36938, 26.48683], [88.35153, 26.45241], [88.33093, 26.48929], [88.41196, 26.63837], [88.4298, 26.54489], [88.62144, 26.46783], [88.69485, 26.38353], [88.67837, 26.26291], [88.78961, 26.31093], [88.85004, 26.23211], [89.05328, 26.2469], [88.91321, 26.37984], [88.92357, 26.40711], [88.95612, 26.4564], [89.08899, 26.38845], [89.15869, 26.13708], [89.35953, 26.0077], [89.53515, 26.00382], [89.57101, 25.9682], [89.63968, 26.22595], [89.70201, 26.15138], [89.73581, 26.15818], [89.77865, 26.08387], [89.77728, 26.04254], [89.86592, 25.93115], [89.80585, 25.82489], [89.84388, 25.70042], [89.86129, 25.61714], [89.81208, 25.37244], [89.84086, 25.31854], [89.83371, 25.29548], [89.87629, 25.28337], [89.90478, 25.31038], [90.1155, 25.22686], [90.40034, 25.1534], [90.65042, 25.17788], [90.87427, 25.15799], [91.25517, 25.20677], [91.63648, 25.12846], [92.0316, 25.1834], [92.33957, 25.07593], [92.39147, 25.01471], [92.49887, 24.88796], [92.38626, 24.86055], [92.25854, 24.9191], [92.15796, 24.54435], [92.11662, 24.38997], [91.96603, 24.3799], [91.89258, 24.14674], [91.82596, 24.22345], [91.76004, 24.23848], [91.73257, 24.14703], [91.65292, 24.22095], [91.63782, 24.1132], [91.55542, 24.08687], [91.37414, 24.10693], [91.35741, 23.99072], [91.29587, 24.0041], [91.22308, 23.89616], [91.25192, 23.83463], [91.15579, 23.6599], [91.28293, 23.37538], [91.36453, 23.06612], [91.40848, 23.07117], [91.4035, 23.27522], [91.46615, 23.2328], [91.54993, 23.01051], [91.61571, 22.93929], [91.7324, 23.00043], [91.81634, 23.08001], [91.76417, 23.26619], [91.84789, 23.42235], [91.95642, 23.47361], [91.95093, 23.73284], [92.04706, 23.64229], [92.15417, 23.73409], [92.26541, 23.70392], [92.38214, 23.28705], [92.37665, 22.9435], [92.5181, 22.71441], [92.60029, 22.1522], [92.56616, 22.13554], [92.60949, 21.97638], [92.67532, 22.03547], [92.70416, 22.16017], [92.86208, 22.05456], [92.89504, 21.95143], [92.93899, 22.02656], [92.99804, 21.98964], [92.99255, 22.05965], [93.04885, 22.20595], [93.15734, 22.18687], [93.14224, 22.24535], [93.19991, 22.25425], [93.18206, 22.43716], [93.13537, 22.45873], [93.11477, 22.54374], [93.134, 22.59573], [93.09417, 22.69459], [93.134, 22.92498], [93.12988, 23.05772], [93.2878, 23.00464], [93.38478, 23.13698], [93.36862, 23.35426], [93.38781, 23.36139], [93.39981, 23.38828], [93.38805, 23.4728], [93.43475, 23.68299], [93.3908, 23.7622], [93.3908, 23.92925], [93.36059, 23.93176], [93.32351, 24.04468], [93.34735, 24.10151], [93.41415, 24.07854], [93.46633, 23.97067], [93.50616, 23.94432], [93.62871, 24.00922], [93.75952, 24.0003], [93.80279, 23.92549], [93.92089, 23.95812], [94.14081, 23.83333], [94.30215, 24.23752], [94.32362, 24.27692], [94.45279, 24.56656], [94.50729, 24.59281], [94.5526, 24.70764], [94.60204, 24.70889], [94.73937, 25.00545], [94.74212, 25.13606], [94.57458, 25.20318], [94.68032, 25.47003], [94.80117, 25.49359], [95.18556, 26.07338], [95.11428, 26.1019], [95.12801, 26.38397], [95.05798, 26.45408], [95.23513, 26.68499], [95.30339, 26.65372], [95.437, 26.7083], [95.81603, 27.01335], [95.93002, 27.04149], [96.04949, 27.19428], [96.15591, 27.24572], [96.40779, 27.29818], [96.55761, 27.29928], [96.73888, 27.36638], [96.88445, 27.25046], [96.85287, 27.2065], [96.89132, 27.17474], [97.14675, 27.09041], [97.17422, 27.14052], [96.91431, 27.45752], [96.90112, 27.62149], [97.29919, 27.92233], [97.35824, 27.87256], [97.38845, 28.01329], [97.35412, 28.06663], [97.31292, 28.06784], [97.34547, 28.21385], [97.1289, 28.3619], [96.98882, 28.32564], [96.88445, 28.39452], [96.85561, 28.4875], [96.6455, 28.61657], [96.48895, 28.42955], [96.40929, 28.51526], [96.61391, 28.72742], [96.3626, 29.10607], [96.20467, 29.02325], [96.18682, 29.11087], [96.31316, 29.18643], [96.05361, 29.38167], [95.84899, 29.31464], [95.75149, 29.32063], [95.72086, 29.20797], [95.50842, 29.13487], [95.41091, 29.13007], [95.3038, 29.13847], [95.26122, 29.07727], [95.2214, 29.10727], [95.11291, 29.09527], [95.0978, 29.14446], [94.81353, 29.17804], [94.69318, 29.31739], [94.2752, 29.11687], [94.35897, 29.01965], [93.72797, 28.68821], [93.44621, 28.67189], [93.18069, 28.50319], [93.14635, 28.37035], [92.93075, 28.25671], [92.67486, 28.15018], [92.65472, 28.07632], [92.73025, 28.05814], [92.7275, 27.98662], [92.42538, 27.80092], [92.32101, 27.79363], [92.27432, 27.89077], [91.87057, 27.7195], [91.84722, 27.76325], [91.6469, 27.76358], [91.55819, 27.6144], [91.65007, 27.48287], [92.01132, 27.47352], [92.12019, 27.27829], [92.04702, 27.26861], [92.03457, 27.07334], [92.11863, 26.893], [92.05523, 26.8692], [91.83181, 26.87318], [91.50067, 26.79223], [90.67715, 26.77215], [90.48504, 26.8594], [90.39271, 26.90704], [90.30402, 26.85098], [90.04535, 26.72422], [89.86124, 26.73307], [89.63369, 26.74402], [89.42349, 26.83727], [89.3901, 26.84225], [89.38319, 26.85963], [89.37913, 26.86224], [89.1926, 26.81329], [89.12825, 26.81661], [89.09554, 26.89089], [88.95807, 26.92668], [88.92301, 26.99286], [88.8714, 26.97488], [88.86984, 27.10937], [88.74219, 27.144], [88.91901, 27.32483], [88.82981, 27.38814], [88.77517, 27.45415], [88.88091, 27.85192], [88.83559, 28.01936], [88.63235, 28.12356], [88.54858, 28.06057], [88.25332, 27.9478], [88.1278, 27.95417], [88.13378, 27.88015], [88.1973, 27.85067], [88.19107, 27.79285], [88.04008, 27.49223], [88.07277, 27.43007], [88.01646, 27.21612], [88.01587, 27.21388], [87.9887, 27.11045], [88.11719, 26.98758], [88.13422, 26.98705], [88.12302, 26.95324], [88.19107, 26.75516], [88.1659, 26.68177], [88.16452, 26.64111], [88.09963, 26.54195], [88.09414, 26.43732], [88.00895, 26.36029], [87.90115, 26.44923], [87.89085, 26.48565], [87.84193, 26.43663], [87.7918, 26.46737], [87.76004, 26.40711], [87.67893, 26.43501], [87.66803, 26.40294], [87.59175, 26.38342], [87.55274, 26.40596], [87.51571, 26.43106], [87.46566, 26.44058], [87.37314, 26.40815], [87.34568, 26.34787], [87.26568, 26.37294], [87.26587, 26.40592], [87.24682, 26.4143], [87.18863, 26.40558], [87.14751, 26.40542], [87.09147, 26.45039], [87.0707, 26.58571], [87.04691, 26.58685], [87.01559, 26.53228], [86.95912, 26.52076], [86.94543, 26.52076], [86.82898, 26.43919], [86.76797, 26.45892], [86.74025, 26.42386], [86.69124, 26.45169], [86.62686, 26.46891], [86.61313, 26.48658], [86.57073, 26.49825], [86.54258, 26.53819], [86.49726, 26.54218], [86.31564, 26.61925], [86.26235, 26.61886], [86.22513, 26.58863], [86.13596, 26.60651], [86.02729, 26.66756], [85.8492, 26.56667], [85.85126, 26.60866], [85.83126, 26.61134], [85.76907, 26.63076], [85.72315, 26.67471], [85.73483, 26.79613], [85.66239, 26.84822], [85.61621, 26.86721], [85.59461, 26.85161], [85.5757, 26.85955], [85.56471, 26.84133], [85.47752, 26.79292], [85.34302, 26.74954], [85.21159, 26.75933], [85.18046, 26.80519], [85.19291, 26.86909], [85.15883, 26.86966], [85.02635, 26.85381], [85.05592, 26.88991], [85.00536, 26.89523], [84.97186, 26.9149], [84.96687, 26.95599], [84.85754, 26.98984], [84.82913, 27.01989], [84.793, 26.9968], [84.64496, 27.04669], [84.69166, 27.21294], [84.62161, 27.33885], [84.29315, 27.39], [84.25735, 27.44941], [84.21376, 27.45218], [84.10791, 27.52399], [84.02229, 27.43836], [83.93306, 27.44939], [83.86182, 27.4241], [83.85595, 27.35797], [83.61288, 27.47013], [83.39495, 27.4798], [83.38872, 27.39276], [83.35136, 27.33885], [83.29999, 27.32778], [83.2673, 27.36235], [83.27197, 27.38309], [83.19413, 27.45632], [82.94938, 27.46036], [82.93261, 27.50328], [82.74119, 27.49838], [82.70378, 27.72122], [82.46405, 27.6716], [82.06554, 27.92222], [81.97214, 27.93322], [81.91223, 27.84995], [81.47867, 28.08303], [81.48179, 28.12148], [81.38683, 28.17638], [81.32923, 28.13521], [81.19847, 28.36284], [81.03471, 28.40054], [80.55142, 28.69182], [80.50575, 28.6706], [80.52443, 28.54897], [80.44504, 28.63098], [80.37188, 28.63371], [80.12125, 28.82346], [80.06957, 28.82763], [80.05743, 28.91479], [80.18085, 29.13649], [80.23178, 29.11626], [80.26602, 29.13938], [80.24112, 29.21414], [80.28626, 29.20327], [80.31428, 29.30784], [80.24322, 29.44299], [80.37939, 29.57098], [80.41858, 29.63581], [80.38428, 29.68513], [80.36803, 29.73865], [80.41554, 29.79451], [80.43458, 29.80466], [80.48997, 29.79566], [80.56247, 29.86661], [80.57179, 29.91422], [80.60226, 29.95732], [80.67076, 29.95732], [80.8778, 30.13384], [80.86673, 30.17321], [80.91143, 30.22173], [80.92547, 30.17193], [81.03953, 30.20059], [80.83343, 30.32023], [80.54504, 30.44936], [80.20721, 30.58541], [79.93255, 30.88288], [79.59884, 30.93943], [79.30694, 31.17357], [79.14016, 31.43403], [79.01931, 31.42817], [78.89344, 31.30481], [78.77898, 31.31209], [78.71032, 31.50197], [78.84516, 31.60631], [78.69933, 31.78723], [78.78036, 31.99478], [78.74404, 32.00384], [78.68754, 32.10256], [78.49609, 32.2762], [78.4645, 32.45367], [78.38897, 32.53938], [78.73916, 32.69438], [78.7831, 32.46873], [78.96713, 32.33655], [78.99322, 32.37948], [79.0979, 32.38051], [79.13174, 32.47766], [79.26768, 32.53277], [79.46562, 32.69668], [79.14016, 33.02545], [79.15252, 33.17156], [78.73636, 33.56521], [78.67599, 33.66445], [78.77349, 33.73871], [78.73367, 34.01121], [78.65657, 34.03195], [78.66225, 34.08858], [78.91769, 34.15452], [78.99802, 34.3027], [79.05364, 34.32482], [78.74465, 34.45174], [78.56475, 34.50835], [78.54964, 34.57283], [78.27781, 34.61484], [78.18435, 34.7998], [78.22692, 34.88771], [78.00033, 35.23954], [78.03466, 35.3785], [78.11664, 35.48022], [77.80532, 35.52058], [77.70232, 35.46244], [77.44277, 35.46132], [76.96624, 35.5932], [76.84539, 35.67356], [76.77323, 35.66062], [76.75475, 35.52617], [76.85088, 35.39754], [76.93465, 35.39866], [77.11796, 35.05419], [76.99251, 34.93349], [76.87193, 34.96906], [76.74514, 34.92488], [76.74377, 34.84039], [76.67648, 34.76371], [76.47186, 34.78965], [76.15463, 34.6429], [76.04614, 34.67566], [75.75438, 34.51827], [75.38009, 34.55021], [75.01479, 34.64629], [74.6663, 34.703], [74.58083, 34.77386], [74.31239, 34.79626], [74.12897, 34.70073], [73.96423, 34.68244], [73.93401, 34.63386], [73.93951, 34.57169], [73.89419, 34.54568], [73.88732, 34.48911], [73.74999, 34.3781], [73.74862, 34.34183], [73.8475, 34.32935], [73.90517, 34.35317], [73.98208, 34.2522], [73.90677, 34.10504], [73.88732, 34.05105], [73.91341, 34.01235], [74.21554, 34.03853], [74.25262, 34.01577], [74.26086, 33.92237], [74.14001, 33.83002], [74.05898, 33.82089], [74.00891, 33.75437], [73.96423, 33.73071], [73.98968, 33.66155], [73.97367, 33.64061], [74.03576, 33.56718], [74.10115, 33.56392], [74.18121, 33.4745], [74.17983, 33.3679], [74.08782, 33.26232], [74.01366, 33.25199], [74.02144, 33.18908], [74.15374, 33.13477], [74.17571, 33.07495], [74.31854, 33.02891], [74.34875, 32.97823], [74.31227, 32.92795], [74.41467, 32.90563], [74.45312, 32.77755], [74.6289, 32.75561], [74.64675, 32.82604], [74.7113, 32.84219], [74.65345, 32.71225], [74.69542, 32.66792], [74.64424, 32.60985], [74.65251, 32.56416], [74.67431, 32.56676], [74.68362, 32.49298], [74.84725, 32.49075], [74.97634, 32.45367], [75.03265, 32.49538], [75.28259, 32.36556], [75.38046, 32.26836], [75.25649, 32.10187], [75.00793, 32.03786], [74.9269, 32.0658], [74.86236, 32.04485], [74.79919, 31.95983], [74.58907, 31.87824], [74.47771, 31.72227], [74.57498, 31.60382], [74.61517, 31.55698], [74.59319, 31.50197], [74.64713, 31.45605], [74.59773, 31.4136], [74.53223, 31.30321], [74.51629, 31.13829], [74.56023, 31.08303], [74.60281, 31.10419], [74.60006, 31.13711], [74.6852, 31.12771], [74.67971, 31.05479], [74.5616, 31.04153], [73.88993, 30.36305], [73.95736, 30.28466], [73.97225, 30.19829], [73.80299, 30.06969], [73.58665, 30.01848], [73.3962, 29.94707], [73.28094, 29.56646], [73.05886, 29.1878], [73.01337, 29.16422], [72.94272, 29.02487], [72.40402, 28.78283], [72.29495, 28.66367], [72.20329, 28.3869], [71.9244, 28.11555], [71.89921, 27.96035], [70.79054, 27.68423], [70.60927, 28.02178], [70.37307, 28.01208], [70.12502, 27.8057], [70.03136, 27.56627], [69.58519, 27.18109], [69.50904, 26.74892], [69.88555, 26.56836], [70.05584, 26.60398], [70.17532, 26.55362], [70.17532, 26.24118], [70.08193, 26.08094], [70.0985, 25.93238], [70.2687, 25.71156], [70.37444, 25.67443], [70.53649, 25.68928], [70.60378, 25.71898], [70.67382, 25.68186], [70.66695, 25.39314], [70.89148, 25.15064], [70.94002, 24.92843], [71.09405, 24.69017], [70.97594, 24.60904], [71.00341, 24.46038], [71.12838, 24.42662], [71.04461, 24.34657], [70.94985, 24.3791], [70.85784, 24.30903], [70.88393, 24.27398], [70.71502, 24.23517], [70.57906, 24.27774], [70.5667, 24.43787], [70.11712, 24.30915], [70.03428, 24.172], [69.73335, 24.17007], [69.59579, 24.29777], [69.29778, 24.28712], [69.19341, 24.25646], [69.07806, 24.29777], [68.97781, 24.26021], [68.90914, 24.33156], [68.7416, 24.31904], [68.74643, 23.97027], [68.39339, 23.96838], [68.20763, 23.85849], [68.11329, 23.53945], [76.59015, 5.591], [79.50447, 8.91876], [79.42124, 9.80115], [80.48418, 10.20786], [89.08044, 21.41871]]]] } },
+ { type: "Feature", properties: { wikidata: "Q9143535", nameEn: "Akrotiri", country: "GB", groups: ["Q644636", "Q37362", "BOTS", "145", "142", "UN"], level: "subterritory", driveSide: "left", callingCodes: ["357"] }, geometry: { type: "MultiPolygon", coordinates: [[[[32.86014, 34.70585], [32.82717, 34.70622], [32.79433, 34.67883], [32.76136, 34.68318], [32.75515, 34.64985], [32.74412, 34.43926], [33.26744, 34.49942], [33.0138, 34.64424], [32.96968, 34.64046], [32.96718, 34.63446], [32.95891, 34.62919], [32.95323, 34.64075], [32.95471, 34.64528], [32.94976, 34.65204], [32.94796, 34.6587], [32.95325, 34.66462], [32.97079, 34.66112], [32.97736, 34.65277], [32.99014, 34.65518], [32.98668, 34.67268], [32.99135, 34.68061], [32.95539, 34.68471], [32.94683, 34.67907], [32.94379, 34.67111], [32.93693, 34.67027], [32.93449, 34.66241], [32.92807, 34.66736], [32.93043, 34.67091], [32.91398, 34.67343], [32.9068, 34.66102], [32.86167, 34.68734], [32.86014, 34.70585]]]] } },
+ { type: "Feature", properties: { wikidata: "Q9206745", nameEn: "Dhekelia", country: "GB", groups: ["Q644636", "Q37362", "BOTS", "145", "142", "UN"], level: "subterritory", driveSide: "left", callingCodes: ["357"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.70575, 34.97947], [33.83531, 34.73974], [33.98684, 34.76642], [33.90075, 34.96623], [33.86432, 34.97592], [33.84811, 34.97075], [33.83505, 34.98108], [33.85621, 34.98956], [33.85891, 35.001], [33.85216, 35.00579], [33.84045, 35.00616], [33.82875, 35.01685], [33.83055, 35.02865], [33.81524, 35.04192], [33.8012, 35.04786], [33.82051, 35.0667], [33.8355, 35.05777], [33.85261, 35.0574], [33.88367, 35.07877], [33.89485, 35.06873], [33.90247, 35.07686], [33.91299, 35.07579], [33.91789, 35.08688], [33.89853, 35.11377], [33.88737, 35.11408], [33.88943, 35.12007], [33.88561, 35.12449], [33.87224, 35.12293], [33.87622, 35.10457], [33.87097, 35.09389], [33.87479, 35.08881], [33.8541, 35.07201], [33.84168, 35.06823], [33.82067, 35.07826], [33.78581, 35.05104], [33.76106, 35.04253], [33.73824, 35.05321], [33.71482, 35.03722], [33.70209, 35.04882], [33.7161, 35.07279], [33.70861, 35.07644], [33.69095, 35.06237], [33.68474, 35.06602], [33.67742, 35.05963], [33.67678, 35.03866], [33.69938, 35.03123], [33.69731, 35.01754], [33.71514, 35.00294], [33.70639, 34.99303], [33.70575, 34.97947]], [[33.77312, 34.9976], [33.77553, 34.99518], [33.78516, 34.99582], [33.79191, 34.98914], [33.78917, 34.98854], [33.78571, 34.98951], [33.78318, 34.98699], [33.78149, 34.98854], [33.77843, 34.988], [33.7778, 34.98981], [33.76738, 34.99188], [33.76605, 34.99543], [33.75682, 34.99916], [33.75994, 35.00113], [33.77312, 34.9976]], [[33.74144, 35.01053], [33.7343, 35.01178], [33.73781, 35.02181], [33.74265, 35.02329], [33.74983, 35.02274], [33.7492, 35.01319], [33.74144, 35.01053]]]] } },
+ { type: "Feature", properties: { wikidata: "Q16390686", nameEn: "Peninsular Spain", country: "ES", groups: ["Q12837", "EU", "039", "150", "UN"], callingCodes: ["34"] }, geometry: { type: "MultiPolygon", coordinates: [[[[3.75438, 42.33445], [3.17156, 42.43545], [3.11379, 42.43646], [3.10027, 42.42621], [3.08167, 42.42748], [3.03734, 42.47363], [2.96518, 42.46692], [2.94283, 42.48174], [2.92107, 42.4573], [2.88413, 42.45938], [2.86983, 42.46843], [2.85675, 42.45444], [2.84335, 42.45724], [2.77464, 42.41046], [2.75497, 42.42578], [2.72056, 42.42298], [2.65311, 42.38771], [2.6747, 42.33974], [2.57934, 42.35808], [2.55516, 42.35351], [2.54382, 42.33406], [2.48457, 42.33933], [2.43508, 42.37568], [2.43299, 42.39423], [2.38504, 42.39977], [2.25551, 42.43757], [2.20578, 42.41633], [2.16599, 42.42314], [2.12789, 42.41291], [2.11621, 42.38393], [2.06241, 42.35906], [2.00488, 42.35399], [1.96482, 42.37787], [1.9574, 42.42401], [1.94084, 42.43039], [1.94061, 42.43333], [1.94292, 42.44316], [1.93663, 42.45439], [1.88853, 42.4501], [1.83037, 42.48395], [1.76335, 42.48863], [1.72515, 42.50338], [1.70571, 42.48867], [1.66826, 42.50779], [1.65674, 42.47125], [1.58933, 42.46275], [1.57953, 42.44957], [1.55937, 42.45808], [1.55073, 42.43299], [1.5127, 42.42959], [1.44529, 42.43724], [1.43838, 42.47848], [1.41648, 42.48315], [1.46661, 42.50949], [1.44759, 42.54431], [1.41245, 42.53539], [1.4234, 42.55959], [1.44529, 42.56722], [1.42512, 42.58292], [1.44197, 42.60217], [1.35562, 42.71944], [1.15928, 42.71407], [1.0804, 42.78569], [0.98292, 42.78754], [0.96166, 42.80629], [0.93089, 42.79154], [0.711, 42.86372], [0.66121, 42.84021], [0.65421, 42.75872], [0.67873, 42.69458], [0.40214, 42.69779], [0.36251, 42.72282], [0.29407, 42.67431], [0.25336, 42.7174], [0.17569, 42.73424], [-0.02468, 42.68513], [-0.10519, 42.72761], [-0.16141, 42.79535], [-0.17939, 42.78974], [-0.3122, 42.84788], [-0.38833, 42.80132], [-0.41319, 42.80776], [-0.44334, 42.79939], [-0.50863, 42.82713], [-0.55497, 42.77846], [-0.67637, 42.88303], [-0.69837, 42.87945], [-0.72608, 42.89318], [-0.73422, 42.91228], [-0.72037, 42.92541], [-0.75478, 42.96916], [-0.81652, 42.95166], [-0.97133, 42.96239], [-1.00963, 42.99279], [-1.10333, 43.0059], [-1.22881, 43.05534], [-1.25244, 43.04164], [-1.30531, 43.06859], [-1.30052, 43.09581], [-1.27118, 43.11961], [-1.32209, 43.1127], [-1.34419, 43.09665], [-1.35272, 43.02658], [-1.44067, 43.047], [-1.47555, 43.08372], [-1.41562, 43.12815], [-1.3758, 43.24511], [-1.40942, 43.27272], [-1.45289, 43.27049], [-1.50992, 43.29481], [-1.55963, 43.28828], [-1.57674, 43.25269], [-1.61341, 43.25269], [-1.63052, 43.28591], [-1.62481, 43.30726], [-1.69407, 43.31378], [-1.73074, 43.29481], [-1.7397, 43.32979], [-1.75079, 43.3317], [-1.75334, 43.34107], [-1.77068, 43.34396], [-1.78714, 43.35476], [-1.78332, 43.36399], [-1.79319, 43.37497], [-1.77289, 43.38957], [-1.81005, 43.59738], [-10.14298, 44.17365], [-11.19304, 41.83075], [-8.87157, 41.86488], [-8.81794, 41.90375], [-8.75712, 41.92833], [-8.74606, 41.9469], [-8.7478, 41.96282], [-8.69071, 41.98862], [-8.6681, 41.99703], [-8.65832, 42.02972], [-8.64626, 42.03668], [-8.63791, 42.04691], [-8.59493, 42.05708], [-8.58086, 42.05147], [-8.54563, 42.0537], [-8.5252, 42.06264], [-8.52837, 42.07658], [-8.48185, 42.0811], [-8.44123, 42.08218], [-8.42512, 42.07199], [-8.40143, 42.08052], [-8.38323, 42.07683], [-8.36353, 42.09065], [-8.33912, 42.08358], [-8.32161, 42.10218], [-8.29809, 42.106], [-8.2732, 42.12396], [-8.24681, 42.13993], [-8.22406, 42.1328], [-8.1986, 42.15402], [-8.18947, 42.13853], [-8.19406, 42.12141], [-8.18178, 42.06436], [-8.11729, 42.08537], [-8.08847, 42.05767], [-8.08796, 42.01398], [-8.16232, 41.9828], [-8.2185, 41.91237], [-8.19551, 41.87459], [-8.16944, 41.87944], [-8.16455, 41.81753], [-8.0961, 41.81024], [-8.01136, 41.83453], [-7.9804, 41.87337], [-7.92336, 41.8758], [-7.90707, 41.92432], [-7.88751, 41.92553], [-7.88055, 41.84571], [-7.84188, 41.88065], [-7.69848, 41.90977], [-7.65774, 41.88308], [-7.58603, 41.87944], [-7.62188, 41.83089], [-7.52737, 41.83939], [-7.49803, 41.87095], [-7.45566, 41.86488], [-7.44759, 41.84451], [-7.42854, 41.83262], [-7.42864, 41.80589], [-7.37092, 41.85031], [-7.32366, 41.8406], [-7.18677, 41.88793], [-7.18549, 41.97515], [-7.14115, 41.98855], [-7.08574, 41.97401], [-7.07596, 41.94977], [-7.01078, 41.94977], [-6.98144, 41.9728], [-6.95537, 41.96553], [-6.94396, 41.94403], [-6.82174, 41.94493], [-6.81196, 41.99097], [-6.76959, 41.98734], [-6.75004, 41.94129], [-6.61967, 41.94008], [-6.58544, 41.96674], [-6.5447, 41.94371], [-6.56752, 41.88429], [-6.51374, 41.8758], [-6.56426, 41.74219], [-6.54633, 41.68623], [-6.49907, 41.65823], [-6.44204, 41.68258], [-6.29863, 41.66432], [-6.19128, 41.57638], [-6.26777, 41.48796], [-6.3306, 41.37677], [-6.38553, 41.38655], [-6.38551, 41.35274], [-6.55937, 41.24417], [-6.65046, 41.24725], [-6.68286, 41.21641], [-6.69711, 41.1858], [-6.77319, 41.13049], [-6.75655, 41.10187], [-6.79241, 41.05397], [-6.80942, 41.03629], [-6.84781, 41.02692], [-6.88843, 41.03027], [-6.913, 41.03922], [-6.9357, 41.02888], [-6.8527, 40.93958], [-6.84292, 40.89771], [-6.80707, 40.88047], [-6.79892, 40.84842], [-6.82337, 40.84472], [-6.82826, 40.74603], [-6.79567, 40.65955], [-6.84292, 40.56801], [-6.80218, 40.55067], [-6.7973, 40.51723], [-6.84944, 40.46394], [-6.84618, 40.42177], [-6.78426, 40.36468], [-6.80218, 40.33239], [-6.86085, 40.2976], [-6.86085, 40.26776], [-7.00426, 40.23169], [-7.02544, 40.18564], [-7.00589, 40.12087], [-6.94233, 40.10716], [-6.86737, 40.01986], [-6.91463, 39.86618], [-6.97492, 39.81488], [-7.01613, 39.66877], [-7.24707, 39.66576], [-7.33507, 39.64569], [-7.54121, 39.66717], [-7.49477, 39.58794], [-7.2927, 39.45847], [-7.3149, 39.34857], [-7.23403, 39.27579], [-7.23566, 39.20132], [-7.12811, 39.17101], [-7.14929, 39.11287], [-7.10692, 39.10275], [-7.04011, 39.11919], [-6.97004, 39.07619], [-6.95211, 39.0243], [-7.051, 38.907], [-7.03848, 38.87221], [-7.26174, 38.72107], [-7.265, 38.61674], [-7.32529, 38.44336], [-7.15581, 38.27597], [-7.09389, 38.17227], [-6.93418, 38.21454], [-7.00375, 38.01914], [-7.05966, 38.01966], [-7.10366, 38.04404], [-7.12648, 38.00296], [-7.24544, 37.98884], [-7.27314, 37.90145], [-7.33441, 37.81193], [-7.41981, 37.75729], [-7.51759, 37.56119], [-7.46878, 37.47127], [-7.43974, 37.38913], [-7.43227, 37.25152], [-7.41854, 37.23813], [-7.41133, 37.20314], [-7.39769, 37.16868], [-7.37282, 36.96896], [-7.2725, 35.73269], [-5.10878, 36.05227], [-2.27707, 35.35051], [3.75438, 42.33445]], [[-5.27801, 36.14942], [-5.34064, 36.03744], [-5.40526, 36.15488], [-5.34536, 36.15501], [-5.33822, 36.15272], [-5.27801, 36.14942]]], [[[1.99838, 42.44682], [2.01564, 42.45171], [1.99216, 42.46208], [1.98579, 42.47486], [1.99766, 42.4858], [1.98916, 42.49351], [1.98022, 42.49569], [1.97697, 42.48568], [1.97227, 42.48487], [1.97003, 42.48081], [1.96215, 42.47854], [1.95606, 42.45785], [1.96125, 42.45364], [1.98378, 42.44697], [1.99838, 42.44682]]]] } },
+ { type: "Feature", properties: { wikidata: "Q98059339", nameEn: "Mainland Norway", country: "NO", groups: ["154", "150", "UN"], callingCodes: ["47"] }, geometry: { type: "MultiPolygon", coordinates: [[[[10.40861, 58.38489], [10.64958, 58.89391], [11.08911, 58.98745], [11.15367, 59.07862], [11.34459, 59.11672], [11.4601, 58.99022], [11.45199, 58.89604], [11.65732, 58.90177], [11.8213, 59.24985], [11.69297, 59.59442], [11.92112, 59.69531], [11.87121, 59.86039], [12.15641, 59.8926], [12.36317, 59.99259], [12.52003, 60.13846], [12.59133, 60.50559], [12.2277, 61.02442], [12.69115, 61.06584], [12.86939, 61.35427], [12.57707, 61.56547], [12.40595, 61.57226], [12.14746, 61.7147], [12.29187, 62.25699], [12.07085, 62.6297], [12.19919, 63.00104], [11.98529, 63.27487], [12.19919, 63.47935], [12.14928, 63.59373], [12.74105, 64.02171], [13.23411, 64.09087], [13.98222, 64.00953], [14.16051, 64.18725], [14.11117, 64.46674], [13.64276, 64.58402], [14.50926, 65.31786], [14.53778, 66.12399], [15.05113, 66.15572], [15.49318, 66.28509], [15.37197, 66.48217], [16.35589, 67.06419], [16.39154, 67.21653], [16.09922, 67.4364], [16.12774, 67.52106], [16.38441, 67.52923], [16.7409, 67.91037], [17.30416, 68.11591], [17.90787, 67.96537], [18.13836, 68.20874], [18.1241, 68.53721], [18.39503, 68.58672], [18.63032, 68.50849], [18.97255, 68.52416], [19.93508, 68.35911], [20.22027, 68.48759], [19.95647, 68.55546], [20.22027, 68.67246], [20.33435, 68.80174], [20.28444, 68.93283], [20.0695, 69.04469], [20.55258, 69.06069], [20.72171, 69.11874], [21.05775, 69.0356], [21.11099, 69.10291], [20.98641, 69.18809], [21.00732, 69.22755], [21.27827, 69.31281], [21.63833, 69.27485], [22.27276, 68.89514], [22.38367, 68.71561], [22.53321, 68.74393], [23.13064, 68.64684], [23.68017, 68.70276], [23.781, 68.84514], [24.02299, 68.81601], [24.18432, 68.73936], [24.74898, 68.65143], [24.90023, 68.55579], [24.93048, 68.61102], [25.10189, 68.63307], [25.12206, 68.78684], [25.42455, 68.90328], [25.61613, 68.89602], [25.75729, 68.99383], [25.69679, 69.27039], [25.96904, 69.68397], [26.40261, 69.91377], [26.64461, 69.96565], [27.05802, 69.92069], [27.57226, 70.06215], [27.95542, 70.0965], [27.97558, 69.99671], [28.32849, 69.88605], [28.36883, 69.81658], [29.12697, 69.69193], [29.31664, 69.47994], [28.8629, 69.22395], [28.81248, 69.11997], [28.91738, 69.04774], [29.0444, 69.0119], [29.26623, 69.13794], [29.27631, 69.2811], [29.97205, 69.41623], [30.16363, 69.65244], [30.52662, 69.54699], [30.95011, 69.54699], [30.84095, 69.80584], [31.59909, 70.16571], [32.07813, 72.01005], [-11.60274, 67.73467], [7.28637, 57.35913], [10.40861, 58.38489]]]] } },
+ { type: "Feature", properties: { wikidata: "Q98543636", nameEn: "Mainland Ecuador", country: "EC", groups: ["005", "419", "019", "UN"], callingCodes: ["593"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-84.52388, -3.36941], [-80.30602, -3.39149], [-80.20647, -3.431], [-80.24123, -3.46124], [-80.24586, -3.48677], [-80.23651, -3.48652], [-80.22629, -3.501], [-80.20535, -3.51667], [-80.21642, -3.5888], [-80.19848, -3.59249], [-80.18741, -3.63994], [-80.19926, -3.68894], [-80.13232, -3.90317], [-80.46386, -4.01342], [-80.4822, -4.05477], [-80.45023, -4.20938], [-80.32114, -4.21323], [-80.46386, -4.41516], [-80.39256, -4.48269], [-80.13945, -4.29786], [-79.79722, -4.47558], [-79.59402, -4.46848], [-79.26248, -4.95167], [-79.1162, -4.97774], [-79.01659, -5.01481], [-78.85149, -4.66795], [-78.68394, -4.60754], [-78.34362, -3.38633], [-78.24589, -3.39907], [-78.22642, -3.51113], [-78.14324, -3.47653], [-78.19369, -3.36431], [-77.94147, -3.05454], [-76.6324, -2.58397], [-76.05203, -2.12179], [-75.57429, -1.55961], [-75.3872, -0.9374], [-75.22862, -0.95588], [-75.22862, -0.60048], [-75.53615, -0.19213], [-75.60169, -0.18708], [-75.61997, -0.10012], [-75.40192, -0.17196], [-75.25764, -0.11943], [-75.82927, 0.09578], [-76.23441, 0.42294], [-76.41215, 0.38228], [-76.4094, 0.24015], [-76.89177, 0.24736], [-77.52001, 0.40782], [-77.49984, 0.64476], [-77.67815, 0.73863], [-77.66416, 0.81604], [-77.68613, 0.83029], [-77.7148, 0.85003], [-77.85677, 0.80197], [-78.42749, 1.15389], [-78.87137, 1.47457], [-82.12561, 4.00341], [-84.52388, -3.36941]]]] } },
+ { type: "Feature", properties: { m49: "001", wikidata: "Q2", nameEn: "World", aliases: ["Earth", "Planet"], level: "world" }, geometry: null },
+ { type: "Feature", properties: { m49: "002", wikidata: "Q15", nameEn: "Africa", level: "region" }, geometry: null },
+ { type: "Feature", properties: { m49: "003", wikidata: "Q49", nameEn: "North America", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "005", wikidata: "Q18", nameEn: "South America", level: "intermediateRegion" }, geometry: null },
+ { type: "Feature", properties: { m49: "009", wikidata: "Q538", nameEn: "Oceania", level: "region" }, geometry: null },
+ { type: "Feature", properties: { m49: "011", wikidata: "Q4412", nameEn: "Western Africa", level: "intermediateRegion" }, geometry: null },
+ { type: "Feature", properties: { m49: "013", wikidata: "Q27611", nameEn: "Central America", level: "intermediateRegion" }, geometry: null },
+ { type: "Feature", properties: { m49: "014", wikidata: "Q27407", nameEn: "Eastern Africa", level: "intermediateRegion" }, geometry: null },
+ { type: "Feature", properties: { m49: "015", wikidata: "Q27381", nameEn: "Northern Africa", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "017", wikidata: "Q27433", nameEn: "Middle Africa", level: "intermediateRegion" }, geometry: null },
+ { type: "Feature", properties: { m49: "018", wikidata: "Q27394", nameEn: "Southern Africa", level: "intermediateRegion" }, geometry: null },
+ { type: "Feature", properties: { m49: "019", wikidata: "Q828", nameEn: "Americas", level: "region" }, geometry: null },
+ { type: "Feature", properties: { m49: "021", wikidata: "Q2017699", nameEn: "Northern America", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "029", wikidata: "Q664609", nameEn: "Caribbean", level: "intermediateRegion" }, geometry: null },
+ { type: "Feature", properties: { m49: "030", wikidata: "Q27231", nameEn: "Eastern Asia", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "034", wikidata: "Q771405", nameEn: "Southern Asia", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "035", wikidata: "Q11708", nameEn: "South-eastern Asia", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "039", wikidata: "Q27449", nameEn: "Southern Europe", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "053", wikidata: "Q45256", nameEn: "Australia and New Zealand", aliases: ["Australasia"], level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "054", wikidata: "Q37394", nameEn: "Melanesia", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "057", wikidata: "Q3359409", nameEn: "Micronesia", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "061", wikidata: "Q35942", nameEn: "Polynesia", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "142", wikidata: "Q48", nameEn: "Asia", level: "region" }, geometry: null },
+ { type: "Feature", properties: { m49: "143", wikidata: "Q27275", nameEn: "Central Asia", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "145", wikidata: "Q27293", nameEn: "Western Asia", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "150", wikidata: "Q46", nameEn: "Europe", level: "region" }, geometry: null },
+ { type: "Feature", properties: { m49: "151", wikidata: "Q27468", nameEn: "Eastern Europe", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "154", wikidata: "Q27479", nameEn: "Northern Europe", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "155", wikidata: "Q27496", nameEn: "Western Europe", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "202", wikidata: "Q132959", nameEn: "Sub-Saharan Africa", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "419", wikidata: "Q72829598", nameEn: "Latin America and the Caribbean", level: "subregion" }, geometry: null },
+ { type: "Feature", properties: { m49: "680", wikidata: "Q3405693", nameEn: "Sark", country: "GB", groups: ["GG", "830", "Q185086", "154", "150", "UN"], level: "subterritory", driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44 01481"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.36485, 49.48223], [-2.65349, 49.15373], [-2.09454, 49.46288], [-2.36485, 49.48223]]]] } },
+ { type: "Feature", properties: { m49: "830", wikidata: "Q42314", nameEn: "Channel Islands", level: "intermediateRegion" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "AC", iso1A3: "ASC", wikidata: "Q46197", nameEn: "Ascension Island", aliases: ["SH-AC"], country: "GB", groups: ["SH", "BOTS", "011", "202", "002", "UN"], isoStatus: "excRes", driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["247"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-14.82771, -8.70814], [-13.33271, -8.07391], [-14.91926, -6.63386], [-14.82771, -8.70814]]]] } },
+ { type: "Feature", properties: { iso1A2: "AD", iso1A3: "AND", iso1N3: "020", wikidata: "Q228", nameEn: "Andorra", groups: ["Q12837", "039", "150", "UN"], callingCodes: ["376"] }, geometry: { type: "MultiPolygon", coordinates: [[[[1.72515, 42.50338], [1.73683, 42.55492], [1.7858, 42.57698], [1.72588, 42.59098], [1.73452, 42.61515], [1.68267, 42.62533], [1.6625, 42.61982], [1.63485, 42.62957], [1.60085, 42.62703], [1.55418, 42.65669], [1.50867, 42.64483], [1.48043, 42.65203], [1.46718, 42.63296], [1.47986, 42.61346], [1.44197, 42.60217], [1.42512, 42.58292], [1.44529, 42.56722], [1.4234, 42.55959], [1.41245, 42.53539], [1.44759, 42.54431], [1.46661, 42.50949], [1.41648, 42.48315], [1.43838, 42.47848], [1.44529, 42.43724], [1.5127, 42.42959], [1.55073, 42.43299], [1.55937, 42.45808], [1.57953, 42.44957], [1.58933, 42.46275], [1.65674, 42.47125], [1.66826, 42.50779], [1.70571, 42.48867], [1.72515, 42.50338]]]] } },
+ { type: "Feature", properties: { iso1A2: "AE", iso1A3: "ARE", iso1N3: "784", wikidata: "Q878", nameEn: "United Arab Emirates", groups: ["145", "142", "UN"], callingCodes: ["971"] }, geometry: { type: "MultiPolygon", coordinates: [[[[56.26534, 25.62825], [56.25341, 25.61443], [56.26636, 25.60643], [56.25365, 25.60211], [56.20473, 25.61119], [56.18363, 25.65508], [56.14826, 25.66351], [56.13579, 25.73524], [56.17416, 25.77239], [56.13963, 25.82765], [56.19334, 25.9795], [56.15498, 26.06828], [56.08666, 26.05038], [55.81777, 26.18798], [55.14145, 25.62624], [53.97892, 24.64436], [52.82259, 25.51697], [52.35509, 25.00368], [52.02277, 24.75635], [51.83108, 24.71675], [51.58834, 24.66608], [51.41644, 24.39615], [51.58871, 24.27256], [51.59617, 24.12041], [52.56622, 22.94341], [55.13599, 22.63334], [55.2137, 22.71065], [55.22634, 23.10378], [55.57358, 23.669], [55.48677, 23.94946], [55.73301, 24.05994], [55.8308, 24.01633], [56.01799, 24.07426], [55.95472, 24.2172], [55.83367, 24.20193], [55.77658, 24.23476], [55.76558, 24.23227], [55.75257, 24.23466], [55.75382, 24.2466], [55.75939, 24.26114], [55.76781, 24.26209], [55.79145, 24.27914], [55.80747, 24.31069], [55.83395, 24.32776], [55.83271, 24.41521], [55.76461, 24.5287], [55.83271, 24.68567], [55.83408, 24.77858], [55.81348, 24.80102], [55.81116, 24.9116], [55.85094, 24.96858], [55.90849, 24.96771], [55.96316, 25.00857], [56.05715, 24.95727], [56.05106, 24.87461], [55.97467, 24.89639], [55.97836, 24.87673], [56.03535, 24.81161], [56.06128, 24.74457], [56.13684, 24.73699], [56.20062, 24.78565], [56.20568, 24.85063], [56.30269, 24.88334], [56.34873, 24.93205], [56.3227, 24.97284], [56.86325, 25.03856], [56.82555, 25.7713], [56.26534, 25.62825]], [[56.26062, 25.33108], [56.3005, 25.31815], [56.3111, 25.30107], [56.35172, 25.30681], [56.34438, 25.26653], [56.27628, 25.23404], [56.24341, 25.22867], [56.20872, 25.24104], [56.20838, 25.25668], [56.24465, 25.27505], [56.25008, 25.28843], [56.23362, 25.31253], [56.26062, 25.33108]]], [[[56.28423, 25.26344], [56.29379, 25.2754], [56.28102, 25.28486], [56.2716, 25.27916], [56.27086, 25.26128], [56.28423, 25.26344]]]] } },
+ { type: "Feature", properties: { iso1A2: "AF", iso1A3: "AFG", iso1N3: "004", wikidata: "Q889", nameEn: "Afghanistan", groups: ["034", "142", "UN"], callingCodes: ["93"] }, geometry: { type: "MultiPolygon", coordinates: [[[[70.61526, 38.34774], [70.60407, 38.28046], [70.54673, 38.24541], [70.4898, 38.12546], [70.17206, 37.93276], [70.1863, 37.84296], [70.27694, 37.81258], [70.28243, 37.66706], [70.15015, 37.52519], [69.95971, 37.5659], [69.93362, 37.61378], [69.84435, 37.60616], [69.80041, 37.5746], [69.51888, 37.5844], [69.44954, 37.4869], [69.36645, 37.40462], [69.45022, 37.23315], [69.39529, 37.16752], [69.25152, 37.09426], [69.03274, 37.25174], [68.96407, 37.32603], [68.88168, 37.33368], [68.91189, 37.26704], [68.80889, 37.32494], [68.81438, 37.23862], [68.6798, 37.27906], [68.61851, 37.19815], [68.41888, 37.13906], [68.41201, 37.10402], [68.29253, 37.10621], [68.27605, 37.00977], [68.18542, 37.02074], [68.02194, 36.91923], [67.87917, 37.0591], [67.7803, 37.08978], [67.78329, 37.1834], [67.51868, 37.26102], [67.2581, 37.17216], [67.2224, 37.24545], [67.13039, 37.27168], [67.08232, 37.35469], [66.95598, 37.40162], [66.64699, 37.32958], [66.55743, 37.35409], [66.30993, 37.32409], [65.72274, 37.55438], [65.64137, 37.45061], [65.64263, 37.34388], [65.51778, 37.23881], [64.97945, 37.21913], [64.61141, 36.6351], [64.62514, 36.44311], [64.57295, 36.34362], [64.43288, 36.24401], [64.05385, 36.10433], [63.98519, 36.03773], [63.56496, 35.95106], [63.53475, 35.90881], [63.29579, 35.85985], [63.12276, 35.86208], [63.10318, 35.81782], [63.23262, 35.67487], [63.10079, 35.63024], [63.12276, 35.53196], [63.0898, 35.43131], [62.90853, 35.37086], [62.74098, 35.25432], [62.62288, 35.22067], [62.48006, 35.28796], [62.29878, 35.13312], [62.29191, 35.25964], [62.15871, 35.33278], [62.05709, 35.43803], [61.97743, 35.4604], [61.77693, 35.41341], [61.58742, 35.43803], [61.27371, 35.61482], [61.18187, 35.30249], [61.0991, 35.27845], [61.12831, 35.09938], [61.06926, 34.82139], [61.00197, 34.70631], [60.99922, 34.63064], [60.72316, 34.52857], [60.91321, 34.30411], [60.66502, 34.31539], [60.50209, 34.13992], [60.5838, 33.80793], [60.5485, 33.73422], [60.57762, 33.59772], [60.69573, 33.56054], [60.91133, 33.55596], [60.88908, 33.50219], [60.56485, 33.12944], [60.86191, 32.22565], [60.84541, 31.49561], [61.70929, 31.37391], [61.80569, 31.16167], [61.80957, 31.12576], [61.83257, 31.0452], [61.8335, 30.97669], [61.78268, 30.92724], [61.80829, 30.84224], [60.87231, 29.86514], [62.47751, 29.40782], [63.5876, 29.50456], [64.12966, 29.39157], [64.19796, 29.50407], [64.62116, 29.58903], [65.04005, 29.53957], [66.24175, 29.85181], [66.36042, 29.9583], [66.23609, 30.06321], [66.34869, 30.404], [66.28413, 30.57001], [66.39194, 30.9408], [66.42645, 30.95309], [66.58175, 30.97532], [66.68166, 31.07597], [66.72561, 31.20526], [66.83273, 31.26867], [67.04147, 31.31561], [67.03323, 31.24519], [67.29964, 31.19586], [67.78854, 31.33203], [67.7748, 31.4188], [67.62374, 31.40473], [67.58323, 31.52772], [67.72056, 31.52304], [67.86887, 31.63536], [68.00071, 31.6564], [68.1655, 31.82691], [68.25614, 31.80357], [68.27605, 31.75863], [68.44222, 31.76446], [68.57475, 31.83158], [68.6956, 31.75687], [68.79997, 31.61665], [68.91078, 31.59687], [68.95995, 31.64822], [69.00939, 31.62249], [69.11514, 31.70782], [69.20577, 31.85957], [69.3225, 31.93186], [69.27032, 32.14141], [69.27932, 32.29119], [69.23599, 32.45946], [69.2868, 32.53938], [69.38155, 32.56601], [69.44747, 32.6678], [69.43649, 32.7302], [69.38018, 32.76601], [69.47082, 32.85834], [69.5436, 32.8768], [69.49854, 32.88843], [69.49004, 33.01509], [69.57656, 33.09911], [69.71526, 33.09911], [69.79766, 33.13247], [69.85259, 33.09451], [70.02563, 33.14282], [70.07369, 33.22557], [70.13686, 33.21064], [70.32775, 33.34496], [70.17062, 33.53535], [70.20141, 33.64387], [70.14785, 33.6553], [70.14236, 33.71701], [70.00503, 33.73528], [69.85671, 33.93719], [69.87307, 33.9689], [69.90203, 34.04194], [70.54336, 33.9463], [70.88119, 33.97933], [71.07345, 34.06242], [71.06933, 34.10564], [71.09307, 34.11961], [71.09453, 34.13524], [71.13078, 34.16503], [71.12815, 34.26619], [71.17662, 34.36769], [71.02401, 34.44835], [71.0089, 34.54568], [71.11602, 34.63047], [71.08718, 34.69034], [71.28356, 34.80882], [71.29472, 34.87728], [71.50329, 34.97328], [71.49917, 35.00478], [71.55273, 35.02615], [71.52938, 35.09023], [71.67495, 35.21262], [71.5541, 35.28776], [71.54294, 35.31037], [71.65435, 35.4479], [71.49917, 35.6267], [71.55273, 35.71483], [71.37969, 35.95865], [71.19505, 36.04134], [71.60491, 36.39429], [71.80267, 36.49924], [72.18135, 36.71838], [72.6323, 36.84601], [73.82685, 36.91421], [74.04856, 36.82648], [74.43389, 37.00977], [74.53739, 36.96224], [74.56453, 37.03023], [74.49981, 37.24518], [74.80605, 37.21565], [74.88887, 37.23275], [74.8294, 37.3435], [74.68383, 37.3948], [74.56161, 37.37734], [74.41055, 37.3948], [74.23339, 37.41116], [74.20308, 37.34208], [73.8564, 37.26158], [73.82552, 37.22659], [73.64974, 37.23643], [73.61129, 37.27469], [73.76647, 37.33913], [73.77197, 37.4417], [73.29633, 37.46495], [73.06884, 37.31729], [72.79693, 37.22222], [72.66381, 37.02014], [72.54095, 37.00007], [72.31676, 36.98115], [71.83229, 36.68084], [71.67083, 36.67346], [71.57195, 36.74943], [71.51502, 36.89128], [71.48481, 36.93218], [71.46923, 36.99925], [71.45578, 37.03094], [71.43097, 37.05855], [71.44127, 37.11856], [71.4494, 37.18137], [71.4555, 37.21418], [71.47386, 37.2269], [71.48339, 37.23937], [71.4824, 37.24921], [71.48536, 37.26017], [71.50674, 37.31502], [71.49821, 37.31975], [71.4862, 37.33405], [71.47685, 37.40281], [71.49612, 37.4279], [71.5256, 37.47971], [71.50616, 37.50733], [71.49693, 37.53527], [71.5065, 37.60912], [71.51972, 37.61945], [71.54186, 37.69691], [71.55234, 37.73209], [71.53053, 37.76534], [71.54324, 37.77104], [71.55752, 37.78677], [71.59255, 37.79956], [71.58843, 37.92425], [71.51565, 37.95349], [71.32871, 37.88564], [71.296, 37.93403], [71.2809, 37.91995], [71.24969, 37.93031], [71.27278, 37.96496], [71.27622, 37.99946], [71.28922, 38.01272], [71.29878, 38.04429], [71.36444, 38.15358], [71.37803, 38.25641], [71.33869, 38.27335], [71.33114, 38.30339], [71.21291, 38.32797], [71.1451, 38.40106], [71.10957, 38.40671], [71.10592, 38.42077], [71.09542, 38.42517], [71.0556, 38.40176], [71.03545, 38.44779], [70.98693, 38.48862], [70.92728, 38.43021], [70.88719, 38.46826], [70.84376, 38.44688], [70.82538, 38.45394], [70.81697, 38.44507], [70.80521, 38.44447], [70.79766, 38.44944], [70.78702, 38.45031], [70.78581, 38.45502], [70.77132, 38.45548], [70.75455, 38.4252], [70.72485, 38.4131], [70.69807, 38.41861], [70.67438, 38.40597], [70.6761, 38.39144], [70.69189, 38.37031], [70.64966, 38.34999], [70.61526, 38.34774]]]] } },
+ { type: "Feature", properties: { iso1A2: "AG", iso1A3: "ATG", iso1N3: "028", wikidata: "Q781", nameEn: "Antigua and Barbuda", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 268"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-61.66959, 18.6782], [-62.58307, 16.68909], [-62.1023, 16.97277], [-61.23098, 16.62484], [-61.66959, 18.6782]]]] } },
+ { type: "Feature", properties: { iso1A2: "AI", iso1A3: "AIA", iso1N3: "660", wikidata: "Q25228", nameEn: "Anguilla", country: "GB", groups: ["BOTS", "029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 264"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.79029, 19.11219], [-63.35989, 18.06012], [-62.62718, 18.26185], [-63.79029, 19.11219]]]] } },
+ { type: "Feature", properties: { iso1A2: "AL", iso1A3: "ALB", iso1N3: "008", wikidata: "Q222", nameEn: "Albania", groups: ["039", "150", "UN"], callingCodes: ["355"] }, geometry: { type: "MultiPolygon", coordinates: [[[[20.07761, 42.55582], [20.01834, 42.54622], [20.00842, 42.5109], [19.9324, 42.51699], [19.82333, 42.46581], [19.76549, 42.50237], [19.74731, 42.57422], [19.77375, 42.58517], [19.73244, 42.66299], [19.65972, 42.62774], [19.4836, 42.40831], [19.42352, 42.36546], [19.42, 42.33019], [19.28623, 42.17745], [19.40687, 42.10024], [19.37548, 42.06835], [19.36867, 42.02564], [19.37691, 41.96977], [19.34601, 41.95675], [19.33812, 41.90669], [19.37451, 41.8842], [19.37597, 41.84849], [19.26406, 41.74971], [19.0384, 40.35325], [19.95905, 39.82857], [19.97622, 39.78684], [19.92466, 39.69533], [19.98042, 39.6504], [20.00957, 39.69227], [20.05189, 39.69112], [20.12956, 39.65805], [20.15988, 39.652], [20.22376, 39.64532], [20.22707, 39.67459], [20.27412, 39.69884], [20.31961, 39.72799], [20.29152, 39.80421], [20.30804, 39.81563], [20.38572, 39.78516], [20.41475, 39.81437], [20.41546, 39.82832], [20.31135, 39.99438], [20.37911, 39.99058], [20.42373, 40.06777], [20.48487, 40.06271], [20.51297, 40.08168], [20.55593, 40.06524], [20.61081, 40.07866], [20.62566, 40.0897], [20.67162, 40.09433], [20.71789, 40.27739], [20.78234, 40.35803], [20.7906, 40.42726], [20.83688, 40.47882], [20.94925, 40.46625], [20.96908, 40.51526], [21.03932, 40.56299], [21.05833, 40.66586], [20.98134, 40.76046], [20.95752, 40.76982], [20.98396, 40.79109], [20.97887, 40.85475], [20.97693, 40.90103], [20.94305, 40.92399], [20.83671, 40.92752], [20.81567, 40.89662], [20.73504, 40.9081], [20.71634, 40.91781], [20.65558, 41.08009], [20.63454, 41.0889], [20.59832, 41.09066], [20.58546, 41.11179], [20.59715, 41.13644], [20.51068, 41.2323], [20.49432, 41.33679], [20.52119, 41.34381], [20.55976, 41.4087], [20.51301, 41.442], [20.49039, 41.49277], [20.45331, 41.51436], [20.45809, 41.5549], [20.52103, 41.56473], [20.55508, 41.58113], [20.51769, 41.65975], [20.52937, 41.69292], [20.51301, 41.72433], [20.53405, 41.78099], [20.57144, 41.7897], [20.55976, 41.87068], [20.59524, 41.8818], [20.57946, 41.91593], [20.63069, 41.94913], [20.59434, 42.03879], [20.55633, 42.08173], [20.56955, 42.12097], [20.48857, 42.25444], [20.3819, 42.3029], [20.34479, 42.32656], [20.24399, 42.32168], [20.21797, 42.41237], [20.17127, 42.50469], [20.07761, 42.55582]]]] } },
+ { type: "Feature", properties: { iso1A2: "AM", iso1A3: "ARM", iso1N3: "051", wikidata: "Q399", nameEn: "Armenia", groups: ["145", "142", "UN"], callingCodes: ["374"] }, geometry: { type: "MultiPolygon", coordinates: [[[[45.0133, 41.29747], [44.93493, 41.25685], [44.81437, 41.30371], [44.80053, 41.25949], [44.81749, 41.23488], [44.84358, 41.23088], [44.89911, 41.21366], [44.87887, 41.20195], [44.82084, 41.21513], [44.72814, 41.20338], [44.61462, 41.24018], [44.59322, 41.1933], [44.46791, 41.18204], [44.34417, 41.2382], [44.34337, 41.20312], [44.32139, 41.2079], [44.18148, 41.24644], [44.16591, 41.19141], [43.84835, 41.16329], [43.74717, 41.1117], [43.67712, 41.13398], [43.4717, 41.12611], [43.44984, 41.0988], [43.47319, 41.02251], [43.58683, 40.98961], [43.67712, 40.93084], [43.67712, 40.84846], [43.74872, 40.7365], [43.7425, 40.66805], [43.63664, 40.54159], [43.54791, 40.47413], [43.60862, 40.43267], [43.59928, 40.34019], [43.71136, 40.16673], [43.65221, 40.14889], [43.65688, 40.11199], [43.92307, 40.01787], [44.1057, 40.03555], [44.1778, 40.02845], [44.26973, 40.04866], [44.46635, 39.97733], [44.61845, 39.8281], [44.75779, 39.7148], [44.88354, 39.74432], [44.92869, 39.72157], [45.06604, 39.79277], [45.18554, 39.67846], [45.17464, 39.58614], [45.21784, 39.58074], [45.23535, 39.61373], [45.30385, 39.61373], [45.29606, 39.57654], [45.46992, 39.49888], [45.70547, 39.60174], [45.80804, 39.56716], [45.83, 39.46487], [45.79225, 39.3695], [45.99774, 39.28931], [46.02303, 39.09978], [46.06973, 39.0744], [46.14785, 38.84206], [46.20601, 38.85262], [46.34059, 38.92076], [46.53497, 38.86548], [46.51805, 38.94982], [46.54296, 39.07078], [46.44022, 39.19636], [46.52584, 39.18912], [46.54141, 39.15895], [46.58032, 39.21204], [46.63481, 39.23013], [46.56476, 39.24942], [46.50093, 39.33736], [46.43244, 39.35181], [46.37795, 39.42039], [46.4013, 39.45405], [46.53051, 39.47809], [46.51027, 39.52373], [46.57721, 39.54414], [46.57098, 39.56694], [46.52117, 39.58734], [46.42465, 39.57534], [46.40286, 39.63651], [46.18493, 39.60533], [45.96543, 39.78859], [45.82533, 39.82925], [45.7833, 39.9475], [45.60895, 39.97733], [45.59806, 40.0131], [45.78642, 40.03218], [45.83779, 39.98925], [45.97944, 40.181], [45.95609, 40.27846], [45.65098, 40.37696], [45.42994, 40.53804], [45.45484, 40.57707], [45.35366, 40.65979], [45.4206, 40.7424], [45.55914, 40.78366], [45.60584, 40.87436], [45.40814, 40.97904], [45.44083, 41.01663], [45.39725, 41.02603], [45.35677, 40.99784], [45.28859, 41.03757], [45.26162, 41.0228], [45.25897, 41.0027], [45.1994, 41.04518], [45.16493, 41.05068], [45.1634, 41.08082], [45.1313, 41.09369], [45.12923, 41.06059], [45.06784, 41.05379], [45.08028, 41.10917], [45.19942, 41.13299], [45.1969, 41.168], [45.11811, 41.19967], [45.05201, 41.19211], [45.02932, 41.2101], [45.05497, 41.2464], [45.0133, 41.29747]], [[45.21324, 40.9817], [45.21219, 40.99001], [45.20518, 40.99348], [45.19312, 40.98998], [45.18382, 41.0066], [45.20625, 41.01484], [45.23487, 41.00226], [45.23095, 40.97828], [45.21324, 40.9817]], [[45.00864, 41.03411], [44.9903, 41.05657], [44.96031, 41.06345], [44.95383, 41.07553], [44.97169, 41.09176], [45.00864, 41.09407], [45.03406, 41.07931], [45.04517, 41.06653], [45.03792, 41.03938], [45.00864, 41.03411]]], [[[45.50279, 40.58424], [45.56071, 40.64765], [45.51825, 40.67382], [45.47927, 40.65023], [45.50279, 40.58424]]]] } },
+ { type: "Feature", properties: { iso1A2: "AO", iso1A3: "AGO", iso1N3: "024", wikidata: "Q916", nameEn: "Angola", groups: ["017", "202", "002", "UN"], callingCodes: ["244"] }, geometry: { type: "MultiPolygon", coordinates: [[[[16.55507, -5.85631], [13.04371, -5.87078], [12.42245, -6.07585], [11.95767, -5.94705], [12.20376, -5.76338], [12.26557, -5.74031], [12.52318, -5.74353], [12.52301, -5.17481], [12.53599, -5.1618], [12.53586, -5.14658], [12.51589, -5.1332], [12.49815, -5.14058], [12.46297, -5.09408], [12.60251, -5.01715], [12.63465, -4.94632], [12.70868, -4.95505], [12.8733, -4.74346], [13.11195, -4.67745], [13.09648, -4.63739], [12.91489, -4.47907], [12.87096, -4.40315], [12.76844, -4.38709], [12.64835, -4.55937], [12.40964, -4.60609], [12.32324, -4.78415], [12.25587, -4.79437], [12.20901, -4.75642], [12.16068, -4.90089], [12.00924, -5.02627], [11.50888, -5.33417], [10.5065, -17.25284], [11.75063, -17.25013], [12.07076, -17.15165], [12.52111, -17.24495], [12.97145, -16.98567], [13.36212, -16.98048], [13.95896, -17.43141], [14.28743, -17.38814], [18.39229, -17.38927], [18.84226, -17.80375], [21.14283, -17.94318], [21.42741, -18.02787], [23.47474, -17.62877], [23.20038, -17.47563], [22.17217, -16.50269], [22.00323, -16.18028], [21.97988, -13.00148], [24.03339, -12.99091], [23.90937, -12.844], [24.06672, -12.29058], [23.98804, -12.13149], [24.02603, -11.15368], [24.00027, -10.89356], [23.86868, -11.02856], [23.45631, -10.946], [23.16602, -11.10577], [22.54205, -11.05784], [22.25951, -11.24911], [22.17954, -10.85884], [22.32604, -10.76291], [22.19039, -9.94628], [21.84856, -9.59871], [21.79824, -7.29628], [20.56263, -7.28566], [20.61689, -6.90876], [20.31846, -6.91953], [20.30218, -6.98955], [19.5469, -7.00195], [19.33698, -7.99743], [18.33635, -8.00126], [17.5828, -8.13784], [16.96282, -7.21787], [16.55507, -5.85631]]]] } },
+ { type: "Feature", properties: { iso1A2: "AQ", iso1A3: "ATA", iso1N3: "010", wikidata: "Q51", nameEn: "Antarctica", level: "region", callingCodes: ["672"] }, geometry: { type: "MultiPolygon", coordinates: [[[[180, -60], [-180, -60], [-180, -90], [180, -90], [180, -60]]]] } },
+ { type: "Feature", properties: { iso1A2: "AR", iso1A3: "ARG", iso1N3: "032", wikidata: "Q414", nameEn: "Argentina", aliases: ["RA"], groups: ["005", "419", "019", "UN"], callingCodes: ["54"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-72.31343, -50.58411], [-72.33873, -51.59954], [-71.99889, -51.98018], [-69.97824, -52.00845], [-68.41683, -52.33516], [-68.60702, -52.65781], [-68.60733, -54.9125], [-68.01394, -54.8753], [-67.46182, -54.92205], [-67.11046, -54.94199], [-66.07313, -55.19618], [-63.67376, -55.11859], [-54.78916, -36.21945], [-57.83001, -34.69099], [-58.34425, -34.15035], [-58.44442, -33.84033], [-58.40475, -33.11777], [-58.1224, -32.98842], [-58.22362, -32.52416], [-58.10036, -32.25338], [-58.20252, -31.86966], [-58.00076, -31.65016], [-58.0023, -31.53084], [-58.07569, -31.44916], [-57.98127, -31.3872], [-57.9908, -31.34924], [-57.86729, -31.06352], [-57.89476, -30.95994], [-57.8024, -30.77193], [-57.89115, -30.49572], [-57.64859, -30.35095], [-57.61478, -30.25165], [-57.65132, -30.19229], [-57.09386, -29.74211], [-56.81251, -29.48154], [-56.62789, -29.18073], [-56.57295, -29.11357], [-56.54171, -29.11447], [-56.05265, -28.62651], [-56.00458, -28.60421], [-56.01729, -28.51223], [-55.65418, -28.18304], [-55.6262, -28.17124], [-55.33303, -27.94661], [-55.16872, -27.86224], [-55.1349, -27.89759], [-54.90805, -27.73149], [-54.90159, -27.63132], [-54.67657, -27.57214], [-54.50416, -27.48232], [-54.41888, -27.40882], [-54.19268, -27.30751], [-54.19062, -27.27639], [-54.15978, -27.2889], [-53.80144, -27.09844], [-53.73372, -26.6131], [-53.68269, -26.33359], [-53.64505, -26.28089], [-53.64186, -26.25976], [-53.64632, -26.24798], [-53.63881, -26.25075], [-53.63739, -26.2496], [-53.65237, -26.23289], [-53.65018, -26.19501], [-53.73968, -26.10012], [-53.73391, -26.07006], [-53.7264, -26.0664], [-53.73086, -26.05842], [-53.73511, -26.04211], [-53.83691, -25.94849], [-53.90831, -25.55513], [-54.52926, -25.62846], [-54.5502, -25.58915], [-54.59398, -25.59224], [-54.62063, -25.91213], [-54.60664, -25.9691], [-54.67359, -25.98607], [-54.69333, -26.37705], [-54.70732, -26.45099], [-54.80868, -26.55669], [-55.00584, -26.78754], [-55.06351, -26.80195], [-55.16948, -26.96068], [-55.25243, -26.93808], [-55.39611, -26.97679], [-55.62322, -27.1941], [-55.59094, -27.32444], [-55.74475, -27.44485], [-55.89195, -27.3467], [-56.18313, -27.29851], [-56.85337, -27.5165], [-58.04205, -27.2387], [-58.59549, -27.29973], [-58.65321, -27.14028], [-58.3198, -26.83443], [-58.1188, -26.16704], [-57.87176, -25.93604], [-57.57431, -25.47269], [-57.80821, -25.13863], [-58.25492, -24.92528], [-58.33055, -24.97099], [-59.33886, -24.49935], [-59.45482, -24.34787], [-60.03367, -24.00701], [-60.28163, -24.04436], [-60.99754, -23.80934], [-61.0782, -23.62932], [-61.9756, -23.0507], [-62.22768, -22.55807], [-62.51761, -22.37684], [-62.64455, -22.25091], [-62.8078, -22.12534], [-62.81124, -21.9987], [-63.66482, -21.99918], [-63.68113, -22.0544], [-63.70963, -21.99934], [-63.93287, -21.99934], [-64.22918, -22.55807], [-64.31489, -22.88824], [-64.35108, -22.73282], [-64.4176, -22.67692], [-64.58888, -22.25035], [-64.67174, -22.18957], [-64.90014, -22.12136], [-64.99524, -22.08255], [-65.47435, -22.08908], [-65.57743, -22.07675], [-65.58694, -22.09794], [-65.61166, -22.09504], [-65.7467, -22.10105], [-65.9261, -21.93335], [-66.04832, -21.9187], [-66.03836, -21.84829], [-66.24077, -21.77837], [-66.29714, -22.08741], [-66.7298, -22.23644], [-67.18382, -22.81525], [-66.99632, -22.99839], [-67.33563, -24.04237], [-68.24825, -24.42596], [-68.56909, -24.69831], [-68.38372, -25.08636], [-68.57622, -25.32505], [-68.38372, -26.15353], [-68.56909, -26.28146], [-68.59048, -26.49861], [-68.27677, -26.90626], [-68.43363, -27.08414], [-68.77586, -27.16029], [-69.22504, -27.95042], [-69.66709, -28.44055], [-69.80969, -29.07185], [-69.99507, -29.28351], [-69.8596, -30.26131], [-70.14479, -30.36595], [-70.55832, -31.51559], [-69.88099, -33.34489], [-69.87386, -34.13344], [-70.49416, -35.24145], [-70.38008, -36.02375], [-70.95047, -36.4321], [-71.24279, -37.20264], [-70.89532, -38.6923], [-71.37826, -38.91474], [-71.92726, -40.72714], [-71.74901, -42.11711], [-72.15541, -42.15941], [-72.14828, -42.85321], [-71.64206, -43.64774], [-71.81318, -44.38097], [-71.16436, -44.46244], [-71.26418, -44.75684], [-72.06985, -44.81756], [-71.35687, -45.22075], [-71.75614, -45.61611], [-71.68577, -46.55385], [-71.94152, -47.13595], [-72.50478, -47.80586], [-72.27662, -48.28727], [-72.54042, -48.52392], [-72.56894, -48.81116], [-73.09655, -49.14342], [-73.45156, -49.79461], [-73.55259, -49.92488], [-73.15765, -50.78337], [-72.31343, -50.58411]]]] } },
+ { type: "Feature", properties: { iso1A2: "AS", iso1A3: "ASM", iso1N3: "016", wikidata: "Q16641", nameEn: "American Samoa", aliases: ["US-AS"], country: "US", groups: ["Q1352230", "061", "009", "UN"], roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 684"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-171.39864, -10.21587], [-170.99605, -15.1275], [-166.32598, -15.26169], [-171.39864, -10.21587]]]] } },
+ { type: "Feature", properties: { iso1A2: "AT", iso1A3: "AUT", iso1N3: "040", wikidata: "Q40", nameEn: "Austria", groups: ["EU", "155", "150", "UN"], callingCodes: ["43"] }, geometry: { type: "MultiPolygon", coordinates: [[[[15.34823, 48.98444], [15.28305, 48.98831], [15.26177, 48.95766], [15.16358, 48.94278], [15.15534, 48.99056], [14.99878, 49.01444], [14.97612, 48.96983], [14.98917, 48.90082], [14.95072, 48.79101], [14.98032, 48.77959], [14.9782, 48.7766], [14.98112, 48.77524], [14.9758, 48.76857], [14.95641, 48.75915], [14.94773, 48.76268], [14.81545, 48.7874], [14.80821, 48.77711], [14.80584, 48.73489], [14.72756, 48.69502], [14.71794, 48.59794], [14.66762, 48.58215], [14.60808, 48.62881], [14.56139, 48.60429], [14.4587, 48.64695], [14.43076, 48.58855], [14.33909, 48.55852], [14.20691, 48.5898], [14.09104, 48.5943], [14.01482, 48.63788], [14.06151, 48.66873], [13.84023, 48.76988], [13.82266, 48.75544], [13.81863, 48.73257], [13.79337, 48.71375], [13.81791, 48.69832], [13.81283, 48.68426], [13.81901, 48.6761], [13.82609, 48.62345], [13.80038, 48.59487], [13.80519, 48.58026], [13.76921, 48.55324], [13.7513, 48.5624], [13.74816, 48.53058], [13.72802, 48.51208], [13.66113, 48.53558], [13.65186, 48.55092], [13.62508, 48.55501], [13.59705, 48.57013], [13.57535, 48.55912], [13.51291, 48.59023], [13.50131, 48.58091], [13.50663, 48.57506], [13.46967, 48.55157], [13.45214, 48.56472], [13.43695, 48.55776], [13.45727, 48.51092], [13.42527, 48.45711], [13.43929, 48.43386], [13.40709, 48.37292], [13.30897, 48.31575], [13.26039, 48.29422], [13.18093, 48.29577], [13.126, 48.27867], [13.0851, 48.27711], [13.02083, 48.25689], [12.95306, 48.20629], [12.87126, 48.20318], [12.84475, 48.16556], [12.836, 48.1647], [12.8362, 48.15876], [12.82673, 48.15245], [12.80676, 48.14979], [12.78595, 48.12445], [12.7617, 48.12796], [12.74973, 48.10885], [12.76141, 48.07373], [12.8549, 48.01122], [12.87476, 47.96195], [12.91683, 47.95647], [12.9211, 47.95135], [12.91985, 47.94069], [12.92668, 47.93879], [12.93419, 47.94063], [12.93642, 47.94436], [12.93886, 47.94046], [12.94163, 47.92927], [13.00588, 47.84374], [12.98543, 47.82896], [12.96311, 47.79957], [12.93202, 47.77302], [12.94371, 47.76281], [12.9353, 47.74788], [12.91711, 47.74026], [12.90274, 47.72513], [12.91333, 47.7178], [12.92969, 47.71094], [12.98578, 47.7078], [13.01382, 47.72116], [13.07692, 47.68814], [13.09562, 47.63304], [13.06407, 47.60075], [13.06641, 47.58577], [13.04537, 47.58183], [13.05355, 47.56291], [13.03252, 47.53373], [13.04537, 47.49426], [12.9998, 47.46267], [12.98344, 47.48716], [12.9624, 47.47452], [12.85256, 47.52741], [12.84672, 47.54556], [12.80699, 47.54477], [12.77427, 47.58025], [12.82101, 47.61493], [12.76492, 47.64485], [12.77777, 47.66689], [12.7357, 47.6787], [12.6071, 47.6741], [12.57438, 47.63238], [12.53816, 47.63553], [12.50076, 47.62293], [12.44117, 47.6741], [12.43883, 47.6977], [12.37222, 47.68433], [12.336, 47.69534], [12.27991, 47.68827], [12.26004, 47.67725], [12.24017, 47.69534], [12.26238, 47.73544], [12.2542, 47.7433], [12.22571, 47.71776], [12.18303, 47.70065], [12.16217, 47.70105], [12.16769, 47.68167], [12.18347, 47.66663], [12.18507, 47.65984], [12.19895, 47.64085], [12.20801, 47.61082], [12.20398, 47.60667], [12.18568, 47.6049], [12.17737, 47.60121], [12.18145, 47.61019], [12.17824, 47.61506], [12.13734, 47.60639], [12.05788, 47.61742], [12.02282, 47.61033], [12.0088, 47.62451], [11.85572, 47.60166], [11.84052, 47.58354], [11.63934, 47.59202], [11.60681, 47.57881], [11.58811, 47.55515], [11.58578, 47.52281], [11.52618, 47.50939], [11.4362, 47.51413], [11.38128, 47.47465], [11.4175, 47.44621], [11.33804, 47.44937], [11.29597, 47.42566], [11.27844, 47.39956], [11.22002, 47.3964], [11.25157, 47.43277], [11.20482, 47.43198], [11.12536, 47.41222], [11.11835, 47.39719], [10.97111, 47.39561], [10.97111, 47.41617], [10.98513, 47.42882], [10.92437, 47.46991], [10.93839, 47.48018], [10.90918, 47.48571], [10.87061, 47.4786], [10.86945, 47.5015], [10.91268, 47.51334], [10.88814, 47.53701], [10.77596, 47.51729], [10.7596, 47.53228], [10.6965, 47.54253], [10.68832, 47.55752], [10.63456, 47.5591], [10.60337, 47.56755], [10.56912, 47.53584], [10.48849, 47.54057], [10.47329, 47.58552], [10.43473, 47.58394], [10.44992, 47.5524], [10.4324, 47.50111], [10.44291, 47.48453], [10.46278, 47.47901], [10.47446, 47.43318], [10.4359, 47.41183], [10.4324, 47.38494], [10.39851, 47.37623], [10.33424, 47.30813], [10.23257, 47.27088], [10.17531, 47.27167], [10.17648, 47.29149], [10.2147, 47.31014], [10.19998, 47.32832], [10.23757, 47.37609], [10.22774, 47.38904], [10.2127, 47.38019], [10.17648, 47.38889], [10.16362, 47.36674], [10.11805, 47.37228], [10.09819, 47.35724], [10.06897, 47.40709], [10.1052, 47.4316], [10.09001, 47.46005], [10.07131, 47.45531], [10.03859, 47.48927], [10.00003, 47.48216], [9.96029, 47.53899], [9.92407, 47.53111], [9.87733, 47.54688], [9.87499, 47.52953], [9.8189, 47.54688], [9.82591, 47.58158], [9.80254, 47.59419], [9.76748, 47.5934], [9.72736, 47.53457], [9.55125, 47.53629], [9.56312, 47.49495], [9.58208, 47.48344], [9.59482, 47.46305], [9.60205, 47.46165], [9.60484, 47.46358], [9.60841, 47.47178], [9.62158, 47.45858], [9.62475, 47.45685], [9.6423, 47.45599], [9.65728, 47.45383], [9.65863, 47.44847], [9.64483, 47.43842], [9.6446, 47.43233], [9.65043, 47.41937], [9.65136, 47.40504], [9.6629, 47.39591], [9.67334, 47.39191], [9.67445, 47.38429], [9.6711, 47.37824], [9.66243, 47.37136], [9.65427, 47.36824], [9.62476, 47.36639], [9.59978, 47.34671], [9.58513, 47.31334], [9.55857, 47.29919], [9.54773, 47.2809], [9.53116, 47.27029], [9.56766, 47.24281], [9.55176, 47.22585], [9.56981, 47.21926], [9.58264, 47.20673], [9.56539, 47.17124], [9.62623, 47.14685], [9.63395, 47.08443], [9.61216, 47.07732], [9.60717, 47.06091], [9.87935, 47.01337], [9.88266, 46.93343], [9.98058, 46.91434], [10.10715, 46.84296], [10.22675, 46.86942], [10.24128, 46.93147], [10.30031, 46.92093], [10.36933, 47.00212], [10.48376, 46.93891], [10.47197, 46.85698], [10.54783, 46.84505], [10.66405, 46.87614], [10.75753, 46.82258], [10.72974, 46.78972], [11.00764, 46.76896], [11.10618, 46.92966], [11.33355, 46.99862], [11.50739, 47.00644], [11.74789, 46.98484], [12.19254, 47.09331], [12.21781, 47.03996], [12.11675, 47.01241], [12.2006, 46.88854], [12.27591, 46.88651], [12.38708, 46.71529], [12.59992, 46.6595], [12.94445, 46.60401], [13.27627, 46.56059], [13.64088, 46.53438], [13.7148, 46.5222], [13.89837, 46.52331], [14.00422, 46.48474], [14.04002, 46.49117], [14.12097, 46.47724], [14.15989, 46.43327], [14.28326, 46.44315], [14.314, 46.43327], [14.42608, 46.44614], [14.45877, 46.41717], [14.52176, 46.42617], [14.56463, 46.37208], [14.5942, 46.43434], [14.66892, 46.44936], [14.72185, 46.49974], [14.81836, 46.51046], [14.83549, 46.56614], [14.86419, 46.59411], [14.87129, 46.61], [14.92283, 46.60848], [14.96002, 46.63459], [14.98024, 46.6009], [15.01451, 46.641], [15.14215, 46.66131], [15.23711, 46.63994], [15.41235, 46.65556], [15.45514, 46.63697], [15.46906, 46.61321], [15.54431, 46.6312], [15.55333, 46.64988], [15.54533, 46.66985], [15.59826, 46.68908], [15.62317, 46.67947], [15.63255, 46.68069], [15.6365, 46.6894], [15.6543, 46.69228], [15.6543, 46.70616], [15.67411, 46.70735], [15.69523, 46.69823], [15.72279, 46.69548], [15.73823, 46.70011], [15.76771, 46.69863], [15.78518, 46.70712], [15.8162, 46.71897], [15.87691, 46.7211], [15.94864, 46.68769], [15.98512, 46.68463], [15.99988, 46.67947], [16.04036, 46.6549], [16.04347, 46.68694], [16.02808, 46.71094], [15.99769, 46.7266], [15.98432, 46.74991], [15.99126, 46.78199], [15.99054, 46.82772], [16.05786, 46.83927], [16.10983, 46.867], [16.19904, 46.94134], [16.22403, 46.939], [16.27594, 46.9643], [16.28202, 47.00159], [16.51369, 47.00084], [16.43936, 47.03548], [16.52176, 47.05747], [16.46134, 47.09395], [16.52863, 47.13974], [16.44932, 47.14418], [16.46442, 47.16845], [16.4523, 47.18812], [16.42801, 47.18422], [16.41739, 47.20649], [16.43663, 47.21127], [16.44142, 47.25079], [16.47782, 47.25918], [16.45104, 47.41181], [16.49908, 47.39416], [16.52414, 47.41007], [16.57152, 47.40868], [16.6718, 47.46139], [16.64821, 47.50155], [16.71059, 47.52692], [16.64193, 47.63114], [16.58699, 47.61772], [16.4222, 47.66537], [16.55129, 47.72268], [16.53514, 47.73837], [16.54779, 47.75074], [16.61183, 47.76171], [16.65679, 47.74197], [16.72089, 47.73469], [16.7511, 47.67878], [16.82938, 47.68432], [16.86509, 47.72268], [16.87538, 47.68895], [17.08893, 47.70928], [17.05048, 47.79377], [17.07039, 47.81129], [17.00997, 47.86245], [17.08275, 47.87719], [17.11022, 47.92461], [17.09786, 47.97336], [17.16001, 48.00636], [17.07039, 48.0317], [17.09168, 48.09366], [17.05735, 48.14179], [17.02919, 48.13996], [16.97701, 48.17385], [16.89461, 48.31332], [16.90903, 48.32519], [16.84243, 48.35258], [16.83317, 48.38138], [16.83588, 48.3844], [16.8497, 48.38321], [16.85204, 48.44968], [16.94611, 48.53614], [16.93955, 48.60371], [16.90354, 48.71541], [16.79779, 48.70998], [16.71883, 48.73806], [16.68518, 48.7281], [16.67008, 48.77699], [16.46134, 48.80865], [16.40915, 48.74576], [16.37345, 48.729], [16.06034, 48.75436], [15.84404, 48.86921], [15.78087, 48.87644], [15.75341, 48.8516], [15.6921, 48.85973], [15.61622, 48.89541], [15.51357, 48.91549], [15.48027, 48.94481], [15.34823, 48.98444]]]] } },
+ { type: "Feature", properties: { iso1A2: "AU", iso1A3: "AUS", iso1N3: "036", wikidata: "Q408", nameEn: "Australia" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "AW", iso1A3: "ABW", iso1N3: "533", wikidata: "Q21203", nameEn: "Aruba", aliases: ["NL-AW"], country: "NL", groups: ["Q1451600", "029", "003", "419", "019", "UN"], callingCodes: ["297"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-70.00823, 12.98375], [-70.35625, 12.58277], [-69.60231, 12.17], [-70.00823, 12.98375]]]] } },
+ { type: "Feature", properties: { iso1A2: "AX", iso1A3: "ALA", iso1N3: "248", wikidata: "Q5689", nameEn: "\xC5land Islands", country: "FI", groups: ["EU", "154", "150", "UN"], callingCodes: ["358 18", "358 457"] }, geometry: { type: "MultiPolygon", coordinates: [[[[19.08191, 60.19152], [20.5104, 59.15546], [21.35468, 59.67511], [21.02509, 60.12142], [21.08159, 60.20167], [21.15143, 60.54555], [20.96741, 60.71528], [19.23413, 60.61414], [19.08191, 60.19152]]]] } },
+ { type: "Feature", properties: { iso1A2: "AZ", iso1A3: "AZE", iso1N3: "031", wikidata: "Q227", nameEn: "Azerbaijan", groups: ["145", "142", "UN"], callingCodes: ["994"] }, geometry: { type: "MultiPolygon", coordinates: [[[[46.42738, 41.91323], [46.3984, 41.84399], [46.30863, 41.79133], [46.23962, 41.75811], [46.20538, 41.77205], [46.17891, 41.72094], [46.19759, 41.62327], [46.24429, 41.59883], [46.26531, 41.63339], [46.28182, 41.60089], [46.3253, 41.60912], [46.34039, 41.5947], [46.34126, 41.57454], [46.29794, 41.5724], [46.33925, 41.4963], [46.40307, 41.48464], [46.4669, 41.43331], [46.63658, 41.37727], [46.72375, 41.28609], [46.66148, 41.20533], [46.63969, 41.09515], [46.55096, 41.1104], [46.48558, 41.0576], [46.456, 41.09984], [46.37661, 41.10805], [46.27698, 41.19011], [46.13221, 41.19479], [45.95786, 41.17956], [45.80842, 41.2229], [45.69946, 41.29545], [45.75705, 41.35157], [45.71035, 41.36208], [45.68389, 41.3539], [45.45973, 41.45898], [45.4006, 41.42402], [45.31352, 41.47168], [45.26285, 41.46433], [45.1797, 41.42231], [45.09867, 41.34065], [45.0133, 41.29747], [45.05497, 41.2464], [45.02932, 41.2101], [45.05201, 41.19211], [45.11811, 41.19967], [45.1969, 41.168], [45.19942, 41.13299], [45.08028, 41.10917], [45.06784, 41.05379], [45.12923, 41.06059], [45.1313, 41.09369], [45.1634, 41.08082], [45.16493, 41.05068], [45.1994, 41.04518], [45.25897, 41.0027], [45.26162, 41.0228], [45.28859, 41.03757], [45.35677, 40.99784], [45.39725, 41.02603], [45.44083, 41.01663], [45.40814, 40.97904], [45.60584, 40.87436], [45.55914, 40.78366], [45.4206, 40.7424], [45.35366, 40.65979], [45.45484, 40.57707], [45.42994, 40.53804], [45.65098, 40.37696], [45.95609, 40.27846], [45.97944, 40.181], [45.83779, 39.98925], [45.78642, 40.03218], [45.59806, 40.0131], [45.60895, 39.97733], [45.7833, 39.9475], [45.82533, 39.82925], [45.96543, 39.78859], [46.18493, 39.60533], [46.40286, 39.63651], [46.42465, 39.57534], [46.52117, 39.58734], [46.57098, 39.56694], [46.57721, 39.54414], [46.51027, 39.52373], [46.53051, 39.47809], [46.4013, 39.45405], [46.37795, 39.42039], [46.43244, 39.35181], [46.50093, 39.33736], [46.56476, 39.24942], [46.63481, 39.23013], [46.58032, 39.21204], [46.54141, 39.15895], [46.52584, 39.18912], [46.44022, 39.19636], [46.54296, 39.07078], [46.51805, 38.94982], [46.53497, 38.86548], [46.75752, 39.03231], [46.83822, 39.13143], [46.92539, 39.16644], [46.95341, 39.13505], [47.05771, 39.20143], [47.05927, 39.24846], [47.31301, 39.37492], [47.38978, 39.45999], [47.50099, 39.49615], [47.84774, 39.66285], [47.98977, 39.70999], [48.34264, 39.42935], [48.37385, 39.37584], [48.15984, 39.30028], [48.12404, 39.25208], [48.15361, 39.19419], [48.31239, 39.09278], [48.33884, 39.03022], [48.28437, 38.97186], [48.08627, 38.94434], [48.07734, 38.91616], [48.01409, 38.90333], [48.02581, 38.82705], [48.24773, 38.71883], [48.3146, 38.59958], [48.45084, 38.61013], [48.58793, 38.45076], [48.62217, 38.40198], [48.70001, 38.40564], [48.78979, 38.45026], [48.81072, 38.44853], [48.84969, 38.45015], [48.88288, 38.43975], [52.39847, 39.43556], [48.80971, 41.95365], [48.5867, 41.84306], [48.55078, 41.77917], [48.42301, 41.65444], [48.40277, 41.60441], [48.2878, 41.56221], [48.22064, 41.51472], [48.07587, 41.49957], [47.87973, 41.21798], [47.75831, 41.19455], [47.62288, 41.22969], [47.54504, 41.20275], [47.49004, 41.26366], [47.34579, 41.27884], [47.10762, 41.59044], [47.03757, 41.55434], [46.99554, 41.59743], [47.00955, 41.63583], [46.8134, 41.76252], [46.75269, 41.8623], [46.58924, 41.80547], [46.5332, 41.87389], [46.42738, 41.91323]], [[45.50279, 40.58424], [45.47927, 40.65023], [45.51825, 40.67382], [45.56071, 40.64765], [45.50279, 40.58424]]], [[[45.00864, 41.03411], [45.03792, 41.03938], [45.04517, 41.06653], [45.03406, 41.07931], [45.00864, 41.09407], [44.97169, 41.09176], [44.95383, 41.07553], [44.96031, 41.06345], [44.9903, 41.05657], [45.00864, 41.03411]]], [[[45.21324, 40.9817], [45.23095, 40.97828], [45.23487, 41.00226], [45.20625, 41.01484], [45.18382, 41.0066], [45.19312, 40.98998], [45.20518, 40.99348], [45.21219, 40.99001], [45.21324, 40.9817]]], [[[45.46992, 39.49888], [45.29606, 39.57654], [45.30385, 39.61373], [45.23535, 39.61373], [45.21784, 39.58074], [45.17464, 39.58614], [45.18554, 39.67846], [45.06604, 39.79277], [44.92869, 39.72157], [44.88354, 39.74432], [44.75779, 39.7148], [44.80977, 39.65768], [44.81043, 39.62677], [44.88916, 39.59653], [44.96746, 39.42998], [45.05932, 39.36435], [45.08751, 39.35052], [45.16168, 39.21952], [45.30489, 39.18333], [45.40148, 39.09007], [45.40452, 39.07224], [45.44811, 39.04927], [45.44966, 38.99243], [45.6131, 38.964], [45.6155, 38.94304], [45.65172, 38.95199], [45.83883, 38.90768], [45.90266, 38.87739], [45.94624, 38.89072], [46.00228, 38.87376], [46.06766, 38.87861], [46.14785, 38.84206], [46.06973, 39.0744], [46.02303, 39.09978], [45.99774, 39.28931], [45.79225, 39.3695], [45.83, 39.46487], [45.80804, 39.56716], [45.70547, 39.60174], [45.46992, 39.49888]]]] } },
+ { type: "Feature", properties: { iso1A2: "BA", iso1A3: "BIH", iso1N3: "070", wikidata: "Q225", nameEn: "Bosnia and Herzegovina", groups: ["039", "150", "UN"], callingCodes: ["387"] }, geometry: { type: "MultiPolygon", coordinates: [[[[17.84826, 45.04489], [17.66571, 45.13408], [17.59104, 45.10816], [17.51469, 45.10791], [17.47589, 45.12656], [17.45615, 45.12523], [17.4498, 45.16119], [17.41229, 45.13335], [17.33573, 45.14521], [17.32092, 45.16246], [17.26815, 45.18444], [17.25131, 45.14957], [17.24325, 45.146], [17.18438, 45.14764], [17.0415, 45.20759], [16.9385, 45.22742], [16.92405, 45.27607], [16.83804, 45.18951], [16.81137, 45.18434], [16.78219, 45.19002], [16.74845, 45.20393], [16.64962, 45.20714], [16.60194, 45.23042], [16.56559, 45.22307], [16.5501, 45.2212], [16.52982, 45.22713], [16.49155, 45.21153], [16.4634, 45.14522], [16.40023, 45.1147], [16.38309, 45.05955], [16.38219, 45.05139], [16.3749, 45.05206], [16.35863, 45.03529], [16.35404, 45.00241], [16.29036, 44.99732], [16.12153, 45.09616], [15.98412, 45.23088], [15.83512, 45.22459], [15.76371, 45.16508], [15.78842, 45.11519], [15.74585, 45.0638], [15.78568, 44.97401], [15.74723, 44.96818], [15.76096, 44.87045], [15.79472, 44.8455], [15.72584, 44.82334], [15.8255, 44.71501], [15.89348, 44.74964], [16.05828, 44.61538], [16.00884, 44.58605], [16.03012, 44.55572], [16.10566, 44.52586], [16.16814, 44.40679], [16.12969, 44.38275], [16.21346, 44.35231], [16.18688, 44.27012], [16.36864, 44.08263], [16.43662, 44.07523], [16.43629, 44.02826], [16.50528, 44.0244], [16.55472, 43.95326], [16.70922, 43.84887], [16.75316, 43.77157], [16.80736, 43.76011], [17.00585, 43.58037], [17.15828, 43.49376], [17.24411, 43.49376], [17.29699, 43.44542], [17.25579, 43.40353], [17.286, 43.33065], [17.46986, 43.16559], [17.64268, 43.08595], [17.70879, 42.97223], [17.5392, 42.92787], [17.6444, 42.88641], [17.68151, 42.92725], [17.7948, 42.89556], [17.80854, 42.9182], [17.88201, 42.83668], [18.24318, 42.6112], [18.36197, 42.61423], [18.43735, 42.55921], [18.49778, 42.58409], [18.53751, 42.57376], [18.55504, 42.58409], [18.52232, 42.62279], [18.57373, 42.64429], [18.54841, 42.68328], [18.54603, 42.69171], [18.55221, 42.69045], [18.56789, 42.72074], [18.47324, 42.74992], [18.45921, 42.81682], [18.47633, 42.85829], [18.4935, 42.86433], [18.49661, 42.89306], [18.49076, 42.95553], [18.52232, 43.01451], [18.66254, 43.03928], [18.64735, 43.14766], [18.66605, 43.2056], [18.71747, 43.2286], [18.6976, 43.25243], [18.76538, 43.29838], [18.85342, 43.32426], [18.84794, 43.33735], [18.83912, 43.34795], [18.90911, 43.36383], [18.95819, 43.32899], [18.95001, 43.29327], [19.00844, 43.24988], [19.04233, 43.30008], [19.08206, 43.29668], [19.08673, 43.31453], [19.04071, 43.397], [19.01078, 43.43854], [18.96053, 43.45042], [18.95469, 43.49367], [18.91379, 43.50299], [19.01078, 43.55806], [19.04934, 43.50384], [19.13933, 43.5282], [19.15685, 43.53943], [19.22807, 43.5264], [19.24774, 43.53061], [19.2553, 43.5938], [19.33426, 43.58833], [19.36653, 43.60921], [19.41941, 43.54056], [19.42696, 43.57987], [19.50455, 43.58385], [19.5176, 43.71403], [19.3986, 43.79668], [19.23465, 43.98764], [19.24363, 44.01502], [19.38439, 43.96611], [19.52515, 43.95573], [19.56498, 43.99922], [19.61836, 44.01464], [19.61991, 44.05254], [19.57467, 44.04716], [19.55999, 44.06894], [19.51167, 44.08158], [19.47321, 44.1193], [19.48386, 44.14332], [19.47338, 44.15034], [19.43905, 44.13088], [19.40927, 44.16722], [19.3588, 44.18353], [19.34773, 44.23244], [19.32464, 44.27185], [19.26945, 44.26957], [19.23306, 44.26097], [19.20508, 44.2917], [19.18328, 44.28383], [19.16741, 44.28648], [19.13332, 44.31492], [19.13556, 44.338], [19.11547, 44.34218], [19.1083, 44.3558], [19.11865, 44.36712], [19.10298, 44.36924], [19.10365, 44.37795], [19.10704, 44.38249], [19.10749, 44.39421], [19.11785, 44.40313], [19.14681, 44.41463], [19.14837, 44.45253], [19.12278, 44.50132], [19.13369, 44.52521], [19.16699, 44.52197], [19.26388, 44.65412], [19.32543, 44.74058], [19.36722, 44.88164], [19.18183, 44.92055], [19.01994, 44.85493], [18.8704, 44.85097], [18.76347, 44.90669], [18.76369, 44.93707], [18.80661, 44.93561], [18.78357, 44.97741], [18.65723, 45.07544], [18.47939, 45.05871], [18.41896, 45.11083], [18.32077, 45.1021], [18.24387, 45.13699], [18.1624, 45.07654], [18.03121, 45.12632], [18.01594, 45.15163], [17.99479, 45.14958], [17.97834, 45.13831], [17.97336, 45.12245], [17.93706, 45.08016], [17.87148, 45.04645], [17.84826, 45.04489]]]] } },
+ { type: "Feature", properties: { iso1A2: "BB", iso1A3: "BRB", iso1N3: "052", wikidata: "Q244", nameEn: "Barbados", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", callingCodes: ["1 246"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-58.56442, 13.24471], [-59.80731, 13.87556], [-59.82929, 12.70644], [-58.56442, 13.24471]]]] } },
+ { type: "Feature", properties: { iso1A2: "BD", iso1A3: "BGD", iso1N3: "050", wikidata: "Q902", nameEn: "Bangladesh", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["880"] }, geometry: { type: "MultiPolygon", coordinates: [[[[89.15869, 26.13708], [89.08899, 26.38845], [88.95612, 26.4564], [88.92357, 26.40711], [88.91321, 26.37984], [89.05328, 26.2469], [88.85004, 26.23211], [88.78961, 26.31093], [88.67837, 26.26291], [88.69485, 26.38353], [88.62144, 26.46783], [88.4298, 26.54489], [88.41196, 26.63837], [88.33093, 26.48929], [88.35153, 26.45241], [88.36938, 26.48683], [88.48749, 26.45855], [88.51649, 26.35923], [88.35153, 26.29123], [88.34757, 26.22216], [88.1844, 26.14417], [88.16581, 26.0238], [88.08804, 25.91334], [88.13138, 25.78773], [88.242, 25.80811], [88.45103, 25.66245], [88.4559, 25.59227], [88.677, 25.46959], [88.81296, 25.51546], [88.85278, 25.34679], [89.01105, 25.30303], [89.00463, 25.26583], [88.94067, 25.18534], [88.44766, 25.20149], [88.46277, 25.07468], [88.33917, 24.86803], [88.27325, 24.88796], [88.21832, 24.96642], [88.14004, 24.93529], [88.15515, 24.85806], [88.00683, 24.66477], [88.08786, 24.63232], [88.12296, 24.51301], [88.50934, 24.32474], [88.68801, 24.31464], [88.74841, 24.1959], [88.6976, 24.14703], [88.73743, 23.91751], [88.66189, 23.87607], [88.58087, 23.87105], [88.56507, 23.64044], [88.74841, 23.47361], [88.79351, 23.50535], [88.79254, 23.46028], [88.71133, 23.2492], [88.99148, 23.21134], [88.86377, 23.08759], [88.88327, 23.03885], [88.87063, 22.95235], [88.96713, 22.83346], [88.9151, 22.75228], [88.94614, 22.66941], [88.9367, 22.58527], [89.07114, 22.15335], [89.08044, 21.41871], [92.47409, 20.38654], [92.26071, 21.05697], [92.17752, 21.17445], [92.20087, 21.337], [92.37939, 21.47764], [92.43158, 21.37025], [92.55105, 21.3856], [92.60187, 21.24615], [92.68152, 21.28454], [92.59775, 21.6092], [92.62187, 21.87037], [92.60949, 21.97638], [92.56616, 22.13554], [92.60029, 22.1522], [92.5181, 22.71441], [92.37665, 22.9435], [92.38214, 23.28705], [92.26541, 23.70392], [92.15417, 23.73409], [92.04706, 23.64229], [91.95093, 23.73284], [91.95642, 23.47361], [91.84789, 23.42235], [91.76417, 23.26619], [91.81634, 23.08001], [91.7324, 23.00043], [91.61571, 22.93929], [91.54993, 23.01051], [91.46615, 23.2328], [91.4035, 23.27522], [91.40848, 23.07117], [91.36453, 23.06612], [91.28293, 23.37538], [91.15579, 23.6599], [91.25192, 23.83463], [91.22308, 23.89616], [91.29587, 24.0041], [91.35741, 23.99072], [91.37414, 24.10693], [91.55542, 24.08687], [91.63782, 24.1132], [91.65292, 24.22095], [91.73257, 24.14703], [91.76004, 24.23848], [91.82596, 24.22345], [91.89258, 24.14674], [91.96603, 24.3799], [92.11662, 24.38997], [92.15796, 24.54435], [92.25854, 24.9191], [92.38626, 24.86055], [92.49887, 24.88796], [92.39147, 25.01471], [92.33957, 25.07593], [92.0316, 25.1834], [91.63648, 25.12846], [91.25517, 25.20677], [90.87427, 25.15799], [90.65042, 25.17788], [90.40034, 25.1534], [90.1155, 25.22686], [89.90478, 25.31038], [89.87629, 25.28337], [89.83371, 25.29548], [89.84086, 25.31854], [89.81208, 25.37244], [89.86129, 25.61714], [89.84388, 25.70042], [89.80585, 25.82489], [89.86592, 25.93115], [89.77728, 26.04254], [89.77865, 26.08387], [89.73581, 26.15818], [89.70201, 26.15138], [89.63968, 26.22595], [89.57101, 25.9682], [89.53515, 26.00382], [89.35953, 26.0077], [89.15869, 26.13708]]]] } },
+ { type: "Feature", properties: { iso1A2: "BE", iso1A3: "BEL", iso1N3: "056", wikidata: "Q31", nameEn: "Belgium", groups: ["EU", "155", "150", "UN"], callingCodes: ["32"] }, geometry: { type: "MultiPolygon", coordinates: [[[[4.93295, 51.44945], [4.93909, 51.44632], [4.9524, 51.45014], [4.95244, 51.45207], [4.93295, 51.44945]]], [[[4.91493, 51.4353], [4.92652, 51.43329], [4.92952, 51.42984], [4.93986, 51.43064], [4.94265, 51.44003], [4.93471, 51.43861], [4.93416, 51.44185], [4.94025, 51.44193], [4.93544, 51.44634], [4.92879, 51.44161], [4.92815, 51.43856], [4.92566, 51.44273], [4.92811, 51.4437], [4.92287, 51.44741], [4.91811, 51.44621], [4.92227, 51.44252], [4.91935, 51.43634], [4.91493, 51.4353]]], [[[4.82946, 51.4213], [4.82409, 51.44736], [4.84139, 51.4799], [4.78803, 51.50284], [4.77321, 51.50529], [4.74578, 51.48937], [4.72935, 51.48424], [4.65442, 51.42352], [4.57489, 51.4324], [4.53521, 51.4243], [4.52846, 51.45002], [4.54675, 51.47265], [4.5388, 51.48184], [4.47736, 51.4778], [4.38122, 51.44905], [4.39747, 51.43316], [4.38064, 51.41965], [4.43777, 51.36989], [4.39292, 51.35547], [4.34086, 51.35738], [4.33265, 51.37687], [4.21923, 51.37443], [4.24024, 51.35371], [4.16721, 51.29348], [4.05165, 51.24171], [4.01957, 51.24504], [3.97889, 51.22537], [3.90125, 51.20371], [3.78783, 51.2151], [3.78999, 51.25766], [3.58939, 51.30064], [3.51502, 51.28697], [3.52698, 51.2458], [3.43488, 51.24135], [3.41704, 51.25933], [3.38289, 51.27331], [3.35847, 51.31572], [3.38696, 51.33436], [3.36263, 51.37112], [2.56575, 51.85301], [2.18458, 51.52087], [2.55904, 51.07014], [2.57551, 51.00326], [2.63074, 50.94746], [2.59093, 50.91751], [2.63331, 50.81457], [2.71165, 50.81295], [2.81056, 50.71773], [2.8483, 50.72276], [2.86985, 50.7033], [2.87937, 50.70298], [2.88504, 50.70656], [2.90069, 50.69263], [2.91036, 50.6939], [2.90873, 50.702], [2.95019, 50.75138], [2.96778, 50.75242], [3.00537, 50.76588], [3.04314, 50.77674], [3.09163, 50.77717], [3.10614, 50.78303], [3.11206, 50.79416], [3.11987, 50.79188], [3.1257, 50.78603], [3.15017, 50.79031], [3.16476, 50.76843], [3.18339, 50.74981], [3.18811, 50.74025], [3.20064, 50.73547], [3.19017, 50.72569], [3.20845, 50.71662], [3.22042, 50.71019], [3.24593, 50.71389], [3.26063, 50.70086], [3.26141, 50.69151], [3.2536, 50.68977], [3.264, 50.67668], [3.23951, 50.6585], [3.2729, 50.60718], [3.28575, 50.52724], [3.37693, 50.49538], [3.44629, 50.51009], [3.47385, 50.53397], [3.51564, 50.5256], [3.49509, 50.48885], [3.5683, 50.50192], [3.58361, 50.49049], [3.61014, 50.49568], [3.64426, 50.46275], [3.66153, 50.45165], [3.67494, 50.40239], [3.67262, 50.38663], [3.65709, 50.36873], [3.66976, 50.34563], [3.71009, 50.30305], [3.70987, 50.3191], [3.73911, 50.34809], [3.84314, 50.35219], [3.90781, 50.32814], [3.96771, 50.34989], [4.0268, 50.35793], [4.0689, 50.3254], [4.10237, 50.31247], [4.10957, 50.30234], [4.11954, 50.30425], [4.13665, 50.25609], [4.16808, 50.25786], [4.15524, 50.2833], [4.17347, 50.28838], [4.17861, 50.27443], [4.20651, 50.27333], [4.21945, 50.25539], [4.15524, 50.21103], [4.16014, 50.19239], [4.13561, 50.13078], [4.20147, 50.13535], [4.23101, 50.06945], [4.16294, 50.04719], [4.13508, 50.01976], [4.14239, 49.98034], [4.20532, 49.95803], [4.31963, 49.97043], [4.35051, 49.95315], [4.43488, 49.94122], [4.51098, 49.94659], [4.5414, 49.96911], [4.68695, 49.99685], [4.70064, 50.09384], [4.75237, 50.11314], [4.82438, 50.16878], [4.83279, 50.15331], [4.88602, 50.15182], [4.8382, 50.06738], [4.78827, 49.95609], [4.88529, 49.9236], [4.85134, 49.86457], [4.86965, 49.82271], [4.85464, 49.78995], [4.96714, 49.79872], [5.09249, 49.76193], [5.14545, 49.70287], [5.26232, 49.69456], [5.31465, 49.66846], [5.33039, 49.6555], [5.30214, 49.63055], [5.3137, 49.61225], [5.33851, 49.61599], [5.34837, 49.62889], [5.3974, 49.61596], [5.43713, 49.5707], [5.46734, 49.52648], [5.46541, 49.49825], [5.55001, 49.52729], [5.60909, 49.51228], [5.64505, 49.55146], [5.75649, 49.54321], [5.7577, 49.55915], [5.77435, 49.56298], [5.79195, 49.55228], [5.81838, 49.54777], [5.84143, 49.5533], [5.84692, 49.55663], [5.8424, 49.56082], [5.87256, 49.57539], [5.86986, 49.58756], [5.84971, 49.58674], [5.84826, 49.5969], [5.8762, 49.60898], [5.87609, 49.62047], [5.88393, 49.62802], [5.88552, 49.63507], [5.90599, 49.63853], [5.90164, 49.6511], [5.9069, 49.66377], [5.86175, 49.67862], [5.86527, 49.69291], [5.88677, 49.70951], [5.86503, 49.72739], [5.84193, 49.72161], [5.82562, 49.72395], [5.83149, 49.74729], [5.82245, 49.75048], [5.78871, 49.7962], [5.75409, 49.79239], [5.74953, 49.81428], [5.74364, 49.82058], [5.74844, 49.82435], [5.7404, 49.83452], [5.74076, 49.83823], [5.74975, 49.83933], [5.74953, 49.84709], [5.75884, 49.84811], [5.74567, 49.85368], [5.75861, 49.85631], [5.75269, 49.8711], [5.78415, 49.87922], [5.73621, 49.89796], [5.77314, 49.93646], [5.77291, 49.96056], [5.80833, 49.96451], [5.81163, 49.97142], [5.83467, 49.97823], [5.83968, 49.9892], [5.82331, 49.99662], [5.81866, 50.01286], [5.8551, 50.02683], [5.86904, 50.04614], [5.85474, 50.06342], [5.8857, 50.07824], [5.89488, 50.11476], [5.95929, 50.13295], [5.96453, 50.17259], [6.02488, 50.18283], [6.03093, 50.16362], [6.06406, 50.15344], [6.08577, 50.17246], [6.12028, 50.16374], [6.1137, 50.13668], [6.1379, 50.12964], [6.15298, 50.14126], [6.14132, 50.14971], [6.14588, 50.17106], [6.18739, 50.1822], [6.18364, 50.20815], [6.16853, 50.2234], [6.208, 50.25179], [6.28797, 50.27458], [6.29949, 50.30887], [6.32488, 50.32333], [6.35701, 50.31139], [6.40641, 50.32425], [6.40785, 50.33557], [6.3688, 50.35898], [6.34406, 50.37994], [6.36852, 50.40776], [6.37219, 50.45397], [6.34005, 50.46083], [6.3465, 50.48833], [6.30809, 50.50058], [6.26637, 50.50272], [6.22335, 50.49578], [6.20599, 50.52089], [6.19193, 50.5212], [6.18716, 50.52653], [6.19579, 50.5313], [6.19735, 50.53576], [6.17802, 50.54179], [6.17739, 50.55875], [6.20281, 50.56952], [6.22581, 50.5907], [6.24005, 50.58732], [6.24888, 50.59869], [6.2476, 50.60392], [6.26957, 50.62444], [6.17852, 50.6245], [6.11707, 50.72231], [6.04428, 50.72861], [6.0406, 50.71848], [6.0326, 50.72647], [6.03889, 50.74618], [6.01976, 50.75398], [5.97545, 50.75441], [5.95942, 50.7622], [5.89132, 50.75124], [5.89129, 50.75125], [5.88734, 50.77092], [5.84888, 50.75448], [5.84548, 50.76542], [5.80673, 50.7558], [5.77513, 50.78308], [5.76533, 50.78159], [5.74356, 50.7691], [5.73904, 50.75674], [5.72216, 50.76398], [5.69469, 50.75529], [5.68091, 50.75804], [5.70107, 50.7827], [5.68995, 50.79641], [5.70118, 50.80764], [5.65259, 50.82309], [5.64009, 50.84742], [5.64504, 50.87107], [5.67886, 50.88142], [5.69858, 50.91046], [5.71626, 50.90796], [5.72644, 50.91167], [5.72545, 50.92312], [5.74644, 50.94723], [5.75927, 50.95601], [5.74752, 50.96202], [5.72875, 50.95428], [5.71864, 50.96092], [5.76242, 50.99703], [5.77688, 51.02483], [5.75961, 51.03113], [5.77258, 51.06196], [5.79835, 51.05834], [5.79903, 51.09371], [5.82921, 51.09328], [5.83226, 51.10585], [5.8109, 51.10861], [5.80798, 51.11661], [5.85508, 51.14445], [5.82564, 51.16753], [5.77697, 51.1522], [5.77735, 51.17845], [5.74617, 51.18928], [5.70344, 51.1829], [5.65528, 51.18736], [5.65145, 51.19788], [5.5603, 51.22249], [5.5569, 51.26544], [5.515, 51.29462], [5.48476, 51.30053], [5.46519, 51.2849], [5.4407, 51.28169], [5.41672, 51.26248], [5.347, 51.27502], [5.33886, 51.26314], [5.29716, 51.26104], [5.26461, 51.26693], [5.23814, 51.26064], [5.22542, 51.26888], [5.24244, 51.30495], [5.2002, 51.32243], [5.16222, 51.31035], [5.13377, 51.31592], [5.13105, 51.34791], [5.07102, 51.39469], [5.10456, 51.43163], [5.07891, 51.4715], [5.04774, 51.47022], [5.03281, 51.48679], [5.0106, 51.47167], [5.00393, 51.44406], [4.92152, 51.39487], [4.90016, 51.41404], [4.84988, 51.41502], [4.78941, 51.41102], [4.77229, 51.41337], [4.76577, 51.43046], [4.78314, 51.43319], [4.82946, 51.4213]]]] } },
+ { type: "Feature", properties: { iso1A2: "BF", iso1A3: "BFA", iso1N3: "854", wikidata: "Q965", nameEn: "Burkina Faso", groups: ["011", "202", "002", "UN"], callingCodes: ["226"] }, geometry: { type: "MultiPolygon", coordinates: [[[[0.23859, 15.00135], [0.06588, 14.96961], [-0.24673, 15.07805], [-0.72004, 15.08655], [-1.05875, 14.7921], [-1.32166, 14.72774], [-1.68083, 14.50023], [-1.97945, 14.47709], [-1.9992, 14.19011], [-2.10223, 14.14878], [-2.47587, 14.29671], [-2.66175, 14.14713], [-2.84667, 14.05532], [-2.90831, 13.81174], [-2.88189, 13.64921], [-3.26407, 13.70699], [-3.28396, 13.5422], [-3.23599, 13.29035], [-3.43507, 13.27272], [-3.4313, 13.1588], [-3.54454, 13.1781], [-3.7911, 13.36665], [-3.96282, 13.38164], [-3.90558, 13.44375], [-3.96501, 13.49778], [-4.34477, 13.12927], [-4.21819, 12.95722], [-4.238, 12.71467], [-4.47356, 12.71252], [-4.41412, 12.31922], [-4.57703, 12.19875], [-4.54841, 12.1385], [-4.62546, 12.13204], [-4.62987, 12.06531], [-4.70692, 12.06746], [-4.72893, 12.01579], [-5.07897, 11.97918], [-5.26389, 11.84778], [-5.40258, 11.8327], [-5.26389, 11.75728], [-5.29251, 11.61715], [-5.22867, 11.60421], [-5.20665, 11.43811], [-5.25509, 11.36905], [-5.25949, 11.24816], [-5.32553, 11.21578], [-5.32994, 11.13371], [-5.49284, 11.07538], [-5.41579, 10.84628], [-5.47083, 10.75329], [-5.46643, 10.56074], [-5.51058, 10.43177], [-5.39602, 10.2929], [-5.12465, 10.29788], [-4.96453, 9.99923], [-4.96621, 9.89132], [-4.6426, 9.70696], [-4.31392, 9.60062], [-4.25999, 9.76012], [-3.69703, 9.94279], [-3.31779, 9.91125], [-3.27228, 9.84981], [-3.19306, 9.93781], [-3.16609, 9.85147], [-3.00765, 9.74019], [-2.93012, 9.57403], [-2.76494, 9.40778], [-2.68802, 9.49343], [-2.76534, 9.56589], [-2.74174, 9.83172], [-2.83108, 10.40252], [-2.94232, 10.64281], [-2.83373, 11.0067], [-0.67143, 10.99811], [-0.61937, 10.91305], [-0.44298, 11.04292], [-0.42391, 11.11661], [-0.38219, 11.12596], [-0.35955, 11.07801], [-0.28566, 11.12713], [-0.27374, 11.17157], [-0.13493, 11.14075], [0.50388, 11.01011], [0.48852, 10.98561], [0.50521, 10.98035], [0.4958, 10.93269], [0.66104, 10.99964], [0.91245, 10.99597], [0.9813, 11.08876], [1.03409, 11.04719], [1.42823, 11.46822], [2.00988, 11.42227], [2.29983, 11.68254], [2.39723, 11.89473], [2.05785, 12.35539], [2.26349, 12.41915], [0.99167, 13.10727], [0.99253, 13.37515], [1.18873, 13.31771], [1.21217, 13.37853], [1.24516, 13.33968], [1.28509, 13.35488], [1.24429, 13.39373], [1.20088, 13.38951], [1.02813, 13.46635], [0.99514, 13.5668], [0.77637, 13.64442], [0.77377, 13.6866], [0.61924, 13.68491], [0.38051, 14.05575], [0.16936, 14.51654], [0.23859, 15.00135]]]] } },
+ { type: "Feature", properties: { iso1A2: "BG", iso1A3: "BGR", iso1N3: "100", wikidata: "Q219", nameEn: "Bulgaria", groups: ["EU", "151", "150", "UN"], callingCodes: ["359"] }, geometry: { type: "MultiPolygon", coordinates: [[[[23.05288, 43.79494], [22.85314, 43.84452], [22.83753, 43.88055], [22.87873, 43.9844], [23.01674, 44.01946], [23.04988, 44.07694], [22.67173, 44.21564], [22.61711, 44.16938], [22.61688, 44.06534], [22.41449, 44.00514], [22.35558, 43.81281], [22.41043, 43.69566], [22.47582, 43.6558], [22.53397, 43.47225], [22.82036, 43.33665], [22.89727, 43.22417], [23.00806, 43.19279], [22.98104, 43.11199], [22.89521, 43.03625], [22.78397, 42.98253], [22.74826, 42.88701], [22.54302, 42.87774], [22.43309, 42.82057], [22.4997, 42.74144], [22.43983, 42.56851], [22.55669, 42.50144], [22.51961, 42.3991], [22.47498, 42.3915], [22.45919, 42.33822], [22.34773, 42.31725], [22.38136, 42.30339], [22.47251, 42.20393], [22.50289, 42.19527], [22.51224, 42.15457], [22.67701, 42.06614], [22.86749, 42.02275], [22.90254, 41.87587], [22.96682, 41.77137], [23.01239, 41.76527], [23.03342, 41.71034], [22.95513, 41.63265], [22.96331, 41.35782], [22.93334, 41.34104], [23.1833, 41.31755], [23.21953, 41.33773], [23.22771, 41.37106], [23.31301, 41.40525], [23.33639, 41.36317], [23.40416, 41.39999], [23.52453, 41.40262], [23.63203, 41.37632], [23.67644, 41.41139], [23.76525, 41.40175], [23.80148, 41.43943], [23.89613, 41.45257], [23.91483, 41.47971], [23.96975, 41.44118], [24.06908, 41.46132], [24.06323, 41.53222], [24.10063, 41.54796], [24.18126, 41.51735], [24.27124, 41.57682], [24.30513, 41.51297], [24.52599, 41.56808], [24.61129, 41.42278], [24.71529, 41.41928], [24.8041, 41.34913], [24.82514, 41.4035], [24.86136, 41.39298], [24.90928, 41.40876], [24.942, 41.38685], [25.11611, 41.34212], [25.28322, 41.23411], [25.48187, 41.28506], [25.52394, 41.2798], [25.55082, 41.31667], [25.61042, 41.30614], [25.66183, 41.31316], [25.70507, 41.29209], [25.8266, 41.34563], [25.87919, 41.30526], [26.12926, 41.35878], [26.16548, 41.42278], [26.20288, 41.43943], [26.14796, 41.47533], [26.176, 41.50072], [26.17951, 41.55409], [26.14328, 41.55496], [26.15146, 41.60828], [26.07083, 41.64584], [26.06148, 41.70345], [26.16841, 41.74858], [26.21325, 41.73223], [26.22888, 41.74139], [26.2654, 41.71544], [26.30255, 41.70925], [26.35957, 41.71149], [26.32952, 41.73637], [26.33589, 41.76802], [26.36952, 41.82265], [26.53968, 41.82653], [26.57961, 41.90024], [26.56051, 41.92995], [26.62996, 41.97644], [26.79143, 41.97386], [26.95638, 42.00741], [27.03277, 42.0809], [27.08486, 42.08735], [27.19251, 42.06028], [27.22376, 42.10152], [27.27411, 42.10409], [27.45478, 41.96591], [27.52379, 41.93756], [27.55191, 41.90928], [27.69949, 41.97515], [27.81235, 41.94803], [27.83492, 41.99709], [27.91479, 41.97902], [28.02971, 41.98066], [28.32297, 41.98371], [29.24336, 43.70874], [28.23293, 43.76], [27.99558, 43.84193], [27.92008, 44.00761], [27.73468, 43.95326], [27.64542, 44.04958], [27.60834, 44.01206], [27.39757, 44.0141], [27.26845, 44.12602], [26.95141, 44.13555], [26.62712, 44.05698], [26.38764, 44.04356], [26.10115, 43.96908], [26.05584, 43.90925], [25.94911, 43.85745], [25.72792, 43.69263], [25.39528, 43.61866], [25.17144, 43.70261], [25.10718, 43.6831], [24.96682, 43.72693], [24.73542, 43.68523], [24.62281, 43.74082], [24.50264, 43.76314], [24.35364, 43.70211], [24.18149, 43.68218], [23.73978, 43.80627], [23.61687, 43.79289], [23.4507, 43.84936], [23.26772, 43.84843], [23.05288, 43.79494]]]] } },
+ { type: "Feature", properties: { iso1A2: "BH", iso1A3: "BHR", iso1N3: "048", wikidata: "Q398", nameEn: "Bahrain", groups: ["145", "142", "UN"], callingCodes: ["973"] }, geometry: { type: "MultiPolygon", coordinates: [[[[50.93865, 26.30758], [50.71771, 26.73086], [50.38162, 26.53976], [50.26923, 26.08243], [50.302, 25.87592], [50.57069, 25.57887], [50.80824, 25.54641], [50.7801, 25.595], [50.86149, 25.6965], [50.81266, 25.88946], [50.93865, 26.30758]]]] } },
+ { type: "Feature", properties: { iso1A2: "BI", iso1A3: "BDI", iso1N3: "108", wikidata: "Q967", nameEn: "Burundi", groups: ["014", "202", "002", "UN"], callingCodes: ["257"] }, geometry: { type: "MultiPolygon", coordinates: [[[[30.54501, -2.41404], [30.42933, -2.31064], [30.14034, -2.43626], [29.95911, -2.33348], [29.88237, -2.75105], [29.36805, -2.82933], [29.32234, -2.6483], [29.0562, -2.58632], [29.04081, -2.7416], [29.00167, -2.78523], [29.00404, -2.81978], [29.0505, -2.81774], [29.09119, -2.87871], [29.09797, -2.91935], [29.16037, -2.95457], [29.17258, -2.99385], [29.25633, -3.05471], [29.21463, -3.3514], [29.23708, -3.75856], [29.43673, -4.44845], [29.63827, -4.44681], [29.75109, -4.45836], [29.77289, -4.41733], [29.82885, -4.36153], [29.88172, -4.35743], [30.03323, -4.26631], [30.22042, -4.01738], [30.45915, -3.56532], [30.84165, -3.25152], [30.83823, -2.97837], [30.6675, -2.98987], [30.57926, -2.89791], [30.4987, -2.9573], [30.40662, -2.86151], [30.52747, -2.65841], [30.41789, -2.66266], [30.54501, -2.41404]]]] } },
+ { type: "Feature", properties: { iso1A2: "BJ", iso1A3: "BEN", iso1N3: "204", wikidata: "Q962", nameEn: "Benin", aliases: ["DY"], groups: ["011", "202", "002", "UN"], callingCodes: ["229"] }, geometry: { type: "MultiPolygon", coordinates: [[[[3.59375, 11.70269], [3.48187, 11.86092], [3.31613, 11.88495], [3.25352, 12.01467], [2.83978, 12.40585], [2.6593, 12.30631], [2.37783, 12.24804], [2.39657, 12.10952], [2.45824, 11.98672], [2.39723, 11.89473], [2.29983, 11.68254], [2.00988, 11.42227], [1.42823, 11.46822], [1.03409, 11.04719], [0.9813, 11.08876], [0.91245, 10.99597], [0.8804, 10.803], [0.80358, 10.71459], [0.77666, 10.37665], [1.35507, 9.99525], [1.36624, 9.5951], [1.33675, 9.54765], [1.41746, 9.3226], [1.5649, 9.16941], [1.61838, 9.0527], [1.64249, 6.99562], [1.55877, 6.99737], [1.61812, 6.74843], [1.58105, 6.68619], [1.76906, 6.43189], [1.79826, 6.28221], [1.62913, 6.24075], [1.67336, 6.02702], [2.74181, 6.13349], [2.70566, 6.38038], [2.70464, 6.50831], [2.74334, 6.57291], [2.7325, 6.64057], [2.78204, 6.70514], [2.78823, 6.76356], [2.73405, 6.78508], [2.74024, 6.92802], [2.71702, 6.95722], [2.76965, 7.13543], [2.74489, 7.42565], [2.79442, 7.43486], [2.78668, 7.5116], [2.73405, 7.5423], [2.73095, 7.7755], [2.67523, 7.87825], [2.77907, 9.06924], [3.08017, 9.10006], [3.14147, 9.28375], [3.13928, 9.47167], [3.25093, 9.61632], [3.34726, 9.70696], [3.32099, 9.78032], [3.35383, 9.83641], [3.54429, 9.87739], [3.66908, 10.18136], [3.57275, 10.27185], [3.6844, 10.46351], [3.78292, 10.40538], [3.84243, 10.59316], [3.71505, 11.13015], [3.49175, 11.29765], [3.59375, 11.70269]]]] } },
+ { type: "Feature", properties: { iso1A2: "BL", iso1A3: "BLM", iso1N3: "652", wikidata: "Q25362", nameEn: "Saint-Barth\xE9lemy", country: "FR", groups: ["EU", "Q1451600", "029", "003", "419", "019", "UN"], callingCodes: ["590"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-62.62718, 18.26185], [-63.1055, 17.86651], [-62.34423, 17.49165], [-62.62718, 18.26185]]]] } },
+ { type: "Feature", properties: { iso1A2: "BM", iso1A3: "BMU", iso1N3: "060", wikidata: "Q23635", nameEn: "Bermuda", country: "GB", groups: ["BOTS", "021", "003", "019", "UN"], driveSide: "left", callingCodes: ["1 441"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.20987, 32.6953], [-65.31453, 32.68437], [-65.63955, 31.43417], [-63.20987, 32.6953]]]] } },
+ { type: "Feature", properties: { iso1A2: "BN", iso1A3: "BRN", iso1N3: "096", wikidata: "Q921", nameEn: "Brunei", groups: ["Q36117", "035", "142", "UN"], driveSide: "left", callingCodes: ["673"] }, geometry: { type: "MultiPolygon", coordinates: [[[[115.16236, 5.01011], [115.02521, 5.35005], [114.10166, 4.76112], [114.07448, 4.58441], [114.15813, 4.57], [114.26876, 4.49878], [114.32176, 4.34942], [114.32176, 4.2552], [114.4416, 4.27588], [114.49922, 4.13108], [114.64211, 4.00694], [114.78539, 4.12205], [114.88039, 4.4257], [114.83189, 4.42387], [114.77303, 4.72871], [114.8266, 4.75062], [114.88841, 4.81905], [114.96982, 4.81146], [114.99417, 4.88201], [115.05038, 4.90275], [115.02955, 4.82087], [115.02278, 4.74137], [115.04064, 4.63706], [115.07737, 4.53418], [115.09978, 4.39123], [115.31275, 4.30806], [115.36346, 4.33563], [115.2851, 4.42295], [115.27819, 4.63661], [115.20737, 4.8256], [115.15092, 4.87604], [115.16236, 5.01011]]]] } },
+ { type: "Feature", properties: { iso1A2: "BO", iso1A3: "BOL", iso1N3: "068", wikidata: "Q750", nameEn: "Bolivia", groups: ["005", "419", "019", "UN"], callingCodes: ["591"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.90248, -12.52544], [-64.22539, -12.45267], [-64.30708, -12.46398], [-64.99778, -11.98604], [-65.30027, -11.48749], [-65.28141, -10.86289], [-65.35402, -10.78685], [-65.37923, -10.35141], [-65.29019, -9.86253], [-65.40615, -9.63894], [-65.56244, -9.84266], [-65.68343, -9.75323], [-67.17784, -10.34016], [-68.71533, -11.14749], [-68.7651, -11.0496], [-68.75179, -11.03688], [-68.75265, -11.02383], [-68.74802, -11.00891], [-69.42792, -10.93451], [-69.47839, -10.95254], [-69.57156, -10.94555], [-68.98115, -11.8979], [-68.65044, -12.50689], [-68.85615, -12.87769], [-68.8864, -13.40792], [-69.05265, -13.68546], [-68.88135, -14.18639], [-69.36254, -14.94634], [-69.14856, -15.23478], [-69.40336, -15.61358], [-69.20291, -16.16668], [-69.09986, -16.22693], [-68.96238, -16.194], [-68.79464, -16.33272], [-68.98358, -16.42165], [-69.04027, -16.57214], [-69.00853, -16.66769], [-69.16896, -16.72233], [-69.62883, -17.28142], [-69.46863, -17.37466], [-69.46897, -17.4988], [-69.46623, -17.60518], [-69.34126, -17.72753], [-69.28671, -17.94844], [-69.07496, -18.03715], [-69.14807, -18.16893], [-69.07432, -18.28259], [-68.94987, -18.93302], [-68.87082, -19.06003], [-68.80602, -19.08355], [-68.61989, -19.27584], [-68.41218, -19.40499], [-68.66761, -19.72118], [-68.54611, -19.84651], [-68.57132, -20.03134], [-68.74273, -20.08817], [-68.7276, -20.46178], [-68.44023, -20.62701], [-68.55383, -20.7355], [-68.53957, -20.91542], [-68.40403, -20.94562], [-68.18816, -21.28614], [-67.85114, -22.87076], [-67.54284, -22.89771], [-67.18382, -22.81525], [-66.7298, -22.23644], [-66.29714, -22.08741], [-66.24077, -21.77837], [-66.03836, -21.84829], [-66.04832, -21.9187], [-65.9261, -21.93335], [-65.7467, -22.10105], [-65.61166, -22.09504], [-65.58694, -22.09794], [-65.57743, -22.07675], [-65.47435, -22.08908], [-64.99524, -22.08255], [-64.90014, -22.12136], [-64.67174, -22.18957], [-64.58888, -22.25035], [-64.4176, -22.67692], [-64.35108, -22.73282], [-64.31489, -22.88824], [-64.22918, -22.55807], [-63.93287, -21.99934], [-63.70963, -21.99934], [-63.68113, -22.0544], [-63.66482, -21.99918], [-62.81124, -21.9987], [-62.8078, -22.12534], [-62.64455, -22.25091], [-62.2757, -21.06657], [-62.26883, -20.55311], [-61.93912, -20.10053], [-61.73723, -19.63958], [-60.00638, -19.2981], [-59.06965, -19.29148], [-58.23216, -19.80058], [-58.16225, -20.16193], [-57.8496, -19.98346], [-58.14215, -19.76276], [-57.78463, -19.03259], [-57.71113, -19.03161], [-57.69134, -19.00544], [-57.71995, -18.97546], [-57.71995, -18.89573], [-57.76764, -18.90087], [-57.56807, -18.25655], [-57.48237, -18.24219], [-57.69877, -17.8431], [-57.73949, -17.56095], [-57.90082, -17.44555], [-57.99661, -17.5273], [-58.32935, -17.28195], [-58.5058, -16.80958], [-58.30918, -16.3699], [-58.32431, -16.25861], [-58.41506, -16.32636], [-60.16069, -16.26479], [-60.23797, -15.50267], [-60.58224, -15.09887], [-60.23968, -15.09515], [-60.27887, -14.63021], [-60.46037, -14.22496], [-60.48053, -13.77981], [-61.05527, -13.50054], [-61.81151, -13.49564], [-63.76259, -12.42952], [-63.90248, -12.52544]]]] } },
+ { type: "Feature", properties: { iso1A2: "BQ", iso1A3: "BES", iso1N3: "535", wikidata: "Q27561", nameEn: "Caribbean Netherlands", country: "NL" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "BR", iso1A3: "BRA", iso1N3: "076", wikidata: "Q155", nameEn: "Brazil", groups: ["005", "419", "019", "UN"], callingCodes: ["55"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-59.69361, 4.34069], [-59.78878, 4.45637], [-60.15953, 4.53456], [-60.04189, 4.69801], [-59.98129, 5.07097], [-60.20944, 5.28754], [-60.32352, 5.21299], [-60.73204, 5.20931], [-60.5802, 4.94312], [-60.86539, 4.70512], [-60.98303, 4.54167], [-61.15703, 4.49839], [-61.31457, 4.54167], [-61.29675, 4.44216], [-61.48569, 4.43149], [-61.54629, 4.2822], [-62.13094, 4.08309], [-62.44822, 4.18621], [-62.57656, 4.04754], [-62.74411, 4.03331], [-62.7655, 3.73099], [-62.98296, 3.59935], [-63.21111, 3.96219], [-63.4464, 3.9693], [-63.42233, 3.89995], [-63.50611, 3.83592], [-63.67099, 4.01731], [-63.70218, 3.91417], [-63.86082, 3.94796], [-63.99183, 3.90172], [-64.14512, 4.12932], [-64.57648, 4.12576], [-64.72977, 4.28931], [-64.84028, 4.24665], [-64.48379, 3.7879], [-64.02908, 2.79797], [-64.0257, 2.48156], [-63.39114, 2.4317], [-63.39827, 2.16098], [-64.06135, 1.94722], [-64.08274, 1.64792], [-64.34654, 1.35569], [-64.38932, 1.5125], [-65.11657, 1.12046], [-65.57288, 0.62856], [-65.50158, 0.92086], [-65.6727, 1.01353], [-66.28507, 0.74585], [-66.85795, 1.22998], [-67.08222, 1.17441], [-67.15784, 1.80439], [-67.299, 1.87494], [-67.40488, 2.22258], [-67.9292, 1.82455], [-68.18632, 2.00091], [-68.26699, 1.83463], [-68.18128, 1.72881], [-69.38621, 1.70865], [-69.53746, 1.76408], [-69.83491, 1.69353], [-69.82987, 1.07864], [-69.26017, 1.06856], [-69.14422, 0.84172], [-69.20976, 0.57958], [-69.47696, 0.71065], [-70.04162, 0.55437], [-70.03658, -0.19681], [-69.603, -0.51947], [-69.59796, -0.75136], [-69.4215, -1.01853], [-69.43395, -1.42219], [-69.94708, -4.2431], [-70.00888, -4.37833], [-70.11305, -4.27281], [-70.19582, -4.3607], [-70.33236, -4.15214], [-70.77601, -4.15717], [-70.96814, -4.36915], [-71.87003, -4.51661], [-72.64391, -5.0391], [-72.83973, -5.14765], [-73.24579, -6.05764], [-73.12983, -6.43852], [-73.73986, -6.87919], [-73.77011, -7.28944], [-73.96938, -7.58465], [-73.65485, -7.77897], [-73.76576, -7.89884], [-72.92886, -9.04074], [-73.21498, -9.40904], [-72.72216, -9.41397], [-72.31883, -9.5184], [-72.14742, -9.98049], [-71.23394, -9.9668], [-70.53373, -9.42628], [-70.58453, -9.58303], [-70.55429, -9.76692], [-70.62487, -9.80666], [-70.64134, -11.0108], [-70.51395, -10.92249], [-70.38791, -11.07096], [-69.90896, -10.92744], [-69.57835, -10.94051], [-69.57156, -10.94555], [-69.47839, -10.95254], [-69.42792, -10.93451], [-68.74802, -11.00891], [-68.75265, -11.02383], [-68.75179, -11.03688], [-68.7651, -11.0496], [-68.71533, -11.14749], [-67.17784, -10.34016], [-65.68343, -9.75323], [-65.56244, -9.84266], [-65.40615, -9.63894], [-65.29019, -9.86253], [-65.37923, -10.35141], [-65.35402, -10.78685], [-65.28141, -10.86289], [-65.30027, -11.48749], [-64.99778, -11.98604], [-64.30708, -12.46398], [-64.22539, -12.45267], [-63.90248, -12.52544], [-63.76259, -12.42952], [-61.81151, -13.49564], [-61.05527, -13.50054], [-60.48053, -13.77981], [-60.46037, -14.22496], [-60.27887, -14.63021], [-60.23968, -15.09515], [-60.58224, -15.09887], [-60.23797, -15.50267], [-60.16069, -16.26479], [-58.41506, -16.32636], [-58.32431, -16.25861], [-58.30918, -16.3699], [-58.5058, -16.80958], [-58.32935, -17.28195], [-57.99661, -17.5273], [-57.90082, -17.44555], [-57.73949, -17.56095], [-57.69877, -17.8431], [-57.48237, -18.24219], [-57.56807, -18.25655], [-57.76764, -18.90087], [-57.71995, -18.89573], [-57.71995, -18.97546], [-57.69134, -19.00544], [-57.71113, -19.03161], [-57.78463, -19.03259], [-58.14215, -19.76276], [-57.8496, -19.98346], [-58.16225, -20.16193], [-57.84536, -20.93155], [-57.93492, -21.65505], [-57.88239, -21.6868], [-57.94642, -21.73799], [-57.98625, -22.09157], [-56.6508, -22.28387], [-56.5212, -22.11556], [-56.45893, -22.08072], [-56.23206, -22.25347], [-55.8331, -22.29008], [-55.74941, -22.46436], [-55.741, -22.52018], [-55.72366, -22.5519], [-55.6986, -22.56268], [-55.68742, -22.58407], [-55.62493, -22.62765], [-55.63849, -22.95122], [-55.5446, -23.22811], [-55.52288, -23.2595], [-55.5555, -23.28237], [-55.43585, -23.87157], [-55.44117, -23.9185], [-55.41784, -23.9657], [-55.12292, -23.99669], [-55.0518, -23.98666], [-55.02691, -23.97317], [-54.6238, -23.83078], [-54.32807, -24.01865], [-54.28207, -24.07305], [-54.4423, -25.13381], [-54.62033, -25.46026], [-54.60196, -25.48397], [-54.59509, -25.53696], [-54.59398, -25.59224], [-54.5502, -25.58915], [-54.52926, -25.62846], [-53.90831, -25.55513], [-53.83691, -25.94849], [-53.73511, -26.04211], [-53.73086, -26.05842], [-53.7264, -26.0664], [-53.73391, -26.07006], [-53.73968, -26.10012], [-53.65018, -26.19501], [-53.65237, -26.23289], [-53.63739, -26.2496], [-53.63881, -26.25075], [-53.64632, -26.24798], [-53.64186, -26.25976], [-53.64505, -26.28089], [-53.68269, -26.33359], [-53.73372, -26.6131], [-53.80144, -27.09844], [-54.15978, -27.2889], [-54.19062, -27.27639], [-54.19268, -27.30751], [-54.41888, -27.40882], [-54.50416, -27.48232], [-54.67657, -27.57214], [-54.90159, -27.63132], [-54.90805, -27.73149], [-55.1349, -27.89759], [-55.16872, -27.86224], [-55.33303, -27.94661], [-55.6262, -28.17124], [-55.65418, -28.18304], [-56.01729, -28.51223], [-56.00458, -28.60421], [-56.05265, -28.62651], [-56.54171, -29.11447], [-56.57295, -29.11357], [-56.62789, -29.18073], [-56.81251, -29.48154], [-57.09386, -29.74211], [-57.65132, -30.19229], [-57.22502, -30.26121], [-56.90236, -30.02578], [-56.49267, -30.39471], [-56.4795, -30.3899], [-56.4619, -30.38457], [-55.87388, -31.05053], [-55.58866, -30.84117], [-55.5634, -30.8686], [-55.55373, -30.8732], [-55.55218, -30.88193], [-55.54572, -30.89051], [-55.53431, -30.89714], [-55.53276, -30.90218], [-55.52712, -30.89997], [-55.51862, -30.89828], [-55.50841, -30.9027], [-55.50821, -30.91349], [-54.17384, -31.86168], [-53.76024, -32.0751], [-53.39572, -32.58596], [-53.37671, -32.57005], [-53.1111, -32.71147], [-53.53459, -33.16843], [-53.52794, -33.68908], [-53.44031, -33.69344], [-53.39593, -33.75169], [-53.37138, -33.74313], [-52.83257, -34.01481], [-28.34015, -20.99094], [-28.99601, 1.86593], [-51.35485, 4.8383], [-51.63798, 4.51394], [-51.61983, 4.14596], [-51.79599, 3.89336], [-51.82312, 3.85825], [-51.85573, 3.83427], [-52.31787, 3.17896], [-52.6906, 2.37298], [-52.96539, 2.1881], [-53.78743, 2.34412], [-54.16286, 2.10779], [-54.6084, 2.32856], [-55.01919, 2.564], [-55.71493, 2.40342], [-55.96292, 2.53188], [-56.13054, 2.27723], [-55.92159, 2.05236], [-55.89863, 1.89861], [-55.99278, 1.83137], [-56.47045, 1.95135], [-56.7659, 1.89509], [-57.07092, 1.95304], [-57.09109, 2.01854], [-57.23981, 1.95808], [-57.35073, 1.98327], [-57.55743, 1.69605], [-57.77281, 1.73344], [-57.97336, 1.64566], [-58.01873, 1.51966], [-58.33887, 1.58014], [-58.4858, 1.48399], [-58.53571, 1.29154], [-58.84229, 1.17749], [-58.92072, 1.31293], [-59.25583, 1.40559], [-59.74066, 1.87596], [-59.7264, 2.27497], [-59.91177, 2.36759], [-59.99733, 2.92312], [-59.79769, 3.37162], [-59.86899, 3.57089], [-59.51963, 3.91951], [-59.73353, 4.20399], [-59.69361, 4.34069]]]] } },
+ { type: "Feature", properties: { iso1A2: "BS", iso1A3: "BHS", iso1N3: "044", wikidata: "Q778", nameEn: "The Bahamas", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 242"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-72.98446, 20.4801], [-71.70065, 25.7637], [-78.91214, 27.76553], [-80.65727, 23.71953], [-72.98446, 20.4801]]]] } },
+ { type: "Feature", properties: { iso1A2: "BT", iso1A3: "BTN", iso1N3: "064", wikidata: "Q917", nameEn: "Bhutan", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["975"] }, geometry: { type: "MultiPolygon", coordinates: [[[[91.6469, 27.76358], [91.5629, 27.84823], [91.48973, 27.93903], [91.46327, 28.0064], [91.25779, 28.07509], [91.20019, 27.98715], [90.69894, 28.07784], [90.58842, 28.02838], [90.13387, 28.19178], [89.79762, 28.23979], [89.59525, 28.16433], [89.12825, 27.62502], [89.0582, 27.60985], [88.97213, 27.51671], [88.95355, 27.4106], [89.00216, 27.32532], [88.96947, 27.30319], [88.93678, 27.33777], [88.91901, 27.32483], [88.74219, 27.144], [88.86984, 27.10937], [88.8714, 26.97488], [88.92301, 26.99286], [88.95807, 26.92668], [89.09554, 26.89089], [89.12825, 26.81661], [89.1926, 26.81329], [89.37913, 26.86224], [89.38319, 26.85963], [89.3901, 26.84225], [89.42349, 26.83727], [89.63369, 26.74402], [89.86124, 26.73307], [90.04535, 26.72422], [90.30402, 26.85098], [90.39271, 26.90704], [90.48504, 26.8594], [90.67715, 26.77215], [91.50067, 26.79223], [91.83181, 26.87318], [92.05523, 26.8692], [92.11863, 26.893], [92.03457, 27.07334], [92.04702, 27.26861], [92.12019, 27.27829], [92.01132, 27.47352], [91.65007, 27.48287], [91.55819, 27.6144], [91.6469, 27.76358]]]] } },
+ { type: "Feature", properties: { iso1A2: "BV", iso1A3: "BVT", iso1N3: "074", wikidata: "Q23408", nameEn: "Bouvet Island", country: "NO", groups: ["005", "419", "019", "UN"] }, geometry: { type: "MultiPolygon", coordinates: [[[[4.54042, -54.0949], [2.28941, -54.13089], [3.35353, -55.17558], [4.54042, -54.0949]]]] } },
+ { type: "Feature", properties: { iso1A2: "BW", iso1A3: "BWA", iso1N3: "072", wikidata: "Q963", nameEn: "Botswana", groups: ["018", "202", "002", "UN"], driveSide: "left", callingCodes: ["267"] }, geometry: { type: "MultiPolygon", coordinates: [[[[25.26433, -17.79571], [25.16882, -17.78253], [25.05895, -17.84452], [24.95586, -17.79674], [24.73364, -17.89338], [24.71887, -17.9218], [24.6303, -17.9863], [24.57485, -18.07151], [24.40577, -17.95726], [24.19416, -18.01919], [23.61088, -18.4881], [23.29618, -17.99855], [23.0996, -18.00075], [21.45556, -18.31795], [20.99904, -18.31743], [20.99751, -22.00026], [19.99912, -21.99991], [19.99817, -24.76768], [20.02809, -24.78725], [20.03678, -24.81004], [20.29826, -24.94869], [20.64795, -25.47827], [20.86081, -26.14892], [20.61754, -26.4692], [20.63275, -26.78181], [20.68596, -26.9039], [20.87031, -26.80047], [21.13353, -26.86661], [21.37869, -26.82083], [21.69322, -26.86152], [21.7854, -26.79199], [21.77114, -26.69015], [21.83291, -26.65959], [21.90703, -26.66808], [22.06192, -26.61882], [22.21206, -26.3773], [22.41921, -26.23078], [22.56365, -26.19668], [22.70808, -25.99186], [22.86012, -25.50572], [23.03497, -25.29971], [23.47588, -25.29971], [23.9244, -25.64286], [24.18287, -25.62916], [24.36531, -25.773], [24.44703, -25.73021], [24.67319, -25.81749], [24.8946, -25.80723], [25.01718, -25.72507], [25.12266, -25.75931], [25.33076, -25.76616], [25.58543, -25.6343], [25.6643, -25.4491], [25.69661, -25.29284], [25.72702, -25.25503], [25.88571, -24.87802], [25.84295, -24.78661], [25.8515, -24.75727], [26.39409, -24.63468], [26.46346, -24.60358], [26.51667, -24.47219], [26.84165, -24.24885], [26.99749, -23.65486], [27.33768, -23.40917], [27.52393, -23.37952], [27.6066, -23.21894], [27.74154, -23.2137], [27.93539, -23.04941], [27.93729, -22.96194], [28.04752, -22.90243], [28.04562, -22.8394], [28.34874, -22.5694], [28.63287, -22.55887], [28.91889, -22.44299], [29.0151, -22.22907], [29.10881, -22.21202], [29.15268, -22.21399], [29.18974, -22.18599], [29.21955, -22.17771], [29.37703, -22.19581], [29.3533, -22.18363], [29.24648, -22.05967], [29.1974, -22.07472], [29.14501, -22.07275], [29.08495, -22.04867], [29.04108, -22.00563], [29.02191, -21.95665], [29.02191, -21.90647], [29.04023, -21.85864], [29.07763, -21.81877], [28.58114, -21.63455], [28.49942, -21.66634], [28.29416, -21.59037], [28.01669, -21.57624], [27.91407, -21.31621], [27.69171, -21.08409], [27.72972, -20.51735], [27.69361, -20.48531], [27.28865, -20.49873], [27.29831, -20.28935], [27.21278, -20.08244], [26.72246, -19.92707], [26.17227, -19.53709], [25.96226, -19.08152], [25.99837, -19.02943], [25.94326, -18.90362], [25.82353, -18.82808], [25.79217, -18.6355], [25.68859, -18.56165], [25.53465, -18.39041], [25.39972, -18.12691], [25.31799, -18.07091], [25.23909, -17.90832], [25.26433, -17.79571]]]] } },
+ { type: "Feature", properties: { iso1A2: "BY", iso1A3: "BLR", iso1N3: "112", wikidata: "Q184", nameEn: "Belarus", groups: ["151", "150", "UN"], callingCodes: ["375"] }, geometry: { type: "MultiPolygon", coordinates: [[[[28.15217, 56.16964], [27.97865, 56.11849], [27.63065, 55.89687], [27.61683, 55.78558], [27.3541, 55.8089], [27.27804, 55.78299], [27.1559, 55.85032], [26.97153, 55.8102], [26.87448, 55.7172], [26.76872, 55.67658], [26.71802, 55.70645], [26.64888, 55.70515], [26.63231, 55.67968], [26.63167, 55.57887], [26.55094, 55.5093], [26.5522, 55.40277], [26.44937, 55.34832], [26.5709, 55.32572], [26.6714, 55.33902], [26.80929, 55.31642], [26.83266, 55.30444], [26.835, 55.28182], [26.73017, 55.24226], [26.72983, 55.21788], [26.68075, 55.19787], [26.69243, 55.16718], [26.54753, 55.14181], [26.51481, 55.16051], [26.46249, 55.12814], [26.35121, 55.1525], [26.30628, 55.12536], [26.23202, 55.10439], [26.26941, 55.08032], [26.20397, 54.99729], [26.13386, 54.98924], [26.05907, 54.94631], [25.99129, 54.95705], [25.89462, 54.93438], [25.74122, 54.80108], [25.75977, 54.57252], [25.68045, 54.5321], [25.64813, 54.48704], [25.62203, 54.4656], [25.63371, 54.42075], [25.5376, 54.33158], [25.55425, 54.31591], [25.68513, 54.31727], [25.78553, 54.23327], [25.78563, 54.15747], [25.71084, 54.16704], [25.64875, 54.1259], [25.54724, 54.14925], [25.51452, 54.17799], [25.56823, 54.25212], [25.509, 54.30267], [25.35559, 54.26544], [25.22705, 54.26271], [25.19199, 54.219], [25.0728, 54.13419], [24.991, 54.14241], [24.96894, 54.17589], [24.77131, 54.11091], [24.85311, 54.02862], [24.74279, 53.96663], [24.69185, 53.96543], [24.69652, 54.01901], [24.62275, 54.00217], [24.44411, 53.90076], [24.34128, 53.90076], [24.19638, 53.96405], [23.98837, 53.92554], [23.95098, 53.9613], [23.81309, 53.94205], [23.80543, 53.89558], [23.71726, 53.93379], [23.61677, 53.92691], [23.51284, 53.95052], [23.62004, 53.60942], [23.81995, 53.24131], [23.85657, 53.22923], [23.91393, 53.16469], [23.87548, 53.0831], [23.92184, 53.02079], [23.94689, 52.95919], [23.91805, 52.94016], [23.93763, 52.71332], [23.73615, 52.6149], [23.58296, 52.59868], [23.45112, 52.53774], [23.34141, 52.44845], [23.18196, 52.28812], [23.20071, 52.22848], [23.47859, 52.18215], [23.54314, 52.12148], [23.61, 52.11264], [23.64066, 52.07626], [23.68733, 51.9906], [23.61523, 51.92066], [23.62691, 51.78208], [23.53198, 51.74298], [23.57053, 51.55938], [23.56236, 51.53673], [23.62751, 51.50512], [23.6736, 51.50255], [23.60906, 51.62122], [23.7766, 51.66809], [23.91118, 51.63316], [23.8741, 51.59734], [23.99907, 51.58369], [24.13075, 51.66979], [24.3163, 51.75063], [24.29021, 51.80841], [24.37123, 51.88222], [24.98784, 51.91273], [25.20228, 51.97143], [25.46163, 51.92205], [25.73673, 51.91973], [25.80574, 51.94556], [25.83217, 51.92587], [26.00408, 51.92967], [26.19084, 51.86781], [26.39367, 51.87315], [26.46962, 51.80501], [26.69759, 51.82284], [26.80043, 51.75777], [26.9489, 51.73788], [26.99422, 51.76933], [27.20602, 51.77291], [27.20948, 51.66713], [27.26613, 51.65957], [27.24828, 51.60161], [27.47212, 51.61184], [27.51058, 51.5854], [27.55727, 51.63486], [27.71932, 51.60672], [27.67125, 51.50854], [27.76052, 51.47604], [27.85253, 51.62293], [27.91844, 51.61952], [27.95827, 51.56065], [28.10658, 51.57857], [28.23452, 51.66988], [28.37592, 51.54505], [28.47051, 51.59734], [28.64429, 51.5664], [28.69161, 51.44695], [28.73143, 51.46236], [28.75615, 51.41442], [28.78224, 51.45294], [28.76027, 51.48802], [28.81795, 51.55552], [28.95528, 51.59222], [28.99098, 51.56833], [29.1187, 51.65872], [29.16402, 51.64679], [29.20659, 51.56918], [29.25603, 51.57089], [29.25191, 51.49828], [29.32881, 51.37843], [29.42357, 51.4187], [29.49773, 51.39814], [29.54372, 51.48372], [29.7408, 51.53417], [29.77376, 51.4461], [30.17888, 51.51025], [30.34642, 51.42555], [30.36153, 51.33984], [30.56203, 51.25655], [30.64992, 51.35014], [30.51946, 51.59649], [30.68804, 51.82806], [30.76443, 51.89739], [30.90897, 52.00699], [30.95589, 52.07775], [31.13332, 52.1004], [31.25142, 52.04131], [31.38326, 52.12991], [31.7822, 52.11406], [31.77877, 52.18636], [31.6895, 52.1973], [31.70735, 52.26711], [31.57971, 52.32146], [31.62084, 52.33849], [31.61397, 52.48843], [31.56316, 52.51518], [31.63869, 52.55361], [31.50406, 52.69707], [31.57277, 52.71613], [31.592, 52.79011], [31.35667, 52.97854], [31.24147, 53.031], [31.32283, 53.04101], [31.33519, 53.08805], [31.3915, 53.09712], [31.36403, 53.13504], [31.40523, 53.21406], [31.56316, 53.19432], [31.62496, 53.22886], [31.787, 53.18033], [31.82373, 53.10042], [32.15368, 53.07594], [32.40773, 53.18856], [32.51725, 53.28431], [32.73257, 53.33494], [32.74968, 53.45597], [32.47777, 53.5548], [32.40499, 53.6656], [32.50112, 53.68594], [32.45717, 53.74039], [32.36663, 53.7166], [32.12621, 53.81586], [31.89137, 53.78099], [31.77028, 53.80015], [31.85019, 53.91801], [31.88744, 54.03653], [31.89599, 54.0837], [31.57002, 54.14535], [31.30791, 54.25315], [31.3177, 54.34067], [31.22945, 54.46585], [31.08543, 54.50361], [31.21399, 54.63113], [31.19339, 54.66947], [30.99187, 54.67046], [30.98226, 54.68872], [31.0262, 54.70698], [30.97127, 54.71967], [30.95479, 54.74346], [30.75165, 54.80699], [30.8264, 54.90062], [30.81759, 54.94064], [30.93144, 54.9585], [30.95754, 54.98609], [30.9081, 55.02232], [30.94243, 55.03964], [31.00972, 55.02783], [31.02071, 55.06167], [30.97369, 55.17134], [30.87944, 55.28223], [30.81946, 55.27931], [30.8257, 55.3313], [30.93144, 55.3914], [30.90123, 55.46621], [30.95204, 55.50667], [30.93419, 55.6185], [30.86003, 55.63169], [30.7845, 55.58514], [30.72957, 55.66268], [30.67464, 55.64176], [30.63344, 55.73079], [30.51037, 55.76568], [30.51346, 55.78982], [30.48257, 55.81066], [30.30987, 55.83592], [30.27776, 55.86819], [30.12136, 55.8358], [29.97975, 55.87281], [29.80672, 55.79569], [29.61446, 55.77716], [29.51283, 55.70294], [29.3604, 55.75862], [29.44692, 55.95978], [29.21717, 55.98971], [29.08299, 56.03427], [28.73418, 55.97131], [28.63668, 56.07262], [28.68337, 56.10173], [28.5529, 56.11705], [28.43068, 56.09407], [28.37987, 56.11399], [28.36888, 56.05805], [28.30571, 56.06035], [28.15217, 56.16964]]]] } },
+ { type: "Feature", properties: { iso1A2: "BZ", iso1A3: "BLZ", iso1N3: "084", wikidata: "Q242", nameEn: "Belize", groups: ["013", "003", "419", "019", "UN"], roadSpeedUnit: "mph", callingCodes: ["501"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-88.3268, 18.49048], [-88.48242, 18.49164], [-88.71505, 18.0707], [-88.8716, 17.89535], [-89.03839, 18.0067], [-89.15105, 17.95104], [-89.14985, 17.81563], [-89.15025, 17.04813], [-89.22683, 15.88619], [-89.17418, 15.90898], [-89.02415, 15.9063], [-88.95358, 15.88698], [-88.40779, 16.09624], [-86.92368, 17.61462], [-87.84815, 18.18511], [-87.85693, 18.18266], [-87.86657, 18.19971], [-87.87604, 18.18313], [-87.90671, 18.15213], [-88.03165, 18.16657], [-88.03238, 18.41778], [-88.26593, 18.47617], [-88.29909, 18.47591], [-88.3268, 18.49048]]]] } },
+ { type: "Feature", properties: { iso1A2: "CA", iso1A3: "CAN", iso1N3: "124", wikidata: "Q16", nameEn: "Canada", groups: ["021", "003", "019", "UN"], callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-67.20349, 45.1722], [-67.19603, 45.16771], [-67.15965, 45.16179], [-67.11316, 45.11176], [-67.0216, 44.95333], [-66.96824, 44.90965], [-66.98249, 44.87071], [-66.96824, 44.83078], [-66.93432, 44.82597], [-67.16117, 44.20069], [-61.98255, 37.34815], [-56.27503, 47.39728], [-53.12387, 41.40385], [-46.37635, 57.3249], [-77.52957, 77.23408], [-68.21821, 80.48551], [-49.33696, 84.57952], [-140.97446, 84.39275], [-141.00116, 60.30648], [-140.5227, 60.22077], [-140.45648, 60.30919], [-139.98024, 60.18027], [-139.68991, 60.33693], [-139.05831, 60.35205], [-139.20603, 60.08896], [-139.05365, 59.99655], [-138.71149, 59.90728], [-138.62145, 59.76431], [-137.60623, 59.24465], [-137.4925, 58.89415], [-136.82619, 59.16198], [-136.52365, 59.16752], [-136.47323, 59.46617], [-136.33727, 59.44466], [-136.22381, 59.55526], [-136.31566, 59.59083], [-135.48007, 59.79937], [-135.03069, 59.56208], [-135.00267, 59.28745], [-134.7047, 59.2458], [-134.55699, 59.1297], [-134.48059, 59.13231], [-134.27175, 58.8634], [-133.84645, 58.73543], [-133.38523, 58.42773], [-131.8271, 56.62247], [-130.77769, 56.36185], [-130.33965, 56.10849], [-130.10173, 56.12178], [-130.00093, 56.00325], [-130.00857, 55.91344], [-130.15373, 55.74895], [-129.97513, 55.28029], [-130.08035, 55.21556], [-130.18765, 55.07744], [-130.27203, 54.97174], [-130.44184, 54.85377], [-130.64499, 54.76912], [-130.61931, 54.70835], [-133.92876, 54.62289], [-133.36909, 48.51151], [-125.03842, 48.53282], [-123.50039, 48.21223], [-123.15614, 48.35395], [-123.26565, 48.6959], [-123.0093, 48.76586], [-123.0093, 48.83186], [-123.32163, 49.00419], [-95.15355, 48.9996], [-95.15357, 49.384], [-95.12903, 49.37056], [-95.05825, 49.35311], [-95.01419, 49.35647], [-94.99532, 49.36579], [-94.95681, 49.37035], [-94.85381, 49.32492], [-94.8159, 49.32299], [-94.82487, 49.29483], [-94.77355, 49.11998], [-94.75017, 49.09931], [-94.687, 48.84077], [-94.70087, 48.8339], [-94.70486, 48.82365], [-94.69669, 48.80918], [-94.69335, 48.77883], [-94.58903, 48.71803], [-94.54885, 48.71543], [-94.53826, 48.70216], [-94.44258, 48.69223], [-94.4174, 48.71049], [-94.27153, 48.70232], [-94.25172, 48.68404], [-94.25104, 48.65729], [-94.23215, 48.65202], [-93.85769, 48.63284], [-93.83288, 48.62745], [-93.80676, 48.58232], [-93.80939, 48.52439], [-93.79267, 48.51631], [-93.66382, 48.51845], [-93.47022, 48.54357], [-93.44472, 48.59147], [-93.40693, 48.60948], [-93.39758, 48.60364], [-93.3712, 48.60599], [-93.33946, 48.62787], [-93.25391, 48.64266], [-92.94973, 48.60866], [-92.7287, 48.54005], [-92.6342, 48.54133], [-92.62747, 48.50278], [-92.69927, 48.49573], [-92.71323, 48.46081], [-92.65606, 48.43471], [-92.50712, 48.44921], [-92.45588, 48.40624], [-92.48147, 48.36609], [-92.37185, 48.22259], [-92.27167, 48.25046], [-92.30939, 48.31251], [-92.26662, 48.35651], [-92.202, 48.35252], [-92.14732, 48.36578], [-92.05339, 48.35958], [-91.98929, 48.25409], [-91.86125, 48.21278], [-91.71231, 48.19875], [-91.70451, 48.11805], [-91.55649, 48.10611], [-91.58025, 48.04339], [-91.45829, 48.07454], [-91.43248, 48.04912], [-91.25025, 48.08522], [-91.08016, 48.18096], [-90.87588, 48.2484], [-90.75045, 48.09143], [-90.56444, 48.12184], [-90.56312, 48.09488], [-90.07418, 48.11043], [-89.89974, 47.98109], [-89.77248, 48.02607], [-89.57972, 48.00023], [-89.48837, 48.01412], [-88.37033, 48.30586], [-84.85871, 46.88881], [-84.55635, 46.45974], [-84.47607, 46.45225], [-84.4481, 46.48972], [-84.42101, 46.49853], [-84.34174, 46.50683], [-84.29893, 46.49127], [-84.26351, 46.49508], [-84.2264, 46.53337], [-84.1945, 46.54061], [-84.17723, 46.52753], [-84.12885, 46.53068], [-84.11196, 46.50248], [-84.13451, 46.39218], [-84.11254, 46.32329], [-84.11615, 46.2681], [-84.09756, 46.25512], [-84.1096, 46.23987], [-83.95399, 46.05634], [-83.90453, 46.05922], [-83.83329, 46.12169], [-83.57017, 46.105], [-83.43746, 45.99749], [-83.59589, 45.82131], [-82.48419, 45.30225], [-82.42469, 42.992], [-82.4146, 42.97626], [-82.4253, 42.95423], [-82.45331, 42.93139], [-82.4826, 42.8068], [-82.46613, 42.76615], [-82.51063, 42.66025], [-82.51858, 42.611], [-82.57583, 42.5718], [-82.58873, 42.54984], [-82.64242, 42.55594], [-82.82964, 42.37355], [-83.02253, 42.33045], [-83.07837, 42.30978], [-83.09837, 42.28877], [-83.12724, 42.2376], [-83.14962, 42.04089], [-83.11184, 41.95671], [-82.67862, 41.67615], [-78.93684, 42.82887], [-78.90712, 42.89733], [-78.90905, 42.93022], [-78.93224, 42.95229], [-78.96312, 42.95509], [-78.98126, 42.97], [-79.02074, 42.98444], [-79.02424, 43.01983], [-78.99941, 43.05612], [-79.01055, 43.06659], [-79.07486, 43.07845], [-79.05671, 43.10937], [-79.06881, 43.12029], [-79.0427, 43.13934], [-79.04652, 43.16396], [-79.05384, 43.17418], [-79.05002, 43.20133], [-79.05544, 43.21224], [-79.05512, 43.25375], [-79.06921, 43.26183], [-79.25796, 43.54052], [-76.79706, 43.63099], [-76.43859, 44.09393], [-76.35324, 44.13493], [-76.31222, 44.19894], [-76.244, 44.19643], [-76.1664, 44.23051], [-76.16285, 44.28262], [-76.00018, 44.34896], [-75.95947, 44.34463], [-75.8217, 44.43176], [-75.76813, 44.51537], [-75.41441, 44.76614], [-75.2193, 44.87821], [-75.01363, 44.95608], [-74.99101, 44.98051], [-74.8447, 45.00606], [-74.66689, 45.00646], [-74.32699, 44.99029], [-73.35025, 45.00942], [-71.50067, 45.01357], [-71.48735, 45.07784], [-71.42778, 45.12624], [-71.40364, 45.21382], [-71.44252, 45.2361], [-71.37133, 45.24624], [-71.29371, 45.29996], [-71.22338, 45.25184], [-71.19723, 45.25438], [-71.14568, 45.24128], [-71.08364, 45.30623], [-71.01866, 45.31573], [-71.0107, 45.34819], [-70.95193, 45.33895], [-70.91169, 45.29849], [-70.89864, 45.2398], [-70.84816, 45.22698], [-70.80236, 45.37444], [-70.82638, 45.39828], [-70.78372, 45.43269], [-70.65383, 45.37592], [-70.62518, 45.42286], [-70.72651, 45.49771], [-70.68516, 45.56964], [-70.54019, 45.67291], [-70.38934, 45.73215], [-70.41523, 45.79497], [-70.25976, 45.89675], [-70.24694, 45.95138], [-70.31025, 45.96424], [-70.23855, 46.1453], [-70.29078, 46.18832], [-70.18547, 46.35357], [-70.05812, 46.41768], [-69.99966, 46.69543], [-69.22119, 47.46461], [-69.05148, 47.42012], [-69.05073, 47.30076], [-69.05039, 47.2456], [-68.89222, 47.1807], [-68.70125, 47.24399], [-68.60575, 47.24659], [-68.57914, 47.28431], [-68.38332, 47.28723], [-68.37458, 47.35851], [-68.23244, 47.35712], [-67.94843, 47.1925], [-67.87993, 47.10377], [-67.78578, 47.06473], [-67.78111, 45.9392], [-67.75196, 45.91814], [-67.80961, 45.87531], [-67.75654, 45.82324], [-67.80653, 45.80022], [-67.80705, 45.69528], [-67.6049, 45.60725], [-67.43815, 45.59162], [-67.42144, 45.50584], [-67.50578, 45.48971], [-67.42394, 45.37969], [-67.48201, 45.27351], [-67.34927, 45.122], [-67.29754, 45.14865], [-67.29748, 45.18173], [-67.27039, 45.1934], [-67.22751, 45.16344], [-67.20349, 45.1722]]]] } },
+ { type: "Feature", properties: { iso1A2: "CC", iso1A3: "CCK", iso1N3: "166", wikidata: "Q36004", nameEn: "Cocos (Keeling) Islands", country: "AU", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["61"] }, geometry: { type: "MultiPolygon", coordinates: [[[[96.61846, -10.82438], [96.02343, -12.68334], [97.93979, -12.33309], [96.61846, -10.82438]]]] } },
+ { type: "Feature", properties: { iso1A2: "CD", iso1A3: "COD", iso1N3: "180", wikidata: "Q974", nameEn: "Democratic Republic of the Congo", aliases: ["ZR"], groups: ["017", "202", "002", "UN"], callingCodes: ["243"] }, geometry: { type: "MultiPolygon", coordinates: [[[[27.44012, 5.07349], [27.09575, 5.22305], [26.93064, 5.13535], [26.85579, 5.03887], [26.74572, 5.10685], [26.48595, 5.04984], [26.13371, 5.25594], [25.86073, 5.19455], [25.53271, 5.37431], [25.34558, 5.29101], [25.31256, 5.03668], [24.71816, 4.90509], [24.46719, 5.0915], [23.38847, 4.60013], [22.94817, 4.82392], [22.89094, 4.79321], [22.84691, 4.69887], [22.78526, 4.71423], [22.6928, 4.47285], [22.60915, 4.48821], [22.5431, 4.22041], [22.45504, 4.13039], [22.27682, 4.11347], [22.10721, 4.20723], [21.6405, 4.317], [21.55904, 4.25553], [21.25744, 4.33676], [21.21341, 4.29285], [21.11214, 4.33895], [21.08793, 4.39603], [20.90383, 4.44877], [20.60184, 4.42394], [18.62755, 3.47564], [18.63857, 3.19342], [18.10683, 2.26876], [18.08034, 1.58553], [17.85887, 1.04327], [17.86989, 0.58873], [17.95255, 0.48128], [17.93877, 0.32424], [17.81204, 0.23884], [17.66051, -0.26535], [17.72112, -0.52707], [17.32438, -0.99265], [16.97999, -1.12762], [16.70724, -1.45815], [16.50336, -1.8795], [16.16173, -2.16586], [16.22785, -2.59528], [16.1755, -3.25014], [16.21407, -3.2969], [15.89448, -3.9513], [15.53081, -4.042], [15.48121, -4.22062], [15.41785, -4.28381], [15.32693, -4.27282], [15.25411, -4.31121], [15.1978, -4.32388], [14.83101, -4.80838], [14.67948, -4.92093], [14.5059, -4.84956], [14.41499, -4.8825], [14.37366, -4.56125], [14.47284, -4.42941], [14.3957, -4.36623], [14.40672, -4.28381], [13.9108, -4.50906], [13.81162, -4.41842], [13.71794, -4.44864], [13.70417, -4.72601], [13.50305, -4.77818], [13.41764, -4.89897], [13.11182, -4.5942], [13.09648, -4.63739], [13.11195, -4.67745], [12.8733, -4.74346], [12.70868, -4.95505], [12.63465, -4.94632], [12.60251, -5.01715], [12.46297, -5.09408], [12.49815, -5.14058], [12.51589, -5.1332], [12.53586, -5.14658], [12.53599, -5.1618], [12.52301, -5.17481], [12.52318, -5.74353], [12.26557, -5.74031], [12.20376, -5.76338], [11.95767, -5.94705], [12.42245, -6.07585], [13.04371, -5.87078], [16.55507, -5.85631], [16.96282, -7.21787], [17.5828, -8.13784], [18.33635, -8.00126], [19.33698, -7.99743], [19.5469, -7.00195], [20.30218, -6.98955], [20.31846, -6.91953], [20.61689, -6.90876], [20.56263, -7.28566], [21.79824, -7.29628], [21.84856, -9.59871], [22.19039, -9.94628], [22.32604, -10.76291], [22.17954, -10.85884], [22.25951, -11.24911], [22.54205, -11.05784], [23.16602, -11.10577], [23.45631, -10.946], [23.86868, -11.02856], [24.00027, -10.89356], [24.34528, -11.06816], [24.42612, -11.44975], [25.34069, -11.19707], [25.33058, -11.65767], [26.01777, -11.91488], [26.88687, -12.01868], [27.04351, -11.61312], [27.22541, -11.60323], [27.21025, -11.76157], [27.59932, -12.22123], [28.33199, -12.41375], [29.01918, -13.41353], [29.60531, -13.21685], [29.65078, -13.41844], [29.81551, -13.44683], [29.8139, -12.14898], [29.48404, -12.23604], [29.4992, -12.43843], [29.18592, -12.37921], [28.48357, -11.87532], [28.37241, -11.57848], [28.65032, -10.65133], [28.62795, -9.92942], [28.68532, -9.78], [28.56208, -9.49122], [28.51627, -9.44726], [28.52636, -9.35379], [28.36562, -9.30091], [28.38526, -9.23393], [28.9711, -8.66935], [28.88917, -8.4831], [30.79243, -8.27382], [30.2567, -7.14121], [29.52552, -6.2731], [29.43673, -4.44845], [29.23708, -3.75856], [29.21463, -3.3514], [29.25633, -3.05471], [29.17258, -2.99385], [29.16037, -2.95457], [29.09797, -2.91935], [29.09119, -2.87871], [29.0505, -2.81774], [29.00404, -2.81978], [29.00167, -2.78523], [29.04081, -2.7416], [29.00357, -2.70596], [28.94346, -2.69124], [28.89793, -2.66111], [28.90226, -2.62385], [28.89288, -2.55848], [28.87943, -2.55165], [28.86193, -2.53185], [28.86209, -2.5231], [28.87497, -2.50887], [28.88846, -2.50493], [28.89342, -2.49017], [28.89132, -2.47557], [28.86846, -2.44866], [28.86826, -2.41888], [28.89601, -2.37321], [28.95642, -2.37321], [29.00051, -2.29001], [29.105, -2.27043], [29.17562, -2.12278], [29.11847, -1.90576], [29.24458, -1.69663], [29.24323, -1.66826], [29.36322, -1.50887], [29.45038, -1.5054], [29.53062, -1.40499], [29.59061, -1.39016], [29.58388, -0.89821], [29.63006, -0.8997], [29.62708, -0.71055], [29.67176, -0.55714], [29.67474, -0.47969], [29.65091, -0.46777], [29.72687, -0.08051], [29.7224, 0.07291], [29.77454, 0.16675], [29.81922, 0.16824], [29.87284, 0.39166], [29.97413, 0.52124], [29.95477, 0.64486], [29.98307, 0.84295], [30.1484, 0.89805], [30.22139, 0.99635], [30.24671, 1.14974], [30.48503, 1.21675], [31.30127, 2.11006], [31.28042, 2.17853], [31.20148, 2.2217], [31.1985, 2.29462], [31.12104, 2.27676], [31.07934, 2.30207], [31.06593, 2.35862], [30.96911, 2.41071], [30.91102, 2.33332], [30.83059, 2.42559], [30.74271, 2.43601], [30.75612, 2.5863], [30.8857, 2.83923], [30.8574, 2.9508], [30.77101, 3.04897], [30.84251, 3.26908], [30.93486, 3.40737], [30.94081, 3.50847], [30.85153, 3.48867], [30.85997, 3.5743], [30.80713, 3.60506], [30.78512, 3.67097], [30.56277, 3.62703], [30.57378, 3.74567], [30.55396, 3.84451], [30.47691, 3.83353], [30.27658, 3.95653], [30.22374, 3.93896], [30.1621, 4.10586], [30.06964, 4.13221], [29.79666, 4.37809], [29.82087, 4.56246], [29.49726, 4.7007], [29.43341, 4.50101], [29.22207, 4.34297], [29.03054, 4.48784], [28.8126, 4.48784], [28.6651, 4.42638], [28.20719, 4.35614], [27.79551, 4.59976], [27.76469, 4.79284], [27.65462, 4.89375], [27.56656, 4.89375], [27.44012, 5.07349]]]] } },
+ { type: "Feature", properties: { iso1A2: "CF", iso1A3: "CAF", iso1N3: "140", wikidata: "Q929", nameEn: "Central African Republic", groups: ["017", "202", "002", "UN"], callingCodes: ["236"] }, geometry: { type: "MultiPolygon", coordinates: [[[[22.87758, 10.91915], [22.45889, 11.00246], [21.72139, 10.64136], [21.71479, 10.29932], [21.63553, 10.217], [21.52766, 10.2105], [21.34934, 9.95907], [21.26348, 9.97642], [20.82979, 9.44696], [20.36748, 9.11019], [19.06421, 9.00367], [18.86388, 8.87971], [19.11044, 8.68172], [18.79783, 8.25929], [18.67455, 8.22226], [18.62612, 8.14163], [18.64153, 8.08714], [18.6085, 8.05009], [18.02731, 8.01085], [17.93926, 7.95853], [17.67288, 7.98905], [16.8143, 7.53971], [16.6668, 7.67281], [16.658, 7.75353], [16.59415, 7.76444], [16.58315, 7.88657], [16.41583, 7.77971], [16.40703, 7.68809], [15.79942, 7.44149], [15.73118, 7.52006], [15.49743, 7.52179], [15.23397, 7.25135], [15.04717, 6.77085], [14.96311, 6.75693], [14.79966, 6.39043], [14.80122, 6.34866], [14.74206, 6.26356], [14.56149, 6.18928], [14.43073, 6.08867], [14.42917, 6.00508], [14.49455, 5.91683], [14.60974, 5.91838], [14.62375, 5.70466], [14.58951, 5.59777], [14.62531, 5.51411], [14.52724, 5.28319], [14.57083, 5.23979], [14.65489, 5.21343], [14.73383, 4.6135], [15.00825, 4.41458], [15.08609, 4.30282], [15.10644, 4.1362], [15.17482, 4.05131], [15.07686, 4.01805], [15.73522, 3.24348], [15.77725, 3.26835], [16.05449, 3.02306], [16.08252, 2.45708], [16.19357, 2.21537], [16.50126, 2.84739], [16.46701, 2.92512], [16.57598, 3.47999], [16.68283, 3.54257], [17.01746, 3.55136], [17.35649, 3.63045], [17.46876, 3.70515], [17.60966, 3.63705], [17.83421, 3.61068], [17.85842, 3.53378], [18.05656, 3.56893], [18.14902, 3.54476], [18.17323, 3.47665], [18.24148, 3.50302], [18.2723, 3.57992], [18.39558, 3.58212], [18.49245, 3.63924], [18.58711, 3.49423], [18.62755, 3.47564], [20.60184, 4.42394], [20.90383, 4.44877], [21.08793, 4.39603], [21.11214, 4.33895], [21.21341, 4.29285], [21.25744, 4.33676], [21.55904, 4.25553], [21.6405, 4.317], [22.10721, 4.20723], [22.27682, 4.11347], [22.45504, 4.13039], [22.5431, 4.22041], [22.60915, 4.48821], [22.6928, 4.47285], [22.78526, 4.71423], [22.84691, 4.69887], [22.89094, 4.79321], [22.94817, 4.82392], [23.38847, 4.60013], [24.46719, 5.0915], [24.71816, 4.90509], [25.31256, 5.03668], [25.34558, 5.29101], [25.53271, 5.37431], [25.86073, 5.19455], [26.13371, 5.25594], [26.48595, 5.04984], [26.74572, 5.10685], [26.85579, 5.03887], [26.93064, 5.13535], [27.09575, 5.22305], [27.44012, 5.07349], [27.26886, 5.25876], [27.23017, 5.37167], [27.28621, 5.56382], [27.22705, 5.62889], [27.22705, 5.71254], [26.51721, 6.09655], [26.58259, 6.1987], [26.32729, 6.36272], [26.38022, 6.63493], [25.90076, 7.09549], [25.37461, 7.33024], [25.35281, 7.42595], [25.20337, 7.50312], [25.20649, 7.61115], [25.29214, 7.66675], [25.25319, 7.8487], [24.98855, 7.96588], [24.85156, 8.16933], [24.35965, 8.26177], [24.13238, 8.36959], [24.25691, 8.69288], [23.51905, 8.71749], [23.59065, 8.99743], [23.44744, 8.99128], [23.4848, 9.16959], [23.56263, 9.19418], [23.64358, 9.28637], [23.64981, 9.44303], [23.62179, 9.53823], [23.69155, 9.67566], [23.67164, 9.86923], [23.3128, 10.45214], [23.02221, 10.69235], [22.87758, 10.91915]]]] } },
+ { type: "Feature", properties: { iso1A2: "CG", iso1A3: "COG", iso1N3: "178", wikidata: "Q971", nameEn: "Republic of the Congo", groups: ["017", "202", "002", "UN"], callingCodes: ["242"] }, geometry: { type: "MultiPolygon", coordinates: [[[[18.62755, 3.47564], [18.58711, 3.49423], [18.49245, 3.63924], [18.39558, 3.58212], [18.2723, 3.57992], [18.24148, 3.50302], [18.17323, 3.47665], [18.14902, 3.54476], [18.05656, 3.56893], [17.85842, 3.53378], [17.83421, 3.61068], [17.60966, 3.63705], [17.46876, 3.70515], [17.35649, 3.63045], [17.01746, 3.55136], [16.68283, 3.54257], [16.57598, 3.47999], [16.46701, 2.92512], [16.50126, 2.84739], [16.19357, 2.21537], [16.15568, 2.18955], [16.08563, 2.19733], [16.05294, 1.9811], [16.14634, 1.70259], [16.02647, 1.65591], [16.02959, 1.76483], [15.48942, 1.98265], [15.34776, 1.91264], [15.22634, 2.03243], [15.00996, 1.98887], [14.61145, 2.17866], [13.29457, 2.16106], [13.13461, 1.57238], [13.25447, 1.32339], [13.15519, 1.23368], [13.89582, 1.4261], [14.25186, 1.39842], [14.48179, 0.9152], [14.26066, 0.57255], [14.10909, 0.58563], [13.88648, 0.26652], [13.90632, -0.2287], [14.06862, -0.20826], [14.2165, -0.38261], [14.41887, -0.44799], [14.52569, -0.57818], [14.41838, -1.89412], [14.25932, -1.97624], [14.23518, -2.15671], [14.16202, -2.23916], [14.23829, -2.33715], [14.10442, -2.49268], [13.85846, -2.46935], [13.92073, -2.35581], [13.75884, -2.09293], [13.47977, -2.43224], [13.02759, -2.33098], [12.82172, -1.91091], [12.61312, -1.8129], [12.44656, -1.92025], [12.47925, -2.32626], [12.04895, -2.41704], [11.96866, -2.33559], [11.74605, -2.39936], [11.57637, -2.33379], [11.64487, -2.61865], [11.5359, -2.85654], [11.64798, -2.81146], [11.80365, -3.00424], [11.70558, -3.0773], [11.70227, -3.17465], [11.96554, -3.30267], [11.8318, -3.5812], [11.92719, -3.62768], [11.87083, -3.71571], [11.68608, -3.68942], [11.57949, -3.52798], [11.48764, -3.51089], [11.22301, -3.69888], [11.12647, -3.94169], [10.75913, -4.39519], [11.50888, -5.33417], [12.00924, -5.02627], [12.16068, -4.90089], [12.20901, -4.75642], [12.25587, -4.79437], [12.32324, -4.78415], [12.40964, -4.60609], [12.64835, -4.55937], [12.76844, -4.38709], [12.87096, -4.40315], [12.91489, -4.47907], [13.09648, -4.63739], [13.11182, -4.5942], [13.41764, -4.89897], [13.50305, -4.77818], [13.70417, -4.72601], [13.71794, -4.44864], [13.81162, -4.41842], [13.9108, -4.50906], [14.40672, -4.28381], [14.3957, -4.36623], [14.47284, -4.42941], [14.37366, -4.56125], [14.41499, -4.8825], [14.5059, -4.84956], [14.67948, -4.92093], [14.83101, -4.80838], [15.1978, -4.32388], [15.25411, -4.31121], [15.32693, -4.27282], [15.41785, -4.28381], [15.48121, -4.22062], [15.53081, -4.042], [15.89448, -3.9513], [16.21407, -3.2969], [16.1755, -3.25014], [16.22785, -2.59528], [16.16173, -2.16586], [16.50336, -1.8795], [16.70724, -1.45815], [16.97999, -1.12762], [17.32438, -0.99265], [17.72112, -0.52707], [17.66051, -0.26535], [17.81204, 0.23884], [17.93877, 0.32424], [17.95255, 0.48128], [17.86989, 0.58873], [17.85887, 1.04327], [18.08034, 1.58553], [18.10683, 2.26876], [18.63857, 3.19342], [18.62755, 3.47564]]]] } },
+ { type: "Feature", properties: { iso1A2: "CH", iso1A3: "CHE", iso1N3: "756", wikidata: "Q39", nameEn: "Switzerland", groups: ["155", "150", "UN"], callingCodes: ["41"] }, geometry: { type: "MultiPolygon", coordinates: [[[[8.72809, 47.69282], [8.72617, 47.69651], [8.73671, 47.7169], [8.70543, 47.73121], [8.74251, 47.75168], [8.71778, 47.76571], [8.68985, 47.75686], [8.68022, 47.78599], [8.65292, 47.80066], [8.64425, 47.76398], [8.62408, 47.7626], [8.61657, 47.79998], [8.56415, 47.80633], [8.56814, 47.78001], [8.48868, 47.77215], [8.45771, 47.7493], [8.44807, 47.72426], [8.40569, 47.69855], [8.4211, 47.68407], [8.40473, 47.67499], [8.41346, 47.66676], [8.42264, 47.66667], [8.44711, 47.65379], [8.4667, 47.65747], [8.46605, 47.64103], [8.49656, 47.64709], [8.5322, 47.64687], [8.52801, 47.66059], [8.56141, 47.67088], [8.57683, 47.66158], [8.6052, 47.67258], [8.61113, 47.66332], [8.62884, 47.65098], [8.62049, 47.63757], [8.60412, 47.63735], [8.61471, 47.64514], [8.60701, 47.65271], [8.59545, 47.64298], [8.60348, 47.61204], [8.57586, 47.59537], [8.55756, 47.62394], [8.51686, 47.63476], [8.50747, 47.61897], [8.45578, 47.60121], [8.46637, 47.58389], [8.48949, 47.588], [8.49431, 47.58107], [8.43235, 47.56617], [8.39477, 47.57826], [8.38273, 47.56608], [8.32735, 47.57133], [8.30277, 47.58607], [8.29524, 47.5919], [8.29722, 47.60603], [8.2824, 47.61225], [8.26313, 47.6103], [8.25863, 47.61571], [8.23809, 47.61204], [8.22577, 47.60385], [8.22011, 47.6181], [8.20617, 47.62141], [8.19378, 47.61636], [8.1652, 47.5945], [8.14947, 47.59558], [8.13823, 47.59147], [8.13662, 47.58432], [8.11543, 47.5841], [8.10395, 47.57918], [8.10002, 47.56504], [8.08557, 47.55768], [8.06663, 47.56374], [8.04383, 47.55443], [8.02136, 47.55096], [8.00113, 47.55616], [7.97581, 47.55493], [7.95682, 47.55789], [7.94494, 47.54511], [7.91251, 47.55031], [7.90673, 47.57674], [7.88664, 47.58854], [7.84412, 47.5841], [7.81901, 47.58798], [7.79486, 47.55691], [7.75261, 47.54599], [7.71961, 47.54219], [7.69642, 47.53297], [7.68101, 47.53232], [7.6656, 47.53752], [7.66174, 47.54554], [7.65083, 47.54662], [7.63338, 47.56256], [7.67655, 47.56435], [7.68904, 47.57133], [7.67115, 47.5871], [7.68486, 47.59601], [7.69385, 47.60099], [7.68229, 47.59905], [7.67395, 47.59212], [7.64599, 47.59695], [7.64213, 47.5944], [7.64309, 47.59151], [7.61929, 47.57683], [7.60459, 47.57869], [7.60523, 47.58519], [7.58945, 47.59017], [7.58386, 47.57536], [7.56684, 47.57785], [7.56548, 47.57617], [7.55689, 47.57232], [7.55652, 47.56779], [7.53634, 47.55553], [7.52831, 47.55347], [7.51723, 47.54578], [7.50873, 47.54546], [7.49691, 47.53821], [7.50588, 47.52856], [7.51904, 47.53515], [7.53199, 47.5284], [7.5229, 47.51644], [7.49804, 47.51798], [7.51076, 47.49651], [7.47534, 47.47932], [7.43356, 47.49712], [7.42923, 47.48628], [7.4583, 47.47216], [7.4462, 47.46264], [7.43088, 47.45846], [7.40308, 47.43638], [7.35603, 47.43432], [7.33526, 47.44186], [7.24669, 47.4205], [7.17026, 47.44312], [7.19583, 47.49455], [7.16249, 47.49025], [7.12781, 47.50371], [7.07425, 47.48863], [7.0231, 47.50522], [6.98425, 47.49432], [7.0024, 47.45264], [6.93953, 47.43388], [6.93744, 47.40714], [6.88542, 47.37262], [6.87959, 47.35335], [7.03125, 47.36996], [7.0564, 47.35134], [7.05305, 47.33304], [6.94316, 47.28747], [6.95108, 47.26428], [6.9508, 47.24338], [6.8489, 47.15933], [6.76788, 47.1208], [6.68823, 47.06616], [6.71531, 47.0494], [6.43341, 46.92703], [6.46456, 46.88865], [6.43216, 46.80336], [6.45209, 46.77502], [6.38351, 46.73171], [6.27135, 46.68251], [6.11084, 46.57649], [6.1567, 46.54402], [6.07269, 46.46244], [6.08427, 46.44305], [6.06407, 46.41676], [6.09926, 46.40768], [6.15016, 46.3778], [6.15985, 46.37721], [6.16987, 46.36759], [6.15738, 46.3491], [6.13876, 46.33844], [6.1198, 46.31157], [6.11697, 46.29547], [6.1013, 46.28512], [6.11926, 46.2634], [6.12446, 46.25059], [6.10071, 46.23772], [6.08563, 46.24651], [6.07072, 46.24085], [6.0633, 46.24583], [6.05029, 46.23518], [6.04602, 46.23127], [6.03342, 46.2383], [6.02461, 46.23313], [5.97542, 46.21525], [5.96515, 46.19638], [5.99573, 46.18587], [5.98846, 46.17046], [5.98188, 46.17392], [5.97508, 46.15863], [5.9641, 46.14412], [5.95781, 46.12925], [5.97893, 46.13303], [5.9871, 46.14499], [6.01791, 46.14228], [6.03614, 46.13712], [6.04564, 46.14031], [6.05203, 46.15191], [6.07491, 46.14879], [6.09199, 46.15191], [6.09926, 46.14373], [6.13397, 46.1406], [6.15305, 46.15194], [6.18116, 46.16187], [6.18871, 46.16644], [6.18707, 46.17999], [6.19552, 46.18401], [6.19807, 46.18369], [6.20539, 46.19163], [6.21114, 46.1927], [6.21273, 46.19409], [6.21603, 46.19507], [6.21844, 46.19837], [6.22222, 46.19888], [6.22175, 46.20045], [6.23544, 46.20714], [6.23913, 46.20511], [6.24821, 46.20531], [6.26007, 46.21165], [6.27694, 46.21566], [6.29663, 46.22688], [6.31041, 46.24417], [6.29474, 46.26221], [6.26749, 46.24745], [6.24952, 46.26255], [6.23775, 46.27822], [6.25137, 46.29014], [6.24826, 46.30175], [6.21981, 46.31304], [6.25432, 46.3632], [6.53358, 46.45431], [6.82312, 46.42661], [6.8024, 46.39171], [6.77152, 46.34784], [6.86052, 46.28512], [6.78968, 46.14058], [6.89321, 46.12548], [6.87868, 46.03855], [6.93862, 46.06502], [7.00946, 45.9944], [7.04151, 45.92435], [7.10685, 45.85653], [7.56343, 45.97421], [7.85949, 45.91485], [7.9049, 45.99945], [7.98881, 45.99867], [8.02906, 46.10331], [8.11383, 46.11577], [8.16866, 46.17817], [8.08814, 46.26692], [8.31162, 46.38044], [8.30648, 46.41587], [8.42464, 46.46367], [8.46317, 46.43712], [8.45032, 46.26869], [8.62242, 46.12112], [8.75697, 46.10395], [8.80778, 46.10085], [8.85617, 46.0748], [8.79414, 46.00913], [8.78585, 45.98973], [8.79362, 45.99207], [8.8319, 45.9879], [8.85121, 45.97239], [8.86688, 45.96135], [8.88904, 45.95465], [8.93649, 45.86775], [8.94372, 45.86587], [8.93504, 45.86245], [8.91129, 45.8388], [8.94737, 45.84285], [8.9621, 45.83707], [8.99663, 45.83466], [9.00324, 45.82055], [9.0298, 45.82127], [9.03279, 45.82865], [9.03793, 45.83548], [9.03505, 45.83976], [9.04059, 45.8464], [9.04546, 45.84968], [9.06642, 45.8761], [9.09065, 45.89906], [8.99257, 45.9698], [9.01618, 46.04928], [9.24503, 46.23616], [9.29226, 46.32717], [9.25502, 46.43743], [9.28136, 46.49685], [9.36128, 46.5081], [9.40487, 46.46621], [9.45936, 46.50873], [9.46117, 46.37481], [9.57015, 46.2958], [9.71273, 46.29266], [9.73086, 46.35071], [9.95249, 46.38045], [10.07055, 46.21668], [10.14439, 46.22992], [10.17862, 46.25626], [10.10506, 46.3372], [10.165, 46.41051], [10.03715, 46.44479], [10.10307, 46.61003], [10.23674, 46.63484], [10.25309, 46.57432], [10.46136, 46.53164], [10.49375, 46.62049], [10.44686, 46.64162], [10.40475, 46.63671], [10.38659, 46.67847], [10.47197, 46.85698], [10.48376, 46.93891], [10.36933, 47.00212], [10.30031, 46.92093], [10.24128, 46.93147], [10.22675, 46.86942], [10.10715, 46.84296], [9.98058, 46.91434], [9.88266, 46.93343], [9.87935, 47.01337], [9.60717, 47.06091], [9.55721, 47.04762], [9.54041, 47.06495], [9.47548, 47.05257], [9.47139, 47.06402], [9.51362, 47.08505], [9.52089, 47.10019], [9.51044, 47.13727], [9.48774, 47.17402], [9.4891, 47.19346], [9.50318, 47.22153], [9.52406, 47.24959], [9.53116, 47.27029], [9.54773, 47.2809], [9.55857, 47.29919], [9.58513, 47.31334], [9.59978, 47.34671], [9.62476, 47.36639], [9.65427, 47.36824], [9.66243, 47.37136], [9.6711, 47.37824], [9.67445, 47.38429], [9.67334, 47.39191], [9.6629, 47.39591], [9.65136, 47.40504], [9.65043, 47.41937], [9.6446, 47.43233], [9.64483, 47.43842], [9.65863, 47.44847], [9.65728, 47.45383], [9.6423, 47.45599], [9.62475, 47.45685], [9.62158, 47.45858], [9.60841, 47.47178], [9.60484, 47.46358], [9.60205, 47.46165], [9.59482, 47.46305], [9.58208, 47.48344], [9.56312, 47.49495], [9.55125, 47.53629], [9.25619, 47.65939], [9.18203, 47.65598], [9.17593, 47.65399], [9.1755, 47.65584], [9.1705, 47.65513], [9.15181, 47.66904], [9.13845, 47.66389], [9.09891, 47.67801], [9.02093, 47.6868], [8.94093, 47.65596], [8.89946, 47.64769], [8.87625, 47.65441], [8.87383, 47.67045], [8.85065, 47.68209], [8.86989, 47.70504], [8.82002, 47.71458], [8.80663, 47.73821], [8.77309, 47.72059], [8.76965, 47.7075], [8.79966, 47.70222], [8.79511, 47.67462], [8.75856, 47.68969], [8.72809, 47.69282]], [[8.95861, 45.96485], [8.96668, 45.98436], [8.97741, 45.98317], [8.97604, 45.96151], [8.95861, 45.96485]], [[8.70847, 47.68904], [8.68985, 47.69552], [8.66837, 47.68437], [8.65769, 47.68928], [8.67508, 47.6979], [8.66416, 47.71367], [8.70237, 47.71453], [8.71773, 47.69088], [8.70847, 47.68904]]]] } },
+ { type: "Feature", properties: { iso1A2: "CI", iso1A3: "CIV", iso1N3: "384", wikidata: "Q1008", nameEn: "C\xF4te d'Ivoire", groups: ["011", "202", "002", "UN"], callingCodes: ["225"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-7.52774, 3.7105], [-3.34019, 4.17519], [-3.10675, 5.08515], [-3.11073, 5.12675], [-3.063, 5.13665], [-2.96554, 5.10397], [-2.95261, 5.12477], [-2.75502, 5.10657], [-2.73074, 5.1364], [-2.77625, 5.34621], [-2.72737, 5.34789], [-2.76614, 5.60963], [-2.85378, 5.65156], [-2.93132, 5.62137], [-2.96671, 5.6415], [-2.95323, 5.71865], [-3.01896, 5.71697], [-3.25999, 6.62521], [-3.21954, 6.74407], [-3.23327, 6.81744], [-2.95438, 7.23737], [-2.97822, 7.27165], [-2.92339, 7.60847], [-2.79467, 7.86002], [-2.78395, 7.94974], [-2.74819, 7.92613], [-2.67787, 8.02055], [-2.61232, 8.02645], [-2.62901, 8.11495], [-2.49037, 8.20872], [-2.58243, 8.7789], [-2.66357, 9.01771], [-2.77799, 9.04949], [-2.69814, 9.22717], [-2.68802, 9.49343], [-2.76494, 9.40778], [-2.93012, 9.57403], [-3.00765, 9.74019], [-3.16609, 9.85147], [-3.19306, 9.93781], [-3.27228, 9.84981], [-3.31779, 9.91125], [-3.69703, 9.94279], [-4.25999, 9.76012], [-4.31392, 9.60062], [-4.6426, 9.70696], [-4.96621, 9.89132], [-4.96453, 9.99923], [-5.12465, 10.29788], [-5.39602, 10.2929], [-5.51058, 10.43177], [-5.65135, 10.46767], [-5.78124, 10.43952], [-5.99478, 10.19694], [-6.18851, 10.24244], [-6.1731, 10.46983], [-6.24795, 10.74248], [-6.325, 10.68624], [-6.40646, 10.69922], [-6.42847, 10.5694], [-6.52974, 10.59104], [-6.63541, 10.66893], [-6.68164, 10.35074], [-6.93921, 10.35291], [-7.01186, 10.25111], [-6.97444, 10.21644], [-7.00966, 10.15794], [-7.0603, 10.14711], [-7.13331, 10.24877], [-7.3707, 10.24677], [-7.44555, 10.44602], [-7.52261, 10.4655], [-7.54462, 10.40921], [-7.63048, 10.46334], [-7.92107, 10.15577], [-7.97971, 10.17117], [-8.01225, 10.1021], [-8.11921, 10.04577], [-8.15652, 9.94288], [-8.09434, 9.86936], [-8.14657, 9.55062], [-8.03463, 9.39604], [-7.85056, 9.41812], [-7.90777, 9.20456], [-7.73862, 9.08422], [-7.92518, 8.99332], [-7.95503, 8.81146], [-7.69882, 8.66148], [-7.65653, 8.36873], [-7.92518, 8.50652], [-8.22991, 8.48438], [-8.2411, 8.24196], [-8.062, 8.16071], [-7.98675, 8.20134], [-7.99919, 8.11023], [-7.94695, 8.00925], [-8.06449, 8.04989], [-8.13414, 7.87991], [-8.09931, 7.78626], [-8.21374, 7.54466], [-8.4003, 7.6285], [-8.47114, 7.55676], [-8.41935, 7.51203], [-8.37458, 7.25794], [-8.29249, 7.1691], [-8.31736, 6.82837], [-8.59456, 6.50612], [-8.48652, 6.43797], [-8.45666, 6.49977], [-8.38453, 6.35887], [-8.3298, 6.36381], [-8.17557, 6.28222], [-8.00642, 6.31684], [-7.90692, 6.27728], [-7.83478, 6.20309], [-7.8497, 6.08932], [-7.79747, 6.07696], [-7.78254, 5.99037], [-7.70294, 5.90625], [-7.67309, 5.94337], [-7.48155, 5.80974], [-7.46165, 5.84934], [-7.43677, 5.84687], [-7.43926, 5.74787], [-7.37209, 5.61173], [-7.43428, 5.42355], [-7.36463, 5.32944], [-7.46165, 5.26256], [-7.48901, 5.14118], [-7.55369, 5.08667], [-7.53876, 4.94294], [-7.59349, 4.8909], [-7.53259, 4.35145], [-7.52774, 3.7105]]]] } },
+ { type: "Feature", properties: { iso1A2: "CK", iso1A3: "COK", iso1N3: "184", wikidata: "Q26988", nameEn: "Cook Islands", country: "NZ", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["682"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-168.15106, -10.26955], [-156.45576, -31.75456], [-156.48634, -15.52824], [-156.50903, -7.4975], [-168.15106, -10.26955]]]] } },
+ { type: "Feature", properties: { iso1A2: "CL", iso1A3: "CHL", iso1N3: "152", wikidata: "Q298", nameEn: "Chile", groups: ["005", "419", "019", "UN"], callingCodes: ["56"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-68.60702, -52.65781], [-68.41683, -52.33516], [-69.97824, -52.00845], [-71.99889, -51.98018], [-72.33873, -51.59954], [-72.31343, -50.58411], [-73.15765, -50.78337], [-73.55259, -49.92488], [-73.45156, -49.79461], [-73.09655, -49.14342], [-72.56894, -48.81116], [-72.54042, -48.52392], [-72.27662, -48.28727], [-72.50478, -47.80586], [-71.94152, -47.13595], [-71.68577, -46.55385], [-71.75614, -45.61611], [-71.35687, -45.22075], [-72.06985, -44.81756], [-71.26418, -44.75684], [-71.16436, -44.46244], [-71.81318, -44.38097], [-71.64206, -43.64774], [-72.14828, -42.85321], [-72.15541, -42.15941], [-71.74901, -42.11711], [-71.92726, -40.72714], [-71.37826, -38.91474], [-70.89532, -38.6923], [-71.24279, -37.20264], [-70.95047, -36.4321], [-70.38008, -36.02375], [-70.49416, -35.24145], [-69.87386, -34.13344], [-69.88099, -33.34489], [-70.55832, -31.51559], [-70.14479, -30.36595], [-69.8596, -30.26131], [-69.99507, -29.28351], [-69.80969, -29.07185], [-69.66709, -28.44055], [-69.22504, -27.95042], [-68.77586, -27.16029], [-68.43363, -27.08414], [-68.27677, -26.90626], [-68.59048, -26.49861], [-68.56909, -26.28146], [-68.38372, -26.15353], [-68.57622, -25.32505], [-68.38372, -25.08636], [-68.56909, -24.69831], [-68.24825, -24.42596], [-67.33563, -24.04237], [-66.99632, -22.99839], [-67.18382, -22.81525], [-67.54284, -22.89771], [-67.85114, -22.87076], [-68.18816, -21.28614], [-68.40403, -20.94562], [-68.53957, -20.91542], [-68.55383, -20.7355], [-68.44023, -20.62701], [-68.7276, -20.46178], [-68.74273, -20.08817], [-68.57132, -20.03134], [-68.54611, -19.84651], [-68.66761, -19.72118], [-68.41218, -19.40499], [-68.61989, -19.27584], [-68.80602, -19.08355], [-68.87082, -19.06003], [-68.94987, -18.93302], [-69.07432, -18.28259], [-69.14807, -18.16893], [-69.07496, -18.03715], [-69.28671, -17.94844], [-69.34126, -17.72753], [-69.46623, -17.60518], [-69.46897, -17.4988], [-69.66483, -17.65083], [-69.79087, -17.65563], [-69.82868, -17.72048], [-69.75305, -17.94605], [-69.81607, -18.12582], [-69.96732, -18.25992], [-70.16394, -18.31737], [-70.31267, -18.31258], [-70.378, -18.3495], [-70.59118, -18.35072], [-113.52687, -26.52828], [-68.11646, -58.14883], [-66.07313, -55.19618], [-67.11046, -54.94199], [-67.46182, -54.92205], [-68.01394, -54.8753], [-68.60733, -54.9125], [-68.60702, -52.65781]]]] } },
+ { type: "Feature", properties: { iso1A2: "CM", iso1A3: "CMR", iso1N3: "120", wikidata: "Q1009", nameEn: "Cameroon", groups: ["017", "202", "002", "UN"], callingCodes: ["237"] }, geometry: { type: "MultiPolygon", coordinates: [[[[14.83314, 12.62963], [14.55058, 12.78256], [14.56101, 12.91036], [14.46881, 13.08259], [14.08251, 13.0797], [14.20204, 12.53405], [14.17523, 12.41916], [14.22215, 12.36533], [14.4843, 12.35223], [14.6474, 12.17466], [14.61612, 11.7798], [14.55207, 11.72001], [14.64591, 11.66166], [14.6124, 11.51283], [14.17821, 11.23831], [13.97489, 11.30258], [13.78945, 11.00154], [13.7403, 11.00593], [13.70753, 10.94451], [13.73434, 10.9255], [13.54964, 10.61236], [13.5705, 10.53183], [13.43644, 10.13326], [13.34111, 10.12299], [13.25025, 10.03647], [13.25323, 10.00127], [13.286, 9.9822], [13.27409, 9.93232], [13.24132, 9.91031], [13.25025, 9.86042], [13.29941, 9.8296], [13.25472, 9.76795], [13.22642, 9.57266], [13.02385, 9.49334], [12.85628, 9.36698], [12.91958, 9.33905], [12.90022, 9.11411], [12.81085, 8.91992], [12.79, 8.75361], [12.71701, 8.7595], [12.68722, 8.65938], [12.44146, 8.6152], [12.4489, 8.52536], [12.26123, 8.43696], [12.24782, 8.17904], [12.19271, 8.10826], [12.20909, 7.97553], [11.99908, 7.67302], [12.01844, 7.52981], [11.93205, 7.47812], [11.84864, 7.26098], [11.87396, 7.09398], [11.63117, 6.9905], [11.55818, 6.86186], [11.57755, 6.74059], [11.51499, 6.60892], [11.42264, 6.5882], [11.42041, 6.53789], [11.09495, 6.51717], [11.09644, 6.68437], [10.94302, 6.69325], [10.8179, 6.83377], [10.83727, 6.9358], [10.60789, 7.06885], [10.59746, 7.14719], [10.57214, 7.16345], [10.53639, 6.93432], [10.21466, 6.88996], [10.15135, 7.03781], [9.86314, 6.77756], [9.77824, 6.79088], [9.70674, 6.51717], [9.51757, 6.43874], [8.84209, 5.82562], [8.88156, 5.78857], [8.83687, 5.68483], [8.92029, 5.58403], [8.78027, 5.1243], [8.60302, 4.87353], [8.34397, 4.30689], [9.22018, 3.72052], [9.81162, 2.33797], [9.82123, 2.35097], [9.83754, 2.32428], [9.83238, 2.29079], [9.84716, 2.24676], [9.89012, 2.20457], [9.90749, 2.20049], [9.991, 2.16561], [11.3561, 2.17217], [11.37116, 2.29975], [13.28534, 2.25716], [13.29457, 2.16106], [14.61145, 2.17866], [15.00996, 1.98887], [15.22634, 2.03243], [15.34776, 1.91264], [15.48942, 1.98265], [16.02959, 1.76483], [16.02647, 1.65591], [16.14634, 1.70259], [16.05294, 1.9811], [16.08563, 2.19733], [16.15568, 2.18955], [16.19357, 2.21537], [16.08252, 2.45708], [16.05449, 3.02306], [15.77725, 3.26835], [15.73522, 3.24348], [15.07686, 4.01805], [15.17482, 4.05131], [15.10644, 4.1362], [15.08609, 4.30282], [15.00825, 4.41458], [14.73383, 4.6135], [14.65489, 5.21343], [14.57083, 5.23979], [14.52724, 5.28319], [14.62531, 5.51411], [14.58951, 5.59777], [14.62375, 5.70466], [14.60974, 5.91838], [14.49455, 5.91683], [14.42917, 6.00508], [14.43073, 6.08867], [14.56149, 6.18928], [14.74206, 6.26356], [14.80122, 6.34866], [14.79966, 6.39043], [14.96311, 6.75693], [15.04717, 6.77085], [15.23397, 7.25135], [15.49743, 7.52179], [15.56964, 7.58936], [15.59272, 7.7696], [15.50743, 7.79302], [15.20426, 8.50892], [15.09484, 8.65982], [14.83566, 8.80557], [14.35707, 9.19611], [14.37094, 9.2954], [13.97544, 9.6365], [14.01793, 9.73169], [14.1317, 9.82413], [14.20411, 10.00055], [14.4673, 10.00264], [14.80082, 9.93818], [14.95722, 9.97926], [15.05999, 9.94845], [15.14043, 9.99246], [15.24618, 9.99246], [15.41408, 9.92876], [15.68761, 9.99344], [15.50535, 10.1098], [15.30874, 10.31063], [15.23724, 10.47764], [15.14936, 10.53915], [15.15532, 10.62846], [15.06737, 10.80921], [15.09127, 10.87431], [15.04957, 11.02347], [15.10021, 11.04101], [15.0585, 11.40481], [15.13149, 11.5537], [15.06595, 11.71126], [15.11579, 11.79313], [15.04808, 11.8731], [15.05786, 12.0608], [15.0349, 12.10698], [15.00146, 12.1223], [14.96952, 12.0925], [14.89019, 12.16593], [14.90827, 12.3269], [14.83314, 12.62963]]]] } },
+ { type: "Feature", properties: { iso1A2: "CN", iso1A3: "CHN", iso1N3: "156", wikidata: "Q148", nameEn: "People's Republic of China" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "CO", iso1A3: "COL", iso1N3: "170", wikidata: "Q739", nameEn: "Colombia", groups: ["005", "419", "019", "UN"], callingCodes: ["57"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-71.19849, 12.65801], [-81.58685, 18.0025], [-82.06974, 14.49418], [-82.56142, 11.91792], [-78.79327, 9.93766], [-77.58292, 9.22278], [-77.32389, 8.81247], [-77.45064, 8.49991], [-77.17257, 7.97422], [-77.57185, 7.51147], [-77.72514, 7.72348], [-77.72157, 7.47612], [-77.81426, 7.48319], [-77.89178, 7.22681], [-78.06168, 7.07793], [-82.12561, 4.00341], [-78.87137, 1.47457], [-78.42749, 1.15389], [-77.85677, 0.80197], [-77.7148, 0.85003], [-77.68613, 0.83029], [-77.66416, 0.81604], [-77.67815, 0.73863], [-77.49984, 0.64476], [-77.52001, 0.40782], [-76.89177, 0.24736], [-76.4094, 0.24015], [-76.41215, 0.38228], [-76.23441, 0.42294], [-75.82927, 0.09578], [-75.25764, -0.11943], [-75.18513, -0.0308], [-74.42701, -0.50218], [-74.26675, -0.97229], [-73.65312, -1.26222], [-72.92587, -2.44514], [-71.75223, -2.15058], [-70.94377, -2.23142], [-70.04609, -2.73906], [-70.71396, -3.7921], [-70.52393, -3.87553], [-70.3374, -3.79505], [-69.94708, -4.2431], [-69.43395, -1.42219], [-69.4215, -1.01853], [-69.59796, -0.75136], [-69.603, -0.51947], [-70.03658, -0.19681], [-70.04162, 0.55437], [-69.47696, 0.71065], [-69.20976, 0.57958], [-69.14422, 0.84172], [-69.26017, 1.06856], [-69.82987, 1.07864], [-69.83491, 1.69353], [-69.53746, 1.76408], [-69.38621, 1.70865], [-68.18128, 1.72881], [-68.26699, 1.83463], [-68.18632, 2.00091], [-67.9292, 1.82455], [-67.40488, 2.22258], [-67.299, 1.87494], [-67.15784, 1.80439], [-67.08222, 1.17441], [-66.85795, 1.22998], [-67.21967, 2.35778], [-67.65696, 2.81691], [-67.85862, 2.79173], [-67.85862, 2.86727], [-67.30945, 3.38393], [-67.50067, 3.75812], [-67.62671, 3.74303], [-67.85358, 4.53249], [-67.83341, 5.31104], [-67.59141, 5.5369], [-67.63914, 5.64963], [-67.58558, 5.84537], [-67.43513, 5.98835], [-67.4625, 6.20625], [-67.60654, 6.2891], [-69.41843, 6.1072], [-70.10716, 6.96516], [-70.7596, 7.09799], [-71.03941, 6.98163], [-71.37234, 7.01588], [-71.42212, 7.03854], [-71.44118, 7.02116], [-71.82441, 7.04314], [-72.04895, 7.03837], [-72.19437, 7.37034], [-72.43132, 7.40034], [-72.47415, 7.48928], [-72.45321, 7.57232], [-72.47827, 7.65604], [-72.46763, 7.79518], [-72.44454, 7.86031], [-72.46183, 7.90682], [-72.45806, 7.91141], [-72.47042, 7.92306], [-72.48183, 7.92909], [-72.48801, 7.94329], [-72.47213, 7.96106], [-72.39137, 8.03534], [-72.35163, 8.01163], [-72.36987, 8.19976], [-72.4042, 8.36513], [-72.65474, 8.61428], [-72.77415, 9.10165], [-72.94052, 9.10663], [-73.02119, 9.27584], [-73.36905, 9.16636], [-72.98085, 9.85253], [-72.88002, 10.44309], [-72.4767, 11.1117], [-72.24983, 11.14138], [-71.9675, 11.65536], [-71.3275, 11.85], [-70.92579, 11.96275], [-71.19849, 12.65801]]]] } },
+ { type: "Feature", properties: { iso1A2: "CP", iso1A3: "CPT", wikidata: "Q161258", nameEn: "Clipperton Island", country: "FR", groups: ["EU", "013", "003", "019", "UN"], isoStatus: "excRes" }, geometry: { type: "MultiPolygon", coordinates: [[[[-110.36279, 9.79626], [-108.755, 9.84085], [-109.04145, 11.13245], [-110.36279, 9.79626]]]] } },
+ { type: "Feature", properties: { iso1A2: "CR", iso1A3: "CRI", iso1N3: "188", wikidata: "Q800", nameEn: "Costa Rica", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["506"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-83.68276, 11.01562], [-83.66597, 10.79916], [-83.90838, 10.71161], [-84.68197, 11.07568], [-84.92439, 10.9497], [-85.60529, 11.22607], [-85.71223, 11.06868], [-86.14524, 11.09059], [-87.41779, 5.02401], [-82.94503, 7.93865], [-82.89978, 8.04083], [-82.89137, 8.05755], [-82.88641, 8.10219], [-82.9388, 8.26634], [-83.05209, 8.33394], [-82.93056, 8.43465], [-82.8679, 8.44042], [-82.8382, 8.48117], [-82.83322, 8.52464], [-82.83975, 8.54755], [-82.82739, 8.60153], [-82.8794, 8.6981], [-82.92068, 8.74832], [-82.91377, 8.774], [-82.88253, 8.83331], [-82.72126, 8.97125], [-82.93516, 9.07687], [-82.93516, 9.46741], [-82.84871, 9.4973], [-82.87919, 9.62645], [-82.77206, 9.59573], [-82.66667, 9.49746], [-82.61345, 9.49881], [-82.56507, 9.57279], [-82.51044, 9.65379], [-83.54024, 10.96805], [-83.68276, 11.01562]]]] } },
+ { type: "Feature", properties: { iso1A2: "CU", iso1A3: "CUB", iso1N3: "192", wikidata: "Q241", nameEn: "Cuba", groups: ["029", "003", "419", "019", "UN"], callingCodes: ["53"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-73.62304, 20.6935], [-82.02215, 24.23074], [-85.77883, 21.92705], [-74.81171, 18.82201], [-73.62304, 20.6935]]]] } },
+ { type: "Feature", properties: { iso1A2: "CV", iso1A3: "CPV", iso1N3: "132", wikidata: "Q1011", nameEn: "Cape Verde", groups: ["Q105472", "011", "202", "002", "UN"], callingCodes: ["238"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-28.81604, 14.57305], [-20.39702, 14.12816], [-23.37101, 19.134], [-28.81604, 14.57305]]]] } },
+ { type: "Feature", properties: { iso1A2: "CW", iso1A3: "CUW", iso1N3: "531", wikidata: "Q25279", nameEn: "Cura\xE7ao", aliases: ["NL-CW"], country: "NL", groups: ["Q1451600", "029", "003", "419", "019", "UN"], callingCodes: ["599"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-68.90012, 12.62309], [-69.59009, 12.46019], [-68.99639, 11.79035], [-68.33524, 11.78151], [-68.90012, 12.62309]]]] } },
+ { type: "Feature", properties: { iso1A2: "CX", iso1A3: "CXR", iso1N3: "162", wikidata: "Q31063", nameEn: "Christmas Island", country: "AU", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["61"] }, geometry: { type: "MultiPolygon", coordinates: [[[[105.66835, -9.31927], [104.67494, -11.2566], [106.66176, -11.14349], [105.66835, -9.31927]]]] } },
+ { type: "Feature", properties: { iso1A2: "CY", iso1A3: "CYP", iso1N3: "196", wikidata: "Q229", nameEn: "Republic of Cyprus", groups: ["Q644636", "EU", "145", "142", "UN"], driveSide: "left", callingCodes: ["357"] }, geometry: { type: "MultiPolygon", coordinates: [[[[32.46489, 35.48584], [30.15137, 34.08517], [32.74412, 34.43926], [32.75515, 34.64985], [32.76136, 34.68318], [32.79433, 34.67883], [32.82717, 34.70622], [32.86014, 34.70585], [32.86167, 34.68734], [32.9068, 34.66102], [32.91398, 34.67343], [32.93043, 34.67091], [32.92807, 34.66736], [32.93449, 34.66241], [32.93693, 34.67027], [32.94379, 34.67111], [32.94683, 34.67907], [32.95539, 34.68471], [32.99135, 34.68061], [32.98668, 34.67268], [32.99014, 34.65518], [32.97736, 34.65277], [32.97079, 34.66112], [32.95325, 34.66462], [32.94796, 34.6587], [32.94976, 34.65204], [32.95471, 34.64528], [32.95323, 34.64075], [32.95891, 34.62919], [32.96718, 34.63446], [32.96968, 34.64046], [33.0138, 34.64424], [33.26744, 34.49942], [33.83531, 34.73974], [33.70575, 34.97947], [33.70639, 34.99303], [33.71514, 35.00294], [33.69731, 35.01754], [33.69938, 35.03123], [33.67678, 35.03866], [33.63765, 35.03869], [33.61215, 35.0527], [33.59658, 35.03635], [33.567, 35.04803], [33.57478, 35.06049], [33.53975, 35.08151], [33.48915, 35.06594], [33.47666, 35.00701], [33.45256, 35.00288], [33.45178, 35.02078], [33.47825, 35.04103], [33.48136, 35.0636], [33.46813, 35.10564], [33.41675, 35.16325], [33.4076, 35.20062], [33.38575, 35.2018], [33.37248, 35.18698], [33.3717, 35.1788], [33.36569, 35.17479], [33.35612, 35.17402], [33.35596, 35.17942], [33.34964, 35.17803], [33.35056, 35.18328], [33.31955, 35.18096], [33.3072, 35.16816], [33.27068, 35.16815], [33.15138, 35.19504], [33.11105, 35.15639], [33.08249, 35.17319], [33.01192, 35.15639], [32.94471, 35.09422], [32.86406, 35.1043], [32.85733, 35.07742], [32.70779, 35.14127], [32.70947, 35.18328], [32.64864, 35.19967], [32.60361, 35.16647], [32.46489, 35.48584]]], [[[33.74144, 35.01053], [33.7492, 35.01319], [33.74983, 35.02274], [33.74265, 35.02329], [33.73781, 35.02181], [33.7343, 35.01178], [33.74144, 35.01053]]], [[[33.77312, 34.9976], [33.75994, 35.00113], [33.75682, 34.99916], [33.76605, 34.99543], [33.76738, 34.99188], [33.7778, 34.98981], [33.77843, 34.988], [33.78149, 34.98854], [33.78318, 34.98699], [33.78571, 34.98951], [33.78917, 34.98854], [33.79191, 34.98914], [33.78516, 34.99582], [33.77553, 34.99518], [33.77312, 34.9976]]]] } },
+ { type: "Feature", properties: { iso1A2: "CZ", iso1A3: "CZE", iso1N3: "203", wikidata: "Q213", nameEn: "Czechia", groups: ["EU", "151", "150", "UN"], callingCodes: ["420"] }, geometry: { type: "MultiPolygon", coordinates: [[[[14.82803, 50.86966], [14.79139, 50.81438], [14.70661, 50.84096], [14.61993, 50.86049], [14.63434, 50.8883], [14.65259, 50.90513], [14.64802, 50.93241], [14.58024, 50.91443], [14.56374, 50.922], [14.59702, 50.96148], [14.59908, 50.98685], [14.58215, 50.99306], [14.56432, 51.01008], [14.53438, 51.00374], [14.53321, 51.01679], [14.49873, 51.02242], [14.50809, 51.0427], [14.49991, 51.04692], [14.49154, 51.04382], [14.49202, 51.02286], [14.45827, 51.03712], [14.41335, 51.02086], [14.30098, 51.05515], [14.25665, 50.98935], [14.28776, 50.97718], [14.32353, 50.98556], [14.32793, 50.97379], [14.30251, 50.96606], [14.31422, 50.95243], [14.39848, 50.93866], [14.38691, 50.89907], [14.30098, 50.88448], [14.27123, 50.89386], [14.24314, 50.88761], [14.22331, 50.86049], [14.02982, 50.80662], [13.98864, 50.8177], [13.89113, 50.78533], [13.89444, 50.74142], [13.82942, 50.7251], [13.76316, 50.73487], [13.70204, 50.71771], [13.65977, 50.73096], [13.52474, 50.70394], [13.53748, 50.67654], [13.5226, 50.64721], [13.49742, 50.63133], [13.46413, 50.60102], [13.42189, 50.61243], [13.37485, 50.64931], [13.37805, 50.627], [13.32264, 50.60317], [13.32594, 50.58009], [13.29454, 50.57904], [13.25158, 50.59268], [13.19043, 50.50237], [13.13424, 50.51709], [13.08301, 50.50132], [13.0312, 50.50944], [13.02038, 50.4734], [13.02147, 50.44763], [12.98433, 50.42016], [12.94058, 50.40944], [12.82465, 50.45738], [12.73476, 50.43237], [12.73044, 50.42268], [12.70731, 50.39948], [12.67261, 50.41949], [12.51356, 50.39694], [12.48747, 50.37278], [12.49214, 50.35228], [12.48256, 50.34784], [12.46643, 50.35527], [12.43722, 50.33774], [12.43371, 50.32506], [12.39924, 50.32302], [12.40158, 50.29521], [12.36594, 50.28289], [12.35425, 50.23993], [12.33263, 50.24367], [12.32445, 50.20442], [12.33847, 50.19432], [12.32596, 50.17146], [12.29232, 50.17524], [12.28063, 50.19544], [12.28755, 50.22429], [12.23943, 50.24594], [12.24791, 50.25525], [12.26953, 50.25189], [12.25119, 50.27079], [12.20823, 50.2729], [12.18013, 50.32146], [12.10907, 50.32041], [12.13716, 50.27396], [12.09287, 50.25032], [12.19335, 50.19997], [12.21484, 50.16399], [12.1917, 50.13434], [12.2073, 50.10315], [12.23709, 50.10213], [12.27433, 50.0771], [12.26111, 50.06331], [12.30798, 50.05719], [12.49908, 49.97305], [12.47264, 49.94222], [12.55197, 49.92094], [12.48256, 49.83575], [12.46603, 49.78882], [12.40489, 49.76321], [12.4462, 49.70233], [12.52553, 49.68415], [12.53544, 49.61888], [12.56188, 49.6146], [12.60155, 49.52887], [12.64782, 49.52565], [12.64121, 49.47628], [12.669, 49.42935], [12.71227, 49.42363], [12.75854, 49.3989], [12.78168, 49.34618], [12.88414, 49.33541], [12.88249, 49.35479], [12.94859, 49.34079], [13.03618, 49.30417], [13.02957, 49.27399], [13.05883, 49.26259], [13.17665, 49.16713], [13.17019, 49.14339], [13.20405, 49.12303], [13.23689, 49.11412], [13.28242, 49.1228], [13.39479, 49.04812], [13.40802, 48.98851], [13.50221, 48.93752], [13.50552, 48.97441], [13.58319, 48.96899], [13.61624, 48.9462], [13.67739, 48.87886], [13.73854, 48.88538], [13.76994, 48.83537], [13.78977, 48.83319], [13.8096, 48.77877], [13.84023, 48.76988], [14.06151, 48.66873], [14.01482, 48.63788], [14.09104, 48.5943], [14.20691, 48.5898], [14.33909, 48.55852], [14.43076, 48.58855], [14.4587, 48.64695], [14.56139, 48.60429], [14.60808, 48.62881], [14.66762, 48.58215], [14.71794, 48.59794], [14.72756, 48.69502], [14.80584, 48.73489], [14.80821, 48.77711], [14.81545, 48.7874], [14.94773, 48.76268], [14.95641, 48.75915], [14.9758, 48.76857], [14.98112, 48.77524], [14.9782, 48.7766], [14.98032, 48.77959], [14.95072, 48.79101], [14.98917, 48.90082], [14.97612, 48.96983], [14.99878, 49.01444], [15.15534, 48.99056], [15.16358, 48.94278], [15.26177, 48.95766], [15.28305, 48.98831], [15.34823, 48.98444], [15.48027, 48.94481], [15.51357, 48.91549], [15.61622, 48.89541], [15.6921, 48.85973], [15.75341, 48.8516], [15.78087, 48.87644], [15.84404, 48.86921], [16.06034, 48.75436], [16.37345, 48.729], [16.40915, 48.74576], [16.46134, 48.80865], [16.67008, 48.77699], [16.68518, 48.7281], [16.71883, 48.73806], [16.79779, 48.70998], [16.90354, 48.71541], [16.93955, 48.60371], [17.00215, 48.70887], [17.11202, 48.82925], [17.19355, 48.87602], [17.29054, 48.85546], [17.3853, 48.80936], [17.45671, 48.85004], [17.5295, 48.81117], [17.7094, 48.86721], [17.73126, 48.87885], [17.77944, 48.92318], [17.87831, 48.92679], [17.91814, 49.01784], [18.06885, 49.03157], [18.1104, 49.08624], [18.15022, 49.24518], [18.18456, 49.28909], [18.36446, 49.3267], [18.4139, 49.36517], [18.4084, 49.40003], [18.44686, 49.39467], [18.54848, 49.47059], [18.53063, 49.49022], [18.57183, 49.51162], [18.6144, 49.49824], [18.67757, 49.50895], [18.74761, 49.492], [18.84521, 49.51672], [18.84786, 49.5446], [18.80479, 49.6815], [18.72838, 49.68163], [18.69817, 49.70473], [18.62676, 49.71983], [18.62943, 49.74603], [18.62645, 49.75002], [18.61368, 49.75426], [18.61278, 49.7618], [18.57183, 49.83334], [18.60341, 49.86256], [18.57045, 49.87849], [18.57697, 49.91565], [18.54299, 49.92537], [18.54495, 49.9079], [18.53423, 49.89906], [18.41604, 49.93498], [18.33562, 49.94747], [18.33278, 49.92415], [18.31914, 49.91565], [18.27794, 49.93863], [18.27107, 49.96779], [18.21752, 49.97309], [18.20241, 49.99958], [18.10628, 50.00223], [18.07898, 50.04535], [18.03212, 50.06574], [18.00396, 50.04954], [18.04585, 50.03311], [18.04585, 50.01194], [18.00191, 50.01723], [17.86886, 49.97452], [17.77669, 50.02253], [17.7506, 50.07896], [17.6888, 50.12037], [17.66683, 50.10275], [17.59404, 50.16437], [17.70528, 50.18812], [17.76296, 50.23382], [17.72176, 50.25665], [17.74648, 50.29966], [17.69292, 50.32859], [17.67764, 50.28977], [17.58889, 50.27837], [17.3702, 50.28123], [17.34548, 50.2628], [17.34273, 50.32947], [17.27681, 50.32246], [17.19991, 50.3654], [17.19579, 50.38817], [17.14498, 50.38117], [17.1224, 50.39494], [16.89229, 50.45117], [16.85933, 50.41093], [16.90877, 50.38642], [16.94448, 50.31281], [16.99803, 50.30316], [17.02138, 50.27772], [16.99803, 50.25753], [17.02825, 50.23118], [17.00353, 50.21449], [16.98018, 50.24172], [16.8456, 50.20834], [16.7014, 50.09659], [16.63137, 50.1142], [16.55446, 50.16613], [16.56407, 50.21009], [16.42674, 50.32509], [16.39379, 50.3207], [16.3622, 50.34875], [16.36495, 50.37679], [16.30289, 50.38292], [16.28118, 50.36891], [16.22821, 50.41054], [16.21585, 50.40627], [16.19526, 50.43291], [16.31413, 50.50274], [16.34572, 50.49575], [16.44597, 50.58041], [16.33611, 50.66579], [16.23174, 50.67101], [16.20839, 50.63096], [16.10265, 50.66405], [16.02437, 50.60046], [15.98317, 50.61528], [16.0175, 50.63009], [15.97219, 50.69799], [15.87331, 50.67188], [15.81683, 50.75666], [15.73186, 50.73885], [15.43798, 50.80833], [15.3803, 50.77187], [15.36656, 50.83956], [15.2773, 50.8907], [15.27043, 50.97724], [15.2361, 50.99886], [15.1743, 50.9833], [15.16744, 51.01959], [15.11937, 50.99021], [15.10152, 51.01095], [15.06218, 51.02269], [15.03895, 51.0123], [15.02433, 51.0242], [14.96419, 50.99108], [15.01088, 50.97984], [14.99852, 50.86817], [14.82803, 50.86966]]]] } },
+ { type: "Feature", properties: { iso1A2: "DE", iso1A3: "DEU", iso1N3: "276", wikidata: "Q183", nameEn: "Germany", groups: ["EU", "155", "150", "UN"], callingCodes: ["49"] }, geometry: { type: "MultiPolygon", coordinates: [[[[8.70847, 47.68904], [8.71773, 47.69088], [8.70237, 47.71453], [8.66416, 47.71367], [8.67508, 47.6979], [8.65769, 47.68928], [8.66837, 47.68437], [8.68985, 47.69552], [8.70847, 47.68904]]], [[[8.72617, 47.69651], [8.72809, 47.69282], [8.75856, 47.68969], [8.79511, 47.67462], [8.79966, 47.70222], [8.76965, 47.7075], [8.77309, 47.72059], [8.80663, 47.73821], [8.82002, 47.71458], [8.86989, 47.70504], [8.85065, 47.68209], [8.87383, 47.67045], [8.87625, 47.65441], [8.89946, 47.64769], [8.94093, 47.65596], [9.02093, 47.6868], [9.09891, 47.67801], [9.13845, 47.66389], [9.15181, 47.66904], [9.1705, 47.65513], [9.1755, 47.65584], [9.17593, 47.65399], [9.18203, 47.65598], [9.25619, 47.65939], [9.55125, 47.53629], [9.72736, 47.53457], [9.76748, 47.5934], [9.80254, 47.59419], [9.82591, 47.58158], [9.8189, 47.54688], [9.87499, 47.52953], [9.87733, 47.54688], [9.92407, 47.53111], [9.96029, 47.53899], [10.00003, 47.48216], [10.03859, 47.48927], [10.07131, 47.45531], [10.09001, 47.46005], [10.1052, 47.4316], [10.06897, 47.40709], [10.09819, 47.35724], [10.11805, 47.37228], [10.16362, 47.36674], [10.17648, 47.38889], [10.2127, 47.38019], [10.22774, 47.38904], [10.23757, 47.37609], [10.19998, 47.32832], [10.2147, 47.31014], [10.17648, 47.29149], [10.17531, 47.27167], [10.23257, 47.27088], [10.33424, 47.30813], [10.39851, 47.37623], [10.4324, 47.38494], [10.4359, 47.41183], [10.47446, 47.43318], [10.46278, 47.47901], [10.44291, 47.48453], [10.4324, 47.50111], [10.44992, 47.5524], [10.43473, 47.58394], [10.47329, 47.58552], [10.48849, 47.54057], [10.56912, 47.53584], [10.60337, 47.56755], [10.63456, 47.5591], [10.68832, 47.55752], [10.6965, 47.54253], [10.7596, 47.53228], [10.77596, 47.51729], [10.88814, 47.53701], [10.91268, 47.51334], [10.86945, 47.5015], [10.87061, 47.4786], [10.90918, 47.48571], [10.93839, 47.48018], [10.92437, 47.46991], [10.98513, 47.42882], [10.97111, 47.41617], [10.97111, 47.39561], [11.11835, 47.39719], [11.12536, 47.41222], [11.20482, 47.43198], [11.25157, 47.43277], [11.22002, 47.3964], [11.27844, 47.39956], [11.29597, 47.42566], [11.33804, 47.44937], [11.4175, 47.44621], [11.38128, 47.47465], [11.4362, 47.51413], [11.52618, 47.50939], [11.58578, 47.52281], [11.58811, 47.55515], [11.60681, 47.57881], [11.63934, 47.59202], [11.84052, 47.58354], [11.85572, 47.60166], [12.0088, 47.62451], [12.02282, 47.61033], [12.05788, 47.61742], [12.13734, 47.60639], [12.17824, 47.61506], [12.18145, 47.61019], [12.17737, 47.60121], [12.18568, 47.6049], [12.20398, 47.60667], [12.20801, 47.61082], [12.19895, 47.64085], [12.18507, 47.65984], [12.18347, 47.66663], [12.16769, 47.68167], [12.16217, 47.70105], [12.18303, 47.70065], [12.22571, 47.71776], [12.2542, 47.7433], [12.26238, 47.73544], [12.24017, 47.69534], [12.26004, 47.67725], [12.27991, 47.68827], [12.336, 47.69534], [12.37222, 47.68433], [12.43883, 47.6977], [12.44117, 47.6741], [12.50076, 47.62293], [12.53816, 47.63553], [12.57438, 47.63238], [12.6071, 47.6741], [12.7357, 47.6787], [12.77777, 47.66689], [12.76492, 47.64485], [12.82101, 47.61493], [12.77427, 47.58025], [12.80699, 47.54477], [12.84672, 47.54556], [12.85256, 47.52741], [12.9624, 47.47452], [12.98344, 47.48716], [12.9998, 47.46267], [13.04537, 47.49426], [13.03252, 47.53373], [13.05355, 47.56291], [13.04537, 47.58183], [13.06641, 47.58577], [13.06407, 47.60075], [13.09562, 47.63304], [13.07692, 47.68814], [13.01382, 47.72116], [12.98578, 47.7078], [12.92969, 47.71094], [12.91333, 47.7178], [12.90274, 47.72513], [12.91711, 47.74026], [12.9353, 47.74788], [12.94371, 47.76281], [12.93202, 47.77302], [12.96311, 47.79957], [12.98543, 47.82896], [13.00588, 47.84374], [12.94163, 47.92927], [12.93886, 47.94046], [12.93642, 47.94436], [12.93419, 47.94063], [12.92668, 47.93879], [12.91985, 47.94069], [12.9211, 47.95135], [12.91683, 47.95647], [12.87476, 47.96195], [12.8549, 48.01122], [12.76141, 48.07373], [12.74973, 48.10885], [12.7617, 48.12796], [12.78595, 48.12445], [12.80676, 48.14979], [12.82673, 48.15245], [12.8362, 48.15876], [12.836, 48.1647], [12.84475, 48.16556], [12.87126, 48.20318], [12.95306, 48.20629], [13.02083, 48.25689], [13.0851, 48.27711], [13.126, 48.27867], [13.18093, 48.29577], [13.26039, 48.29422], [13.30897, 48.31575], [13.40709, 48.37292], [13.43929, 48.43386], [13.42527, 48.45711], [13.45727, 48.51092], [13.43695, 48.55776], [13.45214, 48.56472], [13.46967, 48.55157], [13.50663, 48.57506], [13.50131, 48.58091], [13.51291, 48.59023], [13.57535, 48.55912], [13.59705, 48.57013], [13.62508, 48.55501], [13.65186, 48.55092], [13.66113, 48.53558], [13.72802, 48.51208], [13.74816, 48.53058], [13.7513, 48.5624], [13.76921, 48.55324], [13.80519, 48.58026], [13.80038, 48.59487], [13.82609, 48.62345], [13.81901, 48.6761], [13.81283, 48.68426], [13.81791, 48.69832], [13.79337, 48.71375], [13.81863, 48.73257], [13.82266, 48.75544], [13.84023, 48.76988], [13.8096, 48.77877], [13.78977, 48.83319], [13.76994, 48.83537], [13.73854, 48.88538], [13.67739, 48.87886], [13.61624, 48.9462], [13.58319, 48.96899], [13.50552, 48.97441], [13.50221, 48.93752], [13.40802, 48.98851], [13.39479, 49.04812], [13.28242, 49.1228], [13.23689, 49.11412], [13.20405, 49.12303], [13.17019, 49.14339], [13.17665, 49.16713], [13.05883, 49.26259], [13.02957, 49.27399], [13.03618, 49.30417], [12.94859, 49.34079], [12.88249, 49.35479], [12.88414, 49.33541], [12.78168, 49.34618], [12.75854, 49.3989], [12.71227, 49.42363], [12.669, 49.42935], [12.64121, 49.47628], [12.64782, 49.52565], [12.60155, 49.52887], [12.56188, 49.6146], [12.53544, 49.61888], [12.52553, 49.68415], [12.4462, 49.70233], [12.40489, 49.76321], [12.46603, 49.78882], [12.48256, 49.83575], [12.55197, 49.92094], [12.47264, 49.94222], [12.49908, 49.97305], [12.30798, 50.05719], [12.26111, 50.06331], [12.27433, 50.0771], [12.23709, 50.10213], [12.2073, 50.10315], [12.1917, 50.13434], [12.21484, 50.16399], [12.19335, 50.19997], [12.09287, 50.25032], [12.13716, 50.27396], [12.10907, 50.32041], [12.18013, 50.32146], [12.20823, 50.2729], [12.25119, 50.27079], [12.26953, 50.25189], [12.24791, 50.25525], [12.23943, 50.24594], [12.28755, 50.22429], [12.28063, 50.19544], [12.29232, 50.17524], [12.32596, 50.17146], [12.33847, 50.19432], [12.32445, 50.20442], [12.33263, 50.24367], [12.35425, 50.23993], [12.36594, 50.28289], [12.40158, 50.29521], [12.39924, 50.32302], [12.43371, 50.32506], [12.43722, 50.33774], [12.46643, 50.35527], [12.48256, 50.34784], [12.49214, 50.35228], [12.48747, 50.37278], [12.51356, 50.39694], [12.67261, 50.41949], [12.70731, 50.39948], [12.73044, 50.42268], [12.73476, 50.43237], [12.82465, 50.45738], [12.94058, 50.40944], [12.98433, 50.42016], [13.02147, 50.44763], [13.02038, 50.4734], [13.0312, 50.50944], [13.08301, 50.50132], [13.13424, 50.51709], [13.19043, 50.50237], [13.25158, 50.59268], [13.29454, 50.57904], [13.32594, 50.58009], [13.32264, 50.60317], [13.37805, 50.627], [13.37485, 50.64931], [13.42189, 50.61243], [13.46413, 50.60102], [13.49742, 50.63133], [13.5226, 50.64721], [13.53748, 50.67654], [13.52474, 50.70394], [13.65977, 50.73096], [13.70204, 50.71771], [13.76316, 50.73487], [13.82942, 50.7251], [13.89444, 50.74142], [13.89113, 50.78533], [13.98864, 50.8177], [14.02982, 50.80662], [14.22331, 50.86049], [14.24314, 50.88761], [14.27123, 50.89386], [14.30098, 50.88448], [14.38691, 50.89907], [14.39848, 50.93866], [14.31422, 50.95243], [14.30251, 50.96606], [14.32793, 50.97379], [14.32353, 50.98556], [14.28776, 50.97718], [14.25665, 50.98935], [14.30098, 51.05515], [14.41335, 51.02086], [14.45827, 51.03712], [14.49202, 51.02286], [14.49154, 51.04382], [14.49991, 51.04692], [14.50809, 51.0427], [14.49873, 51.02242], [14.53321, 51.01679], [14.53438, 51.00374], [14.56432, 51.01008], [14.58215, 50.99306], [14.59908, 50.98685], [14.59702, 50.96148], [14.56374, 50.922], [14.58024, 50.91443], [14.64802, 50.93241], [14.65259, 50.90513], [14.63434, 50.8883], [14.61993, 50.86049], [14.70661, 50.84096], [14.79139, 50.81438], [14.82803, 50.86966], [14.81664, 50.88148], [14.89681, 50.9422], [14.89252, 50.94999], [14.92942, 50.99744], [14.95529, 51.04552], [14.97938, 51.07742], [14.98229, 51.11354], [14.99689, 51.12205], [14.99079, 51.14284], [14.99646, 51.14365], [15.00083, 51.14974], [14.99414, 51.15813], [14.99311, 51.16249], [15.0047, 51.16874], [15.01242, 51.21285], [15.04288, 51.28387], [14.98008, 51.33449], [14.96899, 51.38367], [14.9652, 51.44793], [14.94749, 51.47155], [14.73219, 51.52922], [14.72652, 51.53902], [14.73047, 51.54606], [14.71125, 51.56209], [14.7727, 51.61263], [14.75759, 51.62318], [14.75392, 51.67445], [14.69065, 51.70842], [14.66386, 51.73282], [14.64625, 51.79472], [14.60493, 51.80473], [14.59089, 51.83302], [14.6588, 51.88359], [14.6933, 51.9044], [14.70601, 51.92944], [14.7177, 51.94048], [14.72163, 51.95188], [14.71836, 51.95606], [14.7139, 51.95643], [14.70488, 51.97679], [14.71339, 52.00337], [14.76026, 52.06624], [14.72971, 52.09167], [14.6917, 52.10283], [14.67683, 52.13936], [14.70616, 52.16927], [14.68344, 52.19612], [14.71319, 52.22144], [14.70139, 52.25038], [14.58149, 52.28007], [14.56378, 52.33838], [14.55228, 52.35264], [14.54423, 52.42568], [14.63056, 52.48993], [14.60081, 52.53116], [14.6289, 52.57136], [14.61073, 52.59847], [14.22071, 52.81175], [14.13806, 52.82392], [14.12256, 52.84311], [14.15873, 52.87715], [14.14056, 52.95786], [14.25954, 53.00264], [14.35044, 53.05829], [14.38679, 53.13669], [14.36696, 53.16444], [14.37853, 53.20405], [14.40662, 53.21098], [14.45125, 53.26241], [14.44133, 53.27427], [14.4215, 53.27724], [14.35209, 53.49506], [14.3273, 53.50587], [14.30416, 53.55499], [14.31904, 53.61581], [14.2853, 53.63392], [14.28477, 53.65955], [14.27133, 53.66613], [14.2836, 53.67721], [14.26782, 53.69866], [14.27249, 53.74464], [14.21323, 53.8664], [14.20823, 53.90776], [14.18544, 53.91258], [14.20647, 53.91671], [14.22634, 53.9291], [14.20811, 54.12784], [13.93395, 54.84044], [12.85844, 54.82438], [11.90309, 54.38543], [11.00303, 54.63689], [10.31111, 54.65968], [10.16755, 54.73883], [9.89314, 54.84171], [9.73563, 54.8247], [9.61187, 54.85548], [9.62734, 54.88057], [9.58937, 54.88785], [9.4659, 54.83131], [9.43155, 54.82586], [9.41213, 54.84254], [9.38532, 54.83968], [9.36496, 54.81749], [9.33849, 54.80233], [9.32771, 54.80602], [9.2474, 54.8112], [9.23445, 54.83432], [9.24631, 54.84726], [9.20571, 54.85841], [9.14275, 54.87421], [9.04629, 54.87249], [8.92795, 54.90452], [8.81178, 54.90518], [8.76387, 54.8948], [8.63979, 54.91069], [8.55769, 54.91837], [8.45719, 55.06747], [8.02459, 55.09613], [5.45168, 54.20039], [6.91025, 53.44221], [7.00198, 53.32672], [7.19052, 53.31866], [7.21679, 53.20058], [7.22681, 53.18165], [7.17898, 53.13817], [7.21694, 53.00742], [7.07253, 52.81083], [7.04557, 52.63318], [6.77307, 52.65375], [6.71641, 52.62905], [6.69507, 52.488], [6.94293, 52.43597], [6.99041, 52.47235], [7.03417, 52.40237], [7.07044, 52.37805], [7.02703, 52.27941], [7.06365, 52.23789], [7.03729, 52.22695], [6.9897, 52.2271], [6.97189, 52.20329], [6.83984, 52.11728], [6.76117, 52.11895], [6.68128, 52.05052], [6.83035, 51.9905], [6.82357, 51.96711], [6.72319, 51.89518], [6.68386, 51.91861], [6.58556, 51.89386], [6.50231, 51.86313], [6.47179, 51.85395], [6.38815, 51.87257], [6.40704, 51.82771], [6.30593, 51.84998], [6.29872, 51.86801], [6.21443, 51.86801], [6.15349, 51.90439], [6.11551, 51.89769], [6.16902, 51.84094], [6.10337, 51.84829], [6.06705, 51.86136], [5.99848, 51.83195], [5.94568, 51.82786], [5.98665, 51.76944], [5.95003, 51.7493], [6.04091, 51.71821], [6.02767, 51.6742], [6.11759, 51.65609], [6.09055, 51.60564], [6.18017, 51.54096], [6.21724, 51.48568], [6.20654, 51.40049], [6.22641, 51.39948], [6.22674, 51.36135], [6.16977, 51.33169], [6.07889, 51.24432], [6.07889, 51.17038], [6.17384, 51.19589], [6.16706, 51.15677], [5.98292, 51.07469], [5.9541, 51.03496], [5.9134, 51.06736], [5.86735, 51.05182], [5.87849, 51.01969], [5.90493, 51.00198], [5.90296, 50.97356], [5.95282, 50.98728], [6.02697, 50.98303], [6.01615, 50.93367], [6.09297, 50.92066], [6.07486, 50.89307], [6.08805, 50.87223], [6.07693, 50.86025], [6.07431, 50.84674], [6.05702, 50.85179], [6.05623, 50.8572], [6.01921, 50.84435], [6.02328, 50.81694], [6.00462, 50.80065], [5.98404, 50.80988], [5.97497, 50.79992], [6.02624, 50.77453], [6.01976, 50.75398], [6.03889, 50.74618], [6.0326, 50.72647], [6.0406, 50.71848], [6.04428, 50.72861], [6.11707, 50.72231], [6.17852, 50.6245], [6.26957, 50.62444], [6.2476, 50.60392], [6.24888, 50.59869], [6.24005, 50.58732], [6.22581, 50.5907], [6.20281, 50.56952], [6.17739, 50.55875], [6.17802, 50.54179], [6.19735, 50.53576], [6.19579, 50.5313], [6.18716, 50.52653], [6.19193, 50.5212], [6.20599, 50.52089], [6.22335, 50.49578], [6.26637, 50.50272], [6.30809, 50.50058], [6.3465, 50.48833], [6.34005, 50.46083], [6.37219, 50.45397], [6.36852, 50.40776], [6.34406, 50.37994], [6.3688, 50.35898], [6.40785, 50.33557], [6.40641, 50.32425], [6.35701, 50.31139], [6.32488, 50.32333], [6.29949, 50.30887], [6.28797, 50.27458], [6.208, 50.25179], [6.16853, 50.2234], [6.18364, 50.20815], [6.18739, 50.1822], [6.14588, 50.17106], [6.14132, 50.14971], [6.15298, 50.14126], [6.1379, 50.12964], [6.12055, 50.09171], [6.11274, 50.05916], [6.13458, 50.04141], [6.13044, 50.02929], [6.14666, 50.02207], [6.13794, 50.01466], [6.13273, 50.02019], [6.1295, 50.01849], [6.13806, 50.01056], [6.14948, 50.00908], [6.14147, 49.99563], [6.1701, 49.98518], [6.16466, 49.97086], [6.17872, 49.9537], [6.18554, 49.95622], [6.18045, 49.96611], [6.19089, 49.96991], [6.19856, 49.95053], [6.22094, 49.94955], [6.22608, 49.929], [6.21882, 49.92403], [6.22926, 49.92096], [6.23496, 49.89972], [6.26146, 49.88203], [6.28874, 49.87592], [6.29692, 49.86685], [6.30963, 49.87021], [6.32303, 49.85133], [6.32098, 49.83728], [6.33585, 49.83785], [6.34267, 49.84974], [6.36576, 49.85032], [6.40022, 49.82029], [6.42521, 49.81591], [6.42905, 49.81091], [6.44131, 49.81443], [6.45425, 49.81164], [6.47111, 49.82263], [6.48718, 49.81267], [6.50647, 49.80916], [6.51215, 49.80124], [6.52121, 49.81338], [6.53122, 49.80666], [6.52169, 49.79787], [6.50534, 49.78952], [6.51669, 49.78336], [6.51056, 49.77515], [6.51828, 49.76855], [6.51646, 49.75961], [6.50174, 49.75292], [6.50193, 49.73291], [6.51805, 49.72425], [6.51397, 49.72058], [6.50261, 49.72718], [6.49535, 49.72645], [6.49694, 49.72205], [6.5042, 49.71808], [6.50647, 49.71353], [6.49785, 49.71118], [6.48014, 49.69767], [6.46048, 49.69092], [6.44654, 49.67799], [6.42937, 49.66857], [6.42726, 49.66078], [6.43768, 49.66021], [6.4413, 49.65722], [6.41861, 49.61723], [6.39822, 49.60081], [6.385, 49.59946], [6.37464, 49.58886], [6.38342, 49.5799], [6.38024, 49.57593], [6.36676, 49.57813], [6.35825, 49.57053], [6.38228, 49.55855], [6.38072, 49.55171], [6.35666, 49.52931], [6.36788, 49.50377], [6.36907, 49.48931], [6.36778, 49.46937], [6.38352, 49.46463], [6.39168, 49.4667], [6.40274, 49.46546], [6.42432, 49.47683], [6.55404, 49.42464], [6.533, 49.40748], [6.60091, 49.36864], [6.58807, 49.35358], [6.572, 49.35027], [6.60186, 49.31055], [6.66583, 49.28065], [6.69274, 49.21661], [6.71843, 49.2208], [6.73256, 49.20486], [6.71137, 49.18808], [6.73765, 49.16375], [6.78265, 49.16793], [6.83385, 49.15162], [6.84703, 49.15734], [6.86225, 49.18185], [6.85016, 49.19354], [6.85119, 49.20038], [6.83555, 49.21249], [6.85939, 49.22376], [6.89298, 49.20863], [6.91875, 49.22261], [6.93831, 49.2223], [6.94028, 49.21641], [6.95963, 49.203], [6.97273, 49.2099], [7.01318, 49.19018], [7.03459, 49.19096], [7.0274, 49.17042], [7.03178, 49.15734], [7.04662, 49.13724], [7.04409, 49.12123], [7.04843, 49.11422], [7.05548, 49.11185], [7.06642, 49.11415], [7.07162, 49.1255], [7.09007, 49.13094], [7.07859, 49.15031], [7.10715, 49.15631], [7.10384, 49.13787], [7.12504, 49.14253], [7.1358, 49.1282], [7.1593, 49.1204], [7.23473, 49.12971], [7.29514, 49.11426], [7.3195, 49.14231], [7.35995, 49.14399], [7.3662, 49.17308], [7.44052, 49.18354], [7.44455, 49.16765], [7.49473, 49.17], [7.49172, 49.13915], [7.53012, 49.09818], [7.56416, 49.08136], [7.62575, 49.07654], [7.63618, 49.05428], [7.75948, 49.04562], [7.79557, 49.06583], [7.86386, 49.03499], [7.93641, 49.05544], [7.97783, 49.03161], [8.14189, 48.97833], [8.22604, 48.97352], [8.20031, 48.95856], [8.19989, 48.95825], [8.12813, 48.87985], [8.10253, 48.81829], [8.06802, 48.78957], [8.0326, 48.79017], [8.01534, 48.76085], [7.96994, 48.75606], [7.96812, 48.72491], [7.89002, 48.66317], [7.84098, 48.64217], [7.80057, 48.5857], [7.80167, 48.54758], [7.80647, 48.51239], [7.76833, 48.48945], [7.73109, 48.39192], [7.74562, 48.32736], [7.69022, 48.30018], [7.6648, 48.22219], [7.57137, 48.12292], [7.56966, 48.03265], [7.62302, 47.97898], [7.55673, 47.87371], [7.52921, 47.77747], [7.54761, 47.72912], [7.53722, 47.71635], [7.51266, 47.70197], [7.51915, 47.68335], [7.52067, 47.66437], [7.53384, 47.65115], [7.5591, 47.63849], [7.57423, 47.61628], [7.58851, 47.60794], [7.59301, 47.60058], [7.58945, 47.59017], [7.60523, 47.58519], [7.60459, 47.57869], [7.61929, 47.57683], [7.64309, 47.59151], [7.64213, 47.5944], [7.64599, 47.59695], [7.67395, 47.59212], [7.68229, 47.59905], [7.69385, 47.60099], [7.68486, 47.59601], [7.67115, 47.5871], [7.68904, 47.57133], [7.67655, 47.56435], [7.63338, 47.56256], [7.65083, 47.54662], [7.66174, 47.54554], [7.6656, 47.53752], [7.68101, 47.53232], [7.69642, 47.53297], [7.71961, 47.54219], [7.75261, 47.54599], [7.79486, 47.55691], [7.81901, 47.58798], [7.84412, 47.5841], [7.88664, 47.58854], [7.90673, 47.57674], [7.91251, 47.55031], [7.94494, 47.54511], [7.95682, 47.55789], [7.97581, 47.55493], [8.00113, 47.55616], [8.02136, 47.55096], [8.04383, 47.55443], [8.06663, 47.56374], [8.08557, 47.55768], [8.10002, 47.56504], [8.10395, 47.57918], [8.11543, 47.5841], [8.13662, 47.58432], [8.13823, 47.59147], [8.14947, 47.59558], [8.1652, 47.5945], [8.19378, 47.61636], [8.20617, 47.62141], [8.22011, 47.6181], [8.22577, 47.60385], [8.23809, 47.61204], [8.25863, 47.61571], [8.26313, 47.6103], [8.2824, 47.61225], [8.29722, 47.60603], [8.29524, 47.5919], [8.30277, 47.58607], [8.32735, 47.57133], [8.35512, 47.57014], [8.38273, 47.56608], [8.39477, 47.57826], [8.43235, 47.56617], [8.49431, 47.58107], [8.48949, 47.588], [8.46637, 47.58389], [8.45578, 47.60121], [8.50747, 47.61897], [8.51686, 47.63476], [8.55756, 47.62394], [8.57586, 47.59537], [8.60348, 47.61204], [8.59545, 47.64298], [8.60701, 47.65271], [8.61471, 47.64514], [8.60412, 47.63735], [8.62049, 47.63757], [8.62884, 47.65098], [8.61113, 47.66332], [8.6052, 47.67258], [8.57683, 47.66158], [8.56141, 47.67088], [8.52801, 47.66059], [8.5322, 47.64687], [8.49656, 47.64709], [8.46605, 47.64103], [8.4667, 47.65747], [8.44711, 47.65379], [8.42264, 47.66667], [8.41346, 47.66676], [8.40473, 47.67499], [8.4211, 47.68407], [8.40569, 47.69855], [8.44807, 47.72426], [8.45771, 47.7493], [8.48868, 47.77215], [8.56814, 47.78001], [8.56415, 47.80633], [8.61657, 47.79998], [8.62408, 47.7626], [8.64425, 47.76398], [8.65292, 47.80066], [8.68022, 47.78599], [8.68985, 47.75686], [8.71778, 47.76571], [8.74251, 47.75168], [8.70543, 47.73121], [8.73671, 47.7169], [8.72617, 47.69651]]]] } },
+ { type: "Feature", properties: { iso1A2: "DG", iso1A3: "DGA", wikidata: "Q184851", nameEn: "Diego Garcia", country: "GB", groups: ["IO", "BOTS", "014", "202", "002", "UN"], isoStatus: "excRes", callingCodes: ["246"] }, geometry: { type: "MultiPolygon", coordinates: [[[[73.14823, -7.76302], [73.09982, -6.07324], [71.43792, -7.73904], [73.14823, -7.76302]]]] } },
+ { type: "Feature", properties: { iso1A2: "DJ", iso1A3: "DJI", iso1N3: "262", wikidata: "Q977", nameEn: "Djibouti", groups: ["014", "202", "002", "UN"], callingCodes: ["253"] }, geometry: { type: "MultiPolygon", coordinates: [[[[43.90659, 12.3823], [43.90659, 12.3823], [43.32909, 12.59711], [43.29075, 12.79154], [42.86195, 12.58747], [42.7996, 12.42629], [42.6957, 12.36201], [42.46941, 12.52661], [42.4037, 12.46478], [41.95461, 11.81157], [41.82878, 11.72361], [41.77727, 11.49902], [41.8096, 11.33606], [41.80056, 10.97127], [42.06302, 10.92599], [42.13691, 10.97586], [42.42669, 10.98493], [42.62989, 11.09711], [42.75111, 11.06992], [42.79037, 10.98493], [42.95776, 10.98533], [43.90659, 12.3823]]]] } },
+ { type: "Feature", properties: { iso1A2: "DK", iso1A3: "DNK", iso1N3: "208", wikidata: "Q756617", nameEn: "Kingdom of Denmark" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "DM", iso1A3: "DMA", iso1N3: "212", wikidata: "Q784", nameEn: "Dominica", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 767"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-61.32485, 14.91445], [-60.86656, 15.82603], [-61.95646, 15.5094], [-61.32485, 14.91445]]]] } },
+ { type: "Feature", properties: { iso1A2: "DO", iso1A3: "DOM", iso1N3: "214", wikidata: "Q786", nameEn: "Dominican Republic", groups: ["029", "003", "419", "019", "UN"], callingCodes: ["1 809", "1 829", "1 849"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-67.87844, 21.7938], [-72.38946, 20.27111], [-71.77419, 19.73128], [-71.75865, 19.70231], [-71.7429, 19.58445], [-71.71449, 19.55364], [-71.71268, 19.53374], [-71.6802, 19.45008], [-71.69448, 19.37866], [-71.77766, 19.33823], [-71.73229, 19.26686], [-71.62642, 19.21212], [-71.65337, 19.11759], [-71.69938, 19.10916], [-71.71088, 19.08353], [-71.74088, 19.0437], [-71.88102, 18.95007], [-71.77766, 18.95007], [-71.72624, 18.87802], [-71.71885, 18.78423], [-71.82556, 18.62551], [-71.95412, 18.64939], [-72.00201, 18.62312], [-71.88102, 18.50125], [-71.90875, 18.45821], [-71.69952, 18.34101], [-71.78271, 18.18302], [-71.75465, 18.14405], [-71.74994, 18.11115], [-71.73783, 18.07177], [-71.75671, 18.03456], [-72.29523, 17.48026], [-68.39466, 16.14167], [-67.87844, 21.7938]]]] } },
+ { type: "Feature", properties: { iso1A2: "DZ", iso1A3: "DZA", iso1N3: "012", wikidata: "Q262", nameEn: "Algeria", groups: ["015", "002", "UN"], callingCodes: ["213"] }, geometry: { type: "MultiPolygon", coordinates: [[[[8.59123, 37.14286], [5.10072, 39.89531], [-2.27707, 35.35051], [-2.21248, 35.08532], [-2.21445, 35.04378], [-2.04734, 34.93218], [-1.97833, 34.93218], [-1.97469, 34.886], [-1.73707, 34.74226], [-1.84569, 34.61907], [-1.69788, 34.48056], [-1.78042, 34.39018], [-1.64666, 34.10405], [-1.73494, 33.71721], [-1.59508, 33.59929], [-1.67067, 33.27084], [-1.46249, 33.0499], [-1.54244, 32.95499], [-1.37794, 32.73628], [-0.9912, 32.52467], [-1.24998, 32.32993], [-1.24453, 32.1917], [-1.15735, 32.12096], [-1.22829, 32.07832], [-2.46166, 32.16603], [-2.93873, 32.06557], [-2.82784, 31.79459], [-3.66314, 31.6339], [-3.66386, 31.39202], [-3.77647, 31.31912], [-3.77103, 31.14984], [-3.54944, 31.0503], [-3.65418, 30.85566], [-3.64735, 30.67539], [-4.31774, 30.53229], [-4.6058, 30.28343], [-5.21671, 29.95253], [-5.58831, 29.48103], [-5.72121, 29.52322], [-5.75616, 29.61407], [-6.69965, 29.51623], [-6.78351, 29.44634], [-6.95824, 29.50924], [-7.61585, 29.36252], [-8.6715, 28.71194], [-8.66879, 27.6666], [-8.66674, 27.31569], [-4.83423, 24.99935], [1.15698, 21.12843], [1.20992, 20.73533], [3.24648, 19.81703], [3.12501, 19.1366], [3.36082, 18.9745], [4.26651, 19.14224], [5.8153, 19.45101], [7.38361, 20.79165], [7.48273, 20.87258], [11.96886, 23.51735], [11.62498, 24.26669], [11.41061, 24.21456], [10.85323, 24.5595], [10.33159, 24.5465], [10.02432, 24.98124], [10.03146, 25.35635], [9.38834, 26.19288], [9.51696, 26.39148], [9.89569, 26.57696], [9.78136, 29.40961], [9.3876, 30.16738], [9.55544, 30.23971], [9.07483, 32.07865], [8.35999, 32.50101], [8.31895, 32.83483], [8.1179, 33.05086], [8.11433, 33.10175], [7.83028, 33.18851], [7.73687, 33.42114], [7.54088, 33.7726], [7.52851, 34.06493], [7.66174, 34.20167], [7.74207, 34.16492], [7.81242, 34.21841], [7.86264, 34.3987], [8.20482, 34.57575], [8.29655, 34.72798], [8.25189, 34.92009], [8.30727, 34.95378], [8.3555, 35.10007], [8.47318, 35.23376], [8.30329, 35.29884], [8.36086, 35.47774], [8.35371, 35.66373], [8.26472, 35.73669], [8.2626, 35.91733], [8.40731, 36.42208], [8.18936, 36.44939], [8.16167, 36.48817], [8.47609, 36.66607], [8.46537, 36.7706], [8.57613, 36.78062], [8.67706, 36.8364], [8.62972, 36.86499], [8.64044, 36.9401], [8.59123, 37.14286]]]] } },
+ { type: "Feature", properties: { iso1A2: "EA", wikidata: "Q28868874", nameEn: "Ceuta, Melilla", country: "ES", level: "territory", isoStatus: "excRes" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "EC", iso1A3: "ECU", iso1N3: "218", wikidata: "Q736", nameEn: "Ecuador" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "EE", iso1A3: "EST", iso1N3: "233", wikidata: "Q191", nameEn: "Estonia", aliases: ["EW"], groups: ["EU", "154", "150", "UN"], callingCodes: ["372"] }, geometry: { type: "MultiPolygon", coordinates: [[[[26.32936, 60.00121], [20.5104, 59.15546], [19.84909, 57.57876], [22.80496, 57.87798], [23.20055, 57.56697], [24.26221, 57.91787], [24.3579, 57.87471], [25.19484, 58.0831], [25.28237, 57.98539], [25.29581, 58.08288], [25.73499, 57.90193], [26.05949, 57.84744], [26.0324, 57.79037], [26.02456, 57.78342], [26.027, 57.78158], [26.0266, 57.77441], [26.02069, 57.77169], [26.02415, 57.76865], [26.03332, 57.7718], [26.0543, 57.76105], [26.08098, 57.76619], [26.2029, 57.7206], [26.1866, 57.6849], [26.29253, 57.59244], [26.46527, 57.56885], [26.54675, 57.51813], [26.90364, 57.62823], [27.34698, 57.52242], [27.31919, 57.57672], [27.40393, 57.62125], [27.3746, 57.66834], [27.52615, 57.72843], [27.50171, 57.78842], [27.56689, 57.83356], [27.78526, 57.83963], [27.81841, 57.89244], [27.67282, 57.92627], [27.62393, 58.09462], [27.48541, 58.22615], [27.55489, 58.39525], [27.36366, 58.78381], [27.74429, 58.98351], [27.80482, 59.1116], [27.87978, 59.18097], [27.90911, 59.24353], [28.00689, 59.28351], [28.14215, 59.28934], [28.19284, 59.35791], [28.20537, 59.36491], [28.21137, 59.38058], [28.19061, 59.39962], [28.04187, 59.47017], [27.85643, 59.58538], [26.90044, 59.63819], [26.32936, 60.00121]]]] } },
+ { type: "Feature", properties: { iso1A2: "EG", iso1A3: "EGY", iso1N3: "818", wikidata: "Q79", nameEn: "Egypt", groups: ["015", "002", "UN"], callingCodes: ["20"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.62659, 31.82938], [26.92891, 33.39516], [24.8458, 31.39877], [25.01077, 30.73861], [24.71117, 30.17441], [24.99968, 29.24574], [24.99885, 21.99535], [33.17563, 22.00405], [34.0765, 22.00501], [37.8565, 22.00903], [34.4454, 27.91479], [34.8812, 29.36878], [34.92298, 29.45305], [34.26742, 31.21998], [34.24012, 31.29591], [34.23572, 31.2966], [34.21853, 31.32363], [34.052, 31.46619], [33.62659, 31.82938]]]] } },
+ { type: "Feature", properties: { iso1A2: "EH", iso1A3: "ESH", iso1N3: "732", wikidata: "Q6250", nameEn: "Western Sahara", groups: ["015", "002"], callingCodes: ["212"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-8.66879, 27.6666], [-8.77527, 27.66663], [-8.71787, 26.9898], [-9.08698, 26.98639], [-9.56957, 26.90042], [-9.81998, 26.71379], [-10.68417, 26.90984], [-11.35695, 26.8505], [-11.23622, 26.72023], [-11.38635, 26.611], [-11.62052, 26.05229], [-12.06001, 26.04442], [-12.12281, 25.13682], [-12.92147, 24.39502], [-13.00628, 24.01923], [-13.75627, 23.77231], [-14.10361, 22.75501], [-14.1291, 22.41636], [-14.48112, 22.00886], [-14.47329, 21.63839], [-14.78487, 21.36587], [-16.44269, 21.39745], [-16.9978, 21.36239], [-17.02707, 21.34022], [-17.21511, 21.34226], [-17.35589, 20.80492], [-17.0471, 20.76408], [-17.0695, 20.85742], [-17.06781, 20.92697], [-17.0396, 20.9961], [-17.0357, 21.05368], [-16.99806, 21.12142], [-16.95474, 21.33997], [-13.01525, 21.33343], [-13.08438, 22.53866], [-13.15313, 22.75649], [-13.10753, 22.89493], [-13.00412, 23.02297], [-12.5741, 23.28975], [-12.36213, 23.3187], [-12.14969, 23.41935], [-12.00251, 23.4538], [-12.0002, 25.9986], [-8.66721, 25.99918], [-8.66674, 27.31569], [-8.66879, 27.6666]]]] } },
+ { type: "Feature", properties: { iso1A2: "ER", iso1A3: "ERI", iso1N3: "232", wikidata: "Q986", nameEn: "Eritrea", groups: ["014", "202", "002", "UN"], callingCodes: ["291"] }, geometry: { type: "MultiPolygon", coordinates: [[[[40.99158, 15.81743], [39.63762, 18.37348], [38.57727, 17.98125], [38.45916, 17.87167], [38.37133, 17.66269], [38.13362, 17.53906], [37.50967, 17.32199], [37.42694, 17.04041], [36.99777, 17.07172], [36.92193, 16.23451], [36.76371, 15.80831], [36.69761, 15.75323], [36.54276, 15.23478], [36.44337, 15.14963], [36.54376, 14.25597], [36.56536, 14.26177], [36.55659, 14.28237], [36.63364, 14.31172], [36.85787, 14.32201], [37.01622, 14.2561], [37.09486, 14.27155], [37.13206, 14.40746], [37.3106, 14.44657], [37.47319, 14.2149], [37.528, 14.18413], [37.91287, 14.89447], [38.0364, 14.72745], [38.25562, 14.67287], [38.3533, 14.51323], [38.45748, 14.41445], [38.78306, 14.4754], [38.98058, 14.54895], [39.02834, 14.63717], [39.16074, 14.65187], [39.14772, 14.61827], [39.19547, 14.56996], [39.23888, 14.56365], [39.26927, 14.48801], [39.2302, 14.44598], [39.2519, 14.40393], [39.37685, 14.54402], [39.52756, 14.49011], [39.50585, 14.55735], [39.58182, 14.60987], [39.76632, 14.54264], [39.9443, 14.41024], [40.07236, 14.54264], [40.14649, 14.53969], [40.21128, 14.39342], [40.25686, 14.41445], [40.9167, 14.11152], [41.25097, 13.60787], [41.62864, 13.38626], [42.05841, 12.80912], [42.21469, 12.75832], [42.2798, 12.6355], [42.4037, 12.46478], [42.46941, 12.52661], [42.6957, 12.36201], [42.7996, 12.42629], [42.86195, 12.58747], [43.29075, 12.79154], [40.99158, 15.81743]]]] } },
+ { type: "Feature", properties: { iso1A2: "ES", iso1A3: "ESP", iso1N3: "724", wikidata: "Q29", nameEn: "Spain" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "ET", iso1A3: "ETH", iso1N3: "231", wikidata: "Q115", nameEn: "Ethiopia", groups: ["014", "202", "002", "UN"], callingCodes: ["251"] }, geometry: { type: "MultiPolygon", coordinates: [[[[42.4037, 12.46478], [42.2798, 12.6355], [42.21469, 12.75832], [42.05841, 12.80912], [41.62864, 13.38626], [41.25097, 13.60787], [40.9167, 14.11152], [40.25686, 14.41445], [40.21128, 14.39342], [40.14649, 14.53969], [40.07236, 14.54264], [39.9443, 14.41024], [39.76632, 14.54264], [39.58182, 14.60987], [39.50585, 14.55735], [39.52756, 14.49011], [39.37685, 14.54402], [39.2519, 14.40393], [39.2302, 14.44598], [39.26927, 14.48801], [39.23888, 14.56365], [39.19547, 14.56996], [39.14772, 14.61827], [39.16074, 14.65187], [39.02834, 14.63717], [38.98058, 14.54895], [38.78306, 14.4754], [38.45748, 14.41445], [38.3533, 14.51323], [38.25562, 14.67287], [38.0364, 14.72745], [37.91287, 14.89447], [37.528, 14.18413], [37.47319, 14.2149], [37.3106, 14.44657], [37.13206, 14.40746], [37.09486, 14.27155], [37.01622, 14.2561], [36.85787, 14.32201], [36.63364, 14.31172], [36.55659, 14.28237], [36.56536, 14.26177], [36.54376, 14.25597], [36.44653, 13.95666], [36.48824, 13.83954], [36.38993, 13.56459], [36.24545, 13.36759], [36.13374, 12.92665], [36.16651, 12.88019], [36.14268, 12.70879], [36.01458, 12.72478], [35.70476, 12.67101], [35.24302, 11.91132], [35.11492, 11.85156], [35.05832, 11.71158], [35.09556, 11.56278], [34.95704, 11.24448], [35.01215, 11.19626], [34.93172, 10.95946], [34.97789, 10.91559], [34.97491, 10.86147], [34.86916, 10.78832], [34.86618, 10.74588], [34.77532, 10.69027], [34.77383, 10.74588], [34.59062, 10.89072], [34.4372, 10.781], [34.2823, 10.53508], [34.34783, 10.23914], [34.32102, 10.11599], [34.22718, 10.02506], [34.20484, 9.9033], [34.13186, 9.7492], [34.08717, 9.55243], [34.10229, 9.50238], [34.14304, 9.04654], [34.14453, 8.60204], [34.01346, 8.50041], [33.89579, 8.4842], [33.87195, 8.41938], [33.71407, 8.3678], [33.66938, 8.44442], [33.54575, 8.47094], [33.3119, 8.45474], [33.19721, 8.40317], [33.1853, 8.29264], [33.18083, 8.13047], [33.08401, 8.05822], [33.0006, 7.90333], [33.04944, 7.78989], [33.24637, 7.77939], [33.32531, 7.71297], [33.44745, 7.7543], [33.71407, 7.65983], [33.87642, 7.5491], [34.02984, 7.36449], [34.03878, 7.27437], [34.01495, 7.25664], [34.19369, 7.12807], [34.19369, 7.04382], [34.35753, 6.91963], [34.47669, 6.91076], [34.53925, 6.82794], [34.53776, 6.74808], [34.65096, 6.72589], [34.77459, 6.5957], [34.87736, 6.60161], [35.01738, 6.46991], [34.96227, 6.26415], [35.00546, 5.89387], [35.12611, 5.68937], [35.13058, 5.62118], [35.31188, 5.50106], [35.29938, 5.34042], [35.50792, 5.42431], [35.8576, 5.33413], [35.81968, 5.10757], [35.82118, 4.77382], [35.9419, 4.61933], [35.95449, 4.53244], [36.03924, 4.44406], [36.84474, 4.44518], [37.07724, 4.33503], [38.14168, 3.62487], [38.45812, 3.60445], [38.52336, 3.62551], [38.91938, 3.51198], [39.07736, 3.5267], [39.19954, 3.47834], [39.49444, 3.45521], [39.51551, 3.40895], [39.55132, 3.39634], [39.58339, 3.47434], [39.76808, 3.67058], [39.86043, 3.86974], [40.77498, 4.27683], [41.1754, 3.94079], [41.89488, 3.97375], [42.07619, 4.17667], [42.55853, 4.20518], [42.84526, 4.28357], [42.97746, 4.44032], [43.04177, 4.57923], [43.40263, 4.79289], [44.02436, 4.9451], [44.98104, 4.91821], [47.97917, 8.00124], [47.92477, 8.00111], [46.99339, 7.9989], [44.19222, 8.93028], [43.32613, 9.59205], [43.23518, 9.84605], [43.0937, 9.90579], [42.87643, 10.18441], [42.69452, 10.62672], [42.95776, 10.98533], [42.79037, 10.98493], [42.75111, 11.06992], [42.62989, 11.09711], [42.42669, 10.98493], [42.13691, 10.97586], [42.06302, 10.92599], [41.80056, 10.97127], [41.8096, 11.33606], [41.77727, 11.49902], [41.82878, 11.72361], [41.95461, 11.81157], [42.4037, 12.46478]]]] } },
+ { type: "Feature", properties: { iso1A2: "EU", iso1A3: "EUE", wikidata: "Q458", nameEn: "European Union", level: "union", isoStatus: "excRes" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "FI", iso1A3: "FIN", iso1N3: "246", wikidata: "Q33", nameEn: "Finland", aliases: ["SF"] }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "FJ", iso1A3: "FJI", iso1N3: "242", wikidata: "Q712", nameEn: "Fiji", groups: ["054", "009", "UN"], driveSide: "left", callingCodes: ["679"] }, geometry: { type: "MultiPolygon", coordinates: [[[[174.245, -23.1974], [179.99999, -22.5], [179.99999, -11.5], [174, -11.5], [174.245, -23.1974]]], [[[-176.76826, -14.95183], [-180, -14.96041], [-180, -22.90585], [-176.74538, -22.89767], [-176.76826, -14.95183]]]] } },
+ { type: "Feature", properties: { iso1A2: "FK", iso1A3: "FLK", iso1N3: "238", wikidata: "Q9648", nameEn: "Falkland Islands", country: "GB", groups: ["BOTS", "005", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["500"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.67376, -55.11859], [-54.56126, -51.26248], [-61.26735, -50.63919], [-63.67376, -55.11859]]]] } },
+ { type: "Feature", properties: { iso1A2: "FM", iso1A3: "FSM", iso1N3: "583", wikidata: "Q702", nameEn: "Federated States of Micronesia", groups: ["057", "009", "UN"], roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["691"] }, geometry: { type: "MultiPolygon", coordinates: [[[[138.20583, 13.3783], [136.27107, 6.73747], [156.88247, -1.39237], [165.19726, 6.22546], [138.20583, 13.3783]]]] } },
+ { type: "Feature", properties: { iso1A2: "FO", iso1A3: "FRO", iso1N3: "234", wikidata: "Q4628", nameEn: "Faroe Islands", country: "DK", groups: ["154", "150", "UN"], callingCodes: ["298"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-8.51774, 62.35338], [-6.51083, 60.95272], [-5.70102, 62.77194], [-8.51774, 62.35338]]]] } },
+ { type: "Feature", properties: { iso1A2: "FR", iso1A3: "FRA", iso1N3: "250", wikidata: "Q142", nameEn: "France" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "FX", iso1A3: "FXX", iso1N3: "249", wikidata: "Q212429", nameEn: "Metropolitan France", country: "FR", groups: ["EU", "155", "150", "UN"], isoStatus: "excRes", callingCodes: ["33"] }, geometry: { type: "MultiPolygon", coordinates: [[[[2.55904, 51.07014], [2.18458, 51.52087], [1.17405, 50.74239], [-2.02963, 49.91866], [-2.09454, 49.46288], [-1.83944, 49.23037], [-2.00491, 48.86706], [-2.65349, 49.15373], [-6.28985, 48.93406], [-1.81005, 43.59738], [-1.77289, 43.38957], [-1.79319, 43.37497], [-1.78332, 43.36399], [-1.78714, 43.35476], [-1.77068, 43.34396], [-1.75334, 43.34107], [-1.75079, 43.3317], [-1.7397, 43.32979], [-1.73074, 43.29481], [-1.69407, 43.31378], [-1.62481, 43.30726], [-1.63052, 43.28591], [-1.61341, 43.25269], [-1.57674, 43.25269], [-1.55963, 43.28828], [-1.50992, 43.29481], [-1.45289, 43.27049], [-1.40942, 43.27272], [-1.3758, 43.24511], [-1.41562, 43.12815], [-1.47555, 43.08372], [-1.44067, 43.047], [-1.35272, 43.02658], [-1.34419, 43.09665], [-1.32209, 43.1127], [-1.27118, 43.11961], [-1.30052, 43.09581], [-1.30531, 43.06859], [-1.25244, 43.04164], [-1.22881, 43.05534], [-1.10333, 43.0059], [-1.00963, 42.99279], [-0.97133, 42.96239], [-0.81652, 42.95166], [-0.75478, 42.96916], [-0.72037, 42.92541], [-0.73422, 42.91228], [-0.72608, 42.89318], [-0.69837, 42.87945], [-0.67637, 42.88303], [-0.55497, 42.77846], [-0.50863, 42.82713], [-0.44334, 42.79939], [-0.41319, 42.80776], [-0.38833, 42.80132], [-0.3122, 42.84788], [-0.17939, 42.78974], [-0.16141, 42.79535], [-0.10519, 42.72761], [-0.02468, 42.68513], [0.17569, 42.73424], [0.25336, 42.7174], [0.29407, 42.67431], [0.36251, 42.72282], [0.40214, 42.69779], [0.67873, 42.69458], [0.65421, 42.75872], [0.66121, 42.84021], [0.711, 42.86372], [0.93089, 42.79154], [0.96166, 42.80629], [0.98292, 42.78754], [1.0804, 42.78569], [1.15928, 42.71407], [1.35562, 42.71944], [1.44197, 42.60217], [1.47986, 42.61346], [1.46718, 42.63296], [1.48043, 42.65203], [1.50867, 42.64483], [1.55418, 42.65669], [1.60085, 42.62703], [1.63485, 42.62957], [1.6625, 42.61982], [1.68267, 42.62533], [1.73452, 42.61515], [1.72588, 42.59098], [1.7858, 42.57698], [1.73683, 42.55492], [1.72515, 42.50338], [1.76335, 42.48863], [1.83037, 42.48395], [1.88853, 42.4501], [1.93663, 42.45439], [1.94292, 42.44316], [1.94061, 42.43333], [1.94084, 42.43039], [1.9574, 42.42401], [1.96482, 42.37787], [2.00488, 42.35399], [2.06241, 42.35906], [2.11621, 42.38393], [2.12789, 42.41291], [2.16599, 42.42314], [2.20578, 42.41633], [2.25551, 42.43757], [2.38504, 42.39977], [2.43299, 42.39423], [2.43508, 42.37568], [2.48457, 42.33933], [2.54382, 42.33406], [2.55516, 42.35351], [2.57934, 42.35808], [2.6747, 42.33974], [2.65311, 42.38771], [2.72056, 42.42298], [2.75497, 42.42578], [2.77464, 42.41046], [2.84335, 42.45724], [2.85675, 42.45444], [2.86983, 42.46843], [2.88413, 42.45938], [2.92107, 42.4573], [2.94283, 42.48174], [2.96518, 42.46692], [3.03734, 42.47363], [3.08167, 42.42748], [3.10027, 42.42621], [3.11379, 42.43646], [3.17156, 42.43545], [3.75438, 42.33445], [7.60802, 41.05927], [10.09675, 41.44089], [9.56115, 43.20816], [7.50102, 43.51859], [7.42422, 43.72209], [7.40903, 43.7296], [7.41113, 43.73156], [7.41291, 43.73168], [7.41298, 43.73311], [7.41233, 43.73439], [7.42062, 43.73977], [7.42299, 43.74176], [7.42443, 43.74087], [7.42809, 43.74396], [7.43013, 43.74895], [7.43624, 43.75014], [7.43708, 43.75197], [7.4389, 43.75151], [7.4379, 43.74963], [7.47823, 43.73341], [7.53006, 43.78405], [7.50423, 43.84345], [7.49355, 43.86551], [7.51162, 43.88301], [7.56075, 43.89932], [7.56858, 43.94506], [7.60771, 43.95772], [7.65266, 43.9763], [7.66848, 43.99943], [7.6597, 44.03009], [7.72508, 44.07578], [7.66878, 44.12795], [7.68694, 44.17487], [7.63245, 44.17877], [7.62155, 44.14881], [7.36364, 44.11882], [7.34547, 44.14359], [7.27827, 44.1462], [7.16929, 44.20352], [7.00764, 44.23736], [6.98221, 44.28289], [6.89171, 44.36637], [6.88784, 44.42043], [6.94504, 44.43112], [6.86233, 44.49834], [6.85507, 44.53072], [6.96042, 44.62129], [6.95133, 44.66264], [7.00582, 44.69364], [7.07484, 44.68073], [7.00401, 44.78782], [7.02217, 44.82519], [6.93499, 44.8664], [6.90774, 44.84322], [6.75518, 44.89915], [6.74519, 44.93661], [6.74791, 45.01939], [6.66981, 45.02324], [6.62803, 45.11175], [6.7697, 45.16044], [6.85144, 45.13226], [6.96706, 45.20841], [7.07074, 45.21228], [7.13115, 45.25386], [7.10572, 45.32924], [7.18019, 45.40071], [7.00037, 45.509], [6.98948, 45.63869], [6.80785, 45.71864], [6.80785, 45.83265], [6.95315, 45.85163], [7.04151, 45.92435], [7.00946, 45.9944], [6.93862, 46.06502], [6.87868, 46.03855], [6.89321, 46.12548], [6.78968, 46.14058], [6.86052, 46.28512], [6.77152, 46.34784], [6.8024, 46.39171], [6.82312, 46.42661], [6.53358, 46.45431], [6.25432, 46.3632], [6.21981, 46.31304], [6.24826, 46.30175], [6.25137, 46.29014], [6.23775, 46.27822], [6.24952, 46.26255], [6.26749, 46.24745], [6.29474, 46.26221], [6.31041, 46.24417], [6.29663, 46.22688], [6.27694, 46.21566], [6.26007, 46.21165], [6.24821, 46.20531], [6.23913, 46.20511], [6.23544, 46.20714], [6.22175, 46.20045], [6.22222, 46.19888], [6.21844, 46.19837], [6.21603, 46.19507], [6.21273, 46.19409], [6.21114, 46.1927], [6.20539, 46.19163], [6.19807, 46.18369], [6.19552, 46.18401], [6.18707, 46.17999], [6.18871, 46.16644], [6.18116, 46.16187], [6.15305, 46.15194], [6.13397, 46.1406], [6.09926, 46.14373], [6.09199, 46.15191], [6.07491, 46.14879], [6.05203, 46.15191], [6.04564, 46.14031], [6.03614, 46.13712], [6.01791, 46.14228], [5.9871, 46.14499], [5.97893, 46.13303], [5.95781, 46.12925], [5.9641, 46.14412], [5.97508, 46.15863], [5.98188, 46.17392], [5.98846, 46.17046], [5.99573, 46.18587], [5.96515, 46.19638], [5.97542, 46.21525], [6.02461, 46.23313], [6.03342, 46.2383], [6.04602, 46.23127], [6.05029, 46.23518], [6.0633, 46.24583], [6.07072, 46.24085], [6.08563, 46.24651], [6.10071, 46.23772], [6.12446, 46.25059], [6.11926, 46.2634], [6.1013, 46.28512], [6.11697, 46.29547], [6.1198, 46.31157], [6.13876, 46.33844], [6.15738, 46.3491], [6.16987, 46.36759], [6.15985, 46.37721], [6.15016, 46.3778], [6.09926, 46.40768], [6.06407, 46.41676], [6.08427, 46.44305], [6.07269, 46.46244], [6.1567, 46.54402], [6.11084, 46.57649], [6.27135, 46.68251], [6.38351, 46.73171], [6.45209, 46.77502], [6.43216, 46.80336], [6.46456, 46.88865], [6.43341, 46.92703], [6.71531, 47.0494], [6.68823, 47.06616], [6.76788, 47.1208], [6.8489, 47.15933], [6.9508, 47.24338], [6.95108, 47.26428], [6.94316, 47.28747], [7.05305, 47.33304], [7.0564, 47.35134], [7.03125, 47.36996], [6.87959, 47.35335], [6.88542, 47.37262], [6.93744, 47.40714], [6.93953, 47.43388], [7.0024, 47.45264], [6.98425, 47.49432], [7.0231, 47.50522], [7.07425, 47.48863], [7.12781, 47.50371], [7.16249, 47.49025], [7.19583, 47.49455], [7.17026, 47.44312], [7.24669, 47.4205], [7.33526, 47.44186], [7.35603, 47.43432], [7.40308, 47.43638], [7.43088, 47.45846], [7.4462, 47.46264], [7.4583, 47.47216], [7.42923, 47.48628], [7.43356, 47.49712], [7.47534, 47.47932], [7.51076, 47.49651], [7.49804, 47.51798], [7.5229, 47.51644], [7.53199, 47.5284], [7.51904, 47.53515], [7.50588, 47.52856], [7.49691, 47.53821], [7.50873, 47.54546], [7.51723, 47.54578], [7.52831, 47.55347], [7.53634, 47.55553], [7.55652, 47.56779], [7.55689, 47.57232], [7.56548, 47.57617], [7.56684, 47.57785], [7.58386, 47.57536], [7.58945, 47.59017], [7.59301, 47.60058], [7.58851, 47.60794], [7.57423, 47.61628], [7.5591, 47.63849], [7.53384, 47.65115], [7.52067, 47.66437], [7.51915, 47.68335], [7.51266, 47.70197], [7.53722, 47.71635], [7.54761, 47.72912], [7.52921, 47.77747], [7.55673, 47.87371], [7.62302, 47.97898], [7.56966, 48.03265], [7.57137, 48.12292], [7.6648, 48.22219], [7.69022, 48.30018], [7.74562, 48.32736], [7.73109, 48.39192], [7.76833, 48.48945], [7.80647, 48.51239], [7.80167, 48.54758], [7.80057, 48.5857], [7.84098, 48.64217], [7.89002, 48.66317], [7.96812, 48.72491], [7.96994, 48.75606], [8.01534, 48.76085], [8.0326, 48.79017], [8.06802, 48.78957], [8.10253, 48.81829], [8.12813, 48.87985], [8.19989, 48.95825], [8.20031, 48.95856], [8.22604, 48.97352], [8.14189, 48.97833], [7.97783, 49.03161], [7.93641, 49.05544], [7.86386, 49.03499], [7.79557, 49.06583], [7.75948, 49.04562], [7.63618, 49.05428], [7.62575, 49.07654], [7.56416, 49.08136], [7.53012, 49.09818], [7.49172, 49.13915], [7.49473, 49.17], [7.44455, 49.16765], [7.44052, 49.18354], [7.3662, 49.17308], [7.35995, 49.14399], [7.3195, 49.14231], [7.29514, 49.11426], [7.23473, 49.12971], [7.1593, 49.1204], [7.1358, 49.1282], [7.12504, 49.14253], [7.10384, 49.13787], [7.10715, 49.15631], [7.07859, 49.15031], [7.09007, 49.13094], [7.07162, 49.1255], [7.06642, 49.11415], [7.05548, 49.11185], [7.04843, 49.11422], [7.04409, 49.12123], [7.04662, 49.13724], [7.03178, 49.15734], [7.0274, 49.17042], [7.03459, 49.19096], [7.01318, 49.19018], [6.97273, 49.2099], [6.95963, 49.203], [6.94028, 49.21641], [6.93831, 49.2223], [6.91875, 49.22261], [6.89298, 49.20863], [6.85939, 49.22376], [6.83555, 49.21249], [6.85119, 49.20038], [6.85016, 49.19354], [6.86225, 49.18185], [6.84703, 49.15734], [6.83385, 49.15162], [6.78265, 49.16793], [6.73765, 49.16375], [6.71137, 49.18808], [6.73256, 49.20486], [6.71843, 49.2208], [6.69274, 49.21661], [6.66583, 49.28065], [6.60186, 49.31055], [6.572, 49.35027], [6.58807, 49.35358], [6.60091, 49.36864], [6.533, 49.40748], [6.55404, 49.42464], [6.42432, 49.47683], [6.40274, 49.46546], [6.39168, 49.4667], [6.38352, 49.46463], [6.36778, 49.46937], [6.3687, 49.4593], [6.28818, 49.48465], [6.27875, 49.503], [6.25029, 49.50609], [6.2409, 49.51408], [6.19543, 49.50536], [6.17386, 49.50934], [6.15366, 49.50226], [6.16115, 49.49297], [6.14321, 49.48796], [6.12814, 49.49365], [6.12346, 49.4735], [6.10325, 49.4707], [6.09845, 49.46351], [6.10072, 49.45268], [6.08373, 49.45594], [6.07887, 49.46399], [6.05553, 49.46663], [6.04176, 49.44801], [6.02743, 49.44845], [6.02648, 49.45451], [5.97693, 49.45513], [5.96876, 49.49053], [5.94224, 49.49608], [5.94128, 49.50034], [5.86571, 49.50015], [5.83389, 49.52152], [5.83467, 49.52717], [5.84466, 49.53027], [5.83648, 49.5425], [5.81664, 49.53775], [5.80871, 49.5425], [5.81838, 49.54777], [5.79195, 49.55228], [5.77435, 49.56298], [5.7577, 49.55915], [5.75649, 49.54321], [5.64505, 49.55146], [5.60909, 49.51228], [5.55001, 49.52729], [5.46541, 49.49825], [5.46734, 49.52648], [5.43713, 49.5707], [5.3974, 49.61596], [5.34837, 49.62889], [5.33851, 49.61599], [5.3137, 49.61225], [5.30214, 49.63055], [5.33039, 49.6555], [5.31465, 49.66846], [5.26232, 49.69456], [5.14545, 49.70287], [5.09249, 49.76193], [4.96714, 49.79872], [4.85464, 49.78995], [4.86965, 49.82271], [4.85134, 49.86457], [4.88529, 49.9236], [4.78827, 49.95609], [4.8382, 50.06738], [4.88602, 50.15182], [4.83279, 50.15331], [4.82438, 50.16878], [4.75237, 50.11314], [4.70064, 50.09384], [4.68695, 49.99685], [4.5414, 49.96911], [4.51098, 49.94659], [4.43488, 49.94122], [4.35051, 49.95315], [4.31963, 49.97043], [4.20532, 49.95803], [4.14239, 49.98034], [4.13508, 50.01976], [4.16294, 50.04719], [4.23101, 50.06945], [4.20147, 50.13535], [4.13561, 50.13078], [4.16014, 50.19239], [4.15524, 50.21103], [4.21945, 50.25539], [4.20651, 50.27333], [4.17861, 50.27443], [4.17347, 50.28838], [4.15524, 50.2833], [4.16808, 50.25786], [4.13665, 50.25609], [4.11954, 50.30425], [4.10957, 50.30234], [4.10237, 50.31247], [4.0689, 50.3254], [4.0268, 50.35793], [3.96771, 50.34989], [3.90781, 50.32814], [3.84314, 50.35219], [3.73911, 50.34809], [3.70987, 50.3191], [3.71009, 50.30305], [3.66976, 50.34563], [3.65709, 50.36873], [3.67262, 50.38663], [3.67494, 50.40239], [3.66153, 50.45165], [3.64426, 50.46275], [3.61014, 50.49568], [3.58361, 50.49049], [3.5683, 50.50192], [3.49509, 50.48885], [3.51564, 50.5256], [3.47385, 50.53397], [3.44629, 50.51009], [3.37693, 50.49538], [3.28575, 50.52724], [3.2729, 50.60718], [3.23951, 50.6585], [3.264, 50.67668], [3.2536, 50.68977], [3.26141, 50.69151], [3.26063, 50.70086], [3.24593, 50.71389], [3.22042, 50.71019], [3.20845, 50.71662], [3.19017, 50.72569], [3.20064, 50.73547], [3.18811, 50.74025], [3.18339, 50.74981], [3.16476, 50.76843], [3.15017, 50.79031], [3.1257, 50.78603], [3.11987, 50.79188], [3.11206, 50.79416], [3.10614, 50.78303], [3.09163, 50.77717], [3.04314, 50.77674], [3.00537, 50.76588], [2.96778, 50.75242], [2.95019, 50.75138], [2.90873, 50.702], [2.91036, 50.6939], [2.90069, 50.69263], [2.88504, 50.70656], [2.87937, 50.70298], [2.86985, 50.7033], [2.8483, 50.72276], [2.81056, 50.71773], [2.71165, 50.81295], [2.63331, 50.81457], [2.59093, 50.91751], [2.63074, 50.94746], [2.57551, 51.00326], [2.55904, 51.07014]], [[1.99838, 42.44682], [1.98378, 42.44697], [1.96125, 42.45364], [1.95606, 42.45785], [1.96215, 42.47854], [1.97003, 42.48081], [1.97227, 42.48487], [1.97697, 42.48568], [1.98022, 42.49569], [1.98916, 42.49351], [1.99766, 42.4858], [1.98579, 42.47486], [1.99216, 42.46208], [2.01564, 42.45171], [1.99838, 42.44682]]]] } },
+ { type: "Feature", properties: { iso1A2: "GA", iso1A3: "GAB", iso1N3: "266", wikidata: "Q1000", nameEn: "Gabon", groups: ["017", "202", "002", "UN"], callingCodes: ["241"] }, geometry: { type: "MultiPolygon", coordinates: [[[[13.29457, 2.16106], [13.28534, 2.25716], [11.37116, 2.29975], [11.3561, 2.17217], [11.35307, 1.00251], [9.79648, 1.0019], [9.75065, 1.06753], [9.66433, 1.06723], [7.24416, -0.64092], [10.75913, -4.39519], [11.12647, -3.94169], [11.22301, -3.69888], [11.48764, -3.51089], [11.57949, -3.52798], [11.68608, -3.68942], [11.87083, -3.71571], [11.92719, -3.62768], [11.8318, -3.5812], [11.96554, -3.30267], [11.70227, -3.17465], [11.70558, -3.0773], [11.80365, -3.00424], [11.64798, -2.81146], [11.5359, -2.85654], [11.64487, -2.61865], [11.57637, -2.33379], [11.74605, -2.39936], [11.96866, -2.33559], [12.04895, -2.41704], [12.47925, -2.32626], [12.44656, -1.92025], [12.61312, -1.8129], [12.82172, -1.91091], [13.02759, -2.33098], [13.47977, -2.43224], [13.75884, -2.09293], [13.92073, -2.35581], [13.85846, -2.46935], [14.10442, -2.49268], [14.23829, -2.33715], [14.16202, -2.23916], [14.23518, -2.15671], [14.25932, -1.97624], [14.41838, -1.89412], [14.52569, -0.57818], [14.41887, -0.44799], [14.2165, -0.38261], [14.06862, -0.20826], [13.90632, -0.2287], [13.88648, 0.26652], [14.10909, 0.58563], [14.26066, 0.57255], [14.48179, 0.9152], [14.25186, 1.39842], [13.89582, 1.4261], [13.15519, 1.23368], [13.25447, 1.32339], [13.13461, 1.57238], [13.29457, 2.16106]]]] } },
+ { type: "Feature", properties: { iso1A2: "GB", iso1A3: "GBR", iso1N3: "826", wikidata: "Q145", ccTLD: ".uk", nameEn: "United Kingdom", aliases: ["UK"] }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "GD", iso1A3: "GRD", iso1N3: "308", wikidata: "Q769", nameEn: "Grenada", aliases: ["WG"], groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 473"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-62.64026, 12.69984], [-61.77886, 11.36496], [-59.94058, 12.34011], [-62.64026, 12.69984]]]] } },
+ { type: "Feature", properties: { iso1A2: "GE", iso1A3: "GEO", iso1N3: "268", wikidata: "Q230", nameEn: "Georgia", groups: ["145", "142", "UN"], callingCodes: ["995"] }, geometry: { type: "MultiPolygon", coordinates: [[[[46.42738, 41.91323], [45.61676, 42.20768], [45.78692, 42.48358], [45.36501, 42.55268], [45.15318, 42.70598], [44.88754, 42.74934], [44.80941, 42.61277], [44.70002, 42.74679], [44.54202, 42.75699], [43.95517, 42.55396], [43.73119, 42.62043], [43.81453, 42.74297], [43.0419, 43.02413], [43.03322, 43.08883], [42.75889, 43.19651], [42.66667, 43.13917], [42.40563, 43.23226], [41.64935, 43.22331], [40.65957, 43.56212], [40.10657, 43.57344], [40.04445, 43.47776], [40.03312, 43.44262], [40.01007, 43.42411], [40.01552, 43.42025], [40.00853, 43.40578], [40.0078, 43.38551], [39.81147, 43.06294], [40.89217, 41.72528], [41.54366, 41.52185], [41.7148, 41.4932], [41.7124, 41.47417], [41.81939, 41.43621], [41.95134, 41.52466], [42.26387, 41.49346], [42.51772, 41.43606], [42.59202, 41.58183], [42.72794, 41.59714], [42.84471, 41.58912], [42.78995, 41.50126], [42.84899, 41.47265], [42.8785, 41.50516], [43.02956, 41.37891], [43.21707, 41.30331], [43.13373, 41.25503], [43.1945, 41.25242], [43.23096, 41.17536], [43.36118, 41.2028], [43.44973, 41.17666], [43.4717, 41.12611], [43.67712, 41.13398], [43.74717, 41.1117], [43.84835, 41.16329], [44.16591, 41.19141], [44.18148, 41.24644], [44.32139, 41.2079], [44.34337, 41.20312], [44.34417, 41.2382], [44.46791, 41.18204], [44.59322, 41.1933], [44.61462, 41.24018], [44.72814, 41.20338], [44.82084, 41.21513], [44.87887, 41.20195], [44.89911, 41.21366], [44.84358, 41.23088], [44.81749, 41.23488], [44.80053, 41.25949], [44.81437, 41.30371], [44.93493, 41.25685], [45.0133, 41.29747], [45.09867, 41.34065], [45.1797, 41.42231], [45.26285, 41.46433], [45.31352, 41.47168], [45.4006, 41.42402], [45.45973, 41.45898], [45.68389, 41.3539], [45.71035, 41.36208], [45.75705, 41.35157], [45.69946, 41.29545], [45.80842, 41.2229], [45.95786, 41.17956], [46.13221, 41.19479], [46.27698, 41.19011], [46.37661, 41.10805], [46.456, 41.09984], [46.48558, 41.0576], [46.55096, 41.1104], [46.63969, 41.09515], [46.66148, 41.20533], [46.72375, 41.28609], [46.63658, 41.37727], [46.4669, 41.43331], [46.40307, 41.48464], [46.33925, 41.4963], [46.29794, 41.5724], [46.34126, 41.57454], [46.34039, 41.5947], [46.3253, 41.60912], [46.28182, 41.60089], [46.26531, 41.63339], [46.24429, 41.59883], [46.19759, 41.62327], [46.17891, 41.72094], [46.20538, 41.77205], [46.23962, 41.75811], [46.30863, 41.79133], [46.3984, 41.84399], [46.42738, 41.91323]]]] } },
+ { type: "Feature", properties: { iso1A2: "GF", iso1A3: "GUF", iso1N3: "254", wikidata: "Q3769", nameEn: "French Guiana", country: "FR", groups: ["Q3320166", "EU", "005", "419", "019", "UN"], callingCodes: ["594"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-51.35485, 4.8383], [-53.7094, 6.2264], [-54.01074, 5.68785], [-54.01877, 5.52789], [-54.26916, 5.26909], [-54.4717, 4.91964], [-54.38444, 4.13222], [-54.19367, 3.84387], [-54.05128, 3.63557], [-53.98914, 3.627], [-53.9849, 3.58697], [-54.28534, 2.67798], [-54.42864, 2.42442], [-54.6084, 2.32856], [-54.16286, 2.10779], [-53.78743, 2.34412], [-52.96539, 2.1881], [-52.6906, 2.37298], [-52.31787, 3.17896], [-51.85573, 3.83427], [-51.82312, 3.85825], [-51.79599, 3.89336], [-51.61983, 4.14596], [-51.63798, 4.51394], [-51.35485, 4.8383]]]] } },
+ { type: "Feature", properties: { iso1A2: "GG", iso1A3: "GGY", iso1N3: "831", wikidata: "Q25230", nameEn: "Bailiwick of Guernsey", country: "GB" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "GH", iso1A3: "GHA", iso1N3: "288", wikidata: "Q117", nameEn: "Ghana", groups: ["011", "202", "002", "UN"], callingCodes: ["233"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-0.13493, 11.14075], [-0.27374, 11.17157], [-0.28566, 11.12713], [-0.35955, 11.07801], [-0.38219, 11.12596], [-0.42391, 11.11661], [-0.44298, 11.04292], [-0.61937, 10.91305], [-0.67143, 10.99811], [-2.83373, 11.0067], [-2.94232, 10.64281], [-2.83108, 10.40252], [-2.74174, 9.83172], [-2.76534, 9.56589], [-2.68802, 9.49343], [-2.69814, 9.22717], [-2.77799, 9.04949], [-2.66357, 9.01771], [-2.58243, 8.7789], [-2.49037, 8.20872], [-2.62901, 8.11495], [-2.61232, 8.02645], [-2.67787, 8.02055], [-2.74819, 7.92613], [-2.78395, 7.94974], [-2.79467, 7.86002], [-2.92339, 7.60847], [-2.97822, 7.27165], [-2.95438, 7.23737], [-3.23327, 6.81744], [-3.21954, 6.74407], [-3.25999, 6.62521], [-3.01896, 5.71697], [-2.95323, 5.71865], [-2.96671, 5.6415], [-2.93132, 5.62137], [-2.85378, 5.65156], [-2.76614, 5.60963], [-2.72737, 5.34789], [-2.77625, 5.34621], [-2.73074, 5.1364], [-2.75502, 5.10657], [-2.95261, 5.12477], [-2.96554, 5.10397], [-3.063, 5.13665], [-3.11073, 5.12675], [-3.10675, 5.08515], [-3.34019, 4.17519], [1.07031, 5.15655], [1.27574, 5.93551], [1.19771, 6.11522], [1.19966, 6.17069], [1.09187, 6.17074], [1.05969, 6.22998], [1.03108, 6.24064], [0.99652, 6.33779], [0.89283, 6.33779], [0.71048, 6.53083], [0.74862, 6.56517], [0.63659, 6.63857], [0.6497, 6.73682], [0.58176, 6.76049], [0.57406, 6.80348], [0.52853, 6.82921], [0.56508, 6.92971], [0.52098, 6.94391], [0.52217, 6.9723], [0.59606, 7.01252], [0.65327, 7.31643], [0.62943, 7.41099], [0.57223, 7.39326], [0.52455, 7.45354], [0.51979, 7.58706], [0.58295, 7.62368], [0.62943, 7.85751], [0.58891, 8.12779], [0.6056, 8.13959], [0.61156, 8.18324], [0.5913, 8.19622], [0.63897, 8.25873], [0.73432, 8.29529], [0.64731, 8.48866], [0.47211, 8.59945], [0.37319, 8.75262], [0.52455, 8.87746], [0.45424, 9.04581], [0.56388, 9.40697], [0.49118, 9.48339], [0.36485, 9.49749], [0.33148, 9.44812], [0.25758, 9.42696], [0.2254, 9.47869], [0.31241, 9.50337], [0.30406, 9.521], [0.2409, 9.52335], [0.23851, 9.57389], [0.38153, 9.58682], [0.36008, 9.6256], [0.29334, 9.59387], [0.26712, 9.66437], [0.28261, 9.69022], [0.32313, 9.6491], [0.34816, 9.66907], [0.34816, 9.71607], [0.32075, 9.72781], [0.36366, 10.03309], [0.41252, 10.02018], [0.41371, 10.06361], [0.35293, 10.09412], [0.39584, 10.31112], [0.33028, 10.30408], [0.29453, 10.41546], [0.18846, 10.4096], [0.12886, 10.53149], [-0.05945, 10.63458], [-0.09141, 10.7147], [-0.07327, 10.71845], [-0.07183, 10.76794], [-0.0228, 10.81916], [-0.02685, 10.8783], [-908e-5, 10.91644], [-63e-4, 10.96417], [0.03355, 10.9807], [0.02395, 11.06229], [342e-5, 11.08317], [-514e-5, 11.10763], [-0.0275, 11.11202], [-0.05733, 11.08628], [-0.14462, 11.10811], [-0.13493, 11.14075]]]] } },
+ { type: "Feature", properties: { iso1A2: "GI", iso1A3: "GIB", iso1N3: "292", wikidata: "Q1410", nameEn: "Gibraltar", country: "GB", groups: ["Q12837", "BOTS", "039", "150", "UN"], callingCodes: ["350"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-5.34064, 36.03744], [-5.27801, 36.14942], [-5.33822, 36.15272], [-5.34536, 36.15501], [-5.40526, 36.15488], [-5.34064, 36.03744]]]] } },
+ { type: "Feature", properties: { iso1A2: "GL", iso1A3: "GRL", iso1N3: "304", wikidata: "Q223", nameEn: "Greenland", country: "DK", groups: ["Q1451600", "021", "003", "019", "UN"], callingCodes: ["299"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-49.33696, 84.57952], [-68.21821, 80.48551], [-77.52957, 77.23408], [-46.37635, 57.3249], [-9.68082, 72.73731], [-5.7106, 84.28058], [-49.33696, 84.57952]]]] } },
+ { type: "Feature", properties: { iso1A2: "GM", iso1A3: "GMB", iso1N3: "270", wikidata: "Q1005", nameEn: "The Gambia", groups: ["011", "202", "002", "UN"], callingCodes: ["220"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-15.14917, 13.57989], [-14.36795, 13.23033], [-13.79409, 13.34472], [-13.8955, 13.59126], [-14.34721, 13.46578], [-14.93719, 13.80173], [-15.36504, 13.79313], [-15.47902, 13.58758], [-17.43598, 13.59273], [-17.43966, 13.04579], [-16.74676, 13.06025], [-16.69343, 13.16791], [-15.80355, 13.16729], [-15.80478, 13.34832], [-15.26908, 13.37768], [-15.14917, 13.57989]]]] } },
+ { type: "Feature", properties: { iso1A2: "GN", iso1A3: "GIN", iso1N3: "324", wikidata: "Q1006", nameEn: "Guinea", groups: ["011", "202", "002", "UN"], callingCodes: ["224"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-11.37536, 12.40788], [-11.46267, 12.44559], [-11.91331, 12.42008], [-12.35415, 12.32758], [-12.87336, 12.51892], [-13.06603, 12.49342], [-13.05296, 12.64003], [-13.70523, 12.68013], [-13.7039, 12.60313], [-13.65089, 12.49515], [-13.64168, 12.42764], [-13.70851, 12.24978], [-13.92745, 12.24077], [-13.94589, 12.16869], [-13.7039, 12.00869], [-13.7039, 11.70195], [-14.09799, 11.63649], [-14.26623, 11.67486], [-14.31513, 11.60713], [-14.51173, 11.49708], [-14.66677, 11.51188], [-14.77786, 11.36323], [-14.95993, 10.99244], [-15.07174, 10.89557], [-15.96748, 10.162], [-14.36218, 8.64107], [-13.29911, 9.04245], [-13.18586, 9.0925], [-13.08953, 9.0409], [-12.94095, 9.26335], [-12.76788, 9.3133], [-12.47254, 9.86834], [-12.24262, 9.92386], [-12.12634, 9.87203], [-11.91023, 9.93927], [-11.89624, 9.99763], [-11.2118, 10.00098], [-10.6534, 9.29919], [-10.74484, 9.07998], [-10.5783, 9.06386], [-10.56197, 8.81225], [-10.47707, 8.67669], [-10.61422, 8.5314], [-10.70565, 8.29235], [-10.63934, 8.35326], [-10.54891, 8.31174], [-10.37257, 8.48941], [-10.27575, 8.48711], [-10.203, 8.47991], [-10.14579, 8.52665], [-10.05375, 8.50697], [-10.05873, 8.42578], [-9.77763, 8.54633], [-9.47415, 8.35195], [-9.50898, 8.18455], [-9.41445, 8.02448], [-9.44928, 7.9284], [-9.35724, 7.74111], [-9.37465, 7.62032], [-9.48161, 7.37122], [-9.41943, 7.41809], [-9.305, 7.42056], [-9.20798, 7.38109], [-9.18311, 7.30461], [-9.09107, 7.1985], [-8.93435, 7.2824], [-8.85724, 7.26019], [-8.8448, 7.35149], [-8.72789, 7.51429], [-8.67814, 7.69428], [-8.55874, 7.70167], [-8.55874, 7.62525], [-8.47114, 7.55676], [-8.4003, 7.6285], [-8.21374, 7.54466], [-8.09931, 7.78626], [-8.13414, 7.87991], [-8.06449, 8.04989], [-7.94695, 8.00925], [-7.99919, 8.11023], [-7.98675, 8.20134], [-8.062, 8.16071], [-8.2411, 8.24196], [-8.22991, 8.48438], [-7.92518, 8.50652], [-7.65653, 8.36873], [-7.69882, 8.66148], [-7.95503, 8.81146], [-7.92518, 8.99332], [-7.73862, 9.08422], [-7.90777, 9.20456], [-7.85056, 9.41812], [-8.03463, 9.39604], [-8.14657, 9.55062], [-8.09434, 9.86936], [-8.15652, 9.94288], [-8.11921, 10.04577], [-8.01225, 10.1021], [-7.97971, 10.17117], [-7.9578, 10.2703], [-8.10207, 10.44649], [-8.22711, 10.41722], [-8.32614, 10.69273], [-8.2667, 10.91762], [-8.35083, 11.06234], [-8.66923, 10.99397], [-8.40058, 11.37466], [-8.80854, 11.66715], [-8.94784, 12.34842], [-9.13689, 12.50875], [-9.38067, 12.48446], [-9.32097, 12.29009], [-9.63938, 12.18312], [-9.714, 12.0226], [-10.30604, 12.24634], [-10.71897, 11.91552], [-10.80355, 12.1053], [-10.99758, 12.24634], [-11.24136, 12.01286], [-11.50006, 12.17826], [-11.37536, 12.40788]]]] } },
+ { type: "Feature", properties: { iso1A2: "GP", iso1A3: "GLP", iso1N3: "312", wikidata: "Q17012", nameEn: "Guadeloupe", country: "FR", groups: ["Q3320166", "EU", "029", "003", "419", "019", "UN"], callingCodes: ["590"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-60.03183, 16.1129], [-61.60296, 16.73066], [-63.00549, 15.26166], [-60.03183, 16.1129]]]] } },
+ { type: "Feature", properties: { iso1A2: "GQ", iso1A3: "GNQ", iso1N3: "226", wikidata: "Q983", nameEn: "Equatorial Guinea", groups: ["017", "202", "002", "UN"], callingCodes: ["240"] }, geometry: { type: "MultiPolygon", coordinates: [[[[9.22018, 3.72052], [8.34397, 4.30689], [7.71762, 0.6674], [3.35016, -3.29031], [9.66433, 1.06723], [9.75065, 1.06753], [9.79648, 1.0019], [11.35307, 1.00251], [11.3561, 2.17217], [9.991, 2.16561], [9.90749, 2.20049], [9.89012, 2.20457], [9.84716, 2.24676], [9.83238, 2.29079], [9.83754, 2.32428], [9.82123, 2.35097], [9.81162, 2.33797], [9.22018, 3.72052]]]] } },
+ { type: "Feature", properties: { iso1A2: "GR", iso1A3: "GRC", iso1N3: "300", wikidata: "Q41", nameEn: "Greece", aliases: ["EL"], groups: ["EU", "039", "150", "UN"], callingCodes: ["30"] }, geometry: { type: "MultiPolygon", coordinates: [[[[26.03489, 40.73051], [26.0754, 40.72772], [26.08638, 40.73214], [26.12495, 40.74283], [26.12854, 40.77339], [26.15685, 40.80709], [26.21351, 40.83298], [26.20856, 40.86048], [26.26169, 40.9168], [26.29441, 40.89119], [26.28623, 40.93005], [26.32259, 40.94042], [26.35894, 40.94292], [26.33297, 40.98388], [26.3606, 41.02027], [26.31928, 41.07386], [26.32259, 41.24929], [26.39861, 41.25053], [26.5209, 41.33993], [26.5837, 41.32131], [26.62997, 41.34613], [26.61767, 41.42281], [26.59742, 41.48058], [26.59196, 41.60491], [26.5209, 41.62592], [26.47958, 41.67037], [26.35957, 41.71149], [26.30255, 41.70925], [26.2654, 41.71544], [26.22888, 41.74139], [26.21325, 41.73223], [26.16841, 41.74858], [26.06148, 41.70345], [26.07083, 41.64584], [26.15146, 41.60828], [26.14328, 41.55496], [26.17951, 41.55409], [26.176, 41.50072], [26.14796, 41.47533], [26.20288, 41.43943], [26.16548, 41.42278], [26.12926, 41.35878], [25.87919, 41.30526], [25.8266, 41.34563], [25.70507, 41.29209], [25.66183, 41.31316], [25.61042, 41.30614], [25.55082, 41.31667], [25.52394, 41.2798], [25.48187, 41.28506], [25.28322, 41.23411], [25.11611, 41.34212], [24.942, 41.38685], [24.90928, 41.40876], [24.86136, 41.39298], [24.82514, 41.4035], [24.8041, 41.34913], [24.71529, 41.41928], [24.61129, 41.42278], [24.52599, 41.56808], [24.30513, 41.51297], [24.27124, 41.57682], [24.18126, 41.51735], [24.10063, 41.54796], [24.06323, 41.53222], [24.06908, 41.46132], [23.96975, 41.44118], [23.91483, 41.47971], [23.89613, 41.45257], [23.80148, 41.43943], [23.76525, 41.40175], [23.67644, 41.41139], [23.63203, 41.37632], [23.52453, 41.40262], [23.40416, 41.39999], [23.33639, 41.36317], [23.31301, 41.40525], [23.22771, 41.37106], [23.21953, 41.33773], [23.1833, 41.31755], [22.93334, 41.34104], [22.81199, 41.3398], [22.76408, 41.32225], [22.74538, 41.16321], [22.71266, 41.13945], [22.65306, 41.18168], [22.62852, 41.14385], [22.58295, 41.11568], [22.5549, 41.13065], [22.42285, 41.11921], [22.26744, 41.16409], [22.17629, 41.15969], [22.1424, 41.12449], [22.06527, 41.15617], [21.90869, 41.09191], [21.91102, 41.04786], [21.7556, 40.92525], [21.69601, 40.9429], [21.57448, 40.86076], [21.53007, 40.90759], [21.41555, 40.9173], [21.35595, 40.87578], [21.25779, 40.86165], [21.21105, 40.8855], [21.15262, 40.85546], [20.97887, 40.85475], [20.98396, 40.79109], [20.95752, 40.76982], [20.98134, 40.76046], [21.05833, 40.66586], [21.03932, 40.56299], [20.96908, 40.51526], [20.94925, 40.46625], [20.83688, 40.47882], [20.7906, 40.42726], [20.78234, 40.35803], [20.71789, 40.27739], [20.67162, 40.09433], [20.62566, 40.0897], [20.61081, 40.07866], [20.55593, 40.06524], [20.51297, 40.08168], [20.48487, 40.06271], [20.42373, 40.06777], [20.37911, 39.99058], [20.31135, 39.99438], [20.41546, 39.82832], [20.41475, 39.81437], [20.38572, 39.78516], [20.30804, 39.81563], [20.29152, 39.80421], [20.31961, 39.72799], [20.27412, 39.69884], [20.22707, 39.67459], [20.22376, 39.64532], [20.15988, 39.652], [20.12956, 39.65805], [20.05189, 39.69112], [20.00957, 39.69227], [19.98042, 39.6504], [19.92466, 39.69533], [19.97622, 39.78684], [19.95905, 39.82857], [19.0384, 40.35325], [19.20409, 39.7532], [22.5213, 33.45682], [29.73302, 35.92555], [29.69611, 36.10365], [29.61805, 36.14179], [29.61002, 36.1731], [29.48192, 36.18377], [29.30783, 36.01033], [28.23708, 36.56812], [27.95037, 36.46155], [27.89482, 36.69898], [27.46117, 36.53789], [27.24613, 36.71622], [27.45627, 36.9008], [27.20312, 36.94571], [27.14757, 37.32], [26.95583, 37.64989], [26.99377, 37.69034], [27.16428, 37.72343], [27.05537, 37.9131], [26.21136, 38.17558], [26.24183, 38.44695], [26.32173, 38.48731], [26.21136, 38.65436], [26.61814, 38.81372], [26.70773, 39.0312], [26.43357, 39.43096], [25.94257, 39.39358], [25.61285, 40.17161], [26.04292, 40.3958], [25.94795, 40.72797], [26.03489, 40.73051]]]] } },
+ { type: "Feature", properties: { iso1A2: "GS", iso1A3: "SGS", iso1N3: "239", wikidata: "Q35086", nameEn: "South Georgia and South Sandwich Islands", country: "GB", groups: ["BOTS", "005", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["500"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-35.26394, -43.68272], [-53.39656, -59.87088], [-22.31757, -59.85974], [-35.26394, -43.68272]]]] } },
+ { type: "Feature", properties: { iso1A2: "GT", iso1A3: "GTM", iso1N3: "320", wikidata: "Q774", nameEn: "Guatemala", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["502"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-89.14985, 17.81563], [-90.98678, 17.81655], [-90.99199, 17.25192], [-91.43809, 17.25373], [-91.04436, 16.92175], [-90.69064, 16.70697], [-90.61212, 16.49832], [-90.40499, 16.40524], [-90.44567, 16.07573], [-91.73182, 16.07371], [-92.20983, 15.26077], [-92.0621, 15.07406], [-92.1454, 14.98143], [-92.1423, 14.88647], [-92.18161, 14.84147], [-92.1454, 14.6804], [-92.2261, 14.53423], [-92.37213, 14.39277], [-90.55276, 12.8866], [-90.11344, 13.73679], [-90.10505, 13.85104], [-89.88937, 14.0396], [-89.81807, 14.07073], [-89.76103, 14.02923], [-89.73251, 14.04133], [-89.75569, 14.07073], [-89.70756, 14.1537], [-89.61844, 14.21937], [-89.52397, 14.22628], [-89.50614, 14.26084], [-89.58814, 14.33165], [-89.57441, 14.41637], [-89.39028, 14.44561], [-89.34776, 14.43013], [-89.35189, 14.47553], [-89.23719, 14.58046], [-89.15653, 14.57802], [-89.13132, 14.71582], [-89.23467, 14.85596], [-89.15149, 14.97775], [-89.18048, 14.99967], [-89.15149, 15.07392], [-88.97343, 15.14039], [-88.32467, 15.63665], [-88.31459, 15.66942], [-88.24022, 15.69247], [-88.22552, 15.72294], [-88.20359, 16.03858], [-88.40779, 16.09624], [-88.95358, 15.88698], [-89.02415, 15.9063], [-89.17418, 15.90898], [-89.22683, 15.88619], [-89.15025, 17.04813], [-89.14985, 17.81563]]]] } },
+ { type: "Feature", properties: { iso1A2: "GU", iso1A3: "GUM", iso1N3: "316", wikidata: "Q16635", nameEn: "Guam", aliases: ["US-GU"], country: "US", groups: ["Q1352230", "Q153732", "057", "009", "UN"], roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 671"] }, geometry: { type: "MultiPolygon", coordinates: [[[[146.25931, 13.85876], [143.82485, 13.92273], [144.61642, 12.82462], [146.25931, 13.85876]]]] } },
+ { type: "Feature", properties: { iso1A2: "GW", iso1A3: "GNB", iso1N3: "624", wikidata: "Q1007", nameEn: "Guinea-Bissau", groups: ["011", "202", "002", "UN"], callingCodes: ["245"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-14.31513, 11.60713], [-14.26623, 11.67486], [-14.09799, 11.63649], [-13.7039, 11.70195], [-13.7039, 12.00869], [-13.94589, 12.16869], [-13.92745, 12.24077], [-13.70851, 12.24978], [-13.64168, 12.42764], [-13.65089, 12.49515], [-13.7039, 12.60313], [-13.70523, 12.68013], [-15.17582, 12.6847], [-15.67302, 12.42974], [-16.20591, 12.46157], [-16.38191, 12.36449], [-16.70562, 12.34803], [-17.4623, 11.92379], [-15.96748, 10.162], [-15.07174, 10.89557], [-14.95993, 10.99244], [-14.77786, 11.36323], [-14.66677, 11.51188], [-14.51173, 11.49708], [-14.31513, 11.60713]]]] } },
+ { type: "Feature", properties: { iso1A2: "GY", iso1A3: "GUY", iso1N3: "328", wikidata: "Q734", nameEn: "Guyana", groups: ["005", "419", "019", "UN"], driveSide: "left", callingCodes: ["592"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-56.84822, 6.73257], [-59.54058, 8.6862], [-59.98508, 8.53046], [-59.85562, 8.35213], [-59.80661, 8.28906], [-59.83156, 8.23261], [-59.97059, 8.20791], [-60.02407, 8.04557], [-60.38056, 7.8302], [-60.51959, 7.83373], [-60.64793, 7.56877], [-60.71923, 7.55817], [-60.59802, 7.33194], [-60.63367, 7.25061], [-60.54098, 7.14804], [-60.44116, 7.20817], [-60.28074, 7.1162], [-60.39419, 6.94847], [-60.54873, 6.8631], [-61.13632, 6.70922], [-61.20762, 6.58174], [-61.15058, 6.19558], [-61.4041, 5.95304], [-60.73204, 5.20931], [-60.32352, 5.21299], [-60.20944, 5.28754], [-59.98129, 5.07097], [-60.04189, 4.69801], [-60.15953, 4.53456], [-59.78878, 4.45637], [-59.69361, 4.34069], [-59.73353, 4.20399], [-59.51963, 3.91951], [-59.86899, 3.57089], [-59.79769, 3.37162], [-59.99733, 2.92312], [-59.91177, 2.36759], [-59.7264, 2.27497], [-59.74066, 1.87596], [-59.25583, 1.40559], [-58.92072, 1.31293], [-58.84229, 1.17749], [-58.53571, 1.29154], [-58.4858, 1.48399], [-58.33887, 1.58014], [-58.01873, 1.51966], [-57.97336, 1.64566], [-57.77281, 1.73344], [-57.55743, 1.69605], [-57.35073, 1.98327], [-57.23981, 1.95808], [-57.09109, 2.01854], [-57.07092, 1.95304], [-56.7659, 1.89509], [-56.47045, 1.95135], [-56.55439, 2.02003], [-56.70519, 2.02964], [-57.35891, 3.32121], [-58.0307, 3.95513], [-57.8699, 4.89394], [-57.37442, 5.0208], [-57.22536, 5.15605], [-57.31629, 5.33714], [-56.84822, 6.73257]]]] } },
+ { type: "Feature", properties: { iso1A2: "HK", iso1A3: "HKG", iso1N3: "344", wikidata: "Q8646", nameEn: "Hong Kong", country: "CN", groups: ["030", "142", "UN"], driveSide: "left", callingCodes: ["852"] }, geometry: { type: "MultiPolygon", coordinates: [[[[113.92195, 22.13873], [114.50148, 22.15017], [114.44998, 22.55977], [114.25154, 22.55977], [114.22888, 22.5436], [114.22185, 22.55343], [114.20655, 22.55706], [114.18338, 22.55444], [114.17247, 22.55944], [114.1597, 22.56041], [114.15123, 22.55163], [114.1482, 22.54091], [114.13823, 22.54319], [114.12665, 22.54003], [114.11656, 22.53415], [114.11181, 22.52878], [114.1034, 22.5352], [114.09692, 22.53435], [114.09048, 22.53716], [114.08606, 22.53276], [114.07817, 22.52997], [114.07267, 22.51855], [114.06272, 22.51617], [114.05729, 22.51104], [114.05438, 22.5026], [114.03113, 22.5065], [113.86771, 22.42972], [113.81621, 22.2163], [113.83338, 22.1826], [113.92195, 22.13873]]]] } },
+ { type: "Feature", properties: { iso1A2: "HM", iso1A3: "HMD", iso1N3: "334", wikidata: "Q131198", nameEn: "Heard Island and McDonald Islands", country: "AU", groups: ["053", "009", "UN"], driveSide: "left" }, geometry: { type: "MultiPolygon", coordinates: [[[[71.08716, -53.87687], [75.44182, -53.99822], [72.87012, -51.48322], [71.08716, -53.87687]]]] } },
+ { type: "Feature", properties: { iso1A2: "HN", iso1A3: "HND", iso1N3: "340", wikidata: "Q783", nameEn: "Honduras", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["504"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-83.86109, 17.73736], [-88.20359, 16.03858], [-88.22552, 15.72294], [-88.24022, 15.69247], [-88.31459, 15.66942], [-88.32467, 15.63665], [-88.97343, 15.14039], [-89.15149, 15.07392], [-89.18048, 14.99967], [-89.15149, 14.97775], [-89.23467, 14.85596], [-89.13132, 14.71582], [-89.15653, 14.57802], [-89.23719, 14.58046], [-89.35189, 14.47553], [-89.34776, 14.43013], [-89.04187, 14.33644], [-88.94608, 14.20207], [-88.85785, 14.17763], [-88.815, 14.11652], [-88.73182, 14.10919], [-88.70661, 14.04317], [-88.49738, 13.97224], [-88.48982, 13.86458], [-88.25791, 13.91108], [-88.23018, 13.99915], [-88.07641, 13.98447], [-88.00331, 13.86948], [-87.7966, 13.91353], [-87.68821, 13.80829], [-87.73106, 13.75443], [-87.78148, 13.52906], [-87.71657, 13.50577], [-87.72115, 13.46083], [-87.73841, 13.44169], [-87.77354, 13.45767], [-87.83467, 13.44655], [-87.84675, 13.41078], [-87.80177, 13.35689], [-87.73714, 13.32715], [-87.69751, 13.25228], [-87.55124, 13.12523], [-87.37107, 12.98646], [-87.06306, 13.00892], [-87.03785, 12.98682], [-86.93197, 13.05313], [-86.93383, 13.18677], [-86.87066, 13.30641], [-86.71267, 13.30348], [-86.76812, 13.79605], [-86.35219, 13.77157], [-86.14801, 14.04317], [-86.00685, 14.08474], [-86.03458, 13.99181], [-85.75477, 13.8499], [-85.73964, 13.9698], [-85.45762, 14.11304], [-85.32149, 14.2562], [-85.18602, 14.24929], [-85.1575, 14.53934], [-84.90082, 14.80489], [-84.82596, 14.82212], [-84.70119, 14.68078], [-84.48373, 14.63249], [-84.10584, 14.76353], [-83.89551, 14.76697], [-83.62101, 14.89448], [-83.49268, 15.01158], [-83.13724, 15.00002], [-83.04763, 15.03256], [-82.06974, 14.49418], [-81.58685, 18.0025], [-83.86109, 17.73736]]]] } },
+ { type: "Feature", properties: { iso1A2: "HR", iso1A3: "HRV", iso1N3: "191", wikidata: "Q224", nameEn: "Croatia", groups: ["EU", "039", "150", "UN"], callingCodes: ["385"] }, geometry: { type: "MultiPolygon", coordinates: [[[[17.6444, 42.88641], [17.5392, 42.92787], [17.70879, 42.97223], [17.64268, 43.08595], [17.46986, 43.16559], [17.286, 43.33065], [17.25579, 43.40353], [17.29699, 43.44542], [17.24411, 43.49376], [17.15828, 43.49376], [17.00585, 43.58037], [16.80736, 43.76011], [16.75316, 43.77157], [16.70922, 43.84887], [16.55472, 43.95326], [16.50528, 44.0244], [16.43629, 44.02826], [16.43662, 44.07523], [16.36864, 44.08263], [16.18688, 44.27012], [16.21346, 44.35231], [16.12969, 44.38275], [16.16814, 44.40679], [16.10566, 44.52586], [16.03012, 44.55572], [16.00884, 44.58605], [16.05828, 44.61538], [15.89348, 44.74964], [15.8255, 44.71501], [15.72584, 44.82334], [15.79472, 44.8455], [15.76096, 44.87045], [15.74723, 44.96818], [15.78568, 44.97401], [15.74585, 45.0638], [15.78842, 45.11519], [15.76371, 45.16508], [15.83512, 45.22459], [15.98412, 45.23088], [16.12153, 45.09616], [16.29036, 44.99732], [16.35404, 45.00241], [16.35863, 45.03529], [16.3749, 45.05206], [16.38219, 45.05139], [16.38309, 45.05955], [16.40023, 45.1147], [16.4634, 45.14522], [16.49155, 45.21153], [16.52982, 45.22713], [16.5501, 45.2212], [16.56559, 45.22307], [16.60194, 45.23042], [16.64962, 45.20714], [16.74845, 45.20393], [16.78219, 45.19002], [16.81137, 45.18434], [16.83804, 45.18951], [16.92405, 45.27607], [16.9385, 45.22742], [17.0415, 45.20759], [17.18438, 45.14764], [17.24325, 45.146], [17.25131, 45.14957], [17.26815, 45.18444], [17.32092, 45.16246], [17.33573, 45.14521], [17.41229, 45.13335], [17.4498, 45.16119], [17.45615, 45.12523], [17.47589, 45.12656], [17.51469, 45.10791], [17.59104, 45.10816], [17.66571, 45.13408], [17.84826, 45.04489], [17.87148, 45.04645], [17.93706, 45.08016], [17.97336, 45.12245], [17.97834, 45.13831], [17.99479, 45.14958], [18.01594, 45.15163], [18.03121, 45.12632], [18.1624, 45.07654], [18.24387, 45.13699], [18.32077, 45.1021], [18.41896, 45.11083], [18.47939, 45.05871], [18.65723, 45.07544], [18.78357, 44.97741], [18.80661, 44.93561], [18.76369, 44.93707], [18.76347, 44.90669], [18.8704, 44.85097], [19.01994, 44.85493], [18.98957, 44.90645], [19.02871, 44.92541], [19.06853, 44.89915], [19.15573, 44.95409], [19.05205, 44.97692], [19.1011, 45.01191], [19.07952, 45.14668], [19.14063, 45.12972], [19.19144, 45.17863], [19.43589, 45.17137], [19.41941, 45.23475], [19.28208, 45.23813], [19.10774, 45.29547], [18.97446, 45.37528], [18.99918, 45.49333], [19.08364, 45.48804], [19.07471, 45.53086], [18.94562, 45.53712], [18.88776, 45.57253], [18.96691, 45.66731], [18.90305, 45.71863], [18.85783, 45.85493], [18.81394, 45.91329], [18.80211, 45.87995], [18.6792, 45.92057], [18.57483, 45.80772], [18.44368, 45.73972], [18.12439, 45.78905], [18.08869, 45.76511], [17.99805, 45.79671], [17.87377, 45.78522], [17.66545, 45.84207], [17.56821, 45.93728], [17.35672, 45.95209], [17.14592, 46.16697], [16.8903, 46.28122], [16.8541, 46.36255], [16.7154, 46.39523], [16.6639, 46.45203], [16.59527, 46.47524], [16.52604, 46.47831], [16.5007, 46.49644], [16.44036, 46.5171], [16.38771, 46.53608], [16.37193, 46.55008], [16.29793, 46.5121], [16.26733, 46.51505], [16.26759, 46.50566], [16.23961, 46.49653], [16.25124, 46.48067], [16.27398, 46.42875], [16.27329, 46.41467], [16.30162, 46.40437], [16.30233, 46.37837], [16.18824, 46.38282], [16.14859, 46.40547], [16.05281, 46.39141], [16.05065, 46.3833], [16.07314, 46.36458], [16.07616, 46.3463], [15.97965, 46.30652], [15.79284, 46.25811], [15.78817, 46.21719], [15.75479, 46.20336], [15.75436, 46.21969], [15.67395, 46.22478], [15.6434, 46.21396], [15.64904, 46.19229], [15.59909, 46.14761], [15.6083, 46.11992], [15.62317, 46.09103], [15.72977, 46.04682], [15.71246, 46.01196], [15.70327, 46.00015], [15.70636, 45.92116], [15.67967, 45.90455], [15.68383, 45.88867], [15.68232, 45.86819], [15.70411, 45.8465], [15.66662, 45.84085], [15.64185, 45.82915], [15.57952, 45.84953], [15.52234, 45.82195], [15.47325, 45.8253], [15.47531, 45.79802], [15.40836, 45.79491], [15.25423, 45.72275], [15.30872, 45.69014], [15.34919, 45.71623], [15.4057, 45.64727], [15.38952, 45.63682], [15.34214, 45.64702], [15.34695, 45.63382], [15.31027, 45.6303], [15.27747, 45.60504], [15.29837, 45.5841], [15.30249, 45.53224], [15.38188, 45.48752], [15.33051, 45.45258], [15.27758, 45.46678], [15.16862, 45.42309], [15.05187, 45.49079], [15.02385, 45.48533], [14.92266, 45.52788], [14.90554, 45.47769], [14.81992, 45.45913], [14.80124, 45.49515], [14.71718, 45.53442], [14.68605, 45.53006], [14.69694, 45.57366], [14.59576, 45.62812], [14.60977, 45.66403], [14.57397, 45.67165], [14.53816, 45.6205], [14.5008, 45.60852], [14.49769, 45.54424], [14.36693, 45.48642], [14.32487, 45.47142], [14.27681, 45.4902], [14.26611, 45.48239], [14.24239, 45.50607], [14.22371, 45.50388], [14.20348, 45.46896], [14.07116, 45.48752], [14.00578, 45.52352], [13.96063, 45.50825], [13.99488, 45.47551], [13.97309, 45.45258], [13.90771, 45.45149], [13.88124, 45.42637], [13.81742, 45.43729], [13.7785, 45.46787], [13.67398, 45.4436], [13.62902, 45.45898], [13.56979, 45.4895], [13.45644, 45.59464], [13.05142, 45.33128], [13.12821, 44.48877], [16.15283, 42.18525], [18.45131, 42.21682], [18.54128, 42.39171], [18.52152, 42.42302], [18.43588, 42.48556], [18.44307, 42.51077], [18.43735, 42.55921], [18.36197, 42.61423], [18.24318, 42.6112], [17.88201, 42.83668], [17.80854, 42.9182], [17.7948, 42.89556], [17.68151, 42.92725], [17.6444, 42.88641]]]] } },
+ { type: "Feature", properties: { iso1A2: "HT", iso1A3: "HTI", iso1N3: "332", wikidata: "Q790", nameEn: "Haiti", aliases: ["RH"], groups: ["029", "003", "419", "019", "UN"], callingCodes: ["509"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-71.71885, 18.78423], [-71.72624, 18.87802], [-71.77766, 18.95007], [-71.88102, 18.95007], [-71.74088, 19.0437], [-71.71088, 19.08353], [-71.69938, 19.10916], [-71.65337, 19.11759], [-71.62642, 19.21212], [-71.73229, 19.26686], [-71.77766, 19.33823], [-71.69448, 19.37866], [-71.6802, 19.45008], [-71.71268, 19.53374], [-71.71449, 19.55364], [-71.7429, 19.58445], [-71.75865, 19.70231], [-71.77419, 19.73128], [-72.38946, 20.27111], [-73.37289, 20.43199], [-74.7289, 18.71009], [-74.76465, 18.06252], [-72.29523, 17.48026], [-71.75671, 18.03456], [-71.73783, 18.07177], [-71.74994, 18.11115], [-71.75465, 18.14405], [-71.78271, 18.18302], [-71.69952, 18.34101], [-71.90875, 18.45821], [-71.88102, 18.50125], [-72.00201, 18.62312], [-71.95412, 18.64939], [-71.82556, 18.62551], [-71.71885, 18.78423]]]] } },
+ { type: "Feature", properties: { iso1A2: "HU", iso1A3: "HUN", iso1N3: "348", wikidata: "Q28", nameEn: "Hungary", groups: ["EU", "151", "150", "UN"], callingCodes: ["36"] }, geometry: { type: "MultiPolygon", coordinates: [[[[21.72525, 48.34628], [21.67134, 48.3989], [21.6068, 48.50365], [21.44063, 48.58456], [21.11516, 48.49546], [20.83248, 48.5824], [20.5215, 48.53336], [20.29943, 48.26104], [20.24312, 48.2784], [19.92452, 48.1283], [19.63338, 48.25006], [19.52489, 48.19791], [19.47957, 48.09437], [19.28182, 48.08336], [19.23924, 48.0595], [19.01952, 48.07052], [18.82176, 48.04206], [18.76134, 47.97499], [18.76821, 47.87469], [18.8506, 47.82308], [18.74074, 47.8157], [18.66521, 47.76772], [18.56496, 47.76588], [18.29305, 47.73541], [18.02938, 47.75665], [17.71215, 47.7548], [17.23699, 48.02094], [17.16001, 48.00636], [17.09786, 47.97336], [17.11022, 47.92461], [17.08275, 47.87719], [17.00997, 47.86245], [17.07039, 47.81129], [17.05048, 47.79377], [17.08893, 47.70928], [16.87538, 47.68895], [16.86509, 47.72268], [16.82938, 47.68432], [16.7511, 47.67878], [16.72089, 47.73469], [16.65679, 47.74197], [16.61183, 47.76171], [16.54779, 47.75074], [16.53514, 47.73837], [16.55129, 47.72268], [16.4222, 47.66537], [16.58699, 47.61772], [16.64193, 47.63114], [16.71059, 47.52692], [16.64821, 47.50155], [16.6718, 47.46139], [16.57152, 47.40868], [16.52414, 47.41007], [16.49908, 47.39416], [16.45104, 47.41181], [16.47782, 47.25918], [16.44142, 47.25079], [16.43663, 47.21127], [16.41739, 47.20649], [16.42801, 47.18422], [16.4523, 47.18812], [16.46442, 47.16845], [16.44932, 47.14418], [16.52863, 47.13974], [16.46134, 47.09395], [16.52176, 47.05747], [16.43936, 47.03548], [16.51369, 47.00084], [16.28202, 47.00159], [16.27594, 46.9643], [16.22403, 46.939], [16.19904, 46.94134], [16.10983, 46.867], [16.14365, 46.8547], [16.15711, 46.85434], [16.21892, 46.86961], [16.2365, 46.87775], [16.2941, 46.87137], [16.34547, 46.83836], [16.3408, 46.80641], [16.31303, 46.79838], [16.30966, 46.7787], [16.37816, 46.69975], [16.42641, 46.69228], [16.41863, 46.66238], [16.38594, 46.6549], [16.39217, 46.63673], [16.50139, 46.56684], [16.52885, 46.53303], [16.52604, 46.5051], [16.59527, 46.47524], [16.6639, 46.45203], [16.7154, 46.39523], [16.8541, 46.36255], [16.8903, 46.28122], [17.14592, 46.16697], [17.35672, 45.95209], [17.56821, 45.93728], [17.66545, 45.84207], [17.87377, 45.78522], [17.99805, 45.79671], [18.08869, 45.76511], [18.12439, 45.78905], [18.44368, 45.73972], [18.57483, 45.80772], [18.6792, 45.92057], [18.80211, 45.87995], [18.81394, 45.91329], [18.99712, 45.93537], [19.01284, 45.96529], [19.0791, 45.96458], [19.10388, 46.04015], [19.14543, 45.9998], [19.28826, 45.99694], [19.52473, 46.1171], [19.56113, 46.16824], [19.66007, 46.19005], [19.81491, 46.1313], [19.93508, 46.17553], [20.01816, 46.17696], [20.03533, 46.14509], [20.09713, 46.17315], [20.26068, 46.12332], [20.28324, 46.1438], [20.35573, 46.16629], [20.45377, 46.14405], [20.49718, 46.18721], [20.63863, 46.12728], [20.76085, 46.21002], [20.74574, 46.25467], [20.86797, 46.28884], [21.06572, 46.24897], [21.16872, 46.30118], [21.28061, 46.44941], [21.26929, 46.4993], [21.33214, 46.63035], [21.43926, 46.65109], [21.5151, 46.72147], [21.48935, 46.7577], [21.52028, 46.84118], [21.59307, 46.86935], [21.59581, 46.91628], [21.68645, 46.99595], [21.648, 47.03902], [21.78395, 47.11104], [21.94463, 47.38046], [22.01055, 47.37767], [22.03389, 47.42508], [22.00917, 47.50492], [22.31816, 47.76126], [22.41979, 47.7391], [22.46559, 47.76583], [22.67247, 47.7871], [22.76617, 47.8417], [22.77991, 47.87211], [22.89849, 47.95851], [22.84276, 47.98602], [22.87847, 48.04665], [22.81804, 48.11363], [22.73427, 48.12005], [22.66835, 48.09162], [22.58733, 48.10813], [22.59007, 48.15121], [22.49806, 48.25189], [22.38133, 48.23726], [22.2083, 48.42534], [22.14689, 48.4005], [21.83339, 48.36242], [21.8279, 48.33321], [21.72525, 48.34628]]]] } },
+ { type: "Feature", properties: { iso1A2: "IC", wikidata: "Q5813", nameEn: "Canary Islands", country: "ES", groups: ["Q3320166", "Q105472", "EU", "039", "150", "UN"], isoStatus: "excRes", callingCodes: ["34"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-12.00985, 30.24121], [-25.3475, 27.87574], [-14.43883, 27.02969], [-12.00985, 30.24121]]]] } },
+ { type: "Feature", properties: { iso1A2: "ID", iso1A3: "IDN", iso1N3: "360", wikidata: "Q252", nameEn: "Indonesia", aliases: ["RI"] }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "IE", iso1A3: "IRL", iso1N3: "372", wikidata: "Q27", nameEn: "Republic of Ireland", groups: ["EU", "Q22890", "154", "150", "UN"], driveSide: "left", callingCodes: ["353"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-6.26218, 54.09785], [-6.29003, 54.11278], [-6.32694, 54.09337], [-6.36279, 54.11248], [-6.36605, 54.07234], [-6.47849, 54.06947], [-6.62842, 54.03503], [-6.66264, 54.0666], [-6.6382, 54.17071], [-6.70175, 54.20218], [-6.74575, 54.18788], [-6.81583, 54.22791], [-6.85179, 54.29176], [-6.87775, 54.34682], [-7.02034, 54.4212], [-7.19145, 54.31296], [-7.14908, 54.22732], [-7.25012, 54.20063], [-7.26316, 54.13863], [-7.29493, 54.12013], [-7.29687, 54.1354], [-7.28017, 54.16714], [-7.29157, 54.17191], [-7.34005, 54.14698], [-7.30553, 54.11869], [-7.32834, 54.11475], [-7.44567, 54.1539], [-7.4799, 54.12239], [-7.55812, 54.12239], [-7.69501, 54.20731], [-7.81397, 54.20159], [-7.8596, 54.21779], [-7.87101, 54.29299], [-8.04555, 54.36292], [-8.179, 54.46763], [-8.04538, 54.48941], [-7.99812, 54.54427], [-7.8596, 54.53671], [-7.70315, 54.62077], [-7.93293, 54.66603], [-7.83352, 54.73854], [-7.75041, 54.7103], [-7.64449, 54.75265], [-7.54671, 54.74606], [-7.54508, 54.79401], [-7.47626, 54.83084], [-7.4473, 54.87003], [-7.44404, 54.9403], [-7.40004, 54.94498], [-7.4033, 55.00391], [-7.34464, 55.04688], [-7.2471, 55.06933], [-6.34755, 55.49206], [-7.75229, 55.93854], [-22.01468, 48.19557], [-6.03913, 51.13217], [-5.37267, 53.63269], [-6.26218, 54.09785]]]] } },
+ { type: "Feature", properties: { iso1A2: "IL", iso1A3: "ISR", iso1N3: "376", wikidata: "Q801", nameEn: "Israel", groups: ["145", "142", "UN"], callingCodes: ["972"] }, geometry: { type: "MultiPolygon", coordinates: [[[[34.052, 31.46619], [34.29262, 31.70393], [34.48681, 31.59711], [34.56797, 31.54197], [34.48892, 31.48365], [34.40077, 31.40926], [34.36505, 31.36404], [34.37381, 31.30598], [34.36523, 31.28963], [34.29417, 31.24194], [34.26742, 31.21998], [34.92298, 29.45305], [34.97718, 29.54294], [34.98207, 29.58147], [35.02147, 29.66343], [35.14108, 30.07374], [35.19183, 30.34636], [35.16218, 30.43535], [35.19595, 30.50297], [35.21379, 30.60401], [35.29311, 30.71365], [35.33456, 30.81224], [35.33984, 30.8802], [35.41371, 30.95565], [35.43658, 31.12444], [35.40316, 31.25535], [35.47672, 31.49578], [35.39675, 31.49572], [35.22921, 31.37445], [35.13033, 31.3551], [35.02459, 31.35979], [34.92571, 31.34337], [34.88932, 31.37093], [34.87833, 31.39321], [34.89756, 31.43891], [34.93258, 31.47816], [34.94356, 31.50743], [34.9415, 31.55601], [34.95249, 31.59813], [35.00879, 31.65426], [35.08226, 31.69107], [35.10782, 31.71594], [35.11895, 31.71454], [35.12933, 31.7325], [35.13931, 31.73012], [35.15119, 31.73634], [35.15474, 31.73352], [35.16478, 31.73242], [35.18023, 31.72067], [35.20538, 31.72388], [35.21937, 31.71578], [35.22392, 31.71899], [35.23972, 31.70896], [35.24315, 31.71244], [35.2438, 31.7201], [35.24981, 31.72543], [35.25182, 31.73945], [35.26319, 31.74846], [35.25225, 31.7678], [35.26058, 31.79064], [35.25573, 31.81362], [35.26404, 31.82567], [35.251, 31.83085], [35.25753, 31.8387], [35.24816, 31.8458], [35.2304, 31.84222], [35.2249, 31.85433], [35.22817, 31.8638], [35.22567, 31.86745], [35.22294, 31.87889], [35.22014, 31.88264], [35.2136, 31.88241], [35.21276, 31.88153], [35.21016, 31.88237], [35.20945, 31.8815], [35.20791, 31.8821], [35.20673, 31.88151], [35.20381, 31.86716], [35.21128, 31.863], [35.216, 31.83894], [35.21469, 31.81835], [35.19461, 31.82687], [35.18169, 31.82542], [35.18603, 31.80901], [35.14174, 31.81325], [35.07677, 31.85627], [35.05617, 31.85685], [35.01978, 31.82944], [34.9724, 31.83352], [34.99712, 31.85569], [35.03489, 31.85919], [35.03978, 31.89276], [35.03489, 31.92448], [35.00124, 31.93264], [34.98682, 31.96935], [35.00261, 32.027], [34.9863, 32.09551], [34.99437, 32.10962], [34.98507, 32.12606], [34.99039, 32.14626], [34.96009, 32.17503], [34.95703, 32.19522], [34.98885, 32.20758], [35.01841, 32.23981], [35.02939, 32.2671], [35.01119, 32.28684], [35.01772, 32.33863], [35.04243, 32.35008], [35.05142, 32.3667], [35.0421, 32.38242], [35.05311, 32.4024], [35.05423, 32.41754], [35.07059, 32.4585], [35.08564, 32.46948], [35.09236, 32.47614], [35.10024, 32.47856], [35.10882, 32.4757], [35.15937, 32.50466], [35.2244, 32.55289], [35.25049, 32.52453], [35.29306, 32.50947], [35.30685, 32.51024], [35.35212, 32.52047], [35.40224, 32.50136], [35.42034, 32.46009], [35.41598, 32.45593], [35.41048, 32.43706], [35.42078, 32.41562], [35.55807, 32.38674], [35.55494, 32.42687], [35.57485, 32.48669], [35.56614, 32.64393], [35.59813, 32.65159], [35.61669, 32.67999], [35.66527, 32.681], [35.68467, 32.70715], [35.75983, 32.74803], [35.78745, 32.77938], [35.83758, 32.82817], [35.84021, 32.8725], [35.87012, 32.91976], [35.89298, 32.9456], [35.87188, 32.98028], [35.84802, 33.1031], [35.81911, 33.11077], [35.81911, 33.1336], [35.84285, 33.16673], [35.83846, 33.19397], [35.81647, 33.2028], [35.81295, 33.24841], [35.77513, 33.27342], [35.813, 33.3172], [35.77477, 33.33609], [35.62019, 33.27278], [35.62283, 33.24226], [35.58502, 33.26653], [35.58326, 33.28381], [35.56523, 33.28969], [35.55555, 33.25844], [35.54544, 33.25513], [35.54808, 33.236], [35.5362, 33.23196], [35.54228, 33.19865], [35.52573, 33.11921], [35.50335, 33.114], [35.50272, 33.09056], [35.448, 33.09264], [35.43059, 33.06659], [35.35223, 33.05617], [35.31429, 33.10515], [35.1924, 33.08743], [35.10645, 33.09318], [34.78515, 33.20368], [33.62659, 31.82938], [34.052, 31.46619]]]] } },
+ { type: "Feature", properties: { iso1A2: "IM", iso1A3: "IMN", iso1N3: "833", wikidata: "Q9676", nameEn: "Isle of Man", country: "GB", groups: ["Q185086", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44 01624", "44 07624", "44 07524", "44 07924"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-3.98763, 54.07351], [-4.1819, 54.57861], [-5.6384, 53.81157], [-3.98763, 54.07351]]]] } },
+ { type: "Feature", properties: { iso1A2: "IN", iso1A3: "IND", iso1N3: "356", wikidata: "Q668", nameEn: "India" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "IO", iso1A3: "IOT", iso1N3: "086", wikidata: "Q43448", nameEn: "British Indian Ocean Territory", country: "GB" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "IQ", iso1A3: "IRQ", iso1N3: "368", wikidata: "Q796", nameEn: "Iraq", groups: ["145", "142", "UN"], callingCodes: ["964"] }, geometry: { type: "MultiPolygon", coordinates: [[[[42.78887, 37.38615], [42.56725, 37.14878], [42.35724, 37.10998], [42.36697, 37.0627], [41.81736, 36.58782], [41.40058, 36.52502], [41.28864, 36.35368], [41.2564, 36.06012], [41.37027, 35.84095], [41.38184, 35.62502], [41.26569, 35.42708], [41.21654, 35.1508], [41.2345, 34.80049], [41.12388, 34.65742], [40.97676, 34.39788], [40.64314, 34.31604], [38.79171, 33.37328], [39.08202, 32.50304], [38.98762, 32.47694], [39.04251, 32.30203], [39.26157, 32.35555], [39.29903, 32.23259], [40.01521, 32.05667], [42.97601, 30.72204], [42.97796, 30.48295], [44.72255, 29.19736], [46.42415, 29.05947], [46.5527, 29.10283], [46.89695, 29.50584], [47.15166, 30.01044], [47.37192, 30.10421], [47.7095, 30.10453], [48.01114, 29.98906], [48.06782, 30.02906], [48.17332, 30.02448], [48.40479, 29.85763], [48.59531, 29.66815], [48.83867, 29.78572], [48.61441, 29.93675], [48.51011, 29.96238], [48.44785, 30.00148], [48.4494, 30.04456], [48.43384, 30.08233], [48.38869, 30.11062], [48.38714, 30.13485], [48.41671, 30.17254], [48.41117, 30.19846], [48.26393, 30.3408], [48.24385, 30.33846], [48.21279, 30.31644], [48.19425, 30.32796], [48.18321, 30.39703], [48.14585, 30.44133], [48.02443, 30.4789], [48.03221, 30.9967], [47.68219, 31.00004], [47.6804, 31.39086], [47.86337, 31.78422], [47.64771, 32.07666], [47.52474, 32.15972], [47.57144, 32.20583], [47.37529, 32.47808], [47.17218, 32.45393], [46.46788, 32.91992], [46.32298, 32.9731], [46.17198, 32.95612], [46.09103, 32.98354], [46.15175, 33.07229], [46.03966, 33.09577], [46.05367, 33.13097], [46.11905, 33.11924], [46.20623, 33.20395], [45.99919, 33.5082], [45.86687, 33.49263], [45.96183, 33.55751], [45.89801, 33.63661], [45.77814, 33.60938], [45.50261, 33.94968], [45.42789, 33.9458], [45.41077, 33.97421], [45.47264, 34.03099], [45.56176, 34.15088], [45.58667, 34.30147], [45.53552, 34.35148], [45.49171, 34.3439], [45.46697, 34.38221], [45.43879, 34.45949], [45.51883, 34.47692], [45.53219, 34.60441], [45.59074, 34.55558], [45.60224, 34.55057], [45.73923, 34.54416], [45.70031, 34.69277], [45.65672, 34.7222], [45.68284, 34.76624], [45.70031, 34.82322], [45.73641, 34.83975], [45.79682, 34.85133], [45.78904, 34.91135], [45.86532, 34.89858], [45.89477, 34.95805], [45.87864, 35.03441], [45.92173, 35.0465], [45.92203, 35.09538], [45.93108, 35.08148], [45.94756, 35.09188], [46.06508, 35.03699], [46.07747, 35.0838], [46.11763, 35.07551], [46.19116, 35.11097], [46.15642, 35.1268], [46.16229, 35.16984], [46.19738, 35.18536], [46.18457, 35.22561], [46.11367, 35.23729], [46.15474, 35.2883], [46.13152, 35.32548], [46.05358, 35.38568], [45.98453, 35.49848], [46.01518, 35.52012], [45.97584, 35.58132], [46.03028, 35.57416], [46.01307, 35.59756], [46.0165, 35.61501], [45.99452, 35.63574], [46.0117, 35.65059], [46.01631, 35.69139], [46.23736, 35.71414], [46.34166, 35.78363], [46.32921, 35.82655], [46.17198, 35.8013], [46.08325, 35.8581], [45.94711, 35.82218], [45.89784, 35.83708], [45.81442, 35.82107], [45.76145, 35.79898], [45.6645, 35.92872], [45.60018, 35.96069], [45.55245, 35.99943], [45.46594, 36.00042], [45.38275, 35.97156], [45.33916, 35.99424], [45.37652, 36.06222], [45.37312, 36.09917], [45.32235, 36.17383], [45.30038, 36.27769], [45.26261, 36.3001], [45.27394, 36.35846], [45.23953, 36.43257], [45.11811, 36.40751], [45.00759, 36.5402], [45.06985, 36.62645], [45.06985, 36.6814], [45.01537, 36.75128], [44.84725, 36.77622], [44.83479, 36.81362], [44.90173, 36.86096], [44.91199, 36.91468], [44.89862, 37.01897], [44.81611, 37.04383], [44.75229, 37.11958], [44.78319, 37.1431], [44.76698, 37.16162], [44.63179, 37.19229], [44.42631, 37.05825], [44.38117, 37.05825], [44.35315, 37.04955], [44.35937, 37.02843], [44.30645, 36.97373], [44.25975, 36.98119], [44.18503, 37.09551], [44.22239, 37.15756], [44.27998, 37.16501], [44.2613, 37.25055], [44.13521, 37.32486], [44.02002, 37.33229], [43.90949, 37.22453], [43.84878, 37.22205], [43.82699, 37.19477], [43.8052, 37.22825], [43.7009, 37.23692], [43.63085, 37.21957], [43.56702, 37.25675], [43.50787, 37.24436], [43.33508, 37.33105], [43.30083, 37.30629], [43.11403, 37.37436], [42.93705, 37.32015], [42.78887, 37.38615]]]] } },
+ { type: "Feature", properties: { iso1A2: "IR", iso1A3: "IRN", iso1N3: "364", wikidata: "Q794", nameEn: "Iran", groups: ["034", "142", "UN"], callingCodes: ["98"] }, geometry: { type: "MultiPolygon", coordinates: [[[[44.96746, 39.42998], [44.88916, 39.59653], [44.81043, 39.62677], [44.71806, 39.71124], [44.65422, 39.72163], [44.6137, 39.78393], [44.47298, 39.68788], [44.48111, 39.61579], [44.41849, 39.56659], [44.42832, 39.4131], [44.37921, 39.4131], [44.29818, 39.378], [44.22452, 39.4169], [44.03667, 39.39223], [44.1043, 39.19842], [44.20946, 39.13975], [44.18863, 38.93881], [44.30322, 38.81581], [44.26155, 38.71427], [44.28065, 38.6465], [44.32058, 38.62752], [44.3207, 38.49799], [44.3119, 38.37887], [44.38309, 38.36117], [44.44386, 38.38295], [44.50115, 38.33939], [44.42476, 38.25763], [44.22509, 37.88859], [44.3883, 37.85433], [44.45948, 37.77065], [44.55498, 37.783], [44.62096, 37.71985], [44.56887, 37.6429], [44.61401, 37.60165], [44.58449, 37.45018], [44.81021, 37.2915], [44.75986, 37.21549], [44.7868, 37.16644], [44.78319, 37.1431], [44.75229, 37.11958], [44.81611, 37.04383], [44.89862, 37.01897], [44.91199, 36.91468], [44.90173, 36.86096], [44.83479, 36.81362], [44.84725, 36.77622], [45.01537, 36.75128], [45.06985, 36.6814], [45.06985, 36.62645], [45.00759, 36.5402], [45.11811, 36.40751], [45.23953, 36.43257], [45.27394, 36.35846], [45.26261, 36.3001], [45.30038, 36.27769], [45.32235, 36.17383], [45.37312, 36.09917], [45.37652, 36.06222], [45.33916, 35.99424], [45.38275, 35.97156], [45.46594, 36.00042], [45.55245, 35.99943], [45.60018, 35.96069], [45.6645, 35.92872], [45.76145, 35.79898], [45.81442, 35.82107], [45.89784, 35.83708], [45.94711, 35.82218], [46.08325, 35.8581], [46.17198, 35.8013], [46.32921, 35.82655], [46.34166, 35.78363], [46.23736, 35.71414], [46.01631, 35.69139], [46.0117, 35.65059], [45.99452, 35.63574], [46.0165, 35.61501], [46.01307, 35.59756], [46.03028, 35.57416], [45.97584, 35.58132], [46.01518, 35.52012], [45.98453, 35.49848], [46.05358, 35.38568], [46.13152, 35.32548], [46.15474, 35.2883], [46.11367, 35.23729], [46.18457, 35.22561], [46.19738, 35.18536], [46.16229, 35.16984], [46.15642, 35.1268], [46.19116, 35.11097], [46.11763, 35.07551], [46.07747, 35.0838], [46.06508, 35.03699], [45.94756, 35.09188], [45.93108, 35.08148], [45.92203, 35.09538], [45.92173, 35.0465], [45.87864, 35.03441], [45.89477, 34.95805], [45.86532, 34.89858], [45.78904, 34.91135], [45.79682, 34.85133], [45.73641, 34.83975], [45.70031, 34.82322], [45.68284, 34.76624], [45.65672, 34.7222], [45.70031, 34.69277], [45.73923, 34.54416], [45.60224, 34.55057], [45.59074, 34.55558], [45.53219, 34.60441], [45.51883, 34.47692], [45.43879, 34.45949], [45.46697, 34.38221], [45.49171, 34.3439], [45.53552, 34.35148], [45.58667, 34.30147], [45.56176, 34.15088], [45.47264, 34.03099], [45.41077, 33.97421], [45.42789, 33.9458], [45.50261, 33.94968], [45.77814, 33.60938], [45.89801, 33.63661], [45.96183, 33.55751], [45.86687, 33.49263], [45.99919, 33.5082], [46.20623, 33.20395], [46.11905, 33.11924], [46.05367, 33.13097], [46.03966, 33.09577], [46.15175, 33.07229], [46.09103, 32.98354], [46.17198, 32.95612], [46.32298, 32.9731], [46.46788, 32.91992], [47.17218, 32.45393], [47.37529, 32.47808], [47.57144, 32.20583], [47.52474, 32.15972], [47.64771, 32.07666], [47.86337, 31.78422], [47.6804, 31.39086], [47.68219, 31.00004], [48.03221, 30.9967], [48.02443, 30.4789], [48.14585, 30.44133], [48.18321, 30.39703], [48.19425, 30.32796], [48.21279, 30.31644], [48.24385, 30.33846], [48.26393, 30.3408], [48.41117, 30.19846], [48.41671, 30.17254], [48.38714, 30.13485], [48.38869, 30.11062], [48.43384, 30.08233], [48.4494, 30.04456], [48.44785, 30.00148], [48.51011, 29.96238], [48.61441, 29.93675], [48.83867, 29.78572], [49.98877, 27.87827], [50.37726, 27.89227], [54.39838, 25.68383], [55.14145, 25.62624], [55.81777, 26.18798], [56.2644, 26.58649], [56.68954, 26.76645], [56.79239, 26.41236], [56.82555, 25.7713], [56.86325, 25.03856], [61.46682, 24.57869], [61.6433, 25.27541], [61.683, 25.66638], [61.83968, 25.7538], [61.83831, 26.07249], [61.89391, 26.26251], [62.05117, 26.31647], [62.21304, 26.26601], [62.31484, 26.528], [62.77352, 26.64099], [63.1889, 26.65072], [63.18688, 26.83844], [63.25005, 26.84212], [63.25005, 27.08692], [63.32283, 27.14437], [63.19649, 27.25674], [62.80604, 27.22412], [62.79684, 27.34381], [62.84905, 27.47627], [62.7638, 28.02992], [62.79412, 28.28108], [62.59499, 28.24842], [62.40259, 28.42703], [61.93581, 28.55284], [61.65978, 28.77937], [61.53765, 29.00507], [61.31508, 29.38903], [60.87231, 29.86514], [61.80829, 30.84224], [61.78268, 30.92724], [61.8335, 30.97669], [61.83257, 31.0452], [61.80957, 31.12576], [61.80569, 31.16167], [61.70929, 31.37391], [60.84541, 31.49561], [60.86191, 32.22565], [60.56485, 33.12944], [60.88908, 33.50219], [60.91133, 33.55596], [60.69573, 33.56054], [60.57762, 33.59772], [60.5485, 33.73422], [60.5838, 33.80793], [60.50209, 34.13992], [60.66502, 34.31539], [60.91321, 34.30411], [60.72316, 34.52857], [60.99922, 34.63064], [61.00197, 34.70631], [61.06926, 34.82139], [61.12831, 35.09938], [61.0991, 35.27845], [61.18187, 35.30249], [61.27371, 35.61482], [61.22719, 35.67038], [61.26152, 35.80749], [61.22444, 35.92879], [61.12007, 35.95992], [61.22719, 36.12759], [61.1393, 36.38782], [61.18187, 36.55348], [61.14516, 36.64644], [60.34767, 36.63214], [60.00768, 37.04102], [59.74678, 37.12499], [59.55178, 37.13594], [59.39385, 37.34257], [59.39797, 37.47892], [59.33507, 37.53146], [59.22905, 37.51161], [58.9338, 37.67374], [58.6921, 37.64548], [58.5479, 37.70526], [58.47786, 37.6433], [58.39959, 37.63134], [58.22999, 37.6856], [58.21399, 37.77281], [57.79534, 37.89299], [57.35042, 37.98546], [57.37236, 38.09321], [57.21169, 38.28965], [57.03453, 38.18717], [56.73928, 38.27887], [56.62255, 38.24005], [56.43303, 38.26054], [56.32454, 38.18502], [56.33278, 38.08132], [55.97847, 38.08024], [55.76561, 38.12238], [55.44152, 38.08564], [55.13412, 37.94705], [54.851, 37.75739], [54.77684, 37.62264], [54.81804, 37.61285], [54.77822, 37.51597], [54.67247, 37.43532], [54.58664, 37.45809], [54.36211, 37.34912], [54.24565, 37.32047], [53.89734, 37.3464], [48.88288, 38.43975], [48.84969, 38.45015], [48.81072, 38.44853], [48.78979, 38.45026], [48.70001, 38.40564], [48.62217, 38.40198], [48.58793, 38.45076], [48.45084, 38.61013], [48.3146, 38.59958], [48.24773, 38.71883], [48.02581, 38.82705], [48.01409, 38.90333], [48.07734, 38.91616], [48.08627, 38.94434], [48.28437, 38.97186], [48.33884, 39.03022], [48.31239, 39.09278], [48.15361, 39.19419], [48.12404, 39.25208], [48.15984, 39.30028], [48.37385, 39.37584], [48.34264, 39.42935], [47.98977, 39.70999], [47.84774, 39.66285], [47.50099, 39.49615], [47.38978, 39.45999], [47.31301, 39.37492], [47.05927, 39.24846], [47.05771, 39.20143], [46.95341, 39.13505], [46.92539, 39.16644], [46.83822, 39.13143], [46.75752, 39.03231], [46.53497, 38.86548], [46.34059, 38.92076], [46.20601, 38.85262], [46.14785, 38.84206], [46.06766, 38.87861], [46.00228, 38.87376], [45.94624, 38.89072], [45.90266, 38.87739], [45.83883, 38.90768], [45.65172, 38.95199], [45.6155, 38.94304], [45.6131, 38.964], [45.44966, 38.99243], [45.44811, 39.04927], [45.40452, 39.07224], [45.40148, 39.09007], [45.30489, 39.18333], [45.16168, 39.21952], [45.08751, 39.35052], [45.05932, 39.36435], [44.96746, 39.42998]]]] } },
+ { type: "Feature", properties: { iso1A2: "IS", iso1A3: "ISL", iso1N3: "352", wikidata: "Q189", nameEn: "Iceland", groups: ["154", "150", "UN"], callingCodes: ["354"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-33.15676, 62.62995], [-8.25539, 63.0423], [-15.70914, 69.67442], [-33.15676, 62.62995]]]] } },
+ { type: "Feature", properties: { iso1A2: "IT", iso1A3: "ITA", iso1N3: "380", wikidata: "Q38", nameEn: "Italy", groups: ["EU", "039", "150", "UN"], callingCodes: ["39"] }, geometry: { type: "MultiPolygon", coordinates: [[[[8.95861, 45.96485], [8.97604, 45.96151], [8.97741, 45.98317], [8.96668, 45.98436], [8.95861, 45.96485]]], [[[7.63035, 43.57419], [9.56115, 43.20816], [10.09675, 41.44089], [7.60802, 41.05927], [7.89009, 38.19924], [11.2718, 37.6713], [12.13667, 34.20326], [14.02721, 36.53141], [17.67657, 35.68918], [18.83516, 40.36999], [16.15283, 42.18525], [13.12821, 44.48877], [13.05142, 45.33128], [13.45644, 45.59464], [13.6076, 45.64761], [13.7198, 45.59352], [13.74587, 45.59811], [13.78445, 45.5825], [13.84106, 45.58185], [13.86771, 45.59898], [13.8695, 45.60835], [13.9191, 45.6322], [13.87933, 45.65207], [13.83422, 45.68703], [13.83332, 45.70855], [13.8235, 45.7176], [13.66986, 45.79955], [13.59784, 45.8072], [13.58858, 45.83503], [13.57563, 45.8425], [13.58644, 45.88173], [13.59565, 45.89446], [13.60857, 45.89907], [13.61931, 45.91782], [13.63815, 45.93607], [13.6329, 45.94894], [13.64307, 45.98326], [13.63458, 45.98947], [13.62074, 45.98388], [13.58903, 45.99009], [13.56759, 45.96991], [13.52963, 45.96588], [13.50104, 45.98078], [13.47474, 46.00546], [13.49702, 46.01832], [13.50998, 46.04498], [13.49568, 46.04839], [13.50104, 46.05986], [13.57072, 46.09022], [13.64053, 46.13587], [13.66472, 46.17392], [13.64451, 46.18966], [13.56682, 46.18703], [13.56114, 46.2054], [13.47587, 46.22725], [13.42218, 46.20758], [13.37671, 46.29668], [13.44808, 46.33507], [13.43418, 46.35992], [13.47019, 46.3621], [13.5763, 46.40915], [13.5763, 46.42613], [13.59777, 46.44137], [13.68684, 46.43881], [13.7148, 46.5222], [13.64088, 46.53438], [13.27627, 46.56059], [12.94445, 46.60401], [12.59992, 46.6595], [12.38708, 46.71529], [12.27591, 46.88651], [12.2006, 46.88854], [12.11675, 47.01241], [12.21781, 47.03996], [12.19254, 47.09331], [11.74789, 46.98484], [11.50739, 47.00644], [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.54783, 46.84505], [10.47197, 46.85698], [10.38659, 46.67847], [10.40475, 46.63671], [10.44686, 46.64162], [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.14439, 46.22992], [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.25502, 46.43743], [9.29226, 46.32717], [9.24503, 46.23616], [9.01618, 46.04928], [8.99257, 45.9698], [9.09065, 45.89906], [9.06642, 45.8761], [9.04546, 45.84968], [9.04059, 45.8464], [9.03505, 45.83976], [9.03793, 45.83548], [9.03279, 45.82865], [9.0298, 45.82127], [9.00324, 45.82055], [8.99663, 45.83466], [8.9621, 45.83707], [8.94737, 45.84285], [8.91129, 45.8388], [8.93504, 45.86245], [8.94372, 45.86587], [8.93649, 45.86775], [8.88904, 45.95465], [8.86688, 45.96135], [8.85121, 45.97239], [8.8319, 45.9879], [8.79362, 45.99207], [8.78585, 45.98973], [8.79414, 46.00913], [8.85617, 46.0748], [8.80778, 46.10085], [8.75697, 46.10395], [8.62242, 46.12112], [8.45032, 46.26869], [8.46317, 46.43712], [8.42464, 46.46367], [8.30648, 46.41587], [8.31162, 46.38044], [8.08814, 46.26692], [8.16866, 46.17817], [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], [7.07074, 45.21228], [6.96706, 45.20841], [6.85144, 45.13226], [6.7697, 45.16044], [6.62803, 45.11175], [6.66981, 45.02324], [6.74791, 45.01939], [6.74519, 44.93661], [6.75518, 44.89915], [6.90774, 44.84322], [6.93499, 44.8664], [7.02217, 44.82519], [7.00401, 44.78782], [7.07484, 44.68073], [7.00582, 44.69364], [6.95133, 44.66264], [6.96042, 44.62129], [6.85507, 44.53072], [6.86233, 44.49834], [6.94504, 44.43112], [6.88784, 44.42043], [6.89171, 44.36637], [6.98221, 44.28289], [7.00764, 44.23736], [7.16929, 44.20352], [7.27827, 44.1462], [7.34547, 44.14359], [7.36364, 44.11882], [7.62155, 44.14881], [7.63245, 44.17877], [7.68694, 44.17487], [7.66878, 44.12795], [7.72508, 44.07578], [7.6597, 44.03009], [7.66848, 43.99943], [7.65266, 43.9763], [7.60771, 43.95772], [7.56858, 43.94506], [7.56075, 43.89932], [7.51162, 43.88301], [7.49355, 43.86551], [7.50423, 43.84345], [7.53006, 43.78405], [7.63035, 43.57419]], [[12.45181, 41.90056], [12.44834, 41.90095], [12.44582, 41.90194], [12.44815, 41.90326], [12.44984, 41.90545], [12.45091, 41.90625], [12.45543, 41.90738], [12.45561, 41.90629], [12.45762, 41.9058], [12.45755, 41.9033], [12.45826, 41.90281], [12.45834, 41.90174], [12.4577, 41.90115], [12.45691, 41.90125], [12.45626, 41.90172], [12.45435, 41.90143], [12.45446, 41.90028], [12.45181, 41.90056]], [[12.45648, 43.89369], [12.44184, 43.90498], [12.41641, 43.89991], [12.40935, 43.9024], [12.41233, 43.90956], [12.40733, 43.92379], [12.41551, 43.92984], [12.41165, 43.93769], [12.40506, 43.94325], [12.40415, 43.95485], [12.41414, 43.95273], [12.42005, 43.9578], [12.43662, 43.95698], [12.44684, 43.96597], [12.46205, 43.97463], [12.47853, 43.98052], [12.49406, 43.98492], [12.50678, 43.99113], [12.51463, 43.99122], [12.5154, 43.98508], [12.51064, 43.98165], [12.51109, 43.97201], [12.50622, 43.97131], [12.50875, 43.96198], [12.50655, 43.95796], [12.51427, 43.94897], [12.51553, 43.94096], [12.50496, 43.93017], [12.50269, 43.92363], [12.49724, 43.92248], [12.49247, 43.91774], [12.49429, 43.90973], [12.48771, 43.89706], [12.45648, 43.89369]]]] } },
+ { type: "Feature", properties: { iso1A2: "JE", iso1A3: "JEY", iso1N3: "832", wikidata: "Q785", nameEn: "Bailiwick of Jersey", country: "GB", groups: ["830", "Q185086", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44 01534"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.00491, 48.86706], [-1.83944, 49.23037], [-2.09454, 49.46288], [-2.65349, 49.15373], [-2.00491, 48.86706]]]] } },
+ { type: "Feature", properties: { iso1A2: "JM", iso1A3: "JAM", iso1N3: "388", wikidata: "Q766", nameEn: "Jamaica", aliases: ["JA"], groups: ["029", "003", "419", "019", "UN"], driveSide: "left", callingCodes: ["1 876", "1 658"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-74.09729, 17.36817], [-78.9741, 19.59515], [-78.34606, 16.57862], [-74.09729, 17.36817]]]] } },
+ { type: "Feature", properties: { iso1A2: "JO", iso1A3: "JOR", iso1N3: "400", wikidata: "Q810", nameEn: "Jordan", groups: ["145", "142", "UN"], callingCodes: ["962"] }, geometry: { type: "MultiPolygon", coordinates: [[[[39.04251, 32.30203], [38.98762, 32.47694], [39.08202, 32.50304], [38.79171, 33.37328], [36.83946, 32.31293], [36.40959, 32.37908], [36.23948, 32.50108], [36.20875, 32.49529], [36.20379, 32.52751], [36.08074, 32.51463], [36.02239, 32.65911], [35.96633, 32.66237], [35.93307, 32.71966], [35.88405, 32.71321], [35.75983, 32.74803], [35.68467, 32.70715], [35.66527, 32.681], [35.61669, 32.67999], [35.59813, 32.65159], [35.56614, 32.64393], [35.57485, 32.48669], [35.55494, 32.42687], [35.55807, 32.38674], [35.57111, 32.21877], [35.52012, 32.04076], [35.54375, 31.96587], [35.52758, 31.9131], [35.55941, 31.76535], [35.47672, 31.49578], [35.40316, 31.25535], [35.43658, 31.12444], [35.41371, 30.95565], [35.33984, 30.8802], [35.33456, 30.81224], [35.29311, 30.71365], [35.21379, 30.60401], [35.19595, 30.50297], [35.16218, 30.43535], [35.19183, 30.34636], [35.14108, 30.07374], [35.02147, 29.66343], [34.98207, 29.58147], [34.97718, 29.54294], [34.92298, 29.45305], [34.8812, 29.36878], [36.07081, 29.18469], [36.50005, 29.49696], [36.75083, 29.86903], [37.4971, 29.99949], [37.66395, 30.33245], [37.99354, 30.49998], [36.99791, 31.50081], [38.99233, 31.99721], [39.29903, 32.23259], [39.26157, 32.35555], [39.04251, 32.30203]]]] } },
+ { type: "Feature", properties: { iso1A2: "JP", iso1A3: "JPN", iso1N3: "392", wikidata: "Q17", nameEn: "Japan", groups: ["030", "142", "UN"], driveSide: "left", callingCodes: ["81"] }, geometry: { type: "MultiPolygon", coordinates: [[[[145.82361, 43.38904], [145.23667, 43.76813], [145.82343, 44.571], [140.9182, 45.92937], [133.61399, 37.41], [129.2669, 34.87122], [122.26612, 25.98197], [123.92912, 17.8782], [155.16731, 23.60141], [145.82361, 43.38904]]]] } },
+ { type: "Feature", properties: { iso1A2: "KE", iso1A3: "KEN", iso1N3: "404", wikidata: "Q114", nameEn: "Kenya", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["254"] }, geometry: { type: "MultiPolygon", coordinates: [[[[35.9419, 4.61933], [35.51424, 4.61643], [35.42366, 4.76969], [35.47843, 4.91872], [35.30992, 4.90402], [35.34151, 5.02364], [34.47601, 4.72162], [33.9873, 4.23316], [34.06046, 4.15235], [34.15429, 3.80464], [34.45815, 3.67385], [34.44922, 3.51627], [34.39112, 3.48802], [34.41794, 3.44342], [34.40006, 3.37949], [34.45815, 3.18319], [34.56242, 3.11478], [34.60114, 2.93034], [34.65774, 2.8753], [34.73967, 2.85447], [34.78137, 2.76223], [34.77244, 2.70272], [34.95267, 2.47209], [34.90947, 2.42447], [34.98692, 1.97348], [34.9899, 1.6668], [34.92734, 1.56109], [34.87819, 1.5596], [34.7918, 1.36752], [34.82606, 1.30944], [34.82606, 1.26626], [34.80223, 1.22754], [34.67562, 1.21265], [34.58029, 1.14712], [34.57427, 1.09868], [34.52369, 1.10692], [34.43349, 0.85254], [34.40041, 0.80266], [34.31516, 0.75693], [34.27345, 0.63182], [34.20196, 0.62289], [34.13493, 0.58118], [34.11408, 0.48884], [34.08727, 0.44713], [34.10067, 0.36372], [33.90936, 0.10581], [33.98449, -0.13079], [33.9264, -0.54188], [33.93107, -0.99298], [34.02286, -1.00779], [34.03084, -1.05101], [34.0824, -1.02264], [37.67199, -3.06222], [37.71745, -3.304], [37.5903, -3.42735], [37.63099, -3.50723], [37.75036, -3.54243], [37.81321, -3.69179], [39.21631, -4.67835], [39.44306, -4.93877], [39.62121, -4.68136], [41.75542, -1.85308], [41.56362, -1.66375], [41.56, -1.59812], [41.00099, -0.83068], [40.98767, 2.82959], [41.31368, 3.14314], [41.89488, 3.97375], [41.1754, 3.94079], [40.77498, 4.27683], [39.86043, 3.86974], [39.76808, 3.67058], [39.58339, 3.47434], [39.55132, 3.39634], [39.51551, 3.40895], [39.49444, 3.45521], [39.19954, 3.47834], [39.07736, 3.5267], [38.91938, 3.51198], [38.52336, 3.62551], [38.45812, 3.60445], [38.14168, 3.62487], [37.07724, 4.33503], [36.84474, 4.44518], [36.03924, 4.44406], [35.95449, 4.53244], [35.9419, 4.61933]]]] } },
+ { type: "Feature", properties: { iso1A2: "KG", iso1A3: "KGZ", iso1N3: "417", wikidata: "Q813", nameEn: "Kyrgyzstan", groups: ["143", "142", "UN"], callingCodes: ["996"] }, geometry: { type: "MultiPolygon", coordinates: [[[[74.88756, 42.98612], [74.75, 42.99029], [74.70331, 43.02519], [74.64615, 43.05881], [74.57491, 43.13702], [74.22489, 43.24657], [73.55634, 43.03071], [73.50992, 42.82356], [73.44393, 42.43098], [71.88792, 42.83578], [71.62405, 42.76613], [71.53272, 42.8014], [71.2724, 42.77853], [71.22785, 42.69248], [71.17807, 42.67381], [71.15232, 42.60486], [70.97717, 42.50147], [70.85973, 42.30188], [70.94483, 42.26238], [71.13263, 42.28356], [71.28719, 42.18033], [70.69777, 41.92554], [70.17682, 41.5455], [70.48909, 41.40335], [70.67586, 41.47953], [70.78572, 41.36419], [70.77885, 41.24813], [70.86263, 41.23833], [70.9615, 41.16393], [71.02193, 41.19494], [71.11806, 41.15359], [71.25813, 41.18796], [71.27187, 41.11015], [71.34877, 41.16807], [71.40198, 41.09436], [71.46148, 41.13958], [71.43814, 41.19644], [71.46688, 41.31883], [71.57227, 41.29175], [71.6787, 41.42111], [71.65914, 41.49599], [71.73054, 41.54713], [71.71132, 41.43012], [71.76625, 41.4466], [71.83914, 41.3546], [71.91457, 41.2982], [71.85964, 41.19081], [72.07249, 41.11739], [72.10745, 41.15483], [72.16433, 41.16483], [72.17594, 41.15522], [72.14864, 41.13363], [72.1792, 41.10621], [72.21061, 41.05607], [72.17594, 41.02377], [72.18339, 40.99571], [72.324, 41.03381], [72.34026, 41.04539], [72.34757, 41.06104], [72.36138, 41.04384], [72.38511, 41.02785], [72.45206, 41.03018], [72.48742, 40.97136], [72.55109, 40.96046], [72.59136, 40.86947], [72.68157, 40.84942], [72.84291, 40.85512], [72.94454, 40.8094], [73.01869, 40.84681], [73.13267, 40.83512], [73.13412, 40.79122], [73.0612, 40.76678], [72.99133, 40.76457], [72.93296, 40.73089], [72.8722, 40.71111], [72.85372, 40.7116], [72.84754, 40.67229], [72.80137, 40.67856], [72.74866, 40.60873], [72.74894, 40.59592], [72.75982, 40.57273], [72.74862, 40.57131], [72.74768, 40.58051], [72.73995, 40.58409], [72.69579, 40.59778], [72.66713, 40.59076], [72.66713, 40.5219], [72.47795, 40.5532], [72.40517, 40.61917], [72.34406, 40.60144], [72.41714, 40.55736], [72.38384, 40.51535], [72.41513, 40.50856], [72.44191, 40.48222], [72.40346, 40.4007], [72.24368, 40.46091], [72.18648, 40.49893], [71.96401, 40.31907], [72.05464, 40.27586], [71.85002, 40.25647], [71.82646, 40.21872], [71.73054, 40.14818], [71.71719, 40.17886], [71.69621, 40.18492], [71.70569, 40.20391], [71.68386, 40.26984], [71.61931, 40.26775], [71.61725, 40.20615], [71.51549, 40.22986], [71.51215, 40.26943], [71.4246, 40.28619], [71.36663, 40.31593], [71.13042, 40.34106], [71.05901, 40.28765], [70.95789, 40.28761], [70.9818, 40.22392], [70.80495, 40.16813], [70.7928, 40.12797], [70.65827, 40.0981], [70.65946, 39.9878], [70.58912, 39.95211], [70.55033, 39.96619], [70.47557, 39.93216], [70.57384, 39.99394], [70.58297, 40.00891], [70.01283, 40.23288], [69.67001, 40.10639], [69.64704, 40.12165], [69.57615, 40.10524], [69.55555, 40.12296], [69.53794, 40.11833], [69.53855, 40.0887], [69.5057, 40.03277], [69.53615, 39.93991], [69.43557, 39.92877], [69.43134, 39.98431], [69.35649, 40.01994], [69.26938, 39.8127], [69.3594, 39.52516], [69.68677, 39.59281], [69.87491, 39.53882], [70.11111, 39.58223], [70.2869, 39.53141], [70.44757, 39.60128], [70.64087, 39.58792], [70.7854, 39.38933], [71.06418, 39.41586], [71.08752, 39.50704], [71.49814, 39.61397], [71.55856, 39.57588], [71.5517, 39.45722], [71.62688, 39.44056], [71.76816, 39.45456], [71.80164, 39.40631], [71.7522, 39.32031], [71.79202, 39.27355], [71.90601, 39.27674], [72.04059, 39.36704], [72.09689, 39.26823], [72.17242, 39.2661], [72.23834, 39.17248], [72.33173, 39.33093], [72.62027, 39.39696], [72.85934, 39.35116], [73.18454, 39.35536], [73.31912, 39.38615], [73.45096, 39.46677], [73.59831, 39.46425], [73.87018, 39.47879], [73.94683, 39.60733], [73.92354, 39.69565], [73.9051, 39.75073], [73.83006, 39.76136], [73.97049, 40.04378], [74.25533, 40.13191], [74.35063, 40.09742], [74.69875, 40.34668], [74.85996, 40.32857], [74.78168, 40.44886], [74.82013, 40.52197], [75.08243, 40.43945], [75.22834, 40.45382], [75.5854, 40.66874], [75.69663, 40.28642], [75.91361, 40.2948], [75.96168, 40.38064], [76.33659, 40.3482], [76.5261, 40.46114], [76.75681, 40.95354], [76.99302, 41.0696], [77.28004, 41.0033], [77.3693, 41.0375], [77.52723, 41.00227], [77.76206, 41.01574], [77.81287, 41.14307], [78.12873, 41.23091], [78.15757, 41.38565], [78.3732, 41.39603], [79.92977, 42.04113], [80.17842, 42.03211], [80.17807, 42.21166], [79.97364, 42.42816], [79.52921, 42.44778], [79.19763, 42.804], [78.91502, 42.76839], [78.48469, 42.89649], [75.82823, 42.94848], [75.72174, 42.79672], [75.29966, 42.86183], [75.22619, 42.85528], [74.88756, 42.98612]], [[70.74189, 39.86319], [70.63105, 39.77923], [70.59667, 39.83542], [70.54998, 39.85137], [70.52631, 39.86989], [70.53651, 39.89155], [70.74189, 39.86319]], [[71.86463, 39.98598], [71.84316, 39.95582], [71.7504, 39.93701], [71.71511, 39.96348], [71.78838, 40.01404], [71.86463, 39.98598]], [[71.21139, 40.03369], [71.1427, 39.95026], [71.23067, 39.93581], [71.16101, 39.88423], [71.10531, 39.91354], [71.04979, 39.89808], [71.10501, 39.95568], [71.09063, 39.99], [71.11668, 39.99291], [71.11037, 40.01984], [71.01035, 40.05481], [71.00236, 40.18154], [71.06305, 40.1771], [71.12218, 40.03052], [71.21139, 40.03369]]]] } },
+ { type: "Feature", properties: { iso1A2: "KH", iso1A3: "KHM", iso1N3: "116", wikidata: "Q424", nameEn: "Cambodia", groups: ["035", "142", "UN"], callingCodes: ["855"] }, geometry: { type: "MultiPolygon", coordinates: [[[[105.87328, 11.55953], [105.81645, 11.56876], [105.80867, 11.60536], [105.8507, 11.66635], [105.88962, 11.67854], [105.95188, 11.63738], [106.00792, 11.7197], [106.02038, 11.77457], [106.06708, 11.77761], [106.13158, 11.73283], [106.18539, 11.75171], [106.26478, 11.72122], [106.30525, 11.67549], [106.37219, 11.69836], [106.44691, 11.66787], [106.45158, 11.68616], [106.41577, 11.76999], [106.44535, 11.8279], [106.44068, 11.86294], [106.4687, 11.86751], [106.4111, 11.97413], [106.70687, 11.96956], [106.79405, 12.0807], [106.92325, 12.06548], [106.99953, 12.08983], [107.15831, 12.27547], [107.34511, 12.33327], [107.42917, 12.24657], [107.4463, 12.29373], [107.55059, 12.36824], [107.5755, 12.52177], [107.55993, 12.7982], [107.49611, 12.88926], [107.49144, 13.01215], [107.62843, 13.3668], [107.61909, 13.52577], [107.53503, 13.73908], [107.45252, 13.78897], [107.46498, 13.91593], [107.44318, 13.99751], [107.38247, 13.99147], [107.35757, 14.02319], [107.37158, 14.07906], [107.33577, 14.11832], [107.40427, 14.24509], [107.39493, 14.32655], [107.44941, 14.41552], [107.48521, 14.40346], [107.52569, 14.54665], [107.52102, 14.59034], [107.55371, 14.628], [107.54361, 14.69092], [107.47238, 14.61523], [107.44435, 14.52785], [107.37897, 14.54443], [107.3276, 14.58812], [107.29803, 14.58963], [107.26534, 14.54292], [107.256, 14.48716], [107.21241, 14.48716], [107.17038, 14.41782], [107.09722, 14.3937], [107.03962, 14.45099], [107.04585, 14.41782], [106.98825, 14.36806], [106.9649, 14.3198], [106.90574, 14.33639], [106.8497, 14.29416], [106.80767, 14.31226], [106.73762, 14.42687], [106.63333, 14.44194], [106.59908, 14.50977], [106.57106, 14.50525], [106.54148, 14.59565], [106.50723, 14.58963], [106.45898, 14.55045], [106.47766, 14.50977], [106.43874, 14.52032], [106.40916, 14.45249], [106.32355, 14.44043], [106.25194, 14.48415], [106.21302, 14.36203], [106.00131, 14.36957], [105.99509, 14.32734], [106.02311, 14.30623], [106.04801, 14.20363], [106.10872, 14.18401], [106.11962, 14.11307], [106.18656, 14.06324], [106.16632, 14.01794], [106.10094, 13.98471], [106.10405, 13.9137], [105.90791, 13.92881], [105.78182, 14.02247], [105.78338, 14.08438], [105.5561, 14.15684], [105.44869, 14.10703], [105.36775, 14.09948], [105.2759, 14.17496], [105.20894, 14.34967], [105.17748, 14.34432], [105.14012, 14.23873], [105.08408, 14.20402], [105.02804, 14.23722], [104.97667, 14.38806], [104.69335, 14.42726], [104.55014, 14.36091], [104.27616, 14.39861], [103.93836, 14.3398], [103.70175, 14.38052], [103.71109, 14.4348], [103.53518, 14.42575], [103.39353, 14.35639], [103.16469, 14.33075], [102.93275, 14.19044], [102.91251, 14.01531], [102.77864, 13.93374], [102.72727, 13.77806], [102.56848, 13.69366], [102.5481, 13.6589], [102.58635, 13.6286], [102.62483, 13.60883], [102.57573, 13.60461], [102.5358, 13.56933], [102.44601, 13.5637], [102.36859, 13.57488], [102.33828, 13.55613], [102.361, 13.50551], [102.35563, 13.47307], [102.35692, 13.38274], [102.34611, 13.35618], [102.36001, 13.31142], [102.36146, 13.26006], [102.43422, 13.09061], [102.46011, 13.08057], [102.52275, 12.99813], [102.48694, 12.97537], [102.49335, 12.92711], [102.53053, 12.77506], [102.4994, 12.71736], [102.51963, 12.66117], [102.57567, 12.65358], [102.7796, 12.43781], [102.78116, 12.40284], [102.73134, 12.37091], [102.70176, 12.1686], [102.77026, 12.06815], [102.78427, 11.98746], [102.83957, 11.8519], [102.90973, 11.75613], [102.91449, 11.65512], [102.52395, 11.25257], [102.47649, 9.66162], [103.99198, 10.48391], [104.43778, 10.42386], [104.47963, 10.43046], [104.49869, 10.4057], [104.59018, 10.53073], [104.87933, 10.52833], [104.95094, 10.64003], [105.09571, 10.72722], [105.02722, 10.89236], [105.08326, 10.95656], [105.11449, 10.96332], [105.34011, 10.86179], [105.42884, 10.96878], [105.50045, 10.94586], [105.77751, 11.03671], [105.86376, 10.89839], [105.84603, 10.85873], [105.93403, 10.83853], [105.94535, 10.9168], [106.06708, 10.8098], [106.18539, 10.79451], [106.14301, 10.98176], [106.20095, 10.97795], [106.1757, 11.07301], [106.1527, 11.10476], [106.10444, 11.07879], [105.86782, 11.28343], [105.88962, 11.43605], [105.87328, 11.55953]]]] } },
+ { type: "Feature", properties: { iso1A2: "KI", iso1A3: "KIR", iso1N3: "296", wikidata: "Q710", nameEn: "Kiribati", groups: ["057", "009", "UN"], driveSide: "left", callingCodes: ["686"] }, geometry: { type: "MultiPolygon", coordinates: [[[[169, 3.9], [169, -3.5], [178, -3.5], [178, 3.9], [169, 3.9]]], [[[-161.06795, 5.2462], [-158.12991, -1.86122], [-175.33482, -1.40631], [-175.31804, -7.54825], [-156.50903, -7.4975], [-156.48634, -15.52824], [-135.59706, -4.70473], [-161.06795, 5.2462]]]] } },
+ { type: "Feature", properties: { iso1A2: "KM", iso1A3: "COM", iso1N3: "174", wikidata: "Q970", nameEn: "Comoros", groups: ["014", "202", "002", "UN"], callingCodes: ["269"] }, geometry: { type: "MultiPolygon", coordinates: [[[[42.63904, -10.02522], [43.28731, -13.97126], [45.4971, -11.75965], [42.63904, -10.02522]]]] } },
+ { type: "Feature", properties: { iso1A2: "KN", iso1A3: "KNA", iso1N3: "659", wikidata: "Q763", nameEn: "St. Kitts and Nevis", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 869"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-62.29333, 17.43155], [-62.76692, 17.64353], [-63.09677, 17.21372], [-62.63813, 16.65446], [-62.29333, 17.43155]]]] } },
+ { type: "Feature", properties: { iso1A2: "KP", iso1A3: "PRK", iso1N3: "408", wikidata: "Q423", nameEn: "North Korea", groups: ["030", "142", "UN"], callingCodes: ["850"] }, geometry: { type: "MultiPolygon", coordinates: [[[[130.26095, 42.9027], [130.09764, 42.91425], [130.12957, 42.98361], [129.96409, 42.97306], [129.95082, 43.01051], [129.8865, 43.00395], [129.85261, 42.96494], [129.83277, 42.86746], [129.80719, 42.79218], [129.7835, 42.76521], [129.77183, 42.69435], [129.75294, 42.59409], [129.72541, 42.43739], [129.60482, 42.44461], [129.54701, 42.37254], [129.42882, 42.44702], [129.28541, 42.41574], [129.22423, 42.3553], [129.22285, 42.26491], [129.15178, 42.17224], [128.96068, 42.06657], [128.94007, 42.03537], [128.04487, 42.01769], [128.15119, 41.74568], [128.30716, 41.60322], [128.20061, 41.40895], [128.18546, 41.41279], [128.12967, 41.37931], [128.03311, 41.39232], [128.02633, 41.42103], [127.92943, 41.44291], [127.29712, 41.49473], [127.17841, 41.59714], [126.90729, 41.79955], [126.60631, 41.65565], [126.53189, 41.35206], [126.242, 41.15454], [126.00335, 40.92835], [125.76869, 40.87908], [125.71172, 40.85223], [124.86913, 40.45387], [124.40719, 40.13655], [124.38556, 40.11047], [124.3322, 40.05573], [124.37089, 40.03004], [124.35029, 39.95639], [124.23201, 39.9248], [124.17532, 39.8232], [123.90497, 38.79949], [123.85601, 37.49093], [124.67666, 38.05679], [124.84224, 37.977], [124.87921, 37.80827], [125.06408, 37.66334], [125.37112, 37.62643], [125.81159, 37.72949], [126.13074, 37.70512], [126.18776, 37.74728], [126.19097, 37.81462], [126.24402, 37.83113], [126.43239, 37.84095], [126.46818, 37.80873], [126.56709, 37.76857], [126.59918, 37.76364], [126.66067, 37.7897], [126.68793, 37.83728], [126.68793, 37.9175], [126.67023, 37.95852], [126.84961, 38.0344], [126.88106, 38.10246], [126.95887, 38.1347], [126.95338, 38.17735], [127.04479, 38.25518], [127.15749, 38.30722], [127.38727, 38.33227], [127.49672, 38.30647], [127.55013, 38.32257], [128.02917, 38.31861], [128.27652, 38.41657], [128.31105, 38.58462], [128.37487, 38.62345], [128.65655, 38.61914], [131.95041, 41.5445], [130.65022, 42.32281], [130.66367, 42.38024], [130.64181, 42.41422], [130.60805, 42.4317], [130.56835, 42.43281], [130.55143, 42.52158], [130.50123, 42.61636], [130.44361, 42.54849], [130.41826, 42.6011], [130.2385, 42.71127], [130.23068, 42.80125], [130.26095, 42.9027]]]] } },
+ { type: "Feature", properties: { iso1A2: "KR", iso1A3: "KOR", iso1N3: "410", wikidata: "Q884", nameEn: "South Korea", groups: ["030", "142", "UN"], callingCodes: ["82"] }, geometry: { type: "MultiPolygon", coordinates: [[[[133.11729, 37.53115], [128.65655, 38.61914], [128.37487, 38.62345], [128.31105, 38.58462], [128.27652, 38.41657], [128.02917, 38.31861], [127.55013, 38.32257], [127.49672, 38.30647], [127.38727, 38.33227], [127.15749, 38.30722], [127.04479, 38.25518], [126.95338, 38.17735], [126.95887, 38.1347], [126.88106, 38.10246], [126.84961, 38.0344], [126.67023, 37.95852], [126.68793, 37.9175], [126.68793, 37.83728], [126.66067, 37.7897], [126.59918, 37.76364], [126.56709, 37.76857], [126.46818, 37.80873], [126.43239, 37.84095], [126.24402, 37.83113], [126.19097, 37.81462], [126.18776, 37.74728], [126.13074, 37.70512], [125.81159, 37.72949], [125.37112, 37.62643], [125.06408, 37.66334], [124.87921, 37.80827], [124.84224, 37.977], [124.67666, 38.05679], [123.85601, 37.49093], [122.80525, 33.30571], [125.99728, 32.63328], [129.2669, 34.87122], [133.11729, 37.53115]]]] } },
+ { type: "Feature", properties: { iso1A2: "KW", iso1A3: "KWT", iso1N3: "414", wikidata: "Q817", nameEn: "Kuwait", groups: ["145", "142", "UN"], callingCodes: ["965"] }, geometry: { type: "MultiPolygon", coordinates: [[[[49.00421, 28.81495], [48.59531, 29.66815], [48.40479, 29.85763], [48.17332, 30.02448], [48.06782, 30.02906], [48.01114, 29.98906], [47.7095, 30.10453], [47.37192, 30.10421], [47.15166, 30.01044], [46.89695, 29.50584], [46.5527, 29.10283], [47.46202, 29.0014], [47.58376, 28.83382], [47.59863, 28.66798], [47.70561, 28.5221], [48.42991, 28.53628], [49.00421, 28.81495]]]] } },
+ { type: "Feature", properties: { iso1A2: "KY", iso1A3: "CYM", iso1N3: "136", wikidata: "Q5785", nameEn: "Cayman Islands", country: "GB", groups: ["BOTS", "029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 345"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-82.11509, 19.60401], [-80.36068, 18.11751], [-79.32727, 20.06742], [-82.11509, 19.60401]]]] } },
+ { type: "Feature", properties: { iso1A2: "KZ", iso1A3: "KAZ", iso1N3: "398", wikidata: "Q232", nameEn: "Kazakhstan", groups: ["143", "142", "UN"], callingCodes: ["7"] }, geometry: { type: "MultiPolygon", coordinates: [[[[68.90865, 55.38148], [68.19206, 55.18823], [68.26661, 55.09226], [68.21308, 54.98645], [65.20174, 54.55216], [65.24663, 54.35721], [65.11033, 54.33028], [64.97216, 54.4212], [63.97686, 54.29763], [64.02715, 54.22679], [63.91224, 54.20013], [63.80604, 54.27079], [62.58651, 54.05871], [62.56876, 53.94047], [62.45931, 53.90737], [62.38535, 54.03961], [62.00966, 54.04134], [62.03913, 53.94768], [61.65318, 54.02445], [61.56941, 53.95703], [61.47603, 54.08048], [61.3706, 54.08464], [61.26863, 53.92797], [60.99796, 53.93699], [61.14283, 53.90063], [61.22574, 53.80268], [60.90626, 53.62937], [61.55706, 53.57144], [61.57185, 53.50112], [61.37957, 53.45887], [61.29082, 53.50992], [61.14291, 53.41481], [61.19024, 53.30536], [62.14574, 53.09626], [62.12799, 52.99133], [62.0422, 52.96105], [61.23462, 53.03227], [61.05842, 52.92217], [60.71989, 52.75923], [60.71693, 52.66245], [60.84118, 52.63912], [60.84709, 52.52228], [60.98021, 52.50068], [61.05417, 52.35096], [60.78201, 52.22067], [60.72581, 52.15538], [60.48915, 52.15175], [60.19925, 51.99173], [59.99809, 51.98263], [60.09867, 51.87135], [60.50986, 51.7964], [60.36787, 51.66815], [60.5424, 51.61675], [60.92401, 51.61124], [60.95655, 51.48615], [61.50677, 51.40687], [61.55114, 51.32746], [61.6813, 51.25716], [61.56889, 51.23679], [61.4431, 50.80679], [60.81833, 50.6629], [60.31914, 50.67705], [60.17262, 50.83312], [60.01288, 50.8163], [59.81172, 50.54451], [59.51886, 50.49937], [59.48928, 50.64216], [58.87974, 50.70852], [58.3208, 51.15151], [57.75578, 51.13852], [57.74986, 50.93017], [57.44221, 50.88354], [57.17302, 51.11253], [56.17906, 50.93204], [56.11398, 50.7471], [55.67774, 50.54508], [54.72067, 51.03261], [54.56685, 51.01958], [54.71476, 50.61214], [54.55797, 50.52006], [54.41894, 50.61214], [54.46331, 50.85554], [54.12248, 51.11542], [53.69299, 51.23466], [53.46165, 51.49445], [52.54329, 51.48444], [52.36119, 51.74161], [51.8246, 51.67916], [51.77431, 51.49536], [51.301, 51.48799], [51.26254, 51.68466], [50.59695, 51.61859], [50.26859, 51.28677], [49.97277, 51.2405], [49.76866, 51.11067], [49.39001, 51.09396], [49.41959, 50.85927], [49.12673, 50.78639], [48.86936, 50.61589], [48.57946, 50.63278], [48.90782, 50.02281], [48.68352, 49.89546], [48.42564, 49.82283], [48.24519, 49.86099], [48.10044, 50.09242], [47.58551, 50.47867], [47.30448, 50.30894], [47.34589, 50.09308], [47.18319, 49.93721], [46.9078, 49.86707], [46.78398, 49.34026], [47.04658, 49.19834], [47.00857, 49.04921], [46.78392, 48.95352], [46.49011, 48.43019], [47.11516, 48.27188], [47.12107, 47.83687], [47.38731, 47.68176], [47.41689, 47.83687], [47.64973, 47.76559], [48.15348, 47.74545], [48.45173, 47.40818], [48.52326, 47.4102], [49.01136, 46.72716], [48.51142, 46.69268], [48.54988, 46.56267], [49.16518, 46.38542], [49.32259, 46.26944], [49.88945, 46.04554], [49.2134, 44.84989], [52.26048, 41.69249], [52.47884, 41.78034], [52.97575, 42.1308], [54.20635, 42.38477], [54.95182, 41.92424], [55.45471, 41.25609], [56.00314, 41.32584], [55.97584, 44.99322], [55.97584, 44.99328], [55.97584, 44.99338], [55.97584, 44.99343], [55.97584, 44.99348], [55.97584, 44.99353], [55.97584, 44.99359], [55.97584, 44.99369], [55.97584, 44.99374], [55.97584, 44.99384], [55.97584, 44.9939], [55.97584, 44.994], [55.97584, 44.99405], [55.97584, 44.99415], [55.97584, 44.99421], [55.97584, 44.99426], [55.97584, 44.99431], [55.97584, 44.99436], [55.97584, 44.99441], [55.97594, 44.99446], [55.97605, 44.99452], [55.97605, 44.99457], [55.97605, 44.99462], [55.97605, 44.99467], [55.97605, 44.99477], [55.97615, 44.99477], [55.97615, 44.99483], [55.97615, 44.99493], [55.97615, 44.99498], [55.97615, 44.99503], [55.97615, 44.99508], [55.97625, 44.99514], [55.97636, 44.99519], [55.97636, 44.99524], [55.97646, 44.99529], [55.97646, 44.99534], [55.97656, 44.99539], [55.97667, 44.99545], [55.97677, 44.9955], [55.97677, 44.99555], [55.97677, 44.9956], [55.97687, 44.9956], [55.97698, 44.99565], [55.97698, 44.9957], [55.97708, 44.99576], [55.97718, 44.99581], [55.97729, 44.99586], [55.97739, 44.99586], [55.97739, 44.99591], [55.97749, 44.99591], [55.9776, 44.99591], [55.9777, 44.99596], [55.9777, 44.99601], [55.9778, 44.99607], [55.97791, 44.99607], [55.97801, 44.99607], [55.97801, 44.99612], [55.97811, 44.99617], [55.97822, 44.99617], [55.97832, 44.99622], [55.97842, 44.99622], [58.59711, 45.58671], [61.01475, 44.41383], [62.01711, 43.51008], [63.34656, 43.64003], [64.53885, 43.56941], [64.96464, 43.74748], [65.18666, 43.48835], [65.53277, 43.31856], [65.85194, 42.85481], [66.09482, 42.93426], [66.00546, 41.94455], [66.53302, 41.87388], [66.69129, 41.1311], [67.9644, 41.14611], [67.98511, 41.02794], [68.08273, 41.08148], [68.1271, 41.0324], [67.96736, 40.83798], [68.49983, 40.56437], [68.63, 40.59358], [68.58444, 40.91447], [68.49983, 40.99669], [68.62221, 41.03019], [68.65662, 40.93861], [68.73945, 40.96989], [68.7217, 41.05025], [69.01308, 41.22804], [69.05006, 41.36183], [69.15137, 41.43078], [69.17701, 41.43769], [69.18528, 41.45175], [69.20439, 41.45391], [69.22671, 41.46298], [69.23332, 41.45847], [69.25059, 41.46693], [69.29778, 41.43673], [69.35554, 41.47211], [69.37468, 41.46555], [69.45081, 41.46246], [69.39485, 41.51518], [69.45751, 41.56863], [69.49545, 41.545], [70.94483, 42.26238], [70.85973, 42.30188], [70.97717, 42.50147], [71.15232, 42.60486], [71.17807, 42.67381], [71.22785, 42.69248], [71.2724, 42.77853], [71.53272, 42.8014], [71.62405, 42.76613], [71.88792, 42.83578], [73.44393, 42.43098], [73.50992, 42.82356], [73.55634, 43.03071], [74.22489, 43.24657], [74.57491, 43.13702], [74.64615, 43.05881], [74.70331, 43.02519], [74.75, 42.99029], [74.88756, 42.98612], [75.22619, 42.85528], [75.29966, 42.86183], [75.72174, 42.79672], [75.82823, 42.94848], [78.48469, 42.89649], [78.91502, 42.76839], [79.19763, 42.804], [79.52921, 42.44778], [79.97364, 42.42816], [80.17807, 42.21166], [80.26841, 42.23797], [80.16892, 42.61137], [80.26886, 42.8366], [80.38169, 42.83142], [80.58999, 42.9011], [80.3735, 43.01557], [80.62913, 43.141], [80.78817, 43.14235], [80.77771, 43.30065], [80.69718, 43.32589], [80.75156, 43.44948], [80.40031, 44.10986], [80.40229, 44.23319], [80.38384, 44.63073], [79.8987, 44.89957], [80.11169, 45.03352], [81.73278, 45.3504], [82.51374, 45.1755], [82.58474, 45.40027], [82.21792, 45.56619], [83.04622, 47.19053], [83.92184, 46.98912], [84.73077, 47.01394], [84.93995, 46.87399], [85.22443, 47.04816], [85.54294, 47.06171], [85.69696, 47.2898], [85.61067, 47.49753], [85.5169, 48.05493], [85.73581, 48.3939], [86.38069, 48.46064], [86.75343, 48.70331], [86.73568, 48.99918], [86.87238, 49.12432], [87.28386, 49.11626], [87.31465, 49.23603], [87.03071, 49.25142], [86.82606, 49.51796], [86.61307, 49.60239], [86.79056, 49.74787], [86.63674, 49.80136], [86.18709, 49.50259], [85.24047, 49.60239], [84.99198, 50.06793], [84.29385, 50.27257], [83.8442, 50.87375], [83.14607, 51.00796], [82.55443, 50.75412], [81.94999, 50.79307], [81.46581, 50.77658], [81.41248, 50.97524], [81.06091, 50.94833], [81.16999, 51.15662], [80.80318, 51.28262], [80.44819, 51.20855], [80.4127, 50.95581], [80.08138, 50.77658], [79.11255, 52.01171], [77.90383, 53.29807], [76.54243, 53.99329], [76.44076, 54.16017], [76.82266, 54.1798], [76.91052, 54.4677], [75.3668, 54.07439], [75.43398, 53.98652], [75.07405, 53.80831], [73.39218, 53.44623], [73.25412, 53.61532], [73.68921, 53.86522], [73.74778, 54.07194], [73.37963, 53.96132], [72.71026, 54.1161], [72.43415, 53.92685], [72.17477, 54.36303], [71.96141, 54.17736], [71.10379, 54.13326], [71.08706, 54.33376], [71.24185, 54.64965], [71.08288, 54.71253], [70.96009, 55.10558], [70.76493, 55.3027], [70.19179, 55.1476], [69.74917, 55.35545], [69.34224, 55.36344], [68.90865, 55.38148]]]] } },
+ { type: "Feature", properties: { iso1A2: "LA", iso1A3: "LAO", iso1N3: "418", wikidata: "Q819", nameEn: "Laos", groups: ["035", "142", "UN"], callingCodes: ["856"] }, geometry: { type: "MultiPolygon", coordinates: [[[[102.1245, 22.43372], [102.03633, 22.46164], [101.98487, 22.42766], [101.91344, 22.44417], [101.90714, 22.38688], [101.86828, 22.38397], [101.7685, 22.50337], [101.68973, 22.46843], [101.61306, 22.27515], [101.56789, 22.28876], [101.53638, 22.24794], [101.60675, 22.13513], [101.57525, 22.13026], [101.62566, 21.96574], [101.7791, 21.83019], [101.74555, 21.72852], [101.83257, 21.61562], [101.80001, 21.57461], [101.7475, 21.5873], [101.7727, 21.51794], [101.74224, 21.48276], [101.74014, 21.30967], [101.84412, 21.25291], [101.83887, 21.20983], [101.76745, 21.21571], [101.79266, 21.19025], [101.7622, 21.14813], [101.70548, 21.14911], [101.66977, 21.20004], [101.60886, 21.17947], [101.59491, 21.18621], [101.6068, 21.23329], [101.54563, 21.25668], [101.29326, 21.17254], [101.2229, 21.23271], [101.26912, 21.36482], [101.19349, 21.41959], [101.2124, 21.56422], [101.15156, 21.56129], [101.16198, 21.52808], [101.00234, 21.39612], [100.80173, 21.2934], [100.72716, 21.31786], [100.63578, 21.05639], [100.55281, 21.02796], [100.50974, 20.88574], [100.64628, 20.88279], [100.60112, 20.8347], [100.51079, 20.82194], [100.36375, 20.82783], [100.1957, 20.68247], [100.08404, 20.36626], [100.09999, 20.31614], [100.09337, 20.26293], [100.11785, 20.24787], [100.1712, 20.24324], [100.16668, 20.2986], [100.22076, 20.31598], [100.25769, 20.3992], [100.33383, 20.4028], [100.37439, 20.35156], [100.41473, 20.25625], [100.44992, 20.23644], [100.4537, 20.19971], [100.47567, 20.19133], [100.51052, 20.14928], [100.55218, 20.17741], [100.58808, 20.15791], [100.5094, 19.87904], [100.398, 19.75047], [100.49604, 19.53504], [100.58219, 19.49164], [100.64606, 19.55884], [100.77231, 19.48324], [100.90302, 19.61901], [101.08928, 19.59748], [101.26545, 19.59242], [101.26991, 19.48324], [101.21347, 19.46223], [101.20604, 19.35296], [101.24911, 19.33334], [101.261, 19.12717], [101.35606, 19.04716], [101.25803, 18.89545], [101.22832, 18.73377], [101.27585, 18.68875], [101.06047, 18.43247], [101.18227, 18.34367], [101.15108, 18.25624], [101.19118, 18.2125], [101.1793, 18.0544], [101.02185, 17.87637], [100.96541, 17.57926], [101.15108, 17.47586], [101.44667, 17.7392], [101.72294, 17.92867], [101.78087, 18.07559], [101.88485, 18.02474], [102.11359, 18.21532], [102.45523, 17.97106], [102.59234, 17.96127], [102.60971, 17.95411], [102.61432, 17.92273], [102.5896, 17.84889], [102.59485, 17.83537], [102.68194, 17.80151], [102.69946, 17.81686], [102.67543, 17.84529], [102.68538, 17.86653], [102.75954, 17.89561], [102.79044, 17.93612], [102.81988, 17.94233], [102.86323, 17.97531], [102.95812, 18.0054], [102.9912, 17.9949], [103.01998, 17.97095], [103.0566, 18.00144], [103.07823, 18.03833], [103.07343, 18.12351], [103.1493, 18.17799], [103.14994, 18.23172], [103.17093, 18.2618], [103.29757, 18.30475], [103.23818, 18.34875], [103.24779, 18.37807], [103.30977, 18.4341], [103.41044, 18.4486], [103.47773, 18.42841], [103.60957, 18.40528], [103.699, 18.34125], [103.82449, 18.33979], [103.85642, 18.28666], [103.93916, 18.33914], [103.97725, 18.33631], [104.06533, 18.21656], [104.10927, 18.10826], [104.21776, 17.99335], [104.2757, 17.86139], [104.35432, 17.82871], [104.45404, 17.66788], [104.69867, 17.53038], [104.80061, 17.39367], [104.80716, 17.19025], [104.73712, 17.01404], [104.7373, 16.91125], [104.76442, 16.84752], [104.7397, 16.81005], [104.76099, 16.69302], [104.73349, 16.565], [104.88057, 16.37311], [105.00262, 16.25627], [105.06204, 16.09792], [105.42001, 16.00657], [105.38508, 15.987], [105.34115, 15.92737], [105.37959, 15.84074], [105.42285, 15.76971], [105.46573, 15.74742], [105.61756, 15.68792], [105.60446, 15.53301], [105.58191, 15.41031], [105.47635, 15.3796], [105.4692, 15.33709], [105.50662, 15.32054], [105.58043, 15.32724], [105.46661, 15.13132], [105.61162, 15.00037], [105.5121, 14.80802], [105.53864, 14.55731], [105.43783, 14.43865], [105.20894, 14.34967], [105.2759, 14.17496], [105.36775, 14.09948], [105.44869, 14.10703], [105.5561, 14.15684], [105.78338, 14.08438], [105.78182, 14.02247], [105.90791, 13.92881], [106.10405, 13.9137], [106.10094, 13.98471], [106.16632, 14.01794], [106.18656, 14.06324], [106.11962, 14.11307], [106.10872, 14.18401], [106.04801, 14.20363], [106.02311, 14.30623], [105.99509, 14.32734], [106.00131, 14.36957], [106.21302, 14.36203], [106.25194, 14.48415], [106.32355, 14.44043], [106.40916, 14.45249], [106.43874, 14.52032], [106.47766, 14.50977], [106.45898, 14.55045], [106.50723, 14.58963], [106.54148, 14.59565], [106.57106, 14.50525], [106.59908, 14.50977], [106.63333, 14.44194], [106.73762, 14.42687], [106.80767, 14.31226], [106.8497, 14.29416], [106.90574, 14.33639], [106.9649, 14.3198], [106.98825, 14.36806], [107.04585, 14.41782], [107.03962, 14.45099], [107.09722, 14.3937], [107.17038, 14.41782], [107.21241, 14.48716], [107.256, 14.48716], [107.26534, 14.54292], [107.29803, 14.58963], [107.3276, 14.58812], [107.37897, 14.54443], [107.44435, 14.52785], [107.47238, 14.61523], [107.54361, 14.69092], [107.51579, 14.79282], [107.59285, 14.87795], [107.48277, 14.93751], [107.46516, 15.00982], [107.61486, 15.0566], [107.61926, 15.13949], [107.58844, 15.20111], [107.62587, 15.2266], [107.60605, 15.37524], [107.62367, 15.42193], [107.53341, 15.40496], [107.50699, 15.48771], [107.3815, 15.49832], [107.34408, 15.62345], [107.27583, 15.62769], [107.27143, 15.71459], [107.21859, 15.74638], [107.21419, 15.83747], [107.34188, 15.89464], [107.39471, 15.88829], [107.46296, 16.01106], [107.44975, 16.08511], [107.33968, 16.05549], [107.25822, 16.13587], [107.14595, 16.17816], [107.15035, 16.26271], [107.09091, 16.3092], [107.02597, 16.31132], [106.97385, 16.30204], [106.96638, 16.34938], [106.88067, 16.43594], [106.88727, 16.52671], [106.84104, 16.55415], [106.74418, 16.41904], [106.65832, 16.47816], [106.66052, 16.56892], [106.61477, 16.60713], [106.58267, 16.6012], [106.59013, 16.62259], [106.55485, 16.68704], [106.55265, 16.86831], [106.52183, 16.87884], [106.51963, 16.92097], [106.54824, 16.92729], [106.55045, 17.0031], [106.50862, 16.9673], [106.43597, 17.01362], [106.31929, 17.20509], [106.29287, 17.3018], [106.24444, 17.24714], [106.18991, 17.28227], [106.09019, 17.36399], [105.85744, 17.63221], [105.76612, 17.67147], [105.60381, 17.89356], [105.64784, 17.96687], [105.46292, 18.22008], [105.38366, 18.15315], [105.15942, 18.38691], [105.10408, 18.43533], [105.1327, 18.58355], [105.19654, 18.64196], [105.12829, 18.70453], [104.64617, 18.85668], [104.5361, 18.97747], [103.87125, 19.31854], [104.06058, 19.43484], [104.10832, 19.51575], [104.05617, 19.61743], [104.06498, 19.66926], [104.23229, 19.70242], [104.41281, 19.70035], [104.53169, 19.61743], [104.64837, 19.62365], [104.68359, 19.72729], [104.8355, 19.80395], [104.8465, 19.91783], [104.9874, 20.09573], [104.91695, 20.15567], [104.86852, 20.14121], [104.61315, 20.24452], [104.62195, 20.36633], [104.72102, 20.40554], [104.66158, 20.47774], [104.47886, 20.37459], [104.40621, 20.3849], [104.38199, 20.47155], [104.63957, 20.6653], [104.27412, 20.91433], [104.11121, 20.96779], [103.98024, 20.91531], [103.82282, 20.8732], [103.73478, 20.6669], [103.68633, 20.66324], [103.45737, 20.82382], [103.38032, 20.79501], [103.21497, 20.89832], [103.12055, 20.89994], [103.03469, 21.05821], [102.97745, 21.05821], [102.89825, 21.24707], [102.80794, 21.25736], [102.88939, 21.3107], [102.94223, 21.46034], [102.86297, 21.4255], [102.98846, 21.58936], [102.97965, 21.74076], [102.86077, 21.71213], [102.85637, 21.84501], [102.81894, 21.83888], [102.82115, 21.73667], [102.74189, 21.66713], [102.67145, 21.65894], [102.62301, 21.91447], [102.49092, 21.99002], [102.51734, 22.02676], [102.18712, 22.30403], [102.14099, 22.40092], [102.1245, 22.43372]]]] } },
+ { type: "Feature", properties: { iso1A2: "LB", iso1A3: "LBN", iso1N3: "422", wikidata: "Q822", nameEn: "Lebanon", aliases: ["RL"], groups: ["145", "142", "UN"], callingCodes: ["961"] }, geometry: { type: "MultiPolygon", coordinates: [[[[35.94816, 33.47886], [35.94465, 33.52774], [36.05723, 33.57904], [35.9341, 33.6596], [36.06778, 33.82927], [36.14517, 33.85118], [36.3967, 33.83365], [36.38263, 33.86579], [36.28589, 33.91981], [36.41078, 34.05253], [36.50576, 34.05982], [36.5128, 34.09916], [36.62537, 34.20251], [36.59195, 34.2316], [36.58667, 34.27667], [36.60778, 34.31009], [36.56556, 34.31881], [36.53039, 34.3798], [36.55853, 34.41609], [36.46179, 34.46541], [36.4442, 34.50165], [36.34745, 34.5002], [36.3369, 34.52629], [36.39846, 34.55672], [36.41429, 34.61175], [36.45299, 34.59438], [36.46003, 34.6378], [36.42941, 34.62505], [36.35384, 34.65447], [36.35135, 34.68516], [36.32399, 34.69334], [36.29165, 34.62991], [35.98718, 34.64977], [35.97386, 34.63322], [35.48515, 34.70851], [34.78515, 33.20368], [35.10645, 33.09318], [35.1924, 33.08743], [35.31429, 33.10515], [35.35223, 33.05617], [35.43059, 33.06659], [35.448, 33.09264], [35.50272, 33.09056], [35.50335, 33.114], [35.52573, 33.11921], [35.54228, 33.19865], [35.5362, 33.23196], [35.54808, 33.236], [35.54544, 33.25513], [35.55555, 33.25844], [35.56523, 33.28969], [35.58326, 33.28381], [35.58502, 33.26653], [35.62283, 33.24226], [35.62019, 33.27278], [35.77477, 33.33609], [35.81324, 33.36354], [35.82577, 33.40479], [35.88668, 33.43183], [35.94816, 33.47886]]]] } },
+ { type: "Feature", properties: { iso1A2: "LC", iso1A3: "LCA", iso1N3: "662", wikidata: "Q760", nameEn: "St. Lucia", aliases: ["WL"], groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 758"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-59.95997, 14.20285], [-61.69315, 14.26451], [-59.94058, 12.34011], [-59.95997, 14.20285]]]] } },
+ { type: "Feature", properties: { iso1A2: "LI", iso1A3: "LIE", iso1N3: "438", wikidata: "Q347", nameEn: "Liechtenstein", aliases: ["FL"], groups: ["155", "150", "UN"], callingCodes: ["423"] }, geometry: { type: "MultiPolygon", coordinates: [[[[9.60717, 47.06091], [9.61216, 47.07732], [9.63395, 47.08443], [9.62623, 47.14685], [9.56539, 47.17124], [9.58264, 47.20673], [9.56981, 47.21926], [9.55176, 47.22585], [9.56766, 47.24281], [9.53116, 47.27029], [9.52406, 47.24959], [9.50318, 47.22153], [9.4891, 47.19346], [9.48774, 47.17402], [9.51044, 47.13727], [9.52089, 47.10019], [9.51362, 47.08505], [9.47139, 47.06402], [9.47548, 47.05257], [9.54041, 47.06495], [9.55721, 47.04762], [9.60717, 47.06091]]]] } },
+ { type: "Feature", properties: { iso1A2: "LK", iso1A3: "LKA", iso1N3: "144", wikidata: "Q854", nameEn: "Sri Lanka", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["94"] }, geometry: { type: "MultiPolygon", coordinates: [[[[76.59015, 5.591], [85.15017, 5.21497], [80.48418, 10.20786], [79.42124, 9.80115], [79.50447, 8.91876], [76.59015, 5.591]]]] } },
+ { type: "Feature", properties: { iso1A2: "LR", iso1A3: "LBR", iso1N3: "430", wikidata: "Q1014", nameEn: "Liberia", groups: ["011", "202", "002", "UN"], callingCodes: ["231"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-8.47114, 7.55676], [-8.55874, 7.62525], [-8.55874, 7.70167], [-8.67814, 7.69428], [-8.72789, 7.51429], [-8.8448, 7.35149], [-8.85724, 7.26019], [-8.93435, 7.2824], [-9.09107, 7.1985], [-9.18311, 7.30461], [-9.20798, 7.38109], [-9.305, 7.42056], [-9.41943, 7.41809], [-9.48161, 7.37122], [-9.37465, 7.62032], [-9.35724, 7.74111], [-9.44928, 7.9284], [-9.41445, 8.02448], [-9.50898, 8.18455], [-9.47415, 8.35195], [-9.77763, 8.54633], [-10.05873, 8.42578], [-10.05375, 8.50697], [-10.14579, 8.52665], [-10.203, 8.47991], [-10.27575, 8.48711], [-10.30084, 8.30008], [-10.31635, 8.28554], [-10.29839, 8.21283], [-10.35227, 8.15223], [-10.45023, 8.15627], [-10.51554, 8.1393], [-10.57523, 8.04829], [-10.60492, 8.04072], [-10.60422, 7.7739], [-11.29417, 7.21576], [-11.4027, 6.97746], [-11.50429, 6.92704], [-12.15048, 6.15992], [-7.52774, 3.7105], [-7.53259, 4.35145], [-7.59349, 4.8909], [-7.53876, 4.94294], [-7.55369, 5.08667], [-7.48901, 5.14118], [-7.46165, 5.26256], [-7.36463, 5.32944], [-7.43428, 5.42355], [-7.37209, 5.61173], [-7.43926, 5.74787], [-7.43677, 5.84687], [-7.46165, 5.84934], [-7.48155, 5.80974], [-7.67309, 5.94337], [-7.70294, 5.90625], [-7.78254, 5.99037], [-7.79747, 6.07696], [-7.8497, 6.08932], [-7.83478, 6.20309], [-7.90692, 6.27728], [-8.00642, 6.31684], [-8.17557, 6.28222], [-8.3298, 6.36381], [-8.38453, 6.35887], [-8.45666, 6.49977], [-8.48652, 6.43797], [-8.59456, 6.50612], [-8.31736, 6.82837], [-8.29249, 7.1691], [-8.37458, 7.25794], [-8.41935, 7.51203], [-8.47114, 7.55676]]]] } },
+ { type: "Feature", properties: { iso1A2: "LS", iso1A3: "LSO", iso1N3: "426", wikidata: "Q1013", nameEn: "Lesotho", groups: ["018", "202", "002", "UN"], driveSide: "left", callingCodes: ["266"] }, geometry: { type: "MultiPolygon", coordinates: [[[[29.33204, -29.45598], [29.44883, -29.3772], [29.40524, -29.21246], [28.68043, -28.58744], [28.65091, -28.57025], [28.40612, -28.6215], [28.30518, -28.69531], [28.2348, -28.69471], [28.1317, -28.7293], [28.02503, -28.85991], [27.98675, -28.8787], [27.9392, -28.84864], [27.88933, -28.88156], [27.8907, -28.91612], [27.75458, -28.89839], [27.55974, -29.18954], [27.5158, -29.2261], [27.54258, -29.25575], [27.48679, -29.29349], [27.45125, -29.29708], [27.47254, -29.31968], [27.4358, -29.33465], [27.33464, -29.48161], [27.01016, -29.65439], [27.09489, -29.72796], [27.22719, -30.00718], [27.29603, -30.05473], [27.32555, -30.14785], [27.40778, -30.14577], [27.37293, -30.19401], [27.36649, -30.27246], [27.38108, -30.33456], [27.45452, -30.32239], [27.56901, -30.42504], [27.56781, -30.44562], [27.62137, -30.50509], [27.6521, -30.51707], [27.67819, -30.53437], [27.69467, -30.55862], [27.74814, -30.60635], [28.12073, -30.68072], [28.2319, -30.28476], [28.399, -30.1592], [28.68627, -30.12885], [28.80222, -30.10579], [28.9338, -30.05072], [29.16548, -29.91706], [29.12553, -29.76266], [29.28545, -29.58456], [29.33204, -29.45598]]]] } },
+ { type: "Feature", properties: { iso1A2: "LT", iso1A3: "LTU", iso1N3: "440", wikidata: "Q37", nameEn: "Lithuania", groups: ["EU", "154", "150", "UN"], callingCodes: ["370"] }, geometry: { type: "MultiPolygon", coordinates: [[[[24.89005, 56.46666], [24.83686, 56.41565], [24.70022, 56.40483], [24.57353, 56.31525], [24.58143, 56.29125], [24.42746, 56.26522], [24.32334, 56.30226], [24.13139, 56.24881], [24.02657, 56.3231], [23.75726, 56.37282], [23.49803, 56.34307], [23.40486, 56.37689], [23.31606, 56.3827], [23.17312, 56.36795], [23.09531, 56.30511], [22.96988, 56.41213], [22.83048, 56.367], [22.69354, 56.36284], [22.56441, 56.39305], [22.3361, 56.4016], [22.09728, 56.42851], [22.00548, 56.41508], [21.74558, 56.33181], [21.57888, 56.31406], [21.49736, 56.29106], [21.24644, 56.16917], [21.15016, 56.07818], [20.68447, 56.04073], [20.60454, 55.40986], [20.95181, 55.27994], [21.26425, 55.24456], [21.35465, 55.28427], [21.38446, 55.29348], [21.46766, 55.21115], [21.51095, 55.18507], [21.55605, 55.20311], [21.64954, 55.1791], [21.85521, 55.09493], [21.96505, 55.07353], [21.99543, 55.08691], [22.03984, 55.07888], [22.02582, 55.05078], [22.06087, 55.02935], [22.11697, 55.02131], [22.14267, 55.05345], [22.31562, 55.0655], [22.47688, 55.04408], [22.58907, 55.07085], [22.60075, 55.01863], [22.65451, 54.97037], [22.68723, 54.9811], [22.76422, 54.92521], [22.85083, 54.88711], [22.87317, 54.79492], [22.73631, 54.72952], [22.73397, 54.66604], [22.75467, 54.6483], [22.74225, 54.64339], [22.7522, 54.63525], [22.68021, 54.58486], [22.71293, 54.56454], [22.67788, 54.532], [22.70208, 54.45312], [22.7253, 54.41732], [22.79705, 54.36264], [22.83756, 54.40827], [23.00584, 54.38514], [22.99649, 54.35927], [23.05726, 54.34565], [23.04323, 54.31567], [23.104, 54.29794], [23.13905, 54.31567], [23.15526, 54.31076], [23.15938, 54.29894], [23.24656, 54.25701], [23.3494, 54.25155], [23.39525, 54.21672], [23.42418, 54.17911], [23.45223, 54.17775], [23.49196, 54.14764], [23.52702, 54.04622], [23.48261, 53.98855], [23.51284, 53.95052], [23.61677, 53.92691], [23.71726, 53.93379], [23.80543, 53.89558], [23.81309, 53.94205], [23.95098, 53.9613], [23.98837, 53.92554], [24.19638, 53.96405], [24.34128, 53.90076], [24.44411, 53.90076], [24.62275, 54.00217], [24.69652, 54.01901], [24.69185, 53.96543], [24.74279, 53.96663], [24.85311, 54.02862], [24.77131, 54.11091], [24.96894, 54.17589], [24.991, 54.14241], [25.0728, 54.13419], [25.19199, 54.219], [25.22705, 54.26271], [25.35559, 54.26544], [25.509, 54.30267], [25.56823, 54.25212], [25.51452, 54.17799], [25.54724, 54.14925], [25.64875, 54.1259], [25.71084, 54.16704], [25.78563, 54.15747], [25.78553, 54.23327], [25.68513, 54.31727], [25.55425, 54.31591], [25.5376, 54.33158], [25.63371, 54.42075], [25.62203, 54.4656], [25.64813, 54.48704], [25.68045, 54.5321], [25.75977, 54.57252], [25.74122, 54.80108], [25.89462, 54.93438], [25.99129, 54.95705], [26.05907, 54.94631], [26.13386, 54.98924], [26.20397, 54.99729], [26.26941, 55.08032], [26.23202, 55.10439], [26.30628, 55.12536], [26.35121, 55.1525], [26.46249, 55.12814], [26.51481, 55.16051], [26.54753, 55.14181], [26.69243, 55.16718], [26.68075, 55.19787], [26.72983, 55.21788], [26.73017, 55.24226], [26.835, 55.28182], [26.83266, 55.30444], [26.80929, 55.31642], [26.6714, 55.33902], [26.5709, 55.32572], [26.44937, 55.34832], [26.5522, 55.40277], [26.55094, 55.5093], [26.63167, 55.57887], [26.63231, 55.67968], [26.58248, 55.6754], [26.46661, 55.70375], [26.39561, 55.71156], [26.18509, 55.86813], [26.03815, 55.95884], [25.90047, 56.0013], [25.85893, 56.00188], [25.81773, 56.05444], [25.69246, 56.08892], [25.68588, 56.14725], [25.53621, 56.16663], [25.39751, 56.15707], [25.23099, 56.19147], [25.09325, 56.1878], [25.05762, 56.26742], [24.89005, 56.46666]]]] } },
+ { type: "Feature", properties: { iso1A2: "LU", iso1A3: "LUX", iso1N3: "442", wikidata: "Q32", nameEn: "Luxembourg", groups: ["EU", "155", "150", "UN"], callingCodes: ["352"] }, geometry: { type: "MultiPolygon", coordinates: [[[[6.1379, 50.12964], [6.1137, 50.13668], [6.12028, 50.16374], [6.08577, 50.17246], [6.06406, 50.15344], [6.03093, 50.16362], [6.02488, 50.18283], [5.96453, 50.17259], [5.95929, 50.13295], [5.89488, 50.11476], [5.8857, 50.07824], [5.85474, 50.06342], [5.86904, 50.04614], [5.8551, 50.02683], [5.81866, 50.01286], [5.82331, 49.99662], [5.83968, 49.9892], [5.83467, 49.97823], [5.81163, 49.97142], [5.80833, 49.96451], [5.77291, 49.96056], [5.77314, 49.93646], [5.73621, 49.89796], [5.78415, 49.87922], [5.75269, 49.8711], [5.75861, 49.85631], [5.74567, 49.85368], [5.75884, 49.84811], [5.74953, 49.84709], [5.74975, 49.83933], [5.74076, 49.83823], [5.7404, 49.83452], [5.74844, 49.82435], [5.74364, 49.82058], [5.74953, 49.81428], [5.75409, 49.79239], [5.78871, 49.7962], [5.82245, 49.75048], [5.83149, 49.74729], [5.82562, 49.72395], [5.84193, 49.72161], [5.86503, 49.72739], [5.88677, 49.70951], [5.86527, 49.69291], [5.86175, 49.67862], [5.9069, 49.66377], [5.90164, 49.6511], [5.90599, 49.63853], [5.88552, 49.63507], [5.88393, 49.62802], [5.87609, 49.62047], [5.8762, 49.60898], [5.84826, 49.5969], [5.84971, 49.58674], [5.86986, 49.58756], [5.87256, 49.57539], [5.8424, 49.56082], [5.84692, 49.55663], [5.84143, 49.5533], [5.81838, 49.54777], [5.80871, 49.5425], [5.81664, 49.53775], [5.83648, 49.5425], [5.84466, 49.53027], [5.83467, 49.52717], [5.83389, 49.52152], [5.86571, 49.50015], [5.94128, 49.50034], [5.94224, 49.49608], [5.96876, 49.49053], [5.97693, 49.45513], [6.02648, 49.45451], [6.02743, 49.44845], [6.04176, 49.44801], [6.05553, 49.46663], [6.07887, 49.46399], [6.08373, 49.45594], [6.10072, 49.45268], [6.09845, 49.46351], [6.10325, 49.4707], [6.12346, 49.4735], [6.12814, 49.49365], [6.14321, 49.48796], [6.16115, 49.49297], [6.15366, 49.50226], [6.17386, 49.50934], [6.19543, 49.50536], [6.2409, 49.51408], [6.25029, 49.50609], [6.27875, 49.503], [6.28818, 49.48465], [6.3687, 49.4593], [6.36778, 49.46937], [6.36907, 49.48931], [6.36788, 49.50377], [6.35666, 49.52931], [6.38072, 49.55171], [6.38228, 49.55855], [6.35825, 49.57053], [6.36676, 49.57813], [6.38024, 49.57593], [6.38342, 49.5799], [6.37464, 49.58886], [6.385, 49.59946], [6.39822, 49.60081], [6.41861, 49.61723], [6.4413, 49.65722], [6.43768, 49.66021], [6.42726, 49.66078], [6.42937, 49.66857], [6.44654, 49.67799], [6.46048, 49.69092], [6.48014, 49.69767], [6.49785, 49.71118], [6.50647, 49.71353], [6.5042, 49.71808], [6.49694, 49.72205], [6.49535, 49.72645], [6.50261, 49.72718], [6.51397, 49.72058], [6.51805, 49.72425], [6.50193, 49.73291], [6.50174, 49.75292], [6.51646, 49.75961], [6.51828, 49.76855], [6.51056, 49.77515], [6.51669, 49.78336], [6.50534, 49.78952], [6.52169, 49.79787], [6.53122, 49.80666], [6.52121, 49.81338], [6.51215, 49.80124], [6.50647, 49.80916], [6.48718, 49.81267], [6.47111, 49.82263], [6.45425, 49.81164], [6.44131, 49.81443], [6.42905, 49.81091], [6.42521, 49.81591], [6.40022, 49.82029], [6.36576, 49.85032], [6.34267, 49.84974], [6.33585, 49.83785], [6.32098, 49.83728], [6.32303, 49.85133], [6.30963, 49.87021], [6.29692, 49.86685], [6.28874, 49.87592], [6.26146, 49.88203], [6.23496, 49.89972], [6.22926, 49.92096], [6.21882, 49.92403], [6.22608, 49.929], [6.22094, 49.94955], [6.19856, 49.95053], [6.19089, 49.96991], [6.18045, 49.96611], [6.18554, 49.95622], [6.17872, 49.9537], [6.16466, 49.97086], [6.1701, 49.98518], [6.14147, 49.99563], [6.14948, 50.00908], [6.13806, 50.01056], [6.1295, 50.01849], [6.13273, 50.02019], [6.13794, 50.01466], [6.14666, 50.02207], [6.13044, 50.02929], [6.13458, 50.04141], [6.11274, 50.05916], [6.12055, 50.09171], [6.1379, 50.12964]]]] } },
+ { type: "Feature", properties: { iso1A2: "LV", iso1A3: "LVA", iso1N3: "428", wikidata: "Q211", nameEn: "Latvia", groups: ["EU", "154", "150", "UN"], callingCodes: ["371"] }, geometry: { type: "MultiPolygon", coordinates: [[[[27.34698, 57.52242], [26.90364, 57.62823], [26.54675, 57.51813], [26.46527, 57.56885], [26.29253, 57.59244], [26.1866, 57.6849], [26.2029, 57.7206], [26.08098, 57.76619], [26.0543, 57.76105], [26.03332, 57.7718], [26.02415, 57.76865], [26.02069, 57.77169], [26.0266, 57.77441], [26.027, 57.78158], [26.02456, 57.78342], [26.0324, 57.79037], [26.05949, 57.84744], [25.73499, 57.90193], [25.29581, 58.08288], [25.28237, 57.98539], [25.19484, 58.0831], [24.3579, 57.87471], [24.26221, 57.91787], [23.20055, 57.56697], [22.80496, 57.87798], [19.84909, 57.57876], [19.64795, 57.06466], [20.68447, 56.04073], [21.15016, 56.07818], [21.24644, 56.16917], [21.49736, 56.29106], [21.57888, 56.31406], [21.74558, 56.33181], [22.00548, 56.41508], [22.09728, 56.42851], [22.3361, 56.4016], [22.56441, 56.39305], [22.69354, 56.36284], [22.83048, 56.367], [22.96988, 56.41213], [23.09531, 56.30511], [23.17312, 56.36795], [23.31606, 56.3827], [23.40486, 56.37689], [23.49803, 56.34307], [23.75726, 56.37282], [24.02657, 56.3231], [24.13139, 56.24881], [24.32334, 56.30226], [24.42746, 56.26522], [24.58143, 56.29125], [24.57353, 56.31525], [24.70022, 56.40483], [24.83686, 56.41565], [24.89005, 56.46666], [25.05762, 56.26742], [25.09325, 56.1878], [25.23099, 56.19147], [25.39751, 56.15707], [25.53621, 56.16663], [25.68588, 56.14725], [25.69246, 56.08892], [25.81773, 56.05444], [25.85893, 56.00188], [25.90047, 56.0013], [26.03815, 55.95884], [26.18509, 55.86813], [26.39561, 55.71156], [26.46661, 55.70375], [26.58248, 55.6754], [26.63231, 55.67968], [26.64888, 55.70515], [26.71802, 55.70645], [26.76872, 55.67658], [26.87448, 55.7172], [26.97153, 55.8102], [27.1559, 55.85032], [27.27804, 55.78299], [27.3541, 55.8089], [27.61683, 55.78558], [27.63065, 55.89687], [27.97865, 56.11849], [28.15217, 56.16964], [28.23716, 56.27588], [28.16599, 56.37806], [28.19057, 56.44637], [28.10069, 56.524], [28.13526, 56.57989], [28.04768, 56.59004], [27.86101, 56.88204], [27.66511, 56.83921], [27.86101, 57.29402], [27.52453, 57.42826], [27.56832, 57.53728], [27.34698, 57.52242]]]] } },
+ { type: "Feature", properties: { iso1A2: "LY", iso1A3: "LBY", iso1N3: "434", wikidata: "Q1016", nameEn: "Libya", groups: ["015", "002", "UN"], callingCodes: ["218"] }, geometry: { type: "MultiPolygon", coordinates: [[[[26.92891, 33.39516], [11.58941, 33.36891], [11.55852, 33.1409], [11.51549, 33.09826], [11.46037, 32.6307], [11.57828, 32.48013], [11.53898, 32.4138], [11.04234, 32.2145], [10.7315, 31.97235], [10.62788, 31.96629], [10.48497, 31.72956], [10.31364, 31.72648], [10.12239, 31.42098], [10.29516, 30.90337], [9.88152, 30.34074], [9.76848, 30.34366], [9.55544, 30.23971], [9.3876, 30.16738], [9.78136, 29.40961], [9.89569, 26.57696], [9.51696, 26.39148], [9.38834, 26.19288], [10.03146, 25.35635], [10.02432, 24.98124], [10.33159, 24.5465], [10.85323, 24.5595], [11.41061, 24.21456], [11.62498, 24.26669], [11.96886, 23.51735], [13.5631, 23.16574], [14.22918, 22.61719], [14.99751, 23.00539], [15.99566, 23.49639], [23.99539, 19.49944], [23.99715, 20.00038], [24.99794, 19.99661], [24.99885, 21.99535], [24.99968, 29.24574], [24.71117, 30.17441], [25.01077, 30.73861], [24.8458, 31.39877], [26.92891, 33.39516]]]] } },
+ { type: "Feature", properties: { iso1A2: "MA", iso1A3: "MAR", iso1N3: "504", wikidata: "Q1028", nameEn: "Morocco", groups: ["015", "002", "UN"], callingCodes: ["212"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.27707, 35.35051], [-5.10878, 36.05227], [-7.2725, 35.73269], [-14.43883, 27.02969], [-17.27295, 21.93519], [-17.21511, 21.34226], [-17.02707, 21.34022], [-16.9978, 21.36239], [-16.44269, 21.39745], [-14.78487, 21.36587], [-14.47329, 21.63839], [-14.48112, 22.00886], [-14.1291, 22.41636], [-14.10361, 22.75501], [-13.75627, 23.77231], [-13.00628, 24.01923], [-12.92147, 24.39502], [-12.12281, 25.13682], [-12.06001, 26.04442], [-11.62052, 26.05229], [-11.38635, 26.611], [-11.23622, 26.72023], [-11.35695, 26.8505], [-10.68417, 26.90984], [-9.81998, 26.71379], [-9.56957, 26.90042], [-9.08698, 26.98639], [-8.71787, 26.9898], [-8.77527, 27.66663], [-8.66879, 27.6666], [-8.6715, 28.71194], [-7.61585, 29.36252], [-6.95824, 29.50924], [-6.78351, 29.44634], [-6.69965, 29.51623], [-5.75616, 29.61407], [-5.72121, 29.52322], [-5.58831, 29.48103], [-5.21671, 29.95253], [-4.6058, 30.28343], [-4.31774, 30.53229], [-3.64735, 30.67539], [-3.65418, 30.85566], [-3.54944, 31.0503], [-3.77103, 31.14984], [-3.77647, 31.31912], [-3.66386, 31.39202], [-3.66314, 31.6339], [-2.82784, 31.79459], [-2.93873, 32.06557], [-2.46166, 32.16603], [-1.22829, 32.07832], [-1.15735, 32.12096], [-1.24453, 32.1917], [-1.24998, 32.32993], [-0.9912, 32.52467], [-1.37794, 32.73628], [-1.54244, 32.95499], [-1.46249, 33.0499], [-1.67067, 33.27084], [-1.59508, 33.59929], [-1.73494, 33.71721], [-1.64666, 34.10405], [-1.78042, 34.39018], [-1.69788, 34.48056], [-1.84569, 34.61907], [-1.73707, 34.74226], [-1.97469, 34.886], [-1.97833, 34.93218], [-2.04734, 34.93218], [-2.21445, 35.04378], [-2.21248, 35.08532], [-2.27707, 35.35051]], [[-2.91909, 35.33927], [-2.92272, 35.27509], [-2.93893, 35.26737], [-2.95065, 35.26576], [-2.95431, 35.2728], [-2.96516, 35.27967], [-2.96826, 35.28296], [-2.96507, 35.28801], [-2.97035, 35.28852], [-2.96978, 35.29459], [-2.96648, 35.30475], [-2.96038, 35.31609], [-2.91909, 35.33927]], [[-3.90602, 35.21494], [-3.89343, 35.22728], [-3.88372, 35.20767], [-3.90602, 35.21494]], [[-4.30191, 35.17419], [-4.29436, 35.17149], [-4.30112, 35.17058], [-4.30191, 35.17419]], [[-2.40316, 35.16893], [-2.45965, 35.16527], [-2.43262, 35.20652], [-2.40316, 35.16893]], [[-5.38491, 35.92591], [-5.21179, 35.90091], [-5.34379, 35.8711], [-5.35844, 35.87375], [-5.37338, 35.88417], [-5.38491, 35.92591]]]] } },
+ { type: "Feature", properties: { iso1A2: "MC", iso1A3: "MCO", iso1N3: "492", wikidata: "Q235", nameEn: "Monaco", groups: ["155", "150", "UN"], callingCodes: ["377"] }, geometry: { type: "MultiPolygon", coordinates: [[[[7.47823, 43.73341], [7.4379, 43.74963], [7.4389, 43.75151], [7.43708, 43.75197], [7.43624, 43.75014], [7.43013, 43.74895], [7.42809, 43.74396], [7.42443, 43.74087], [7.42299, 43.74176], [7.42062, 43.73977], [7.41233, 43.73439], [7.41298, 43.73311], [7.41291, 43.73168], [7.41113, 43.73156], [7.40903, 43.7296], [7.42422, 43.72209], [7.47823, 43.73341]]]] } },
+ { type: "Feature", properties: { iso1A2: "MD", iso1A3: "MDA", iso1N3: "498", wikidata: "Q217", nameEn: "Moldova", groups: ["151", "150", "UN"], callingCodes: ["373"] }, geometry: { type: "MultiPolygon", coordinates: [[[[27.74422, 48.45926], [27.6658, 48.44034], [27.59027, 48.46311], [27.5889, 48.49224], [27.46942, 48.454], [27.44333, 48.41209], [27.37741, 48.41026], [27.37604, 48.44398], [27.32159, 48.4434], [27.27855, 48.37534], [27.13434, 48.37288], [27.08078, 48.43214], [27.0231, 48.42485], [27.03821, 48.37653], [26.93384, 48.36558], [26.85556, 48.41095], [26.71274, 48.40388], [26.82809, 48.31629], [26.79239, 48.29071], [26.6839, 48.35828], [26.62823, 48.25804], [26.81161, 48.25049], [26.87708, 48.19919], [26.94265, 48.1969], [26.98042, 48.15752], [26.96119, 48.13003], [27.04118, 48.12522], [27.02985, 48.09083], [27.15622, 47.98538], [27.1618, 47.92391], [27.29069, 47.73722], [27.25519, 47.71366], [27.32202, 47.64009], [27.3979, 47.59473], [27.47942, 47.48113], [27.55731, 47.46637], [27.60263, 47.32507], [27.68706, 47.28962], [27.73172, 47.29248], [27.81892, 47.1381], [28.09095, 46.97621], [28.12173, 46.82283], [28.24808, 46.64305], [28.22281, 46.50481], [28.25769, 46.43334], [28.18902, 46.35283], [28.19864, 46.31869], [28.10937, 46.22852], [28.13684, 46.18099], [28.08612, 46.01105], [28.13111, 45.92819], [28.16568, 45.6421], [28.08927, 45.6051], [28.18741, 45.47358], [28.21139, 45.46895], [28.30201, 45.54744], [28.41836, 45.51715], [28.43072, 45.48538], [28.51449, 45.49982], [28.49252, 45.56716], [28.54196, 45.58062], [28.51587, 45.6613], [28.47879, 45.66994], [28.52823, 45.73803], [28.70401, 45.78019], [28.69852, 45.81753], [28.78503, 45.83475], [28.74383, 45.96664], [28.98004, 46.00385], [29.00613, 46.04962], [28.94643, 46.09176], [29.06656, 46.19716], [28.94953, 46.25852], [28.98478, 46.31803], [29.004, 46.31495], [28.9306, 46.45699], [29.01241, 46.46177], [29.02409, 46.49582], [29.23547, 46.55435], [29.24886, 46.37912], [29.35357, 46.49505], [29.49914, 46.45889], [29.5939, 46.35472], [29.6763, 46.36041], [29.66359, 46.4215], [29.74496, 46.45605], [29.88329, 46.35851], [29.94114, 46.40114], [30.09103, 46.38694], [30.16794, 46.40967], [30.02511, 46.45132], [29.88916, 46.54302], [29.94409, 46.56002], [29.9743, 46.75325], [29.94522, 46.80055], [29.98814, 46.82358], [29.87405, 46.88199], [29.75458, 46.8604], [29.72986, 46.92234], [29.57056, 46.94766], [29.62137, 47.05069], [29.61038, 47.09932], [29.53044, 47.07851], [29.49732, 47.12878], [29.57696, 47.13581], [29.54996, 47.24962], [29.59665, 47.25521], [29.5733, 47.36508], [29.48678, 47.36043], [29.47854, 47.30366], [29.39889, 47.30179], [29.3261, 47.44664], [29.18603, 47.43387], [29.11743, 47.55001], [29.22414, 47.60012], [29.22242, 47.73607], [29.27255, 47.79953], [29.20663, 47.80367], [29.27804, 47.88893], [29.19839, 47.89261], [29.1723, 47.99013], [28.9306, 47.96255], [28.8414, 48.03392], [28.85232, 48.12506], [28.69896, 48.13106], [28.53921, 48.17453], [28.48428, 48.0737], [28.42454, 48.12047], [28.43701, 48.15832], [28.38712, 48.17567], [28.34009, 48.13147], [28.30609, 48.14018], [28.30586, 48.1597], [28.34912, 48.1787], [28.36996, 48.20543], [28.35519, 48.24957], [28.32508, 48.23384], [28.2856, 48.23202], [28.19314, 48.20749], [28.17666, 48.25963], [28.07504, 48.23494], [28.09873, 48.3124], [28.04527, 48.32661], [27.95883, 48.32368], [27.88391, 48.36699], [27.87533, 48.4037], [27.81902, 48.41874], [27.79225, 48.44244], [27.74422, 48.45926]]]] } },
+ { type: "Feature", properties: { iso1A2: "ME", iso1A3: "MNE", iso1N3: "499", wikidata: "Q236", nameEn: "Montenegro", groups: ["039", "150", "UN"], callingCodes: ["382"] }, geometry: { type: "MultiPolygon", coordinates: [[[[19.22807, 43.5264], [19.15685, 43.53943], [19.13933, 43.5282], [19.04934, 43.50384], [19.01078, 43.55806], [18.91379, 43.50299], [18.95469, 43.49367], [18.96053, 43.45042], [19.01078, 43.43854], [19.04071, 43.397], [19.08673, 43.31453], [19.08206, 43.29668], [19.04233, 43.30008], [19.00844, 43.24988], [18.95001, 43.29327], [18.95819, 43.32899], [18.90911, 43.36383], [18.83912, 43.34795], [18.84794, 43.33735], [18.85342, 43.32426], [18.76538, 43.29838], [18.6976, 43.25243], [18.71747, 43.2286], [18.66605, 43.2056], [18.64735, 43.14766], [18.66254, 43.03928], [18.52232, 43.01451], [18.49076, 42.95553], [18.49661, 42.89306], [18.4935, 42.86433], [18.47633, 42.85829], [18.45921, 42.81682], [18.47324, 42.74992], [18.56789, 42.72074], [18.55221, 42.69045], [18.54603, 42.69171], [18.54841, 42.68328], [18.57373, 42.64429], [18.52232, 42.62279], [18.55504, 42.58409], [18.53751, 42.57376], [18.49778, 42.58409], [18.43735, 42.55921], [18.44307, 42.51077], [18.43588, 42.48556], [18.52152, 42.42302], [18.54128, 42.39171], [18.45131, 42.21682], [19.26406, 41.74971], [19.37597, 41.84849], [19.37451, 41.8842], [19.33812, 41.90669], [19.34601, 41.95675], [19.37691, 41.96977], [19.36867, 42.02564], [19.37548, 42.06835], [19.40687, 42.10024], [19.28623, 42.17745], [19.42, 42.33019], [19.42352, 42.36546], [19.4836, 42.40831], [19.65972, 42.62774], [19.73244, 42.66299], [19.77375, 42.58517], [19.74731, 42.57422], [19.76549, 42.50237], [19.82333, 42.46581], [19.9324, 42.51699], [20.00842, 42.5109], [20.01834, 42.54622], [20.07761, 42.55582], [20.0969, 42.65559], [20.02915, 42.71147], [20.02088, 42.74789], [20.04898, 42.77701], [20.2539, 42.76245], [20.27869, 42.81945], [20.35692, 42.8335], [20.34528, 42.90676], [20.16415, 42.97177], [20.14896, 42.99058], [20.12325, 42.96237], [20.05431, 42.99571], [20.04729, 43.02732], [19.98887, 43.0538], [19.96549, 43.11098], [19.92576, 43.08539], [19.79255, 43.11951], [19.76918, 43.16044], [19.64063, 43.19027], [19.62661, 43.2286], [19.54598, 43.25158], [19.52962, 43.31623], [19.48171, 43.32644], [19.44315, 43.38846], [19.22229, 43.47926], [19.22807, 43.5264]]]] } },
+ { type: "Feature", properties: { iso1A2: "MF", iso1A3: "MAF", iso1N3: "663", wikidata: "Q126125", nameEn: "Saint-Martin", country: "FR", groups: ["Q3320166", "EU", "029", "003", "419", "019", "UN"], callingCodes: ["590"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-62.93924, 18.02904], [-62.62718, 18.26185], [-63.35989, 18.06012], [-63.33064, 17.9615], [-63.13502, 18.05445], [-63.11042, 18.05339], [-63.09686, 18.04608], [-63.07759, 18.04943], [-63.0579, 18.06614], [-63.04039, 18.05619], [-63.02323, 18.05757], [-62.93924, 18.02904]]]] } },
+ { type: "Feature", properties: { iso1A2: "MG", iso1A3: "MDG", iso1N3: "450", wikidata: "Q1019", nameEn: "Madagascar", aliases: ["RM"], groups: ["014", "202", "002", "UN"], callingCodes: ["261"] }, geometry: { type: "MultiPolygon", coordinates: [[[[51.93891, -10.85085], [45.84651, -12.77177], [42.14681, -19.63341], [45.80092, -33.00974], [51.93891, -10.85085]]]] } },
+ { type: "Feature", properties: { iso1A2: "MH", iso1A3: "MHL", iso1N3: "584", wikidata: "Q709", nameEn: "Marshall Islands", groups: ["057", "009", "UN"], roadSpeedUnit: "mph", callingCodes: ["692"] }, geometry: { type: "MultiPolygon", coordinates: [[[[169, 3.9], [173.53711, 5.70687], [169.29099, 15.77133], [159.04653, 10.59067], [169, 3.9]]]] } },
+ { type: "Feature", properties: { iso1A2: "MK", iso1A3: "MKD", iso1N3: "807", wikidata: "Q221", nameEn: "North Macedonia", groups: ["039", "150", "UN"], callingCodes: ["389"] }, geometry: { type: "MultiPolygon", coordinates: [[[[22.34773, 42.31725], [22.29275, 42.34913], [22.29605, 42.37477], [22.16384, 42.32103], [22.02908, 42.29848], [21.94405, 42.34669], [21.91595, 42.30392], [21.84654, 42.3247], [21.77176, 42.2648], [21.70111, 42.23789], [21.58992, 42.25915], [21.52145, 42.24465], [21.50823, 42.27156], [21.43882, 42.2789], [21.43882, 42.23609], [21.38428, 42.24465], [21.30496, 42.1418], [21.29913, 42.13954], [21.31983, 42.10993], [21.22728, 42.08909], [21.16614, 42.19815], [21.11491, 42.20794], [20.75464, 42.05229], [20.76786, 41.91839], [20.68523, 41.85318], [20.59524, 41.8818], [20.55976, 41.87068], [20.57144, 41.7897], [20.53405, 41.78099], [20.51301, 41.72433], [20.52937, 41.69292], [20.51769, 41.65975], [20.55508, 41.58113], [20.52103, 41.56473], [20.45809, 41.5549], [20.45331, 41.51436], [20.49039, 41.49277], [20.51301, 41.442], [20.55976, 41.4087], [20.52119, 41.34381], [20.49432, 41.33679], [20.51068, 41.2323], [20.59715, 41.13644], [20.58546, 41.11179], [20.59832, 41.09066], [20.63454, 41.0889], [20.65558, 41.08009], [20.71634, 40.91781], [20.73504, 40.9081], [20.81567, 40.89662], [20.83671, 40.92752], [20.94305, 40.92399], [20.97693, 40.90103], [20.97887, 40.85475], [21.15262, 40.85546], [21.21105, 40.8855], [21.25779, 40.86165], [21.35595, 40.87578], [21.41555, 40.9173], [21.53007, 40.90759], [21.57448, 40.86076], [21.69601, 40.9429], [21.7556, 40.92525], [21.91102, 41.04786], [21.90869, 41.09191], [22.06527, 41.15617], [22.1424, 41.12449], [22.17629, 41.15969], [22.26744, 41.16409], [22.42285, 41.11921], [22.5549, 41.13065], [22.58295, 41.11568], [22.62852, 41.14385], [22.65306, 41.18168], [22.71266, 41.13945], [22.74538, 41.16321], [22.76408, 41.32225], [22.81199, 41.3398], [22.93334, 41.34104], [22.96331, 41.35782], [22.95513, 41.63265], [23.03342, 41.71034], [23.01239, 41.76527], [22.96682, 41.77137], [22.90254, 41.87587], [22.86749, 42.02275], [22.67701, 42.06614], [22.51224, 42.15457], [22.50289, 42.19527], [22.47251, 42.20393], [22.38136, 42.30339], [22.34773, 42.31725]]]] } },
+ { type: "Feature", properties: { iso1A2: "ML", iso1A3: "MLI", iso1N3: "466", wikidata: "Q912", nameEn: "Mali", groups: ["011", "202", "002", "UN"], callingCodes: ["223"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-4.83423, 24.99935], [-6.57191, 25.0002], [-5.60725, 16.49919], [-5.33435, 16.33354], [-5.50165, 15.50061], [-9.32979, 15.50032], [-9.31106, 15.69412], [-9.33314, 15.7044], [-9.44673, 15.60553], [-9.40447, 15.4396], [-10.71721, 15.4223], [-10.90932, 15.11001], [-11.43483, 15.62339], [-11.70705, 15.51558], [-11.94903, 14.76143], [-12.23936, 14.76324], [-11.93043, 13.84505], [-12.06897, 13.71049], [-11.83345, 13.33333], [-11.63025, 13.39174], [-11.39935, 12.97808], [-11.37536, 12.40788], [-11.50006, 12.17826], [-11.24136, 12.01286], [-10.99758, 12.24634], [-10.80355, 12.1053], [-10.71897, 11.91552], [-10.30604, 12.24634], [-9.714, 12.0226], [-9.63938, 12.18312], [-9.32097, 12.29009], [-9.38067, 12.48446], [-9.13689, 12.50875], [-8.94784, 12.34842], [-8.80854, 11.66715], [-8.40058, 11.37466], [-8.66923, 10.99397], [-8.35083, 11.06234], [-8.2667, 10.91762], [-8.32614, 10.69273], [-8.22711, 10.41722], [-8.10207, 10.44649], [-7.9578, 10.2703], [-7.97971, 10.17117], [-7.92107, 10.15577], [-7.63048, 10.46334], [-7.54462, 10.40921], [-7.52261, 10.4655], [-7.44555, 10.44602], [-7.3707, 10.24677], [-7.13331, 10.24877], [-7.0603, 10.14711], [-7.00966, 10.15794], [-6.97444, 10.21644], [-7.01186, 10.25111], [-6.93921, 10.35291], [-6.68164, 10.35074], [-6.63541, 10.66893], [-6.52974, 10.59104], [-6.42847, 10.5694], [-6.40646, 10.69922], [-6.325, 10.68624], [-6.24795, 10.74248], [-6.1731, 10.46983], [-6.18851, 10.24244], [-5.99478, 10.19694], [-5.78124, 10.43952], [-5.65135, 10.46767], [-5.51058, 10.43177], [-5.46643, 10.56074], [-5.47083, 10.75329], [-5.41579, 10.84628], [-5.49284, 11.07538], [-5.32994, 11.13371], [-5.32553, 11.21578], [-5.25949, 11.24816], [-5.25509, 11.36905], [-5.20665, 11.43811], [-5.22867, 11.60421], [-5.29251, 11.61715], [-5.26389, 11.75728], [-5.40258, 11.8327], [-5.26389, 11.84778], [-5.07897, 11.97918], [-4.72893, 12.01579], [-4.70692, 12.06746], [-4.62987, 12.06531], [-4.62546, 12.13204], [-4.54841, 12.1385], [-4.57703, 12.19875], [-4.41412, 12.31922], [-4.47356, 12.71252], [-4.238, 12.71467], [-4.21819, 12.95722], [-4.34477, 13.12927], [-3.96501, 13.49778], [-3.90558, 13.44375], [-3.96282, 13.38164], [-3.7911, 13.36665], [-3.54454, 13.1781], [-3.4313, 13.1588], [-3.43507, 13.27272], [-3.23599, 13.29035], [-3.28396, 13.5422], [-3.26407, 13.70699], [-2.88189, 13.64921], [-2.90831, 13.81174], [-2.84667, 14.05532], [-2.66175, 14.14713], [-2.47587, 14.29671], [-2.10223, 14.14878], [-1.9992, 14.19011], [-1.97945, 14.47709], [-1.68083, 14.50023], [-1.32166, 14.72774], [-1.05875, 14.7921], [-0.72004, 15.08655], [-0.24673, 15.07805], [0.06588, 14.96961], [0.23859, 15.00135], [0.72632, 14.95898], [0.96711, 14.98275], [1.31275, 15.27978], [3.01806, 15.34571], [3.03134, 15.42221], [3.50368, 15.35934], [4.19893, 16.39923], [4.21787, 17.00118], [4.26762, 17.00432], [4.26651, 19.14224], [3.36082, 18.9745], [3.12501, 19.1366], [3.24648, 19.81703], [1.20992, 20.73533], [1.15698, 21.12843], [-4.83423, 24.99935]]]] } },
+ { type: "Feature", properties: { iso1A2: "MM", iso1A3: "MMR", iso1N3: "104", wikidata: "Q836", nameEn: "Myanmar", aliases: ["Burma", "BU"], groups: ["035", "142", "UN"], callingCodes: ["95"] }, geometry: { type: "MultiPolygon", coordinates: [[[[92.62187, 21.87037], [92.59775, 21.6092], [92.68152, 21.28454], [92.60187, 21.24615], [92.55105, 21.3856], [92.43158, 21.37025], [92.37939, 21.47764], [92.20087, 21.337], [92.17752, 21.17445], [92.26071, 21.05697], [92.47409, 20.38654], [92.61042, 13.76986], [94.6371, 13.81803], [97.63455, 9.60854], [98.12555, 9.44056], [98.33094, 9.91973], [98.47298, 9.95782], [98.52291, 9.92389], [98.55174, 9.92804], [98.7391, 10.31488], [98.81944, 10.52761], [98.77275, 10.62548], [98.78511, 10.68351], [98.86819, 10.78336], [99.0069, 10.85485], [98.99701, 10.92962], [99.02337, 10.97217], [99.06938, 10.94857], [99.32756, 11.28545], [99.31573, 11.32081], [99.39485, 11.3925], [99.47598, 11.62434], [99.5672, 11.62732], [99.64108, 11.78948], [99.64891, 11.82699], [99.53424, 12.02317], [99.56445, 12.14805], [99.47519, 12.1353], [99.409, 12.60603], [99.29254, 12.68921], [99.18905, 12.84799], [99.18748, 12.9898], [99.10646, 13.05804], [99.12225, 13.19847], [99.20617, 13.20575], [99.16695, 13.72621], [98.97356, 14.04868], [98.56762, 14.37701], [98.24874, 14.83013], [98.18821, 15.13125], [98.22, 15.21327], [98.30446, 15.30667], [98.40522, 15.25268], [98.41906, 15.27103], [98.39351, 15.34177], [98.4866, 15.39154], [98.56027, 15.33471], [98.58598, 15.46821], [98.541, 15.65406], [98.59853, 15.87197], [98.57019, 16.04578], [98.69585, 16.13353], [98.8376, 16.11706], [98.92656, 16.36425], [98.84485, 16.42354], [98.68074, 16.27068], [98.63817, 16.47424], [98.57912, 16.55983], [98.5695, 16.62826], [98.51113, 16.64503], [98.51833, 16.676], [98.51472, 16.68521], [98.51579, 16.69433], [98.51043, 16.70107], [98.49713, 16.69022], [98.50253, 16.7139], [98.46994, 16.73613], [98.53833, 16.81934], [98.49603, 16.8446], [98.52624, 16.89979], [98.39441, 17.06266], [98.34566, 17.04822], [98.10439, 17.33847], [98.11185, 17.36829], [97.91829, 17.54504], [97.76407, 17.71595], [97.66794, 17.88005], [97.73723, 17.97912], [97.60841, 18.23846], [97.64116, 18.29778], [97.56219, 18.33885], [97.50383, 18.26844], [97.34522, 18.54596], [97.36444, 18.57138], [97.5258, 18.4939], [97.76752, 18.58097], [97.73836, 18.88478], [97.66487, 18.9371], [97.73654, 18.9812], [97.73797, 19.04261], [97.83479, 19.09972], [97.84024, 19.22217], [97.78606, 19.26769], [97.84186, 19.29526], [97.78769, 19.39429], [97.88423, 19.5041], [97.84715, 19.55782], [98.04364, 19.65755], [98.03314, 19.80941], [98.13829, 19.78541], [98.24884, 19.67876], [98.51182, 19.71303], [98.56065, 19.67807], [98.83661, 19.80931], [98.98679, 19.7419], [99.0735, 20.10298], [99.20328, 20.12877], [99.416, 20.08614], [99.52943, 20.14811], [99.5569, 20.20676], [99.46077, 20.36198], [99.46008, 20.39673], [99.68255, 20.32077], [99.81096, 20.33687], [99.86383, 20.44371], [99.88211, 20.44488], [99.88451, 20.44596], [99.89168, 20.44548], [99.89301, 20.44311], [99.89692, 20.44789], [99.90499, 20.4487], [99.91616, 20.44986], [99.95721, 20.46301], [100.08404, 20.36626], [100.1957, 20.68247], [100.36375, 20.82783], [100.51079, 20.82194], [100.60112, 20.8347], [100.64628, 20.88279], [100.50974, 20.88574], [100.55281, 21.02796], [100.63578, 21.05639], [100.72716, 21.31786], [100.80173, 21.2934], [101.00234, 21.39612], [101.16198, 21.52808], [101.15156, 21.56129], [101.11744, 21.77659], [100.87265, 21.67396], [100.72143, 21.51898], [100.57861, 21.45637], [100.4811, 21.46148], [100.42892, 21.54325], [100.35201, 21.53176], [100.25863, 21.47043], [100.18447, 21.51898], [100.1625, 21.48704], [100.12542, 21.50365], [100.10757, 21.59945], [100.17486, 21.65306], [100.12679, 21.70539], [100.04956, 21.66843], [99.98654, 21.71064], [99.94003, 21.82782], [99.99084, 21.97053], [99.96612, 22.05965], [99.85351, 22.04183], [99.47585, 22.13345], [99.33166, 22.09656], [99.1552, 22.15874], [99.19176, 22.16983], [99.17318, 22.18025], [99.28771, 22.4105], [99.37972, 22.50188], [99.38247, 22.57544], [99.31243, 22.73893], [99.45654, 22.85726], [99.43537, 22.94086], [99.54218, 22.90014], [99.52214, 23.08218], [99.34127, 23.13099], [99.25741, 23.09025], [99.04601, 23.12215], [99.05975, 23.16382], [98.88597, 23.18656], [98.92515, 23.29535], [98.93958, 23.31414], [98.87573, 23.33038], [98.92104, 23.36946], [98.87683, 23.48995], [98.82877, 23.47908], [98.80294, 23.5345], [98.88396, 23.59555], [98.81775, 23.694], [98.82933, 23.72921], [98.79607, 23.77947], [98.68209, 23.80492], [98.67797, 23.9644], [98.89632, 24.10612], [98.87998, 24.15624], [98.85319, 24.13042], [98.59256, 24.08371], [98.54476, 24.13119], [98.20666, 24.11406], [98.07806, 24.07988], [98.06703, 24.08028], [98.0607, 24.07812], [98.05671, 24.07961], [98.05302, 24.07408], [98.04709, 24.07616], [97.99583, 24.04932], [97.98691, 24.03897], [97.93951, 24.01953], [97.90998, 24.02094], [97.88616, 24.00463], [97.88414, 23.99405], [97.88814, 23.98605], [97.89683, 23.98389], [97.89676, 23.97931], [97.8955, 23.97758], [97.88811, 23.97446], [97.86545, 23.97723], [97.84328, 23.97603], [97.79416, 23.95663], [97.79456, 23.94836], [97.72302, 23.89288], [97.64667, 23.84574], [97.5247, 23.94032], [97.62363, 24.00506], [97.72903, 24.12606], [97.75305, 24.16902], [97.72799, 24.18883], [97.72998, 24.2302], [97.76799, 24.26365], [97.71941, 24.29652], [97.66723, 24.30027], [97.65624, 24.33781], [97.7098, 24.35658], [97.66998, 24.45288], [97.60029, 24.4401], [97.52757, 24.43748], [97.56286, 24.54535], [97.56525, 24.72838], [97.54675, 24.74202], [97.5542, 24.74943], [97.56383, 24.75535], [97.56648, 24.76475], [97.64354, 24.79171], [97.70181, 24.84557], [97.73127, 24.83015], [97.76481, 24.8289], [97.79949, 24.85655], [97.72903, 24.91332], [97.72216, 25.08508], [97.77023, 25.11492], [97.83614, 25.2715], [97.92541, 25.20815], [98.14925, 25.41547], [98.12591, 25.50722], [98.18084, 25.56298], [98.16848, 25.62739], [98.25774, 25.6051], [98.31268, 25.55307], [98.40606, 25.61129], [98.54064, 25.85129], [98.63128, 25.79937], [98.70818, 25.86241], [98.60763, 26.01512], [98.57085, 26.11547], [98.63128, 26.15492], [98.66884, 26.09165], [98.7329, 26.17218], [98.67797, 26.24487], [98.72741, 26.36183], [98.77547, 26.61994], [98.7333, 26.85615], [98.69582, 27.56499], [98.43353, 27.67086], [98.42529, 27.55404], [98.32641, 27.51385], [98.13964, 27.9478], [98.15337, 28.12114], [97.90069, 28.3776], [97.79632, 28.33168], [97.70705, 28.5056], [97.56835, 28.55628], [97.50518, 28.49716], [97.47085, 28.2688], [97.41729, 28.29783], [97.34547, 28.21385], [97.31292, 28.06784], [97.35412, 28.06663], [97.38845, 28.01329], [97.35824, 27.87256], [97.29919, 27.92233], [96.90112, 27.62149], [96.91431, 27.45752], [97.17422, 27.14052], [97.14675, 27.09041], [96.89132, 27.17474], [96.85287, 27.2065], [96.88445, 27.25046], [96.73888, 27.36638], [96.55761, 27.29928], [96.40779, 27.29818], [96.15591, 27.24572], [96.04949, 27.19428], [95.93002, 27.04149], [95.81603, 27.01335], [95.437, 26.7083], [95.30339, 26.65372], [95.23513, 26.68499], [95.05798, 26.45408], [95.12801, 26.38397], [95.11428, 26.1019], [95.18556, 26.07338], [94.80117, 25.49359], [94.68032, 25.47003], [94.57458, 25.20318], [94.74212, 25.13606], [94.73937, 25.00545], [94.60204, 24.70889], [94.5526, 24.70764], [94.50729, 24.59281], [94.45279, 24.56656], [94.32362, 24.27692], [94.30215, 24.23752], [94.14081, 23.83333], [93.92089, 23.95812], [93.80279, 23.92549], [93.75952, 24.0003], [93.62871, 24.00922], [93.50616, 23.94432], [93.46633, 23.97067], [93.41415, 24.07854], [93.34735, 24.10151], [93.32351, 24.04468], [93.36059, 23.93176], [93.3908, 23.92925], [93.3908, 23.7622], [93.43475, 23.68299], [93.38805, 23.4728], [93.39981, 23.38828], [93.38781, 23.36139], [93.36862, 23.35426], [93.38478, 23.13698], [93.2878, 23.00464], [93.12988, 23.05772], [93.134, 22.92498], [93.09417, 22.69459], [93.134, 22.59573], [93.11477, 22.54374], [93.13537, 22.45873], [93.18206, 22.43716], [93.19991, 22.25425], [93.14224, 22.24535], [93.15734, 22.18687], [93.04885, 22.20595], [92.99255, 22.05965], [92.99804, 21.98964], [92.93899, 22.02656], [92.89504, 21.95143], [92.86208, 22.05456], [92.70416, 22.16017], [92.67532, 22.03547], [92.60949, 21.97638], [92.62187, 21.87037]]]] } },
+ { type: "Feature", properties: { iso1A2: "MN", iso1A3: "MNG", iso1N3: "496", wikidata: "Q711", nameEn: "Mongolia", groups: ["030", "142", "UN"], callingCodes: ["976"] }, geometry: { type: "MultiPolygon", coordinates: [[[[102.14032, 51.35566], [101.5044, 51.50467], [101.39085, 51.45753], [100.61116, 51.73028], [99.89203, 51.74903], [99.75578, 51.90108], [99.27888, 51.96876], [98.87768, 52.14563], [98.74142, 51.8637], [98.33222, 51.71832], [98.22053, 51.46579], [98.05257, 51.46696], [97.83305, 51.00248], [98.01472, 50.86652], [97.9693, 50.78044], [98.06393, 50.61262], [98.31373, 50.4996], [98.29481, 50.33561], [97.85197, 49.91339], [97.76871, 49.99861], [97.56432, 49.92801], [97.56811, 49.84265], [97.24639, 49.74737], [96.97388, 49.88413], [95.80056, 50.04239], [95.74757, 49.97915], [95.02465, 49.96941], [94.97166, 50.04725], [94.6121, 50.04239], [94.49477, 50.17832], [94.39258, 50.22193], [94.30823, 50.57498], [92.99595, 50.63183], [93.01109, 50.79001], [92.44714, 50.78762], [92.07173, 50.69585], [91.86048, 50.73734], [89.59711, 49.90851], [89.70687, 49.72535], [88.82499, 49.44808], [88.42449, 49.48821], [88.17223, 49.46934], [88.15543, 49.30314], [87.98977, 49.18147], [87.81333, 49.17354], [87.88171, 48.95853], [87.73822, 48.89582], [88.0788, 48.71436], [87.96361, 48.58478], [88.58939, 48.34531], [88.58316, 48.21893], [88.8011, 48.11302], [88.93186, 48.10263], [89.0711, 47.98528], [89.55453, 48.0423], [89.76624, 47.82745], [90.06512, 47.88177], [90.10871, 47.7375], [90.33598, 47.68303], [90.48854, 47.41826], [90.48542, 47.30438], [90.76108, 46.99399], [90.84035, 46.99525], [91.03649, 46.72916], [91.0147, 46.58171], [91.07696, 46.57315], [90.89639, 46.30711], [90.99672, 46.14207], [91.03026, 46.04194], [90.70907, 45.73437], [90.65114, 45.49314], [90.89169, 45.19667], [91.64048, 45.07408], [93.51161, 44.95964], [94.10003, 44.71016], [94.71959, 44.35284], [95.01191, 44.25274], [95.39772, 44.2805], [95.32891, 44.02407], [95.52594, 43.99353], [95.89543, 43.2528], [96.35658, 42.90363], [96.37926, 42.72055], [97.1777, 42.7964], [99.50671, 42.56535], [100.33297, 42.68231], [100.84979, 42.67087], [101.80515, 42.50074], [102.07645, 42.22519], [102.72403, 42.14675], [103.92804, 41.78246], [104.52258, 41.8706], [104.51667, 41.66113], [105.0123, 41.63188], [106.76517, 42.28741], [107.24774, 42.36107], [107.29755, 42.41395], [107.49681, 42.46221], [107.57258, 42.40898], [108.84489, 42.40246], [109.00679, 42.45302], [109.452, 42.44842], [109.89402, 42.63111], [110.08401, 42.6411], [110.4327, 42.78293], [111.0149, 43.3289], [111.59087, 43.51207], [111.79758, 43.6637], [111.93776, 43.68709], [111.96289, 43.81596], [111.40498, 44.3461], [111.76275, 44.98032], [111.98695, 45.09074], [112.4164, 45.06858], [112.74662, 44.86297], [113.70918, 44.72891], [114.5166, 45.27189], [114.54801, 45.38337], [114.74612, 45.43585], [114.94546, 45.37377], [115.60329, 45.44717], [116.16989, 45.68603], [116.27366, 45.78637], [116.24012, 45.8778], [116.26678, 45.96479], [116.58612, 46.30211], [116.75551, 46.33083], [116.83166, 46.38637], [117.36609, 46.36335], [117.41782, 46.57862], [117.60748, 46.59771], [117.69554, 46.50991], [118.30534, 46.73519], [118.78747, 46.68689], [118.8337, 46.77742], [118.89974, 46.77139], [118.92616, 46.72765], [119.00541, 46.74273], [119.10448, 46.65516], [119.24978, 46.64761], [119.32827, 46.61433], [119.42827, 46.63783], [119.65265, 46.62342], [119.68127, 46.59015], [119.77373, 46.62947], [119.80455, 46.67631], [119.89261, 46.66423], [119.91242, 46.90091], [119.85518, 46.92196], [119.71209, 47.19192], [119.62403, 47.24575], [119.56019, 47.24874], [119.54918, 47.29505], [119.31964, 47.42617], [119.35892, 47.48104], [119.13995, 47.53997], [119.12343, 47.66458], [118.7564, 47.76947], [118.55766, 47.99277], [118.29654, 48.00246], [118.22677, 48.03853], [118.11009, 48.04], [118.03676, 48.00982], [117.80196, 48.01661], [117.50181, 47.77216], [117.37875, 47.63627], [116.9723, 47.87285], [116.67405, 47.89039], [116.4465, 47.83662], [116.21879, 47.88505], [115.94296, 47.67741], [115.57128, 47.91988], [115.52082, 48.15367], [115.811, 48.25699], [115.78876, 48.51781], [116.06565, 48.81716], [116.03781, 48.87014], [116.71193, 49.83813], [116.62502, 49.92919], [116.22402, 50.04477], [115.73602, 49.87688], [115.26068, 49.97367], [114.9703, 50.19254], [114.325, 50.28098], [113.20216, 49.83356], [113.02647, 49.60772], [110.64493, 49.1816], [110.39891, 49.25083], [110.24373, 49.16676], [109.51325, 49.22859], [109.18017, 49.34709], [108.53969, 49.32325], [108.27937, 49.53167], [107.95387, 49.66659], [107.96116, 49.93191], [107.36407, 49.97612], [107.1174, 50.04239], [107.00007, 50.1977], [106.80326, 50.30177], [106.58373, 50.34044], [106.51122, 50.34408], [106.49628, 50.32436], [106.47156, 50.31909], [106.07865, 50.33474], [106.05562, 50.40582], [105.32528, 50.4648], [103.70343, 50.13952], [102.71178, 50.38873], [102.32194, 50.67982], [102.14032, 51.35566]]]] } },
+ { type: "Feature", properties: { iso1A2: "MO", iso1A3: "MAC", iso1N3: "446", wikidata: "Q14773", nameEn: "Macau", aliases: ["Macao"], country: "CN", groups: ["030", "142", "UN"], driveSide: "left", callingCodes: ["853"] }, geometry: { type: "MultiPolygon", coordinates: [[[[113.54942, 22.14519], [113.54839, 22.10909], [113.57191, 22.07696], [113.63011, 22.10782], [113.60504, 22.20464], [113.57123, 22.20416], [113.56865, 22.20973], [113.5508, 22.21672], [113.54333, 22.21688], [113.54093, 22.21314], [113.53593, 22.2137], [113.53301, 22.21235], [113.53552, 22.20607], [113.52659, 22.18271], [113.54093, 22.15497], [113.54942, 22.14519]]]] } },
+ { type: "Feature", properties: { iso1A2: "MP", iso1A3: "MNP", iso1N3: "580", wikidata: "Q16644", nameEn: "Northern Mariana Islands", aliases: ["US-MP"], country: "US", groups: ["Q1352230", "Q153732", "057", "009", "UN"], roadSpeedUnit: "mph", callingCodes: ["1 670"] }, geometry: { type: "MultiPolygon", coordinates: [[[[135.52896, 14.32623], [152.19114, 13.63487], [145.05972, 21.28731], [135.52896, 14.32623]]]] } },
+ { type: "Feature", properties: { iso1A2: "MQ", iso1A3: "MTQ", iso1N3: "474", wikidata: "Q17054", nameEn: "Martinique", country: "FR", groups: ["Q3320166", "EU", "029", "003", "419", "019", "UN"], callingCodes: ["596"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-59.95997, 14.20285], [-61.07821, 15.25109], [-61.69315, 14.26451], [-59.95997, 14.20285]]]] } },
+ { type: "Feature", properties: { iso1A2: "MR", iso1A3: "MRT", iso1N3: "478", wikidata: "Q1025", nameEn: "Mauritania", groups: ["011", "202", "002", "UN"], callingCodes: ["222"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-5.60725, 16.49919], [-6.57191, 25.0002], [-4.83423, 24.99935], [-8.66674, 27.31569], [-8.66721, 25.99918], [-12.0002, 25.9986], [-12.00251, 23.4538], [-12.14969, 23.41935], [-12.36213, 23.3187], [-12.5741, 23.28975], [-13.00412, 23.02297], [-13.10753, 22.89493], [-13.15313, 22.75649], [-13.08438, 22.53866], [-13.01525, 21.33343], [-16.95474, 21.33997], [-16.99806, 21.12142], [-17.0357, 21.05368], [-17.0396, 20.9961], [-17.06781, 20.92697], [-17.0695, 20.85742], [-17.0471, 20.76408], [-17.15288, 16.07139], [-16.50854, 16.09032], [-16.48967, 16.0496], [-16.44814, 16.09753], [-16.4429, 16.20605], [-16.27016, 16.51565], [-15.6509, 16.50315], [-15.00557, 16.64997], [-14.32144, 16.61495], [-13.80075, 16.13961], [-13.43135, 16.09022], [-13.11029, 15.52116], [-12.23936, 14.76324], [-11.94903, 14.76143], [-11.70705, 15.51558], [-11.43483, 15.62339], [-10.90932, 15.11001], [-10.71721, 15.4223], [-9.40447, 15.4396], [-9.44673, 15.60553], [-9.33314, 15.7044], [-9.31106, 15.69412], [-9.32979, 15.50032], [-5.50165, 15.50061], [-5.33435, 16.33354], [-5.60725, 16.49919]]]] } },
+ { type: "Feature", properties: { iso1A2: "MS", iso1A3: "MSR", iso1N3: "500", wikidata: "Q13353", nameEn: "Montserrat", country: "GB", groups: ["BOTS", "029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 664"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-61.91508, 16.51165], [-62.1023, 16.97277], [-62.58307, 16.68909], [-61.91508, 16.51165]]]] } },
+ { type: "Feature", properties: { iso1A2: "MT", iso1A3: "MLT", iso1N3: "470", wikidata: "Q233", nameEn: "Malta", groups: ["EU", "039", "150", "UN"], driveSide: "left", callingCodes: ["356"] }, geometry: { type: "MultiPolygon", coordinates: [[[[15.70991, 35.79901], [14.07544, 36.41525], [13.27636, 35.20764], [15.70991, 35.79901]]]] } },
+ { type: "Feature", properties: { iso1A2: "MU", iso1A3: "MUS", iso1N3: "480", wikidata: "Q1027", nameEn: "Mauritius", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["230"] }, geometry: { type: "MultiPolygon", coordinates: [[[[56.09755, -9.55401], [57.50644, -31.92637], [68.4673, -19.15185], [56.09755, -9.55401]]]] } },
+ { type: "Feature", properties: { iso1A2: "MV", iso1A3: "MDV", iso1N3: "462", wikidata: "Q826", nameEn: "Maldives", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["960"] }, geometry: { type: "MultiPolygon", coordinates: [[[[71.9161, 8.55531], [72.57428, -3.7623], [76.59015, 5.591], [71.9161, 8.55531]]]] } },
+ { type: "Feature", properties: { iso1A2: "MW", iso1A3: "MWI", iso1N3: "454", wikidata: "Q1020", nameEn: "Malawi", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["265"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.48052, -9.62442], [33.31581, -9.48554], [33.14925, -9.49322], [32.99397, -9.36712], [32.95389, -9.40138], [33.00476, -9.5133], [33.00256, -9.63053], [33.05485, -9.61316], [33.10163, -9.66525], [33.12144, -9.58929], [33.2095, -9.61099], [33.31517, -9.82364], [33.36581, -9.81063], [33.37902, -9.9104], [33.31297, -10.05133], [33.53863, -10.20148], [33.54797, -10.36077], [33.70675, -10.56896], [33.47636, -10.78465], [33.28022, -10.84428], [33.25998, -10.88862], [33.39697, -11.15296], [33.29267, -11.3789], [33.29267, -11.43536], [33.23663, -11.40637], [33.24252, -11.59302], [33.32692, -11.59248], [33.33937, -11.91252], [33.25998, -12.14242], [33.3705, -12.34931], [33.47636, -12.32498], [33.54485, -12.35996], [33.37517, -12.54085], [33.28177, -12.54692], [33.18837, -12.61377], [33.05917, -12.59554], [32.94397, -12.76868], [32.96733, -12.88251], [33.02181, -12.88707], [32.98289, -13.12671], [33.0078, -13.19492], [32.86113, -13.47292], [32.84176, -13.52794], [32.73683, -13.57682], [32.68436, -13.55769], [32.66468, -13.60019], [32.68654, -13.64268], [32.7828, -13.64805], [32.84528, -13.71576], [32.76962, -13.77224], [32.79015, -13.80755], [32.88985, -13.82956], [32.99042, -13.95689], [33.02977, -14.05022], [33.07568, -13.98447], [33.16749, -13.93992], [33.24249, -14.00019], [33.66677, -14.61306], [33.7247, -14.4989], [33.88503, -14.51652], [33.92898, -14.47929], [34.08588, -14.48893], [34.18733, -14.43823], [34.22355, -14.43607], [34.34453, -14.3985], [34.35843, -14.38652], [34.39277, -14.39467], [34.4192, -14.43191], [34.44641, -14.47746], [34.45053, -14.49873], [34.47628, -14.53363], [34.48932, -14.53646], [34.49636, -14.55091], [34.52366, -14.5667], [34.53962, -14.59776], [34.55112, -14.64494], [34.53516, -14.67782], [34.52057, -14.68263], [34.54503, -14.74672], [34.567, -14.77345], [34.61522, -14.99583], [34.57503, -15.30619], [34.43126, -15.44778], [34.44981, -15.60864], [34.25195, -15.90321], [34.43126, -16.04737], [34.40344, -16.20923], [35.04805, -16.83167], [35.13771, -16.81687], [35.17017, -16.93521], [35.04805, -17.00027], [35.0923, -17.13235], [35.3062, -17.1244], [35.27065, -16.93817], [35.30929, -16.82871], [35.27219, -16.69402], [35.14235, -16.56812], [35.25828, -16.4792], [35.30157, -16.2211], [35.43355, -16.11371], [35.52365, -16.15414], [35.70107, -16.10147], [35.80487, -16.03907], [35.85303, -15.41913], [35.78799, -15.17428], [35.91812, -14.89514], [35.87212, -14.89478], [35.86945, -14.67481], [35.5299, -14.27714], [35.47989, -14.15594], [34.86229, -13.48958], [34.60253, -13.48487], [34.37831, -12.17408], [34.46088, -12.0174], [34.70739, -12.15652], [34.82903, -12.04837], [34.57917, -11.87849], [34.64241, -11.57499], [34.96296, -11.57354], [34.91153, -11.39799], [34.79375, -11.32245], [34.63305, -11.11731], [34.61161, -11.01611], [34.67047, -10.93796], [34.65946, -10.6828], [34.57581, -10.56271], [34.51911, -10.12279], [34.54499, -10.0678], [34.03865, -9.49398], [33.95829, -9.54066], [33.9638, -9.62206], [33.93298, -9.71647], [33.76677, -9.58516], [33.48052, -9.62442]]]] } },
+ { type: "Feature", properties: { iso1A2: "MX", iso1A3: "MEX", iso1N3: "484", wikidata: "Q96", nameEn: "Mexico", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["52"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-117.1243, 32.53427], [-118.48109, 32.5991], [-120.12904, 18.41089], [-92.37213, 14.39277], [-92.2261, 14.53423], [-92.1454, 14.6804], [-92.18161, 14.84147], [-92.1423, 14.88647], [-92.1454, 14.98143], [-92.0621, 15.07406], [-92.20983, 15.26077], [-91.73182, 16.07371], [-90.44567, 16.07573], [-90.40499, 16.40524], [-90.61212, 16.49832], [-90.69064, 16.70697], [-91.04436, 16.92175], [-91.43809, 17.25373], [-90.99199, 17.25192], [-90.98678, 17.81655], [-89.14985, 17.81563], [-89.15105, 17.95104], [-89.03839, 18.0067], [-88.8716, 17.89535], [-88.71505, 18.0707], [-88.48242, 18.49164], [-88.3268, 18.49048], [-88.29909, 18.47591], [-88.26593, 18.47617], [-88.03238, 18.41778], [-88.03165, 18.16657], [-87.90671, 18.15213], [-87.87604, 18.18313], [-87.86657, 18.19971], [-87.85693, 18.18266], [-87.84815, 18.18511], [-86.92368, 17.61462], [-85.9092, 21.8218], [-96.92418, 25.97377], [-97.13927, 25.96583], [-97.35946, 25.92189], [-97.37332, 25.83854], [-97.42511, 25.83969], [-97.45669, 25.86874], [-97.49828, 25.89877], [-97.52025, 25.88518], [-97.66511, 26.01708], [-97.95155, 26.0625], [-97.97017, 26.05232], [-98.24603, 26.07191], [-98.27075, 26.09457], [-98.30491, 26.10475], [-98.35126, 26.15129], [-99.00546, 26.3925], [-99.03053, 26.41249], [-99.08477, 26.39849], [-99.53573, 27.30926], [-99.49744, 27.43746], [-99.482, 27.47128], [-99.48045, 27.49016], [-99.50208, 27.50021], [-99.52955, 27.49747], [-99.51478, 27.55836], [-99.55409, 27.61314], [-100.50029, 28.66117], [-100.51222, 28.70679], [-100.5075, 28.74066], [-100.52313, 28.75598], [-100.59809, 28.88197], [-100.63689, 28.90812], [-100.67294, 29.09744], [-100.79696, 29.24688], [-100.87982, 29.296], [-100.94056, 29.33371], [-100.94579, 29.34523], [-100.96725, 29.3477], [-101.01128, 29.36947], [-101.05686, 29.44738], [-101.47277, 29.7744], [-102.60596, 29.8192], [-103.15787, 28.93865], [-104.37752, 29.54255], [-104.39363, 29.55396], [-104.3969, 29.57105], [-104.5171, 29.64671], [-104.77674, 30.4236], [-106.00363, 31.39181], [-106.09025, 31.40569], [-106.20346, 31.46305], [-106.23711, 31.51262], [-106.24612, 31.54193], [-106.28084, 31.56173], [-106.30305, 31.62154], [-106.33419, 31.66303], [-106.34864, 31.69663], [-106.3718, 31.71165], [-106.38003, 31.73151], [-106.41773, 31.75196], [-106.43419, 31.75478], [-106.45244, 31.76523], [-106.46726, 31.75998], [-106.47298, 31.75054], [-106.48815, 31.74769], [-106.50111, 31.75714], [-106.50962, 31.76155], [-106.51251, 31.76922], [-106.52266, 31.77509], [-106.529, 31.784], [-108.20899, 31.78534], [-108.20979, 31.33316], [-111.07523, 31.33232], [-114.82011, 32.49609], [-114.79524, 32.55731], [-114.81141, 32.55543], [-114.80584, 32.62028], [-114.76736, 32.64094], [-114.71871, 32.71894], [-115.88053, 32.63624], [-117.1243, 32.53427]]]] } },
+ { type: "Feature", properties: { iso1A2: "MY", iso1A3: "MYS", iso1N3: "458", wikidata: "Q833", nameEn: "Malaysia" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "MZ", iso1A3: "MOZ", iso1N3: "508", wikidata: "Q1029", nameEn: "Mozambique", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["258"] }, geometry: { type: "MultiPolygon", coordinates: [[[[40.74206, -10.25691], [40.44265, -10.4618], [40.00295, -10.80255], [39.58249, -10.96043], [39.24395, -11.17433], [38.88996, -11.16978], [38.47258, -11.4199], [38.21598, -11.27289], [37.93618, -11.26228], [37.8388, -11.3123], [37.76614, -11.53352], [37.3936, -11.68949], [36.80309, -11.56836], [36.62068, -11.72884], [36.19094, -11.70008], [36.19094, -11.57593], [35.82767, -11.41081], [35.63599, -11.55927], [34.96296, -11.57354], [34.64241, -11.57499], [34.57917, -11.87849], [34.82903, -12.04837], [34.70739, -12.15652], [34.46088, -12.0174], [34.37831, -12.17408], [34.60253, -13.48487], [34.86229, -13.48958], [35.47989, -14.15594], [35.5299, -14.27714], [35.86945, -14.67481], [35.87212, -14.89478], [35.91812, -14.89514], [35.78799, -15.17428], [35.85303, -15.41913], [35.80487, -16.03907], [35.70107, -16.10147], [35.52365, -16.15414], [35.43355, -16.11371], [35.30157, -16.2211], [35.25828, -16.4792], [35.14235, -16.56812], [35.27219, -16.69402], [35.30929, -16.82871], [35.27065, -16.93817], [35.3062, -17.1244], [35.0923, -17.13235], [35.04805, -17.00027], [35.17017, -16.93521], [35.13771, -16.81687], [35.04805, -16.83167], [34.40344, -16.20923], [34.43126, -16.04737], [34.25195, -15.90321], [34.44981, -15.60864], [34.43126, -15.44778], [34.57503, -15.30619], [34.61522, -14.99583], [34.567, -14.77345], [34.54503, -14.74672], [34.52057, -14.68263], [34.53516, -14.67782], [34.55112, -14.64494], [34.53962, -14.59776], [34.52366, -14.5667], [34.49636, -14.55091], [34.48932, -14.53646], [34.47628, -14.53363], [34.45053, -14.49873], [34.44641, -14.47746], [34.4192, -14.43191], [34.39277, -14.39467], [34.35843, -14.38652], [34.34453, -14.3985], [34.22355, -14.43607], [34.18733, -14.43823], [34.08588, -14.48893], [33.92898, -14.47929], [33.88503, -14.51652], [33.7247, -14.4989], [33.66677, -14.61306], [33.24249, -14.00019], [30.22098, -14.99447], [30.41902, -15.62269], [30.42568, -15.9962], [30.91597, -15.99924], [30.97761, -16.05848], [31.13171, -15.98019], [31.30563, -16.01193], [31.42451, -16.15154], [31.67988, -16.19595], [31.90223, -16.34388], [31.91324, -16.41569], [32.02772, -16.43892], [32.28529, -16.43892], [32.42838, -16.4727], [32.71017, -16.59932], [32.69917, -16.66893], [32.78943, -16.70267], [32.97655, -16.70689], [32.91051, -16.89446], [32.84113, -16.92259], [32.96554, -17.11971], [33.00517, -17.30477], [33.0426, -17.3468], [32.96554, -17.48964], [32.98536, -17.55891], [33.0492, -17.60298], [32.94133, -17.99705], [33.03159, -18.35054], [33.02278, -18.4696], [32.88629, -18.51344], [32.88629, -18.58023], [32.95013, -18.69079], [32.9017, -18.7992], [32.82465, -18.77419], [32.70137, -18.84712], [32.73439, -18.92628], [32.69917, -18.94293], [32.72118, -19.02204], [32.84006, -19.0262], [32.87088, -19.09279], [32.85107, -19.29238], [32.77966, -19.36098], [32.78282, -19.47513], [32.84446, -19.48343], [32.84666, -19.68462], [32.95013, -19.67219], [33.06461, -19.77787], [33.01178, -20.02007], [32.93032, -20.03868], [32.85987, -20.16686], [32.85987, -20.27841], [32.66174, -20.56106], [32.55167, -20.56312], [32.48122, -20.63319], [32.51644, -20.91929], [32.37115, -21.133], [32.48236, -21.32873], [32.41234, -21.31246], [31.38336, -22.36919], [31.30611, -22.422], [31.55779, -23.176], [31.56539, -23.47268], [31.67942, -23.60858], [31.70223, -23.72695], [31.77445, -23.90082], [31.87707, -23.95293], [31.90368, -24.18892], [31.9835, -24.29983], [32.03196, -25.10785], [32.01676, -25.38117], [31.97875, -25.46356], [32.00631, -25.65044], [31.92649, -25.84216], [31.974, -25.95387], [32.00916, -25.999], [32.08599, -26.00978], [32.10435, -26.15656], [32.07352, -26.40185], [32.13409, -26.5317], [32.13315, -26.84345], [32.19409, -26.84032], [32.22302, -26.84136], [32.29584, -26.852], [32.35222, -26.86027], [34.51034, -26.91792], [42.99868, -12.65261], [40.74206, -10.25691]]]] } },
+ { type: "Feature", properties: { iso1A2: "NA", iso1A3: "NAM", iso1N3: "516", wikidata: "Q1030", nameEn: "Namibia", groups: ["018", "202", "002", "UN"], driveSide: "left", callingCodes: ["264"] }, geometry: { type: "MultiPolygon", coordinates: [[[[14.28743, -17.38814], [13.95896, -17.43141], [13.36212, -16.98048], [12.97145, -16.98567], [12.52111, -17.24495], [12.07076, -17.15165], [11.75063, -17.25013], [10.5065, -17.25284], [12.51595, -32.27486], [16.45332, -28.63117], [16.46592, -28.57126], [16.59922, -28.53246], [16.90446, -28.057], [17.15405, -28.08573], [17.4579, -28.68718], [18.99885, -28.89165], [19.99882, -28.42622], [19.99817, -24.76768], [19.99912, -21.99991], [20.99751, -22.00026], [20.99904, -18.31743], [21.45556, -18.31795], [23.0996, -18.00075], [23.29618, -17.99855], [23.61088, -18.4881], [24.19416, -18.01919], [24.40577, -17.95726], [24.57485, -18.07151], [24.6303, -17.9863], [24.71887, -17.9218], [24.73364, -17.89338], [24.95586, -17.79674], [25.05895, -17.84452], [25.16882, -17.78253], [25.26433, -17.79571], [25.00198, -17.58221], [24.70864, -17.49501], [24.5621, -17.52963], [24.38712, -17.46818], [24.32811, -17.49082], [24.23619, -17.47489], [23.47474, -17.62877], [21.42741, -18.02787], [21.14283, -17.94318], [18.84226, -17.80375], [18.39229, -17.38927], [14.28743, -17.38814]]]] } },
+ { type: "Feature", properties: { iso1A2: "NC", iso1A3: "NCL", iso1N3: "540", wikidata: "Q33788", nameEn: "New Caledonia", country: "FR", groups: ["EU", "Q1451600", "054", "009", "UN"], callingCodes: ["687"] }, geometry: { type: "MultiPolygon", coordinates: [[[[159.77159, -28.41151], [174.245, -23.1974], [156.73836, -14.50464], [159.77159, -28.41151]]]] } },
+ { type: "Feature", properties: { iso1A2: "NE", iso1A3: "NER", iso1N3: "562", wikidata: "Q1032", nameEn: "Niger", aliases: ["RN"], groups: ["011", "202", "002", "UN"], callingCodes: ["227"] }, geometry: { type: "MultiPolygon", coordinates: [[[[14.22918, 22.61719], [13.5631, 23.16574], [11.96886, 23.51735], [7.48273, 20.87258], [7.38361, 20.79165], [5.8153, 19.45101], [4.26651, 19.14224], [4.26762, 17.00432], [4.21787, 17.00118], [4.19893, 16.39923], [3.50368, 15.35934], [3.03134, 15.42221], [3.01806, 15.34571], [1.31275, 15.27978], [0.96711, 14.98275], [0.72632, 14.95898], [0.23859, 15.00135], [0.16936, 14.51654], [0.38051, 14.05575], [0.61924, 13.68491], [0.77377, 13.6866], [0.77637, 13.64442], [0.99514, 13.5668], [1.02813, 13.46635], [1.20088, 13.38951], [1.24429, 13.39373], [1.28509, 13.35488], [1.24516, 13.33968], [1.21217, 13.37853], [1.18873, 13.31771], [0.99253, 13.37515], [0.99167, 13.10727], [2.26349, 12.41915], [2.05785, 12.35539], [2.39723, 11.89473], [2.45824, 11.98672], [2.39657, 12.10952], [2.37783, 12.24804], [2.6593, 12.30631], [2.83978, 12.40585], [3.25352, 12.01467], [3.31613, 11.88495], [3.48187, 11.86092], [3.59375, 11.70269], [3.61075, 11.69181], [3.67988, 11.75429], [3.67122, 11.80865], [3.63063, 11.83042], [3.61955, 11.91847], [3.67775, 11.97599], [3.63136, 12.11826], [3.66364, 12.25884], [3.65111, 12.52223], [3.94339, 12.74979], [4.10006, 12.98862], [4.14367, 13.17189], [4.14186, 13.47586], [4.23456, 13.47725], [4.4668, 13.68286], [4.87425, 13.78], [4.9368, 13.7345], [5.07396, 13.75052], [5.21026, 13.73627], [5.27797, 13.75474], [5.35437, 13.83567], [5.52957, 13.8845], [6.15771, 13.64564], [6.27411, 13.67835], [6.43053, 13.6006], [6.69617, 13.34057], [6.94445, 12.99825], [7.0521, 13.00076], [7.12676, 13.02445], [7.22399, 13.1293], [7.39241, 13.09717], [7.81085, 13.34902], [8.07997, 13.30847], [8.25185, 13.20369], [8.41853, 13.06166], [8.49493, 13.07519], [8.60431, 13.01768], [8.64251, 12.93985], [8.97413, 12.83661], [9.65995, 12.80614], [10.00373, 13.18171], [10.19993, 13.27129], [10.46731, 13.28819], [10.66004, 13.36422], [11.4535, 13.37773], [11.88236, 13.2527], [12.04209, 13.14452], [12.16189, 13.10056], [12.19315, 13.12423], [12.47095, 13.06673], [12.58033, 13.27805], [12.6793, 13.29157], [12.87376, 13.48919], [13.05085, 13.53984], [13.19844, 13.52802], [13.33213, 13.71195], [13.6302, 13.71094], [13.47559, 14.40881], [13.48259, 14.46704], [13.68573, 14.55276], [13.67878, 14.64013], [13.809, 14.72915], [13.78991, 14.87519], [13.86301, 15.04043], [14.37425, 15.72591], [15.50373, 16.89649], [15.6032, 18.77402], [15.75098, 19.93002], [15.99632, 20.35364], [15.6721, 20.70069], [15.59841, 20.74039], [15.56004, 20.79488], [15.55382, 20.86507], [15.57248, 20.92138], [15.62515, 20.95395], [15.28332, 21.44557], [15.20213, 21.49365], [15.19692, 21.99339], [14.99751, 23.00539], [14.22918, 22.61719]]]] } },
+ { type: "Feature", properties: { iso1A2: "NF", iso1A3: "NFK", iso1N3: "574", wikidata: "Q31057", nameEn: "Norfolk Island", country: "AU", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["672 3"] }, geometry: { type: "MultiPolygon", coordinates: [[[[169.82316, -28.16667], [166.29505, -28.29175], [167.94076, -30.60745], [169.82316, -28.16667]]]] } },
+ { type: "Feature", properties: { iso1A2: "NG", iso1A3: "NGA", iso1N3: "566", wikidata: "Q1033", nameEn: "Nigeria", groups: ["011", "202", "002", "UN"], callingCodes: ["234"] }, geometry: { type: "MultiPolygon", coordinates: [[[[6.15771, 13.64564], [5.52957, 13.8845], [5.35437, 13.83567], [5.27797, 13.75474], [5.21026, 13.73627], [5.07396, 13.75052], [4.9368, 13.7345], [4.87425, 13.78], [4.4668, 13.68286], [4.23456, 13.47725], [4.14186, 13.47586], [4.14367, 13.17189], [4.10006, 12.98862], [3.94339, 12.74979], [3.65111, 12.52223], [3.66364, 12.25884], [3.63136, 12.11826], [3.67775, 11.97599], [3.61955, 11.91847], [3.63063, 11.83042], [3.67122, 11.80865], [3.67988, 11.75429], [3.61075, 11.69181], [3.59375, 11.70269], [3.49175, 11.29765], [3.71505, 11.13015], [3.84243, 10.59316], [3.78292, 10.40538], [3.6844, 10.46351], [3.57275, 10.27185], [3.66908, 10.18136], [3.54429, 9.87739], [3.35383, 9.83641], [3.32099, 9.78032], [3.34726, 9.70696], [3.25093, 9.61632], [3.13928, 9.47167], [3.14147, 9.28375], [3.08017, 9.10006], [2.77907, 9.06924], [2.67523, 7.87825], [2.73095, 7.7755], [2.73405, 7.5423], [2.78668, 7.5116], [2.79442, 7.43486], [2.74489, 7.42565], [2.76965, 7.13543], [2.71702, 6.95722], [2.74024, 6.92802], [2.73405, 6.78508], [2.78823, 6.76356], [2.78204, 6.70514], [2.7325, 6.64057], [2.74334, 6.57291], [2.70464, 6.50831], [2.70566, 6.38038], [2.74181, 6.13349], [5.87055, 3.78489], [8.34397, 4.30689], [8.60302, 4.87353], [8.78027, 5.1243], [8.92029, 5.58403], [8.83687, 5.68483], [8.88156, 5.78857], [8.84209, 5.82562], [9.51757, 6.43874], [9.70674, 6.51717], [9.77824, 6.79088], [9.86314, 6.77756], [10.15135, 7.03781], [10.21466, 6.88996], [10.53639, 6.93432], [10.57214, 7.16345], [10.59746, 7.14719], [10.60789, 7.06885], [10.83727, 6.9358], [10.8179, 6.83377], [10.94302, 6.69325], [11.09644, 6.68437], [11.09495, 6.51717], [11.42041, 6.53789], [11.42264, 6.5882], [11.51499, 6.60892], [11.57755, 6.74059], [11.55818, 6.86186], [11.63117, 6.9905], [11.87396, 7.09398], [11.84864, 7.26098], [11.93205, 7.47812], [12.01844, 7.52981], [11.99908, 7.67302], [12.20909, 7.97553], [12.19271, 8.10826], [12.24782, 8.17904], [12.26123, 8.43696], [12.4489, 8.52536], [12.44146, 8.6152], [12.68722, 8.65938], [12.71701, 8.7595], [12.79, 8.75361], [12.81085, 8.91992], [12.90022, 9.11411], [12.91958, 9.33905], [12.85628, 9.36698], [13.02385, 9.49334], [13.22642, 9.57266], [13.25472, 9.76795], [13.29941, 9.8296], [13.25025, 9.86042], [13.24132, 9.91031], [13.27409, 9.93232], [13.286, 9.9822], [13.25323, 10.00127], [13.25025, 10.03647], [13.34111, 10.12299], [13.43644, 10.13326], [13.5705, 10.53183], [13.54964, 10.61236], [13.73434, 10.9255], [13.70753, 10.94451], [13.7403, 11.00593], [13.78945, 11.00154], [13.97489, 11.30258], [14.17821, 11.23831], [14.6124, 11.51283], [14.64591, 11.66166], [14.55207, 11.72001], [14.61612, 11.7798], [14.6474, 12.17466], [14.4843, 12.35223], [14.22215, 12.36533], [14.17523, 12.41916], [14.20204, 12.53405], [14.08251, 13.0797], [13.6302, 13.71094], [13.33213, 13.71195], [13.19844, 13.52802], [13.05085, 13.53984], [12.87376, 13.48919], [12.6793, 13.29157], [12.58033, 13.27805], [12.47095, 13.06673], [12.19315, 13.12423], [12.16189, 13.10056], [12.04209, 13.14452], [11.88236, 13.2527], [11.4535, 13.37773], [10.66004, 13.36422], [10.46731, 13.28819], [10.19993, 13.27129], [10.00373, 13.18171], [9.65995, 12.80614], [8.97413, 12.83661], [8.64251, 12.93985], [8.60431, 13.01768], [8.49493, 13.07519], [8.41853, 13.06166], [8.25185, 13.20369], [8.07997, 13.30847], [7.81085, 13.34902], [7.39241, 13.09717], [7.22399, 13.1293], [7.12676, 13.02445], [7.0521, 13.00076], [6.94445, 12.99825], [6.69617, 13.34057], [6.43053, 13.6006], [6.27411, 13.67835], [6.15771, 13.64564]]]] } },
+ { type: "Feature", properties: { iso1A2: "NI", iso1A3: "NIC", iso1N3: "558", wikidata: "Q811", nameEn: "Nicaragua", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["505"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-83.13724, 15.00002], [-83.49268, 15.01158], [-83.62101, 14.89448], [-83.89551, 14.76697], [-84.10584, 14.76353], [-84.48373, 14.63249], [-84.70119, 14.68078], [-84.82596, 14.82212], [-84.90082, 14.80489], [-85.1575, 14.53934], [-85.18602, 14.24929], [-85.32149, 14.2562], [-85.45762, 14.11304], [-85.73964, 13.9698], [-85.75477, 13.8499], [-86.03458, 13.99181], [-86.00685, 14.08474], [-86.14801, 14.04317], [-86.35219, 13.77157], [-86.76812, 13.79605], [-86.71267, 13.30348], [-86.87066, 13.30641], [-86.93383, 13.18677], [-86.93197, 13.05313], [-87.03785, 12.98682], [-87.06306, 13.00892], [-87.37107, 12.98646], [-87.55124, 13.12523], [-87.7346, 13.13228], [-88.11443, 12.63306], [-86.14524, 11.09059], [-85.71223, 11.06868], [-85.60529, 11.22607], [-84.92439, 10.9497], [-84.68197, 11.07568], [-83.90838, 10.71161], [-83.66597, 10.79916], [-83.68276, 11.01562], [-82.56142, 11.91792], [-82.06974, 14.49418], [-83.04763, 15.03256], [-83.13724, 15.00002]]]] } },
+ { type: "Feature", properties: { iso1A2: "NL", iso1A3: "NLD", iso1N3: "528", wikidata: "Q29999", nameEn: "Kingdom of the Netherlands" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "NO", iso1A3: "NOR", iso1N3: "578", wikidata: "Q20", nameEn: "Norway" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "NP", iso1A3: "NPL", iso1N3: "524", wikidata: "Q837", nameEn: "Nepal", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["977"] }, geometry: { type: "MultiPolygon", coordinates: [[[[88.13378, 27.88015], [87.82681, 27.95248], [87.72718, 27.80938], [87.56996, 27.84517], [87.11696, 27.84104], [87.03757, 27.94835], [86.75582, 28.04182], [86.74181, 28.10638], [86.56265, 28.09569], [86.51609, 27.96623], [86.42736, 27.91122], [86.22966, 27.9786], [86.18607, 28.17364], [86.088, 28.09264], [86.08333, 28.02121], [86.12069, 27.93047], [86.06309, 27.90021], [85.94946, 27.9401], [85.97813, 27.99023], [85.90743, 28.05144], [85.84672, 28.18187], [85.74864, 28.23126], [85.71907, 28.38064], [85.69105, 28.38475], [85.60854, 28.25045], [85.59765, 28.30529], [85.4233, 28.32996], [85.38127, 28.28336], [85.10729, 28.34092], [85.18668, 28.54076], [85.19135, 28.62825], [85.06059, 28.68562], [84.85511, 28.58041], [84.62317, 28.73887], [84.47528, 28.74023], [84.2231, 28.89571], [84.24801, 29.02783], [84.18107, 29.23451], [83.97559, 29.33091], [83.82303, 29.30513], [83.63156, 29.16249], [83.44787, 29.30513], [83.28131, 29.56813], [83.07116, 29.61957], [82.73024, 29.81695], [82.5341, 29.9735], [82.38622, 30.02608], [82.16984, 30.0692], [82.19475, 30.16884], [82.10757, 30.23745], [82.10135, 30.35439], [81.99082, 30.33423], [81.62033, 30.44703], [81.5459, 30.37688], [81.41018, 30.42153], [81.39928, 30.21862], [81.33355, 30.15303], [81.2623, 30.14596], [81.29032, 30.08806], [81.24362, 30.0126], [81.12842, 30.01395], [81.03953, 30.20059], [80.92547, 30.17193], [80.91143, 30.22173], [80.86673, 30.17321], [80.8778, 30.13384], [80.67076, 29.95732], [80.60226, 29.95732], [80.57179, 29.91422], [80.56247, 29.86661], [80.48997, 29.79566], [80.43458, 29.80466], [80.41554, 29.79451], [80.36803, 29.73865], [80.38428, 29.68513], [80.41858, 29.63581], [80.37939, 29.57098], [80.24322, 29.44299], [80.31428, 29.30784], [80.28626, 29.20327], [80.24112, 29.21414], [80.26602, 29.13938], [80.23178, 29.11626], [80.18085, 29.13649], [80.05743, 28.91479], [80.06957, 28.82763], [80.12125, 28.82346], [80.37188, 28.63371], [80.44504, 28.63098], [80.52443, 28.54897], [80.50575, 28.6706], [80.55142, 28.69182], [81.03471, 28.40054], [81.19847, 28.36284], [81.32923, 28.13521], [81.38683, 28.17638], [81.48179, 28.12148], [81.47867, 28.08303], [81.91223, 27.84995], [81.97214, 27.93322], [82.06554, 27.92222], [82.46405, 27.6716], [82.70378, 27.72122], [82.74119, 27.49838], [82.93261, 27.50328], [82.94938, 27.46036], [83.19413, 27.45632], [83.27197, 27.38309], [83.2673, 27.36235], [83.29999, 27.32778], [83.35136, 27.33885], [83.38872, 27.39276], [83.39495, 27.4798], [83.61288, 27.47013], [83.85595, 27.35797], [83.86182, 27.4241], [83.93306, 27.44939], [84.02229, 27.43836], [84.10791, 27.52399], [84.21376, 27.45218], [84.25735, 27.44941], [84.29315, 27.39], [84.62161, 27.33885], [84.69166, 27.21294], [84.64496, 27.04669], [84.793, 26.9968], [84.82913, 27.01989], [84.85754, 26.98984], [84.96687, 26.95599], [84.97186, 26.9149], [85.00536, 26.89523], [85.05592, 26.88991], [85.02635, 26.85381], [85.15883, 26.86966], [85.19291, 26.86909], [85.18046, 26.80519], [85.21159, 26.75933], [85.34302, 26.74954], [85.47752, 26.79292], [85.56471, 26.84133], [85.5757, 26.85955], [85.59461, 26.85161], [85.61621, 26.86721], [85.66239, 26.84822], [85.73483, 26.79613], [85.72315, 26.67471], [85.76907, 26.63076], [85.83126, 26.61134], [85.85126, 26.60866], [85.8492, 26.56667], [86.02729, 26.66756], [86.13596, 26.60651], [86.22513, 26.58863], [86.26235, 26.61886], [86.31564, 26.61925], [86.49726, 26.54218], [86.54258, 26.53819], [86.57073, 26.49825], [86.61313, 26.48658], [86.62686, 26.46891], [86.69124, 26.45169], [86.74025, 26.42386], [86.76797, 26.45892], [86.82898, 26.43919], [86.94543, 26.52076], [86.95912, 26.52076], [87.01559, 26.53228], [87.04691, 26.58685], [87.0707, 26.58571], [87.09147, 26.45039], [87.14751, 26.40542], [87.18863, 26.40558], [87.24682, 26.4143], [87.26587, 26.40592], [87.26568, 26.37294], [87.34568, 26.34787], [87.37314, 26.40815], [87.46566, 26.44058], [87.51571, 26.43106], [87.55274, 26.40596], [87.59175, 26.38342], [87.66803, 26.40294], [87.67893, 26.43501], [87.76004, 26.40711], [87.7918, 26.46737], [87.84193, 26.43663], [87.89085, 26.48565], [87.90115, 26.44923], [88.00895, 26.36029], [88.09414, 26.43732], [88.09963, 26.54195], [88.16452, 26.64111], [88.1659, 26.68177], [88.19107, 26.75516], [88.12302, 26.95324], [88.13422, 26.98705], [88.11719, 26.98758], [87.9887, 27.11045], [88.01587, 27.21388], [88.01646, 27.21612], [88.07277, 27.43007], [88.04008, 27.49223], [88.19107, 27.79285], [88.1973, 27.85067], [88.13378, 27.88015]]]] } },
+ { type: "Feature", properties: { iso1A2: "NR", iso1A3: "NRU", iso1N3: "520", wikidata: "Q697", nameEn: "Nauru", groups: ["057", "009", "UN"], driveSide: "left", callingCodes: ["674"] }, geometry: { type: "MultiPolygon", coordinates: [[[[166.95155, 0.14829], [166.21778, -0.7977], [167.60042, -0.88259], [166.95155, 0.14829]]]] } },
+ { type: "Feature", properties: { iso1A2: "NU", iso1A3: "NIU", iso1N3: "570", wikidata: "Q34020", nameEn: "Niue", country: "NZ", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["683"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-170.83899, -18.53439], [-170.82274, -20.44429], [-168.63096, -18.60489], [-170.83899, -18.53439]]]] } },
+ { type: "Feature", properties: { iso1A2: "NZ", iso1A3: "NZL", iso1N3: "554", wikidata: "Q664", nameEn: "New Zealand" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "OM", iso1A3: "OMN", iso1N3: "512", wikidata: "Q842", nameEn: "Oman", groups: ["145", "142", "UN"], callingCodes: ["968"] }, geometry: { type: "MultiPolygon", coordinates: [[[[56.82555, 25.7713], [56.79239, 26.41236], [56.68954, 26.76645], [56.2644, 26.58649], [55.81777, 26.18798], [56.08666, 26.05038], [56.15498, 26.06828], [56.19334, 25.9795], [56.13963, 25.82765], [56.17416, 25.77239], [56.13579, 25.73524], [56.14826, 25.66351], [56.18363, 25.65508], [56.20473, 25.61119], [56.25365, 25.60211], [56.26636, 25.60643], [56.25341, 25.61443], [56.26534, 25.62825], [56.82555, 25.7713]]], [[[56.26062, 25.33108], [56.23362, 25.31253], [56.25008, 25.28843], [56.24465, 25.27505], [56.20838, 25.25668], [56.20872, 25.24104], [56.24341, 25.22867], [56.27628, 25.23404], [56.34438, 25.26653], [56.35172, 25.30681], [56.3111, 25.30107], [56.3005, 25.31815], [56.26062, 25.33108]], [[56.28423, 25.26344], [56.27086, 25.26128], [56.2716, 25.27916], [56.28102, 25.28486], [56.29379, 25.2754], [56.28423, 25.26344]]], [[[61.45114, 22.55394], [56.86325, 25.03856], [56.3227, 24.97284], [56.34873, 24.93205], [56.30269, 24.88334], [56.20568, 24.85063], [56.20062, 24.78565], [56.13684, 24.73699], [56.06128, 24.74457], [56.03535, 24.81161], [55.97836, 24.87673], [55.97467, 24.89639], [56.05106, 24.87461], [56.05715, 24.95727], [55.96316, 25.00857], [55.90849, 24.96771], [55.85094, 24.96858], [55.81116, 24.9116], [55.81348, 24.80102], [55.83408, 24.77858], [55.83271, 24.68567], [55.76461, 24.5287], [55.83271, 24.41521], [55.83395, 24.32776], [55.80747, 24.31069], [55.79145, 24.27914], [55.76781, 24.26209], [55.75939, 24.26114], [55.75382, 24.2466], [55.75257, 24.23466], [55.76558, 24.23227], [55.77658, 24.23476], [55.83367, 24.20193], [55.95472, 24.2172], [56.01799, 24.07426], [55.8308, 24.01633], [55.73301, 24.05994], [55.48677, 23.94946], [55.57358, 23.669], [55.22634, 23.10378], [55.2137, 22.71065], [55.66469, 21.99658], [54.99756, 20.00083], [52.00311, 19.00083], [52.78009, 17.35124], [52.74267, 17.29519], [52.81185, 17.28568], [57.49095, 8.14549], [61.45114, 22.55394]]]] } },
+ { type: "Feature", properties: { iso1A2: "PA", iso1A3: "PAN", iso1N3: "591", wikidata: "Q804", nameEn: "Panama", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["507"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-77.32389, 8.81247], [-77.58292, 9.22278], [-78.79327, 9.93766], [-82.51044, 9.65379], [-82.56507, 9.57279], [-82.61345, 9.49881], [-82.66667, 9.49746], [-82.77206, 9.59573], [-82.87919, 9.62645], [-82.84871, 9.4973], [-82.93516, 9.46741], [-82.93516, 9.07687], [-82.72126, 8.97125], [-82.88253, 8.83331], [-82.91377, 8.774], [-82.92068, 8.74832], [-82.8794, 8.6981], [-82.82739, 8.60153], [-82.83975, 8.54755], [-82.83322, 8.52464], [-82.8382, 8.48117], [-82.8679, 8.44042], [-82.93056, 8.43465], [-83.05209, 8.33394], [-82.9388, 8.26634], [-82.88641, 8.10219], [-82.89137, 8.05755], [-82.89978, 8.04083], [-82.94503, 7.93865], [-82.13751, 6.97312], [-78.06168, 7.07793], [-77.89178, 7.22681], [-77.81426, 7.48319], [-77.72157, 7.47612], [-77.72514, 7.72348], [-77.57185, 7.51147], [-77.17257, 7.97422], [-77.45064, 8.49991], [-77.32389, 8.81247]]]] } },
+ { type: "Feature", properties: { iso1A2: "PE", iso1A3: "PER", iso1N3: "604", wikidata: "Q419", nameEn: "Peru", groups: ["005", "419", "019", "UN"], callingCodes: ["51"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-74.26675, -0.97229], [-74.42701, -0.50218], [-75.18513, -0.0308], [-75.25764, -0.11943], [-75.40192, -0.17196], [-75.61997, -0.10012], [-75.60169, -0.18708], [-75.53615, -0.19213], [-75.22862, -0.60048], [-75.22862, -0.95588], [-75.3872, -0.9374], [-75.57429, -1.55961], [-76.05203, -2.12179], [-76.6324, -2.58397], [-77.94147, -3.05454], [-78.19369, -3.36431], [-78.14324, -3.47653], [-78.22642, -3.51113], [-78.24589, -3.39907], [-78.34362, -3.38633], [-78.68394, -4.60754], [-78.85149, -4.66795], [-79.01659, -5.01481], [-79.1162, -4.97774], [-79.26248, -4.95167], [-79.59402, -4.46848], [-79.79722, -4.47558], [-80.13945, -4.29786], [-80.39256, -4.48269], [-80.46386, -4.41516], [-80.32114, -4.21323], [-80.45023, -4.20938], [-80.4822, -4.05477], [-80.46386, -4.01342], [-80.13232, -3.90317], [-80.19926, -3.68894], [-80.18741, -3.63994], [-80.19848, -3.59249], [-80.21642, -3.5888], [-80.20535, -3.51667], [-80.22629, -3.501], [-80.23651, -3.48652], [-80.24586, -3.48677], [-80.24123, -3.46124], [-80.20647, -3.431], [-80.30602, -3.39149], [-84.52388, -3.36941], [-85.71054, -21.15413], [-70.59118, -18.35072], [-70.378, -18.3495], [-70.31267, -18.31258], [-70.16394, -18.31737], [-69.96732, -18.25992], [-69.81607, -18.12582], [-69.75305, -17.94605], [-69.82868, -17.72048], [-69.79087, -17.65563], [-69.66483, -17.65083], [-69.46897, -17.4988], [-69.46863, -17.37466], [-69.62883, -17.28142], [-69.16896, -16.72233], [-69.00853, -16.66769], [-69.04027, -16.57214], [-68.98358, -16.42165], [-68.79464, -16.33272], [-68.96238, -16.194], [-69.09986, -16.22693], [-69.20291, -16.16668], [-69.40336, -15.61358], [-69.14856, -15.23478], [-69.36254, -14.94634], [-68.88135, -14.18639], [-69.05265, -13.68546], [-68.8864, -13.40792], [-68.85615, -12.87769], [-68.65044, -12.50689], [-68.98115, -11.8979], [-69.57156, -10.94555], [-69.57835, -10.94051], [-69.90896, -10.92744], [-70.38791, -11.07096], [-70.51395, -10.92249], [-70.64134, -11.0108], [-70.62487, -9.80666], [-70.55429, -9.76692], [-70.58453, -9.58303], [-70.53373, -9.42628], [-71.23394, -9.9668], [-72.14742, -9.98049], [-72.31883, -9.5184], [-72.72216, -9.41397], [-73.21498, -9.40904], [-72.92886, -9.04074], [-73.76576, -7.89884], [-73.65485, -7.77897], [-73.96938, -7.58465], [-73.77011, -7.28944], [-73.73986, -6.87919], [-73.12983, -6.43852], [-73.24579, -6.05764], [-72.83973, -5.14765], [-72.64391, -5.0391], [-71.87003, -4.51661], [-70.96814, -4.36915], [-70.77601, -4.15717], [-70.33236, -4.15214], [-70.19582, -4.3607], [-70.11305, -4.27281], [-70.00888, -4.37833], [-69.94708, -4.2431], [-70.3374, -3.79505], [-70.52393, -3.87553], [-70.71396, -3.7921], [-70.04609, -2.73906], [-70.94377, -2.23142], [-71.75223, -2.15058], [-72.92587, -2.44514], [-73.65312, -1.26222], [-74.26675, -0.97229]]]] } },
+ { type: "Feature", properties: { iso1A2: "PF", iso1A3: "PYF", iso1N3: "258", wikidata: "Q30971", nameEn: "French Polynesia", country: "FR", groups: ["EU", "Q1451600", "061", "009", "UN"], callingCodes: ["689"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-135.59706, -4.70473], [-156.48634, -15.52824], [-156.45576, -31.75456], [-133.59543, -28.4709], [-135.59706, -4.70473]]]] } },
+ { type: "Feature", properties: { iso1A2: "PG", iso1A3: "PNG", iso1N3: "598", wikidata: "Q691", nameEn: "Papua New Guinea", groups: ["054", "009", "UN"], driveSide: "left", callingCodes: ["675"] }, geometry: { type: "MultiPolygon", coordinates: [[[[141.03157, 2.12829], [140.99813, -6.3233], [140.85295, -6.72996], [140.90448, -6.85033], [141.01763, -6.90181], [141.01842, -9.35091], [141.88934, -9.36111], [142.19246, -9.15378], [142.48658, -9.36754], [143.29772, -9.33993], [143.87386, -9.02382], [145.2855, -9.62524], [156.73836, -14.50464], [154.74815, -7.33315], [155.60735, -6.92266], [155.69784, -6.92661], [155.92557, -6.84664], [156.03993, -6.65703], [156.03296, -6.55528], [160.43769, -4.17974], [141.03157, 2.12829]]]] } },
+ { type: "Feature", properties: { iso1A2: "PH", iso1A3: "PHL", iso1N3: "608", wikidata: "Q928", nameEn: "Philippines", aliases: ["PI", "RP"], groups: ["035", "142", "UN"], callingCodes: ["63"] }, geometry: { type: "MultiPolygon", coordinates: [[[[129.19694, 7.84182], [121.8109, 21.77688], [120.69238, 21.52331], [118.82252, 14.67191], [115.39742, 10.92666], [116.79524, 7.43869], [117.17735, 7.52841], [117.93857, 6.89845], [117.98544, 6.27477], [119.52945, 5.35672], [118.93936, 4.09009], [118.06469, 4.16638], [121.14448, 2.12444], [129.19694, 7.84182]]]] } },
+ { type: "Feature", properties: { iso1A2: "PK", iso1A3: "PAK", iso1N3: "586", wikidata: "Q843", nameEn: "Pakistan", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["92"] }, geometry: { type: "MultiPolygon", coordinates: [[[[75.72737, 36.7529], [75.45562, 36.71971], [75.40481, 36.95382], [75.13839, 37.02622], [74.56453, 37.03023], [74.53739, 36.96224], [74.43389, 37.00977], [74.04856, 36.82648], [73.82685, 36.91421], [72.6323, 36.84601], [72.18135, 36.71838], [71.80267, 36.49924], [71.60491, 36.39429], [71.19505, 36.04134], [71.37969, 35.95865], [71.55273, 35.71483], [71.49917, 35.6267], [71.65435, 35.4479], [71.54294, 35.31037], [71.5541, 35.28776], [71.67495, 35.21262], [71.52938, 35.09023], [71.55273, 35.02615], [71.49917, 35.00478], [71.50329, 34.97328], [71.29472, 34.87728], [71.28356, 34.80882], [71.08718, 34.69034], [71.11602, 34.63047], [71.0089, 34.54568], [71.02401, 34.44835], [71.17662, 34.36769], [71.12815, 34.26619], [71.13078, 34.16503], [71.09453, 34.13524], [71.09307, 34.11961], [71.06933, 34.10564], [71.07345, 34.06242], [70.88119, 33.97933], [70.54336, 33.9463], [69.90203, 34.04194], [69.87307, 33.9689], [69.85671, 33.93719], [70.00503, 33.73528], [70.14236, 33.71701], [70.14785, 33.6553], [70.20141, 33.64387], [70.17062, 33.53535], [70.32775, 33.34496], [70.13686, 33.21064], [70.07369, 33.22557], [70.02563, 33.14282], [69.85259, 33.09451], [69.79766, 33.13247], [69.71526, 33.09911], [69.57656, 33.09911], [69.49004, 33.01509], [69.49854, 32.88843], [69.5436, 32.8768], [69.47082, 32.85834], [69.38018, 32.76601], [69.43649, 32.7302], [69.44747, 32.6678], [69.38155, 32.56601], [69.2868, 32.53938], [69.23599, 32.45946], [69.27932, 32.29119], [69.27032, 32.14141], [69.3225, 31.93186], [69.20577, 31.85957], [69.11514, 31.70782], [69.00939, 31.62249], [68.95995, 31.64822], [68.91078, 31.59687], [68.79997, 31.61665], [68.6956, 31.75687], [68.57475, 31.83158], [68.44222, 31.76446], [68.27605, 31.75863], [68.25614, 31.80357], [68.1655, 31.82691], [68.00071, 31.6564], [67.86887, 31.63536], [67.72056, 31.52304], [67.58323, 31.52772], [67.62374, 31.40473], [67.7748, 31.4188], [67.78854, 31.33203], [67.29964, 31.19586], [67.03323, 31.24519], [67.04147, 31.31561], [66.83273, 31.26867], [66.72561, 31.20526], [66.68166, 31.07597], [66.58175, 30.97532], [66.42645, 30.95309], [66.39194, 30.9408], [66.28413, 30.57001], [66.34869, 30.404], [66.23609, 30.06321], [66.36042, 29.9583], [66.24175, 29.85181], [65.04005, 29.53957], [64.62116, 29.58903], [64.19796, 29.50407], [64.12966, 29.39157], [63.5876, 29.50456], [62.47751, 29.40782], [60.87231, 29.86514], [61.31508, 29.38903], [61.53765, 29.00507], [61.65978, 28.77937], [61.93581, 28.55284], [62.40259, 28.42703], [62.59499, 28.24842], [62.79412, 28.28108], [62.7638, 28.02992], [62.84905, 27.47627], [62.79684, 27.34381], [62.80604, 27.22412], [63.19649, 27.25674], [63.32283, 27.14437], [63.25005, 27.08692], [63.25005, 26.84212], [63.18688, 26.83844], [63.1889, 26.65072], [62.77352, 26.64099], [62.31484, 26.528], [62.21304, 26.26601], [62.05117, 26.31647], [61.89391, 26.26251], [61.83831, 26.07249], [61.83968, 25.7538], [61.683, 25.66638], [61.6433, 25.27541], [61.46682, 24.57869], [68.11329, 23.53945], [68.20763, 23.85849], [68.39339, 23.96838], [68.74643, 23.97027], [68.7416, 24.31904], [68.90914, 24.33156], [68.97781, 24.26021], [69.07806, 24.29777], [69.19341, 24.25646], [69.29778, 24.28712], [69.59579, 24.29777], [69.73335, 24.17007], [70.03428, 24.172], [70.11712, 24.30915], [70.5667, 24.43787], [70.57906, 24.27774], [70.71502, 24.23517], [70.88393, 24.27398], [70.85784, 24.30903], [70.94985, 24.3791], [71.04461, 24.34657], [71.12838, 24.42662], [71.00341, 24.46038], [70.97594, 24.60904], [71.09405, 24.69017], [70.94002, 24.92843], [70.89148, 25.15064], [70.66695, 25.39314], [70.67382, 25.68186], [70.60378, 25.71898], [70.53649, 25.68928], [70.37444, 25.67443], [70.2687, 25.71156], [70.0985, 25.93238], [70.08193, 26.08094], [70.17532, 26.24118], [70.17532, 26.55362], [70.05584, 26.60398], [69.88555, 26.56836], [69.50904, 26.74892], [69.58519, 27.18109], [70.03136, 27.56627], [70.12502, 27.8057], [70.37307, 28.01208], [70.60927, 28.02178], [70.79054, 27.68423], [71.89921, 27.96035], [71.9244, 28.11555], [72.20329, 28.3869], [72.29495, 28.66367], [72.40402, 28.78283], [72.94272, 29.02487], [73.01337, 29.16422], [73.05886, 29.1878], [73.28094, 29.56646], [73.3962, 29.94707], [73.58665, 30.01848], [73.80299, 30.06969], [73.97225, 30.19829], [73.95736, 30.28466], [73.88993, 30.36305], [74.5616, 31.04153], [74.67971, 31.05479], [74.6852, 31.12771], [74.60006, 31.13711], [74.60281, 31.10419], [74.56023, 31.08303], [74.51629, 31.13829], [74.53223, 31.30321], [74.59773, 31.4136], [74.64713, 31.45605], [74.59319, 31.50197], [74.61517, 31.55698], [74.57498, 31.60382], [74.47771, 31.72227], [74.58907, 31.87824], [74.79919, 31.95983], [74.86236, 32.04485], [74.9269, 32.0658], [75.00793, 32.03786], [75.25649, 32.10187], [75.38046, 32.26836], [75.28259, 32.36556], [75.03265, 32.49538], [74.97634, 32.45367], [74.84725, 32.49075], [74.68362, 32.49298], [74.67431, 32.56676], [74.65251, 32.56416], [74.64424, 32.60985], [74.69542, 32.66792], [74.65345, 32.71225], [74.7113, 32.84219], [74.64675, 32.82604], [74.6289, 32.75561], [74.45312, 32.77755], [74.41467, 32.90563], [74.31227, 32.92795], [74.34875, 32.97823], [74.31854, 33.02891], [74.17571, 33.07495], [74.15374, 33.13477], [74.02144, 33.18908], [74.01366, 33.25199], [74.08782, 33.26232], [74.17983, 33.3679], [74.18121, 33.4745], [74.10115, 33.56392], [74.03576, 33.56718], [73.97367, 33.64061], [73.98968, 33.66155], [73.96423, 33.73071], [74.00891, 33.75437], [74.05898, 33.82089], [74.14001, 33.83002], [74.26086, 33.92237], [74.25262, 34.01577], [74.21554, 34.03853], [73.91341, 34.01235], [73.88732, 34.05105], [73.90677, 34.10504], [73.98208, 34.2522], [73.90517, 34.35317], [73.8475, 34.32935], [73.74862, 34.34183], [73.74999, 34.3781], [73.88732, 34.48911], [73.89419, 34.54568], [73.93951, 34.57169], [73.93401, 34.63386], [73.96423, 34.68244], [74.12897, 34.70073], [74.31239, 34.79626], [74.58083, 34.77386], [74.6663, 34.703], [75.01479, 34.64629], [75.38009, 34.55021], [75.75438, 34.51827], [76.04614, 34.67566], [76.15463, 34.6429], [76.47186, 34.78965], [76.67648, 34.76371], [76.74377, 34.84039], [76.74514, 34.92488], [76.87193, 34.96906], [76.99251, 34.93349], [77.11796, 35.05419], [76.93465, 35.39866], [76.85088, 35.39754], [76.75475, 35.52617], [76.77323, 35.66062], [76.50961, 35.8908], [76.33453, 35.84296], [76.14913, 35.82848], [76.15325, 35.9264], [75.93028, 36.13136], [76.00906, 36.17511], [76.0324, 36.41198], [75.92391, 36.56986], [75.72737, 36.7529]]]] } },
+ { type: "Feature", properties: { iso1A2: "PL", iso1A3: "POL", iso1N3: "616", wikidata: "Q36", nameEn: "Poland", groups: ["EU", "151", "150", "UN"], callingCodes: ["48"] }, geometry: { type: "MultiPolygon", coordinates: [[[[18.57853, 55.25302], [14.20811, 54.12784], [14.22634, 53.9291], [14.20647, 53.91671], [14.18544, 53.91258], [14.20823, 53.90776], [14.21323, 53.8664], [14.27249, 53.74464], [14.26782, 53.69866], [14.2836, 53.67721], [14.27133, 53.66613], [14.28477, 53.65955], [14.2853, 53.63392], [14.31904, 53.61581], [14.30416, 53.55499], [14.3273, 53.50587], [14.35209, 53.49506], [14.4215, 53.27724], [14.44133, 53.27427], [14.45125, 53.26241], [14.40662, 53.21098], [14.37853, 53.20405], [14.36696, 53.16444], [14.38679, 53.13669], [14.35044, 53.05829], [14.25954, 53.00264], [14.14056, 52.95786], [14.15873, 52.87715], [14.12256, 52.84311], [14.13806, 52.82392], [14.22071, 52.81175], [14.61073, 52.59847], [14.6289, 52.57136], [14.60081, 52.53116], [14.63056, 52.48993], [14.54423, 52.42568], [14.55228, 52.35264], [14.56378, 52.33838], [14.58149, 52.28007], [14.70139, 52.25038], [14.71319, 52.22144], [14.68344, 52.19612], [14.70616, 52.16927], [14.67683, 52.13936], [14.6917, 52.10283], [14.72971, 52.09167], [14.76026, 52.06624], [14.71339, 52.00337], [14.70488, 51.97679], [14.7139, 51.95643], [14.71836, 51.95606], [14.72163, 51.95188], [14.7177, 51.94048], [14.70601, 51.92944], [14.6933, 51.9044], [14.6588, 51.88359], [14.59089, 51.83302], [14.60493, 51.80473], [14.64625, 51.79472], [14.66386, 51.73282], [14.69065, 51.70842], [14.75392, 51.67445], [14.75759, 51.62318], [14.7727, 51.61263], [14.71125, 51.56209], [14.73047, 51.54606], [14.72652, 51.53902], [14.73219, 51.52922], [14.94749, 51.47155], [14.9652, 51.44793], [14.96899, 51.38367], [14.98008, 51.33449], [15.04288, 51.28387], [15.01242, 51.21285], [15.0047, 51.16874], [14.99311, 51.16249], [14.99414, 51.15813], [15.00083, 51.14974], [14.99646, 51.14365], [14.99079, 51.14284], [14.99689, 51.12205], [14.98229, 51.11354], [14.97938, 51.07742], [14.95529, 51.04552], [14.92942, 50.99744], [14.89252, 50.94999], [14.89681, 50.9422], [14.81664, 50.88148], [14.82803, 50.86966], [14.99852, 50.86817], [15.01088, 50.97984], [14.96419, 50.99108], [15.02433, 51.0242], [15.03895, 51.0123], [15.06218, 51.02269], [15.10152, 51.01095], [15.11937, 50.99021], [15.16744, 51.01959], [15.1743, 50.9833], [15.2361, 50.99886], [15.27043, 50.97724], [15.2773, 50.8907], [15.36656, 50.83956], [15.3803, 50.77187], [15.43798, 50.80833], [15.73186, 50.73885], [15.81683, 50.75666], [15.87331, 50.67188], [15.97219, 50.69799], [16.0175, 50.63009], [15.98317, 50.61528], [16.02437, 50.60046], [16.10265, 50.66405], [16.20839, 50.63096], [16.23174, 50.67101], [16.33611, 50.66579], [16.44597, 50.58041], [16.34572, 50.49575], [16.31413, 50.50274], [16.19526, 50.43291], [16.21585, 50.40627], [16.22821, 50.41054], [16.28118, 50.36891], [16.30289, 50.38292], [16.36495, 50.37679], [16.3622, 50.34875], [16.39379, 50.3207], [16.42674, 50.32509], [16.56407, 50.21009], [16.55446, 50.16613], [16.63137, 50.1142], [16.7014, 50.09659], [16.8456, 50.20834], [16.98018, 50.24172], [17.00353, 50.21449], [17.02825, 50.23118], [16.99803, 50.25753], [17.02138, 50.27772], [16.99803, 50.30316], [16.94448, 50.31281], [16.90877, 50.38642], [16.85933, 50.41093], [16.89229, 50.45117], [17.1224, 50.39494], [17.14498, 50.38117], [17.19579, 50.38817], [17.19991, 50.3654], [17.27681, 50.32246], [17.34273, 50.32947], [17.34548, 50.2628], [17.3702, 50.28123], [17.58889, 50.27837], [17.67764, 50.28977], [17.69292, 50.32859], [17.74648, 50.29966], [17.72176, 50.25665], [17.76296, 50.23382], [17.70528, 50.18812], [17.59404, 50.16437], [17.66683, 50.10275], [17.6888, 50.12037], [17.7506, 50.07896], [17.77669, 50.02253], [17.86886, 49.97452], [18.00191, 50.01723], [18.04585, 50.01194], [18.04585, 50.03311], [18.00396, 50.04954], [18.03212, 50.06574], [18.07898, 50.04535], [18.10628, 50.00223], [18.20241, 49.99958], [18.21752, 49.97309], [18.27107, 49.96779], [18.27794, 49.93863], [18.31914, 49.91565], [18.33278, 49.92415], [18.33562, 49.94747], [18.41604, 49.93498], [18.53423, 49.89906], [18.54495, 49.9079], [18.54299, 49.92537], [18.57697, 49.91565], [18.57045, 49.87849], [18.60341, 49.86256], [18.57183, 49.83334], [18.61278, 49.7618], [18.61368, 49.75426], [18.62645, 49.75002], [18.62943, 49.74603], [18.62676, 49.71983], [18.69817, 49.70473], [18.72838, 49.68163], [18.80479, 49.6815], [18.84786, 49.5446], [18.84521, 49.51672], [18.94536, 49.52143], [18.97283, 49.49914], [18.9742, 49.39557], [19.18019, 49.41165], [19.25435, 49.53391], [19.36009, 49.53747], [19.37795, 49.574], [19.45348, 49.61583], [19.52626, 49.57311], [19.53313, 49.52856], [19.57845, 49.46077], [19.64162, 49.45184], [19.6375, 49.40897], [19.72127, 49.39288], [19.78581, 49.41701], [19.82237, 49.27806], [19.75286, 49.20751], [19.86409, 49.19316], [19.90529, 49.23532], [19.98494, 49.22904], [20.08238, 49.1813], [20.13738, 49.31685], [20.21977, 49.35265], [20.31453, 49.34817], [20.31728, 49.39914], [20.39939, 49.3896], [20.46422, 49.41612], [20.5631, 49.375], [20.61666, 49.41791], [20.72274, 49.41813], [20.77971, 49.35383], [20.9229, 49.29626], [20.98733, 49.30774], [21.09799, 49.37176], [21.041, 49.41791], [21.12477, 49.43666], [21.19756, 49.4054], [21.27858, 49.45988], [21.43376, 49.41433], [21.62328, 49.4447], [21.77983, 49.35443], [21.82927, 49.39467], [21.96385, 49.3437], [22.04427, 49.22136], [22.56155, 49.08865], [22.89122, 49.00725], [22.86336, 49.10513], [22.72009, 49.20288], [22.748, 49.32759], [22.69444, 49.49378], [22.64534, 49.53094], [22.78304, 49.65543], [22.80261, 49.69098], [22.83179, 49.69875], [22.99329, 49.84249], [23.28221, 50.0957], [23.67635, 50.33385], [23.71382, 50.38248], [23.79445, 50.40481], [23.99563, 50.41289], [24.03668, 50.44507], [24.07048, 50.5071], [24.0996, 50.60752], [24.0595, 50.71625], [23.95925, 50.79271], [23.99254, 50.83847], [24.0952, 50.83262], [24.14524, 50.86128], [24.04576, 50.90196], [23.92217, 51.00836], [23.90376, 51.07697], [23.80678, 51.18405], [23.63858, 51.32182], [23.69905, 51.40871], [23.62751, 51.50512], [23.56236, 51.53673], [23.57053, 51.55938], [23.53198, 51.74298], [23.62691, 51.78208], [23.61523, 51.92066], [23.68733, 51.9906], [23.64066, 52.07626], [23.61, 52.11264], [23.54314, 52.12148], [23.47859, 52.18215], [23.20071, 52.22848], [23.18196, 52.28812], [23.34141, 52.44845], [23.45112, 52.53774], [23.58296, 52.59868], [23.73615, 52.6149], [23.93763, 52.71332], [23.91805, 52.94016], [23.94689, 52.95919], [23.92184, 53.02079], [23.87548, 53.0831], [23.91393, 53.16469], [23.85657, 53.22923], [23.81995, 53.24131], [23.62004, 53.60942], [23.51284, 53.95052], [23.48261, 53.98855], [23.52702, 54.04622], [23.49196, 54.14764], [23.45223, 54.17775], [23.42418, 54.17911], [23.39525, 54.21672], [23.3494, 54.25155], [23.24656, 54.25701], [23.15938, 54.29894], [23.15526, 54.31076], [23.13905, 54.31567], [23.104, 54.29794], [23.04323, 54.31567], [23.05726, 54.34565], [22.99649, 54.35927], [23.00584, 54.38514], [22.83756, 54.40827], [22.79705, 54.36264], [21.41123, 54.32395], [20.63871, 54.3706], [19.8038, 54.44203], [19.64312, 54.45423], [18.57853, 55.25302]]]] } },
+ { type: "Feature", properties: { iso1A2: "PM", iso1A3: "SPM", iso1N3: "666", wikidata: "Q34617", nameEn: "Saint Pierre and Miquelon", country: "FR", groups: ["EU", "Q1451600", "021", "003", "019", "UN"], callingCodes: ["508"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-56.72993, 46.65575], [-55.90758, 46.6223], [-56.27503, 47.39728], [-56.72993, 46.65575]]]] } },
+ { type: "Feature", properties: { iso1A2: "PN", iso1A3: "PCN", iso1N3: "612", wikidata: "Q35672", nameEn: "Pitcairn Islands", country: "GB", groups: ["BOTS", "061", "009", "UN"], driveSide: "left", callingCodes: ["64"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-133.59543, -28.4709], [-122.0366, -24.55017], [-133.61511, -21.93325], [-133.59543, -28.4709]]]] } },
+ { type: "Feature", properties: { iso1A2: "PR", iso1A3: "PRI", iso1N3: "630", wikidata: "Q1183", nameEn: "Puerto Rico", aliases: ["US-PR"], country: "US", groups: ["Q1352230", "029", "003", "419", "019", "UN"], roadSpeedUnit: "mph", callingCodes: ["1 787", "1 939"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-65.27974, 17.56928], [-65.02435, 18.73231], [-67.99519, 18.97186], [-68.23894, 17.84663], [-65.27974, 17.56928]]]] } },
+ { type: "Feature", properties: { iso1A2: "PS", iso1A3: "PSE", iso1N3: "275", wikidata: "Q219060", nameEn: "Palestine" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "PT", iso1A3: "PRT", iso1N3: "620", wikidata: "Q45", nameEn: "Portugal" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "PW", iso1A3: "PLW", iso1N3: "585", wikidata: "Q695", nameEn: "Palau", groups: ["057", "009", "UN"], roadSpeedUnit: "mph", callingCodes: ["680"] }, geometry: { type: "MultiPolygon", coordinates: [[[[128.97621, 3.08804], [136.39296, 1.54187], [136.04605, 12.45908], [128.97621, 3.08804]]]] } },
+ { type: "Feature", properties: { iso1A2: "PY", iso1A3: "PRY", iso1N3: "600", wikidata: "Q733", nameEn: "Paraguay", groups: ["005", "419", "019", "UN"], callingCodes: ["595"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-58.16225, -20.16193], [-58.23216, -19.80058], [-59.06965, -19.29148], [-60.00638, -19.2981], [-61.73723, -19.63958], [-61.93912, -20.10053], [-62.26883, -20.55311], [-62.2757, -21.06657], [-62.64455, -22.25091], [-62.51761, -22.37684], [-62.22768, -22.55807], [-61.9756, -23.0507], [-61.0782, -23.62932], [-60.99754, -23.80934], [-60.28163, -24.04436], [-60.03367, -24.00701], [-59.45482, -24.34787], [-59.33886, -24.49935], [-58.33055, -24.97099], [-58.25492, -24.92528], [-57.80821, -25.13863], [-57.57431, -25.47269], [-57.87176, -25.93604], [-58.1188, -26.16704], [-58.3198, -26.83443], [-58.65321, -27.14028], [-58.59549, -27.29973], [-58.04205, -27.2387], [-56.85337, -27.5165], [-56.18313, -27.29851], [-55.89195, -27.3467], [-55.74475, -27.44485], [-55.59094, -27.32444], [-55.62322, -27.1941], [-55.39611, -26.97679], [-55.25243, -26.93808], [-55.16948, -26.96068], [-55.06351, -26.80195], [-55.00584, -26.78754], [-54.80868, -26.55669], [-54.70732, -26.45099], [-54.69333, -26.37705], [-54.67359, -25.98607], [-54.60664, -25.9691], [-54.62063, -25.91213], [-54.59398, -25.59224], [-54.59509, -25.53696], [-54.60196, -25.48397], [-54.62033, -25.46026], [-54.4423, -25.13381], [-54.28207, -24.07305], [-54.32807, -24.01865], [-54.6238, -23.83078], [-55.02691, -23.97317], [-55.0518, -23.98666], [-55.12292, -23.99669], [-55.41784, -23.9657], [-55.44117, -23.9185], [-55.43585, -23.87157], [-55.5555, -23.28237], [-55.52288, -23.2595], [-55.5446, -23.22811], [-55.63849, -22.95122], [-55.62493, -22.62765], [-55.68742, -22.58407], [-55.6986, -22.56268], [-55.72366, -22.5519], [-55.741, -22.52018], [-55.74941, -22.46436], [-55.8331, -22.29008], [-56.23206, -22.25347], [-56.45893, -22.08072], [-56.5212, -22.11556], [-56.6508, -22.28387], [-57.98625, -22.09157], [-57.94642, -21.73799], [-57.88239, -21.6868], [-57.93492, -21.65505], [-57.84536, -20.93155], [-58.16225, -20.16193]]]] } },
+ { type: "Feature", properties: { iso1A2: "QA", iso1A3: "QAT", iso1N3: "634", wikidata: "Q846", nameEn: "Qatar", groups: ["145", "142", "UN"], callingCodes: ["974"] }, geometry: { type: "MultiPolygon", coordinates: [[[[50.92992, 24.54396], [51.09638, 24.46907], [51.29972, 24.50747], [51.39468, 24.62785], [51.58834, 24.66608], [51.83108, 24.71675], [51.83682, 26.70231], [50.93865, 26.30758], [50.81266, 25.88946], [50.86149, 25.6965], [50.7801, 25.595], [50.80824, 25.54641], [50.57069, 25.57887], [50.8133, 24.74049], [50.92992, 24.54396]]]] } },
+ { type: "Feature", properties: { iso1A2: "RE", iso1A3: "REU", iso1N3: "638", wikidata: "Q17070", nameEn: "R\xE9union", country: "FR", groups: ["Q3320166", "EU", "014", "202", "002", "UN"], callingCodes: ["262"] }, geometry: { type: "MultiPolygon", coordinates: [[[[53.37984, -21.23941], [56.73473, -21.9174], [56.62373, -20.2711], [53.37984, -21.23941]]]] } },
+ { type: "Feature", properties: { iso1A2: "RO", iso1A3: "ROU", iso1N3: "642", wikidata: "Q218", nameEn: "Romania", groups: ["EU", "151", "150", "UN"], callingCodes: ["40"] }, geometry: { type: "MultiPolygon", coordinates: [[[[27.15622, 47.98538], [27.02985, 48.09083], [27.04118, 48.12522], [26.96119, 48.13003], [26.98042, 48.15752], [26.94265, 48.1969], [26.87708, 48.19919], [26.81161, 48.25049], [26.62823, 48.25804], [26.55202, 48.22445], [26.33504, 48.18418], [26.17711, 47.99246], [26.05901, 47.9897], [25.77723, 47.93919], [25.63878, 47.94924], [25.23778, 47.89403], [25.11144, 47.75203], [24.88896, 47.7234], [24.81893, 47.82031], [24.70632, 47.84428], [24.61994, 47.95062], [24.43578, 47.97131], [24.34926, 47.9244], [24.22566, 47.90231], [24.11281, 47.91487], [24.06466, 47.95317], [24.02999, 47.95087], [24.00801, 47.968], [23.98553, 47.96076], [23.96337, 47.96672], [23.94192, 47.94868], [23.89352, 47.94512], [23.8602, 47.9329], [23.80904, 47.98142], [23.75188, 47.99705], [23.66262, 47.98786], [23.63894, 48.00293], [23.5653, 48.00499], [23.52803, 48.01818], [23.4979, 47.96858], [23.33577, 48.0237], [23.27397, 48.08245], [23.15999, 48.12188], [23.1133, 48.08061], [23.08858, 48.00716], [23.0158, 47.99338], [22.92241, 48.02002], [22.94301, 47.96672], [22.89849, 47.95851], [22.77991, 47.87211], [22.76617, 47.8417], [22.67247, 47.7871], [22.46559, 47.76583], [22.41979, 47.7391], [22.31816, 47.76126], [22.00917, 47.50492], [22.03389, 47.42508], [22.01055, 47.37767], [21.94463, 47.38046], [21.78395, 47.11104], [21.648, 47.03902], [21.68645, 46.99595], [21.59581, 46.91628], [21.59307, 46.86935], [21.52028, 46.84118], [21.48935, 46.7577], [21.5151, 46.72147], [21.43926, 46.65109], [21.33214, 46.63035], [21.26929, 46.4993], [21.28061, 46.44941], [21.16872, 46.30118], [21.06572, 46.24897], [20.86797, 46.28884], [20.74574, 46.25467], [20.76085, 46.21002], [20.63863, 46.12728], [20.49718, 46.18721], [20.45377, 46.14405], [20.35573, 46.16629], [20.28324, 46.1438], [20.26068, 46.12332], [20.35862, 45.99356], [20.54818, 45.89939], [20.65645, 45.82801], [20.70069, 45.7493], [20.77416, 45.75601], [20.78446, 45.78522], [20.82364, 45.77738], [20.80361, 45.65875], [20.76798, 45.60969], [20.83321, 45.53567], [20.77217, 45.49788], [20.86026, 45.47295], [20.87948, 45.42743], [21.09894, 45.30144], [21.17612, 45.32566], [21.20392, 45.2677], [21.29398, 45.24148], [21.48278, 45.19557], [21.51299, 45.15345], [21.4505, 45.04294], [21.35855, 45.01941], [21.54938, 44.9327], [21.56328, 44.89502], [21.48202, 44.87199], [21.44013, 44.87613], [21.35643, 44.86364], [21.38802, 44.78133], [21.55007, 44.77304], [21.60019, 44.75208], [21.61942, 44.67059], [21.67504, 44.67107], [21.71692, 44.65349], [21.7795, 44.66165], [21.99364, 44.63395], [22.08016, 44.49844], [22.13234, 44.47444], [22.18315, 44.48179], [22.30844, 44.6619], [22.45301, 44.7194], [22.61917, 44.61489], [22.69196, 44.61587], [22.76749, 44.54446], [22.70981, 44.51852], [22.61368, 44.55719], [22.56493, 44.53419], [22.54021, 44.47836], [22.45436, 44.47258], [22.56012, 44.30712], [22.68166, 44.28206], [22.67173, 44.21564], [23.04988, 44.07694], [23.01674, 44.01946], [22.87873, 43.9844], [22.83753, 43.88055], [22.85314, 43.84452], [23.05288, 43.79494], [23.26772, 43.84843], [23.4507, 43.84936], [23.61687, 43.79289], [23.73978, 43.80627], [24.18149, 43.68218], [24.35364, 43.70211], [24.50264, 43.76314], [24.62281, 43.74082], [24.73542, 43.68523], [24.96682, 43.72693], [25.10718, 43.6831], [25.17144, 43.70261], [25.39528, 43.61866], [25.72792, 43.69263], [25.94911, 43.85745], [26.05584, 43.90925], [26.10115, 43.96908], [26.38764, 44.04356], [26.62712, 44.05698], [26.95141, 44.13555], [27.26845, 44.12602], [27.39757, 44.0141], [27.60834, 44.01206], [27.64542, 44.04958], [27.73468, 43.95326], [27.92008, 44.00761], [27.99558, 43.84193], [28.23293, 43.76], [29.24336, 43.70874], [30.04414, 45.08461], [29.69272, 45.19227], [29.65428, 45.25629], [29.68175, 45.26885], [29.59798, 45.38857], [29.42632, 45.44545], [29.24779, 45.43388], [28.96077, 45.33164], [28.94292, 45.28045], [28.81383, 45.3384], [28.78911, 45.24179], [28.71358, 45.22631], [28.5735, 45.24759], [28.34554, 45.32102], [28.28504, 45.43907], [28.21139, 45.46895], [28.18741, 45.47358], [28.08927, 45.6051], [28.16568, 45.6421], [28.13111, 45.92819], [28.08612, 46.01105], [28.13684, 46.18099], [28.10937, 46.22852], [28.19864, 46.31869], [28.18902, 46.35283], [28.25769, 46.43334], [28.22281, 46.50481], [28.24808, 46.64305], [28.12173, 46.82283], [28.09095, 46.97621], [27.81892, 47.1381], [27.73172, 47.29248], [27.68706, 47.28962], [27.60263, 47.32507], [27.55731, 47.46637], [27.47942, 47.48113], [27.3979, 47.59473], [27.32202, 47.64009], [27.25519, 47.71366], [27.29069, 47.73722], [27.1618, 47.92391], [27.15622, 47.98538]]]] } },
+ { type: "Feature", properties: { iso1A2: "RS", iso1A3: "SRB", iso1N3: "688", wikidata: "Q403", nameEn: "Serbia", groups: ["039", "150", "UN"], callingCodes: ["381"] }, geometry: { type: "MultiPolygon", coordinates: [[[[19.66007, 46.19005], [19.56113, 46.16824], [19.52473, 46.1171], [19.28826, 45.99694], [19.14543, 45.9998], [19.10388, 46.04015], [19.0791, 45.96458], [19.01284, 45.96529], [18.99712, 45.93537], [18.81394, 45.91329], [18.85783, 45.85493], [18.90305, 45.71863], [18.96691, 45.66731], [18.88776, 45.57253], [18.94562, 45.53712], [19.07471, 45.53086], [19.08364, 45.48804], [18.99918, 45.49333], [18.97446, 45.37528], [19.10774, 45.29547], [19.28208, 45.23813], [19.41941, 45.23475], [19.43589, 45.17137], [19.19144, 45.17863], [19.14063, 45.12972], [19.07952, 45.14668], [19.1011, 45.01191], [19.05205, 44.97692], [19.15573, 44.95409], [19.06853, 44.89915], [19.02871, 44.92541], [18.98957, 44.90645], [19.01994, 44.85493], [19.18183, 44.92055], [19.36722, 44.88164], [19.32543, 44.74058], [19.26388, 44.65412], [19.16699, 44.52197], [19.13369, 44.52521], [19.12278, 44.50132], [19.14837, 44.45253], [19.14681, 44.41463], [19.11785, 44.40313], [19.10749, 44.39421], [19.10704, 44.38249], [19.10365, 44.37795], [19.10298, 44.36924], [19.11865, 44.36712], [19.1083, 44.3558], [19.11547, 44.34218], [19.13556, 44.338], [19.13332, 44.31492], [19.16741, 44.28648], [19.18328, 44.28383], [19.20508, 44.2917], [19.23306, 44.26097], [19.26945, 44.26957], [19.32464, 44.27185], [19.34773, 44.23244], [19.3588, 44.18353], [19.40927, 44.16722], [19.43905, 44.13088], [19.47338, 44.15034], [19.48386, 44.14332], [19.47321, 44.1193], [19.51167, 44.08158], [19.55999, 44.06894], [19.57467, 44.04716], [19.61991, 44.05254], [19.61836, 44.01464], [19.56498, 43.99922], [19.52515, 43.95573], [19.38439, 43.96611], [19.24363, 44.01502], [19.23465, 43.98764], [19.3986, 43.79668], [19.5176, 43.71403], [19.50455, 43.58385], [19.42696, 43.57987], [19.41941, 43.54056], [19.36653, 43.60921], [19.33426, 43.58833], [19.2553, 43.5938], [19.24774, 43.53061], [19.22807, 43.5264], [19.22229, 43.47926], [19.44315, 43.38846], [19.48171, 43.32644], [19.52962, 43.31623], [19.54598, 43.25158], [19.62661, 43.2286], [19.64063, 43.19027], [19.76918, 43.16044], [19.79255, 43.11951], [19.92576, 43.08539], [19.96549, 43.11098], [19.98887, 43.0538], [20.04729, 43.02732], [20.05431, 42.99571], [20.12325, 42.96237], [20.14896, 42.99058], [20.16415, 42.97177], [20.34528, 42.90676], [20.35692, 42.8335], [20.40594, 42.84853], [20.43734, 42.83157], [20.53484, 42.8885], [20.48692, 42.93208], [20.59929, 43.01067], [20.64557, 43.00826], [20.69515, 43.09641], [20.59929, 43.20492], [20.68688, 43.21335], [20.73811, 43.25068], [20.82145, 43.26769], [20.88685, 43.21697], [20.83727, 43.17842], [20.96287, 43.12416], [21.00749, 43.13984], [21.05378, 43.10707], [21.08952, 43.13471], [21.14465, 43.11089], [21.16734, 42.99694], [21.2041, 43.02277], [21.23877, 43.00848], [21.23534, 42.95523], [21.2719, 42.8994], [21.32974, 42.90424], [21.36941, 42.87397], [21.44047, 42.87276], [21.39045, 42.74888], [21.47498, 42.74695], [21.59154, 42.72643], [21.58755, 42.70418], [21.6626, 42.67813], [21.75025, 42.70125], [21.79413, 42.65923], [21.75672, 42.62695], [21.7327, 42.55041], [21.70522, 42.54176], [21.7035, 42.51899], [21.62556, 42.45106], [21.64209, 42.41081], [21.62887, 42.37664], [21.59029, 42.38042], [21.57021, 42.3647], [21.53467, 42.36809], [21.5264, 42.33634], [21.56772, 42.30946], [21.58992, 42.25915], [21.70111, 42.23789], [21.77176, 42.2648], [21.84654, 42.3247], [21.91595, 42.30392], [21.94405, 42.34669], [22.02908, 42.29848], [22.16384, 42.32103], [22.29605, 42.37477], [22.29275, 42.34913], [22.34773, 42.31725], [22.45919, 42.33822], [22.47498, 42.3915], [22.51961, 42.3991], [22.55669, 42.50144], [22.43983, 42.56851], [22.4997, 42.74144], [22.43309, 42.82057], [22.54302, 42.87774], [22.74826, 42.88701], [22.78397, 42.98253], [22.89521, 43.03625], [22.98104, 43.11199], [23.00806, 43.19279], [22.89727, 43.22417], [22.82036, 43.33665], [22.53397, 43.47225], [22.47582, 43.6558], [22.41043, 43.69566], [22.35558, 43.81281], [22.41449, 44.00514], [22.61688, 44.06534], [22.61711, 44.16938], [22.67173, 44.21564], [22.68166, 44.28206], [22.56012, 44.30712], [22.45436, 44.47258], [22.54021, 44.47836], [22.56493, 44.53419], [22.61368, 44.55719], [22.70981, 44.51852], [22.76749, 44.54446], [22.69196, 44.61587], [22.61917, 44.61489], [22.45301, 44.7194], [22.30844, 44.6619], [22.18315, 44.48179], [22.13234, 44.47444], [22.08016, 44.49844], [21.99364, 44.63395], [21.7795, 44.66165], [21.71692, 44.65349], [21.67504, 44.67107], [21.61942, 44.67059], [21.60019, 44.75208], [21.55007, 44.77304], [21.38802, 44.78133], [21.35643, 44.86364], [21.44013, 44.87613], [21.48202, 44.87199], [21.56328, 44.89502], [21.54938, 44.9327], [21.35855, 45.01941], [21.4505, 45.04294], [21.51299, 45.15345], [21.48278, 45.19557], [21.29398, 45.24148], [21.20392, 45.2677], [21.17612, 45.32566], [21.09894, 45.30144], [20.87948, 45.42743], [20.86026, 45.47295], [20.77217, 45.49788], [20.83321, 45.53567], [20.76798, 45.60969], [20.80361, 45.65875], [20.82364, 45.77738], [20.78446, 45.78522], [20.77416, 45.75601], [20.70069, 45.7493], [20.65645, 45.82801], [20.54818, 45.89939], [20.35862, 45.99356], [20.26068, 46.12332], [20.09713, 46.17315], [20.03533, 46.14509], [20.01816, 46.17696], [19.93508, 46.17553], [19.81491, 46.1313], [19.66007, 46.19005]]]] } },
+ { type: "Feature", properties: { iso1A2: "RU", iso1A3: "RUS", iso1N3: "643", wikidata: "Q159", nameEn: "Russia" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "RW", iso1A3: "RWA", iso1N3: "646", wikidata: "Q1037", nameEn: "Rwanda", groups: ["014", "202", "002", "UN"], callingCodes: ["250"] }, geometry: { type: "MultiPolygon", coordinates: [[[[30.47194, -1.0555], [30.35212, -1.06896], [30.16369, -1.34303], [29.912, -1.48269], [29.82657, -1.31187], [29.59061, -1.39016], [29.53062, -1.40499], [29.45038, -1.5054], [29.36322, -1.50887], [29.24323, -1.66826], [29.24458, -1.69663], [29.11847, -1.90576], [29.17562, -2.12278], [29.105, -2.27043], [29.00051, -2.29001], [28.95642, -2.37321], [28.89601, -2.37321], [28.86826, -2.41888], [28.86846, -2.44866], [28.89132, -2.47557], [28.89342, -2.49017], [28.88846, -2.50493], [28.87497, -2.50887], [28.86209, -2.5231], [28.86193, -2.53185], [28.87943, -2.55165], [28.89288, -2.55848], [28.90226, -2.62385], [28.89793, -2.66111], [28.94346, -2.69124], [29.00357, -2.70596], [29.04081, -2.7416], [29.0562, -2.58632], [29.32234, -2.6483], [29.36805, -2.82933], [29.88237, -2.75105], [29.95911, -2.33348], [30.14034, -2.43626], [30.42933, -2.31064], [30.54501, -2.41404], [30.83915, -2.35795], [30.89303, -2.08223], [30.80802, -1.91477], [30.84079, -1.64652], [30.71974, -1.43244], [30.57123, -1.33264], [30.50889, -1.16412], [30.45116, -1.10641], [30.47194, -1.0555]]]] } },
+ { type: "Feature", properties: { iso1A2: "SA", iso1A3: "SAU", iso1N3: "682", wikidata: "Q851", nameEn: "Saudi Arabia", groups: ["145", "142", "UN"], callingCodes: ["966"] }, geometry: { type: "MultiPolygon", coordinates: [[[[40.01521, 32.05667], [39.29903, 32.23259], [38.99233, 31.99721], [36.99791, 31.50081], [37.99354, 30.49998], [37.66395, 30.33245], [37.4971, 29.99949], [36.75083, 29.86903], [36.50005, 29.49696], [36.07081, 29.18469], [34.8812, 29.36878], [34.4454, 27.91479], [37.8565, 22.00903], [39.63762, 18.37348], [40.99158, 15.81743], [42.15205, 16.40211], [42.76801, 16.40371], [42.94625, 16.39721], [42.94351, 16.49467], [42.97215, 16.51093], [43.11601, 16.53166], [43.15274, 16.67248], [43.22066, 16.65179], [43.21325, 16.74416], [43.25857, 16.75304], [43.26303, 16.79479], [43.24801, 16.80613], [43.22956, 16.80613], [43.22012, 16.83932], [43.18338, 16.84852], [43.1398, 16.90696], [43.19328, 16.94703], [43.1813, 16.98438], [43.18233, 17.02673], [43.23967, 17.03428], [43.17787, 17.14717], [43.20156, 17.25901], [43.32653, 17.31179], [43.22533, 17.38343], [43.29185, 17.53224], [43.43005, 17.56148], [43.70631, 17.35762], [44.50126, 17.47475], [46.31018, 17.20464], [46.76494, 17.29151], [47.00571, 16.94765], [47.48245, 17.10808], [47.58351, 17.50366], [48.19996, 18.20584], [49.04884, 18.59899], [52.00311, 19.00083], [54.99756, 20.00083], [55.66469, 21.99658], [55.2137, 22.71065], [55.13599, 22.63334], [52.56622, 22.94341], [51.59617, 24.12041], [51.58871, 24.27256], [51.41644, 24.39615], [51.58834, 24.66608], [51.39468, 24.62785], [51.29972, 24.50747], [51.09638, 24.46907], [50.92992, 24.54396], [50.8133, 24.74049], [50.57069, 25.57887], [50.302, 25.87592], [50.26923, 26.08243], [50.38162, 26.53976], [50.71771, 26.73086], [50.37726, 27.89227], [49.98877, 27.87827], [49.00421, 28.81495], [48.42991, 28.53628], [47.70561, 28.5221], [47.59863, 28.66798], [47.58376, 28.83382], [47.46202, 29.0014], [46.5527, 29.10283], [46.42415, 29.05947], [44.72255, 29.19736], [42.97796, 30.48295], [42.97601, 30.72204], [40.01521, 32.05667]]]] } },
+ { type: "Feature", properties: { iso1A2: "SB", iso1A3: "SLB", iso1N3: "090", wikidata: "Q685", nameEn: "Solomon Islands", groups: ["054", "009", "UN"], driveSide: "left", callingCodes: ["677"] }, geometry: { type: "MultiPolygon", coordinates: [[[[172.71443, -12.01327], [160.43769, -4.17974], [156.03296, -6.55528], [156.03993, -6.65703], [155.92557, -6.84664], [155.69784, -6.92661], [155.60735, -6.92266], [154.74815, -7.33315], [156.73836, -14.50464], [172.71443, -12.01327]]]] } },
+ { type: "Feature", properties: { iso1A2: "SC", iso1A3: "SYC", iso1N3: "690", wikidata: "Q1042", nameEn: "Seychelles", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["248"] }, geometry: { type: "MultiPolygon", coordinates: [[[[43.75112, -10.38913], [54.83239, -10.93575], [66.3222, 5.65313], [43.75112, -10.38913]]]] } },
+ { type: "Feature", properties: { iso1A2: "SD", iso1A3: "SDN", iso1N3: "729", wikidata: "Q1049", nameEn: "Sudan", groups: ["015", "002", "UN"], callingCodes: ["249"] }, geometry: { type: "MultiPolygon", coordinates: [[[[37.8565, 22.00903], [34.0765, 22.00501], [33.99686, 21.76784], [33.57251, 21.72406], [33.17563, 22.00405], [24.99885, 21.99535], [24.99794, 19.99661], [23.99715, 20.00038], [23.99539, 19.49944], [23.99997, 15.69575], [23.62785, 15.7804], [23.38812, 15.69649], [23.10792, 15.71297], [22.93201, 15.55107], [22.92579, 15.47007], [22.99584, 15.40105], [22.99584, 15.22989], [22.66115, 14.86308], [22.70474, 14.69149], [22.38562, 14.58907], [22.44944, 14.24986], [22.55997, 14.23024], [22.5553, 14.11704], [22.22995, 13.96754], [22.08674, 13.77863], [22.29689, 13.3731], [22.1599, 13.19281], [22.02914, 13.13976], [21.94819, 13.05637], [21.81432, 12.81362], [21.89371, 12.68001], [21.98711, 12.63292], [22.15679, 12.66634], [22.22684, 12.74682], [22.46345, 12.61925], [22.38873, 12.45514], [22.50548, 12.16769], [22.48369, 12.02766], [22.64092, 12.07485], [22.54907, 11.64372], [22.7997, 11.40424], [22.93124, 11.41645], [22.97249, 11.21955], [22.87758, 10.91915], [23.02221, 10.69235], [23.3128, 10.45214], [23.67164, 9.86923], [23.69155, 9.67566], [24.09319, 9.66572], [24.12744, 9.73784], [24.49389, 9.79962], [24.84653, 9.80643], [24.97739, 9.9081], [25.05688, 10.06776], [25.0918, 10.33718], [25.78141, 10.42599], [25.93163, 10.38159], [25.93241, 10.17941], [26.21338, 9.91545], [26.35815, 9.57946], [26.70685, 9.48735], [27.14427, 9.62858], [27.90704, 9.61323], [28.99983, 9.67155], [29.06988, 9.74826], [29.53844, 9.75133], [29.54, 10.07949], [29.94629, 10.29245], [30.00389, 10.28633], [30.53005, 9.95992], [30.82893, 9.71451], [30.84605, 9.7498], [31.28504, 9.75287], [31.77539, 10.28939], [31.99177, 10.65065], [32.46967, 11.04662], [32.39358, 11.18207], [32.39578, 11.70208], [32.10079, 11.95203], [32.73921, 11.95203], [32.73921, 12.22757], [33.25876, 12.22111], [33.13988, 11.43248], [33.26977, 10.83632], [33.24645, 10.77913], [33.52294, 10.64382], [33.66604, 10.44254], [33.80913, 10.32994], [33.90159, 10.17179], [33.96984, 10.15446], [33.99185, 9.99623], [33.96323, 9.80972], [33.9082, 9.762], [33.87958, 9.49937], [34.10229, 9.50238], [34.08717, 9.55243], [34.13186, 9.7492], [34.20484, 9.9033], [34.22718, 10.02506], [34.32102, 10.11599], [34.34783, 10.23914], [34.2823, 10.53508], [34.4372, 10.781], [34.59062, 10.89072], [34.77383, 10.74588], [34.77532, 10.69027], [34.86618, 10.74588], [34.86916, 10.78832], [34.97491, 10.86147], [34.97789, 10.91559], [34.93172, 10.95946], [35.01215, 11.19626], [34.95704, 11.24448], [35.09556, 11.56278], [35.05832, 11.71158], [35.11492, 11.85156], [35.24302, 11.91132], [35.70476, 12.67101], [36.01458, 12.72478], [36.14268, 12.70879], [36.16651, 12.88019], [36.13374, 12.92665], [36.24545, 13.36759], [36.38993, 13.56459], [36.48824, 13.83954], [36.44653, 13.95666], [36.54376, 14.25597], [36.44337, 15.14963], [36.54276, 15.23478], [36.69761, 15.75323], [36.76371, 15.80831], [36.92193, 16.23451], [36.99777, 17.07172], [37.42694, 17.04041], [37.50967, 17.32199], [38.13362, 17.53906], [38.37133, 17.66269], [38.45916, 17.87167], [38.57727, 17.98125], [39.63762, 18.37348], [37.8565, 22.00903]]]] } },
+ { type: "Feature", properties: { iso1A2: "SE", iso1A3: "SWE", iso1N3: "752", wikidata: "Q34", nameEn: "Sweden", groups: ["EU", "154", "150", "UN"], callingCodes: ["46"] }, geometry: { type: "MultiPolygon", coordinates: [[[[24.15791, 65.85385], [23.90497, 66.15802], [23.71339, 66.21299], [23.64982, 66.30603], [23.67591, 66.3862], [23.63776, 66.43568], [23.85959, 66.56434], [23.89488, 66.772], [23.98059, 66.79585], [23.98563, 66.84149], [23.56214, 67.17038], [23.58735, 67.20752], [23.54701, 67.25435], [23.75372, 67.29914], [23.75372, 67.43688], [23.39577, 67.46974], [23.54701, 67.59306], [23.45627, 67.85297], [23.65793, 67.9497], [23.40081, 68.05545], [23.26469, 68.15134], [23.15377, 68.14759], [23.10336, 68.26551], [22.73028, 68.40881], [22.00429, 68.50692], [21.03001, 68.88969], [20.90649, 68.89696], [20.85104, 68.93142], [20.91658, 68.96764], [20.78802, 69.03087], [20.55258, 69.06069], [20.0695, 69.04469], [20.28444, 68.93283], [20.33435, 68.80174], [20.22027, 68.67246], [19.95647, 68.55546], [20.22027, 68.48759], [19.93508, 68.35911], [18.97255, 68.52416], [18.63032, 68.50849], [18.39503, 68.58672], [18.1241, 68.53721], [18.13836, 68.20874], [17.90787, 67.96537], [17.30416, 68.11591], [16.7409, 67.91037], [16.38441, 67.52923], [16.12774, 67.52106], [16.09922, 67.4364], [16.39154, 67.21653], [16.35589, 67.06419], [15.37197, 66.48217], [15.49318, 66.28509], [15.05113, 66.15572], [14.53778, 66.12399], [14.50926, 65.31786], [13.64276, 64.58402], [14.11117, 64.46674], [14.16051, 64.18725], [13.98222, 64.00953], [13.23411, 64.09087], [12.74105, 64.02171], [12.14928, 63.59373], [12.19919, 63.47935], [11.98529, 63.27487], [12.19919, 63.00104], [12.07085, 62.6297], [12.29187, 62.25699], [12.14746, 61.7147], [12.40595, 61.57226], [12.57707, 61.56547], [12.86939, 61.35427], [12.69115, 61.06584], [12.2277, 61.02442], [12.59133, 60.50559], [12.52003, 60.13846], [12.36317, 59.99259], [12.15641, 59.8926], [11.87121, 59.86039], [11.92112, 59.69531], [11.69297, 59.59442], [11.8213, 59.24985], [11.65732, 58.90177], [11.45199, 58.89604], [11.4601, 58.99022], [11.34459, 59.11672], [11.15367, 59.07862], [11.08911, 58.98745], [10.64958, 58.89391], [10.40861, 58.38489], [12.16597, 56.60205], [12.07466, 56.29488], [12.65312, 56.04345], [12.6372, 55.91371], [12.88472, 55.63369], [12.60345, 55.42675], [12.84405, 55.13257], [14.28399, 55.1553], [14.89259, 55.5623], [15.79951, 55.54655], [19.64795, 57.06466], [19.84909, 57.57876], [20.5104, 59.15546], [19.08191, 60.19152], [19.23413, 60.61414], [20.15877, 63.06556], [24.14112, 65.39731], [24.15107, 65.81427], [24.14798, 65.83466], [24.15791, 65.85385]]]] } },
+ { type: "Feature", properties: { iso1A2: "SG", iso1A3: "SGP", iso1N3: "702", wikidata: "Q334", nameEn: "Singapore", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["65"] }, geometry: { type: "MultiPolygon", coordinates: [[[[104.00131, 1.42405], [103.93384, 1.42926], [103.89565, 1.42841], [103.86383, 1.46288], [103.81181, 1.47953], [103.76395, 1.45183], [103.74161, 1.4502], [103.7219, 1.46108], [103.67468, 1.43166], [103.62738, 1.35255], [103.56591, 1.19719], [103.66049, 1.18825], [103.74084, 1.12902], [104.03085, 1.26954], [104.12282, 1.27714], [104.08072, 1.35998], [104.09162, 1.39694], [104.08871, 1.42015], [104.07348, 1.43322], [104.04622, 1.44691], [104.02277, 1.4438], [104.00131, 1.42405]]]] } },
+ { type: "Feature", properties: { iso1A2: "SH", iso1A3: "SHN", iso1N3: "654", wikidata: "Q192184", nameEn: "Saint Helena, Ascension and Tristan da Cunha", country: "GB" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "SI", iso1A3: "SVN", iso1N3: "705", wikidata: "Q215", nameEn: "Slovenia", groups: ["EU", "039", "150", "UN"], callingCodes: ["386"] }, geometry: { type: "MultiPolygon", coordinates: [[[[16.50139, 46.56684], [16.39217, 46.63673], [16.38594, 46.6549], [16.41863, 46.66238], [16.42641, 46.69228], [16.37816, 46.69975], [16.30966, 46.7787], [16.31303, 46.79838], [16.3408, 46.80641], [16.34547, 46.83836], [16.2941, 46.87137], [16.2365, 46.87775], [16.21892, 46.86961], [16.15711, 46.85434], [16.14365, 46.8547], [16.10983, 46.867], [16.05786, 46.83927], [15.99054, 46.82772], [15.99126, 46.78199], [15.98432, 46.74991], [15.99769, 46.7266], [16.02808, 46.71094], [16.04347, 46.68694], [16.04036, 46.6549], [15.99988, 46.67947], [15.98512, 46.68463], [15.94864, 46.68769], [15.87691, 46.7211], [15.8162, 46.71897], [15.78518, 46.70712], [15.76771, 46.69863], [15.73823, 46.70011], [15.72279, 46.69548], [15.69523, 46.69823], [15.67411, 46.70735], [15.6543, 46.70616], [15.6543, 46.69228], [15.6365, 46.6894], [15.63255, 46.68069], [15.62317, 46.67947], [15.59826, 46.68908], [15.54533, 46.66985], [15.55333, 46.64988], [15.54431, 46.6312], [15.46906, 46.61321], [15.45514, 46.63697], [15.41235, 46.65556], [15.23711, 46.63994], [15.14215, 46.66131], [15.01451, 46.641], [14.98024, 46.6009], [14.96002, 46.63459], [14.92283, 46.60848], [14.87129, 46.61], [14.86419, 46.59411], [14.83549, 46.56614], [14.81836, 46.51046], [14.72185, 46.49974], [14.66892, 46.44936], [14.5942, 46.43434], [14.56463, 46.37208], [14.52176, 46.42617], [14.45877, 46.41717], [14.42608, 46.44614], [14.314, 46.43327], [14.28326, 46.44315], [14.15989, 46.43327], [14.12097, 46.47724], [14.04002, 46.49117], [14.00422, 46.48474], [13.89837, 46.52331], [13.7148, 46.5222], [13.68684, 46.43881], [13.59777, 46.44137], [13.5763, 46.42613], [13.5763, 46.40915], [13.47019, 46.3621], [13.43418, 46.35992], [13.44808, 46.33507], [13.37671, 46.29668], [13.42218, 46.20758], [13.47587, 46.22725], [13.56114, 46.2054], [13.56682, 46.18703], [13.64451, 46.18966], [13.66472, 46.17392], [13.64053, 46.13587], [13.57072, 46.09022], [13.50104, 46.05986], [13.49568, 46.04839], [13.50998, 46.04498], [13.49702, 46.01832], [13.47474, 46.00546], [13.50104, 45.98078], [13.52963, 45.96588], [13.56759, 45.96991], [13.58903, 45.99009], [13.62074, 45.98388], [13.63458, 45.98947], [13.64307, 45.98326], [13.6329, 45.94894], [13.63815, 45.93607], [13.61931, 45.91782], [13.60857, 45.89907], [13.59565, 45.89446], [13.58644, 45.88173], [13.57563, 45.8425], [13.58858, 45.83503], [13.59784, 45.8072], [13.66986, 45.79955], [13.8235, 45.7176], [13.83332, 45.70855], [13.83422, 45.68703], [13.87933, 45.65207], [13.9191, 45.6322], [13.8695, 45.60835], [13.86771, 45.59898], [13.84106, 45.58185], [13.78445, 45.5825], [13.74587, 45.59811], [13.7198, 45.59352], [13.6076, 45.64761], [13.45644, 45.59464], [13.56979, 45.4895], [13.62902, 45.45898], [13.67398, 45.4436], [13.7785, 45.46787], [13.81742, 45.43729], [13.88124, 45.42637], [13.90771, 45.45149], [13.97309, 45.45258], [13.99488, 45.47551], [13.96063, 45.50825], [14.00578, 45.52352], [14.07116, 45.48752], [14.20348, 45.46896], [14.22371, 45.50388], [14.24239, 45.50607], [14.26611, 45.48239], [14.27681, 45.4902], [14.32487, 45.47142], [14.36693, 45.48642], [14.49769, 45.54424], [14.5008, 45.60852], [14.53816, 45.6205], [14.57397, 45.67165], [14.60977, 45.66403], [14.59576, 45.62812], [14.69694, 45.57366], [14.68605, 45.53006], [14.71718, 45.53442], [14.80124, 45.49515], [14.81992, 45.45913], [14.90554, 45.47769], [14.92266, 45.52788], [15.02385, 45.48533], [15.05187, 45.49079], [15.16862, 45.42309], [15.27758, 45.46678], [15.33051, 45.45258], [15.38188, 45.48752], [15.30249, 45.53224], [15.29837, 45.5841], [15.27747, 45.60504], [15.31027, 45.6303], [15.34695, 45.63382], [15.34214, 45.64702], [15.38952, 45.63682], [15.4057, 45.64727], [15.34919, 45.71623], [15.30872, 45.69014], [15.25423, 45.72275], [15.40836, 45.79491], [15.47531, 45.79802], [15.47325, 45.8253], [15.52234, 45.82195], [15.57952, 45.84953], [15.64185, 45.82915], [15.66662, 45.84085], [15.70411, 45.8465], [15.68232, 45.86819], [15.68383, 45.88867], [15.67967, 45.90455], [15.70636, 45.92116], [15.70327, 46.00015], [15.71246, 46.01196], [15.72977, 46.04682], [15.62317, 46.09103], [15.6083, 46.11992], [15.59909, 46.14761], [15.64904, 46.19229], [15.6434, 46.21396], [15.67395, 46.22478], [15.75436, 46.21969], [15.75479, 46.20336], [15.78817, 46.21719], [15.79284, 46.25811], [15.97965, 46.30652], [16.07616, 46.3463], [16.07314, 46.36458], [16.05065, 46.3833], [16.05281, 46.39141], [16.14859, 46.40547], [16.18824, 46.38282], [16.30233, 46.37837], [16.30162, 46.40437], [16.27329, 46.41467], [16.27398, 46.42875], [16.25124, 46.48067], [16.23961, 46.49653], [16.26759, 46.50566], [16.26733, 46.51505], [16.29793, 46.5121], [16.37193, 46.55008], [16.38771, 46.53608], [16.44036, 46.5171], [16.5007, 46.49644], [16.52604, 46.47831], [16.59527, 46.47524], [16.52604, 46.5051], [16.52885, 46.53303], [16.50139, 46.56684]]]] } },
+ { type: "Feature", properties: { iso1A2: "SJ", iso1A3: "SJM", iso1N3: "744", wikidata: "Q842829", nameEn: "Svalbard and Jan Mayen", country: "NO" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "SK", iso1A3: "SVK", iso1N3: "703", wikidata: "Q214", nameEn: "Slovakia", groups: ["EU", "151", "150", "UN"], callingCodes: ["421"] }, geometry: { type: "MultiPolygon", coordinates: [[[[19.82237, 49.27806], [19.78581, 49.41701], [19.72127, 49.39288], [19.6375, 49.40897], [19.64162, 49.45184], [19.57845, 49.46077], [19.53313, 49.52856], [19.52626, 49.57311], [19.45348, 49.61583], [19.37795, 49.574], [19.36009, 49.53747], [19.25435, 49.53391], [19.18019, 49.41165], [18.9742, 49.39557], [18.97283, 49.49914], [18.94536, 49.52143], [18.84521, 49.51672], [18.74761, 49.492], [18.67757, 49.50895], [18.6144, 49.49824], [18.57183, 49.51162], [18.53063, 49.49022], [18.54848, 49.47059], [18.44686, 49.39467], [18.4084, 49.40003], [18.4139, 49.36517], [18.36446, 49.3267], [18.18456, 49.28909], [18.15022, 49.24518], [18.1104, 49.08624], [18.06885, 49.03157], [17.91814, 49.01784], [17.87831, 48.92679], [17.77944, 48.92318], [17.73126, 48.87885], [17.7094, 48.86721], [17.5295, 48.81117], [17.45671, 48.85004], [17.3853, 48.80936], [17.29054, 48.85546], [17.19355, 48.87602], [17.11202, 48.82925], [17.00215, 48.70887], [16.93955, 48.60371], [16.94611, 48.53614], [16.85204, 48.44968], [16.8497, 48.38321], [16.83588, 48.3844], [16.83317, 48.38138], [16.84243, 48.35258], [16.90903, 48.32519], [16.89461, 48.31332], [16.97701, 48.17385], [17.02919, 48.13996], [17.05735, 48.14179], [17.09168, 48.09366], [17.07039, 48.0317], [17.16001, 48.00636], [17.23699, 48.02094], [17.71215, 47.7548], [18.02938, 47.75665], [18.29305, 47.73541], [18.56496, 47.76588], [18.66521, 47.76772], [18.74074, 47.8157], [18.8506, 47.82308], [18.76821, 47.87469], [18.76134, 47.97499], [18.82176, 48.04206], [19.01952, 48.07052], [19.23924, 48.0595], [19.28182, 48.08336], [19.47957, 48.09437], [19.52489, 48.19791], [19.63338, 48.25006], [19.92452, 48.1283], [20.24312, 48.2784], [20.29943, 48.26104], [20.5215, 48.53336], [20.83248, 48.5824], [21.11516, 48.49546], [21.44063, 48.58456], [21.6068, 48.50365], [21.67134, 48.3989], [21.72525, 48.34628], [21.8279, 48.33321], [21.83339, 48.36242], [22.14689, 48.4005], [22.16023, 48.56548], [22.21379, 48.6218], [22.34151, 48.68893], [22.42934, 48.92857], [22.48296, 48.99172], [22.54338, 49.01424], [22.56155, 49.08865], [22.04427, 49.22136], [21.96385, 49.3437], [21.82927, 49.39467], [21.77983, 49.35443], [21.62328, 49.4447], [21.43376, 49.41433], [21.27858, 49.45988], [21.19756, 49.4054], [21.12477, 49.43666], [21.041, 49.41791], [21.09799, 49.37176], [20.98733, 49.30774], [20.9229, 49.29626], [20.77971, 49.35383], [20.72274, 49.41813], [20.61666, 49.41791], [20.5631, 49.375], [20.46422, 49.41612], [20.39939, 49.3896], [20.31728, 49.39914], [20.31453, 49.34817], [20.21977, 49.35265], [20.13738, 49.31685], [20.08238, 49.1813], [19.98494, 49.22904], [19.90529, 49.23532], [19.86409, 49.19316], [19.75286, 49.20751], [19.82237, 49.27806]]]] } },
+ { type: "Feature", properties: { iso1A2: "SL", iso1A3: "SLE", iso1N3: "694", wikidata: "Q1044", nameEn: "Sierra Leone", groups: ["011", "202", "002", "UN"], callingCodes: ["232"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-10.27575, 8.48711], [-10.37257, 8.48941], [-10.54891, 8.31174], [-10.63934, 8.35326], [-10.70565, 8.29235], [-10.61422, 8.5314], [-10.47707, 8.67669], [-10.56197, 8.81225], [-10.5783, 9.06386], [-10.74484, 9.07998], [-10.6534, 9.29919], [-11.2118, 10.00098], [-11.89624, 9.99763], [-11.91023, 9.93927], [-12.12634, 9.87203], [-12.24262, 9.92386], [-12.47254, 9.86834], [-12.76788, 9.3133], [-12.94095, 9.26335], [-13.08953, 9.0409], [-13.18586, 9.0925], [-13.29911, 9.04245], [-14.36218, 8.64107], [-12.15048, 6.15992], [-11.50429, 6.92704], [-11.4027, 6.97746], [-11.29417, 7.21576], [-10.60422, 7.7739], [-10.60492, 8.04072], [-10.57523, 8.04829], [-10.51554, 8.1393], [-10.45023, 8.15627], [-10.35227, 8.15223], [-10.29839, 8.21283], [-10.31635, 8.28554], [-10.30084, 8.30008], [-10.27575, 8.48711]]]] } },
+ { type: "Feature", properties: { iso1A2: "SM", iso1A3: "SMR", iso1N3: "674", wikidata: "Q238", nameEn: "San Marino", groups: ["039", "150", "UN"], callingCodes: ["378"] }, geometry: { type: "MultiPolygon", coordinates: [[[[12.45648, 43.89369], [12.48771, 43.89706], [12.49429, 43.90973], [12.49247, 43.91774], [12.49724, 43.92248], [12.50269, 43.92363], [12.50496, 43.93017], [12.51553, 43.94096], [12.51427, 43.94897], [12.50655, 43.95796], [12.50875, 43.96198], [12.50622, 43.97131], [12.51109, 43.97201], [12.51064, 43.98165], [12.5154, 43.98508], [12.51463, 43.99122], [12.50678, 43.99113], [12.49406, 43.98492], [12.47853, 43.98052], [12.46205, 43.97463], [12.44684, 43.96597], [12.43662, 43.95698], [12.42005, 43.9578], [12.41414, 43.95273], [12.40415, 43.95485], [12.40506, 43.94325], [12.41165, 43.93769], [12.41551, 43.92984], [12.40733, 43.92379], [12.41233, 43.90956], [12.40935, 43.9024], [12.41641, 43.89991], [12.44184, 43.90498], [12.45648, 43.89369]]]] } },
+ { type: "Feature", properties: { iso1A2: "SN", iso1A3: "SEN", iso1N3: "686", wikidata: "Q1041", nameEn: "Senegal", groups: ["011", "202", "002", "UN"], callingCodes: ["221"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-14.32144, 16.61495], [-15.00557, 16.64997], [-15.6509, 16.50315], [-16.27016, 16.51565], [-16.4429, 16.20605], [-16.44814, 16.09753], [-16.48967, 16.0496], [-16.50854, 16.09032], [-17.15288, 16.07139], [-18.35085, 14.63444], [-17.43598, 13.59273], [-15.47902, 13.58758], [-15.36504, 13.79313], [-14.93719, 13.80173], [-14.34721, 13.46578], [-13.8955, 13.59126], [-13.79409, 13.34472], [-14.36795, 13.23033], [-15.14917, 13.57989], [-15.26908, 13.37768], [-15.80478, 13.34832], [-15.80355, 13.16729], [-16.69343, 13.16791], [-16.74676, 13.06025], [-17.43966, 13.04579], [-17.4623, 11.92379], [-16.70562, 12.34803], [-16.38191, 12.36449], [-16.20591, 12.46157], [-15.67302, 12.42974], [-15.17582, 12.6847], [-13.70523, 12.68013], [-13.05296, 12.64003], [-13.06603, 12.49342], [-12.87336, 12.51892], [-12.35415, 12.32758], [-11.91331, 12.42008], [-11.46267, 12.44559], [-11.37536, 12.40788], [-11.39935, 12.97808], [-11.63025, 13.39174], [-11.83345, 13.33333], [-12.06897, 13.71049], [-11.93043, 13.84505], [-12.23936, 14.76324], [-13.11029, 15.52116], [-13.43135, 16.09022], [-13.80075, 16.13961], [-14.32144, 16.61495]]]] } },
+ { type: "Feature", properties: { iso1A2: "SO", iso1A3: "SOM", iso1N3: "706", wikidata: "Q1045", nameEn: "Somalia", groups: ["014", "202", "002", "UN"], callingCodes: ["252"] }, geometry: { type: "MultiPolygon", coordinates: [[[[51.12877, 12.56479], [43.90659, 12.3823], [42.95776, 10.98533], [42.69452, 10.62672], [42.87643, 10.18441], [43.0937, 9.90579], [43.23518, 9.84605], [43.32613, 9.59205], [44.19222, 8.93028], [46.99339, 7.9989], [47.92477, 8.00111], [47.97917, 8.00124], [44.98104, 4.91821], [44.02436, 4.9451], [43.40263, 4.79289], [43.04177, 4.57923], [42.97746, 4.44032], [42.84526, 4.28357], [42.55853, 4.20518], [42.07619, 4.17667], [41.89488, 3.97375], [41.31368, 3.14314], [40.98767, 2.82959], [41.00099, -0.83068], [41.56, -1.59812], [41.56362, -1.66375], [41.75542, -1.85308], [57.49095, 8.14549], [51.12877, 12.56479]]]] } },
+ { type: "Feature", properties: { iso1A2: "SR", iso1A3: "SUR", iso1N3: "740", wikidata: "Q730", nameEn: "Suriname", groups: ["005", "419", "019", "UN"], driveSide: "left", callingCodes: ["597"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-54.26916, 5.26909], [-54.01877, 5.52789], [-54.01074, 5.68785], [-53.7094, 6.2264], [-56.84822, 6.73257], [-57.31629, 5.33714], [-57.22536, 5.15605], [-57.37442, 5.0208], [-57.8699, 4.89394], [-58.0307, 3.95513], [-57.35891, 3.32121], [-56.70519, 2.02964], [-56.55439, 2.02003], [-56.47045, 1.95135], [-55.99278, 1.83137], [-55.89863, 1.89861], [-55.92159, 2.05236], [-56.13054, 2.27723], [-55.96292, 2.53188], [-55.71493, 2.40342], [-55.01919, 2.564], [-54.6084, 2.32856], [-54.42864, 2.42442], [-54.28534, 2.67798], [-53.9849, 3.58697], [-53.98914, 3.627], [-54.05128, 3.63557], [-54.19367, 3.84387], [-54.38444, 4.13222], [-54.4717, 4.91964], [-54.26916, 5.26909]]]] } },
+ { type: "Feature", properties: { iso1A2: "SS", iso1A3: "SSD", iso1N3: "728", wikidata: "Q958", nameEn: "South Sudan", groups: ["014", "202", "002", "UN"], callingCodes: ["211"] }, geometry: { type: "MultiPolygon", coordinates: [[[[34.10229, 9.50238], [33.87958, 9.49937], [33.9082, 9.762], [33.96323, 9.80972], [33.99185, 9.99623], [33.96984, 10.15446], [33.90159, 10.17179], [33.80913, 10.32994], [33.66604, 10.44254], [33.52294, 10.64382], [33.24645, 10.77913], [33.26977, 10.83632], [33.13988, 11.43248], [33.25876, 12.22111], [32.73921, 12.22757], [32.73921, 11.95203], [32.10079, 11.95203], [32.39578, 11.70208], [32.39358, 11.18207], [32.46967, 11.04662], [31.99177, 10.65065], [31.77539, 10.28939], [31.28504, 9.75287], [30.84605, 9.7498], [30.82893, 9.71451], [30.53005, 9.95992], [30.00389, 10.28633], [29.94629, 10.29245], [29.54, 10.07949], [29.53844, 9.75133], [29.06988, 9.74826], [28.99983, 9.67155], [27.90704, 9.61323], [27.14427, 9.62858], [26.70685, 9.48735], [26.35815, 9.57946], [26.21338, 9.91545], [25.93241, 10.17941], [25.93163, 10.38159], [25.78141, 10.42599], [25.0918, 10.33718], [25.05688, 10.06776], [24.97739, 9.9081], [24.84653, 9.80643], [24.49389, 9.79962], [24.12744, 9.73784], [24.09319, 9.66572], [23.69155, 9.67566], [23.62179, 9.53823], [23.64981, 9.44303], [23.64358, 9.28637], [23.56263, 9.19418], [23.4848, 9.16959], [23.44744, 8.99128], [23.59065, 8.99743], [23.51905, 8.71749], [24.25691, 8.69288], [24.13238, 8.36959], [24.35965, 8.26177], [24.85156, 8.16933], [24.98855, 7.96588], [25.25319, 7.8487], [25.29214, 7.66675], [25.20649, 7.61115], [25.20337, 7.50312], [25.35281, 7.42595], [25.37461, 7.33024], [25.90076, 7.09549], [26.38022, 6.63493], [26.32729, 6.36272], [26.58259, 6.1987], [26.51721, 6.09655], [27.22705, 5.71254], [27.22705, 5.62889], [27.28621, 5.56382], [27.23017, 5.37167], [27.26886, 5.25876], [27.44012, 5.07349], [27.56656, 4.89375], [27.65462, 4.89375], [27.76469, 4.79284], [27.79551, 4.59976], [28.20719, 4.35614], [28.6651, 4.42638], [28.8126, 4.48784], [29.03054, 4.48784], [29.22207, 4.34297], [29.43341, 4.50101], [29.49726, 4.7007], [29.82087, 4.56246], [29.79666, 4.37809], [30.06964, 4.13221], [30.1621, 4.10586], [30.22374, 3.93896], [30.27658, 3.95653], [30.47691, 3.83353], [30.55396, 3.84451], [30.57378, 3.74567], [30.56277, 3.62703], [30.78512, 3.67097], [30.80713, 3.60506], [30.85997, 3.5743], [30.85153, 3.48867], [30.97601, 3.693], [31.16666, 3.79853], [31.29476, 3.8015], [31.50478, 3.67814], [31.50776, 3.63652], [31.72075, 3.74354], [31.81459, 3.82083], [31.86821, 3.78664], [31.96205, 3.6499], [31.95907, 3.57408], [32.05187, 3.589], [32.08491, 3.56287], [32.08866, 3.53543], [32.19888, 3.50867], [32.20782, 3.6053], [32.41337, 3.748], [32.72021, 3.77327], [32.89746, 3.81339], [33.02852, 3.89296], [33.18356, 3.77812], [33.51264, 3.75068], [33.9873, 4.23316], [34.47601, 4.72162], [35.34151, 5.02364], [35.30992, 4.90402], [35.47843, 4.91872], [35.42366, 4.76969], [35.51424, 4.61643], [35.9419, 4.61933], [35.82118, 4.77382], [35.81968, 5.10757], [35.8576, 5.33413], [35.50792, 5.42431], [35.29938, 5.34042], [35.31188, 5.50106], [35.13058, 5.62118], [35.12611, 5.68937], [35.00546, 5.89387], [34.96227, 6.26415], [35.01738, 6.46991], [34.87736, 6.60161], [34.77459, 6.5957], [34.65096, 6.72589], [34.53776, 6.74808], [34.53925, 6.82794], [34.47669, 6.91076], [34.35753, 6.91963], [34.19369, 7.04382], [34.19369, 7.12807], [34.01495, 7.25664], [34.03878, 7.27437], [34.02984, 7.36449], [33.87642, 7.5491], [33.71407, 7.65983], [33.44745, 7.7543], [33.32531, 7.71297], [33.24637, 7.77939], [33.04944, 7.78989], [33.0006, 7.90333], [33.08401, 8.05822], [33.18083, 8.13047], [33.1853, 8.29264], [33.19721, 8.40317], [33.3119, 8.45474], [33.54575, 8.47094], [33.66938, 8.44442], [33.71407, 8.3678], [33.87195, 8.41938], [33.89579, 8.4842], [34.01346, 8.50041], [34.14453, 8.60204], [34.14304, 9.04654], [34.10229, 9.50238]]]] } },
+ { type: "Feature", properties: { iso1A2: "ST", iso1A3: "STP", iso1N3: "678", wikidata: "Q1039", nameEn: "S\xE3o Tom\xE9 and Principe", groups: ["017", "202", "002", "UN"], callingCodes: ["239"] }, geometry: { type: "MultiPolygon", coordinates: [[[[4.34149, 1.91417], [6.6507, -0.28606], [7.9035, 1.92304], [4.34149, 1.91417]]]] } },
+ { type: "Feature", properties: { iso1A2: "SV", iso1A3: "SLV", iso1N3: "222", wikidata: "Q792", nameEn: "El Salvador", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["503"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-89.34776, 14.43013], [-89.39028, 14.44561], [-89.57441, 14.41637], [-89.58814, 14.33165], [-89.50614, 14.26084], [-89.52397, 14.22628], [-89.61844, 14.21937], [-89.70756, 14.1537], [-89.75569, 14.07073], [-89.73251, 14.04133], [-89.76103, 14.02923], [-89.81807, 14.07073], [-89.88937, 14.0396], [-90.10505, 13.85104], [-90.11344, 13.73679], [-90.55276, 12.8866], [-88.11443, 12.63306], [-87.7346, 13.13228], [-87.55124, 13.12523], [-87.69751, 13.25228], [-87.73714, 13.32715], [-87.80177, 13.35689], [-87.84675, 13.41078], [-87.83467, 13.44655], [-87.77354, 13.45767], [-87.73841, 13.44169], [-87.72115, 13.46083], [-87.71657, 13.50577], [-87.78148, 13.52906], [-87.73106, 13.75443], [-87.68821, 13.80829], [-87.7966, 13.91353], [-88.00331, 13.86948], [-88.07641, 13.98447], [-88.23018, 13.99915], [-88.25791, 13.91108], [-88.48982, 13.86458], [-88.49738, 13.97224], [-88.70661, 14.04317], [-88.73182, 14.10919], [-88.815, 14.11652], [-88.85785, 14.17763], [-88.94608, 14.20207], [-89.04187, 14.33644], [-89.34776, 14.43013]]]] } },
+ { type: "Feature", properties: { iso1A2: "SX", iso1A3: "SXM", iso1N3: "534", wikidata: "Q26273", nameEn: "Sint Maarten", aliases: ["NL-SX"], country: "NL", groups: ["Q1451600", "029", "003", "419", "019", "UN"], callingCodes: ["1 721"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.33064, 17.9615], [-63.1055, 17.86651], [-62.93924, 18.02904], [-63.02323, 18.05757], [-63.04039, 18.05619], [-63.0579, 18.06614], [-63.07759, 18.04943], [-63.09686, 18.04608], [-63.11042, 18.05339], [-63.13502, 18.05445], [-63.33064, 17.9615]]]] } },
+ { type: "Feature", properties: { iso1A2: "SY", iso1A3: "SYR", iso1N3: "760", wikidata: "Q858", nameEn: "Syria", groups: ["145", "142", "UN"], callingCodes: ["963"] }, geometry: { type: "MultiPolygon", coordinates: [[[[42.23683, 37.2863], [42.21548, 37.28026], [42.20454, 37.28715], [42.22381, 37.30238], [42.22257, 37.31395], [42.2112, 37.32491], [42.19301, 37.31323], [42.18225, 37.28569], [42.00894, 37.17209], [41.515, 37.08084], [41.21937, 37.07665], [40.90856, 37.13147], [40.69136, 37.0996], [39.81589, 36.75538], [39.21538, 36.66834], [39.03217, 36.70911], [38.74042, 36.70629], [38.55908, 36.84429], [38.38859, 36.90064], [38.21064, 36.91842], [37.81974, 36.76055], [37.68048, 36.75065], [37.49103, 36.66904], [37.47253, 36.63243], [37.21988, 36.6736], [37.16177, 36.66069], [37.10894, 36.6704], [37.08279, 36.63495], [37.02088, 36.66422], [37.01647, 36.69512], [37.04619, 36.71101], [37.04399, 36.73483], [36.99886, 36.74012], [36.99557, 36.75997], [36.66727, 36.82901], [36.61581, 36.74629], [36.62681, 36.71189], [36.57398, 36.65186], [36.58829, 36.58295], [36.54206, 36.49539], [36.6081, 36.33772], [36.65653, 36.33861], [36.68672, 36.23677], [36.6125, 36.22592], [36.50463, 36.2419], [36.4617, 36.20461], [36.39206, 36.22088], [36.37474, 36.01163], [36.33956, 35.98687], [36.30099, 36.00985], [36.28338, 36.00273], [36.29769, 35.96086], [36.27678, 35.94839], [36.25366, 35.96264], [36.19973, 35.95195], [36.17441, 35.92076], [36.1623, 35.80925], [36.14029, 35.81015], [36.13919, 35.83692], [36.11827, 35.85923], [35.99829, 35.88242], [36.01844, 35.92403], [36.00514, 35.94113], [35.98499, 35.94107], [35.931, 35.92109], [35.51152, 36.10954], [35.48515, 34.70851], [35.97386, 34.63322], [35.98718, 34.64977], [36.29165, 34.62991], [36.32399, 34.69334], [36.35135, 34.68516], [36.35384, 34.65447], [36.42941, 34.62505], [36.46003, 34.6378], [36.45299, 34.59438], [36.41429, 34.61175], [36.39846, 34.55672], [36.3369, 34.52629], [36.34745, 34.5002], [36.4442, 34.50165], [36.46179, 34.46541], [36.55853, 34.41609], [36.53039, 34.3798], [36.56556, 34.31881], [36.60778, 34.31009], [36.58667, 34.27667], [36.59195, 34.2316], [36.62537, 34.20251], [36.5128, 34.09916], [36.50576, 34.05982], [36.41078, 34.05253], [36.28589, 33.91981], [36.38263, 33.86579], [36.3967, 33.83365], [36.14517, 33.85118], [36.06778, 33.82927], [35.9341, 33.6596], [36.05723, 33.57904], [35.94465, 33.52774], [35.94816, 33.47886], [35.88668, 33.43183], [35.82577, 33.40479], [35.81324, 33.36354], [35.77477, 33.33609], [35.813, 33.3172], [35.77513, 33.27342], [35.81295, 33.24841], [35.81647, 33.2028], [35.83846, 33.19397], [35.84285, 33.16673], [35.81911, 33.1336], [35.81911, 33.11077], [35.84802, 33.1031], [35.87188, 32.98028], [35.89298, 32.9456], [35.87012, 32.91976], [35.84021, 32.8725], [35.83758, 32.82817], [35.78745, 32.77938], [35.75983, 32.74803], [35.88405, 32.71321], [35.93307, 32.71966], [35.96633, 32.66237], [36.02239, 32.65911], [36.08074, 32.51463], [36.20379, 32.52751], [36.20875, 32.49529], [36.23948, 32.50108], [36.40959, 32.37908], [36.83946, 32.31293], [38.79171, 33.37328], [40.64314, 34.31604], [40.97676, 34.39788], [41.12388, 34.65742], [41.2345, 34.80049], [41.21654, 35.1508], [41.26569, 35.42708], [41.38184, 35.62502], [41.37027, 35.84095], [41.2564, 36.06012], [41.28864, 36.35368], [41.40058, 36.52502], [41.81736, 36.58782], [42.36697, 37.0627], [42.35724, 37.10998], [42.32313, 37.17814], [42.34735, 37.22548], [42.2824, 37.2798], [42.26039, 37.27017], [42.23683, 37.2863]]]] } },
+ { type: "Feature", properties: { iso1A2: "SZ", iso1A3: "SWZ", iso1N3: "748", wikidata: "Q1050", nameEn: "Eswatini", aliases: ["Swaziland"], groups: ["018", "202", "002", "UN"], driveSide: "left", callingCodes: ["268"] }, geometry: { type: "MultiPolygon", coordinates: [[[[31.86881, -25.99973], [31.4175, -25.71886], [31.31237, -25.7431], [31.13073, -25.91558], [30.95819, -26.26303], [30.78927, -26.48271], [30.81101, -26.84722], [30.88826, -26.79622], [30.97757, -26.92706], [30.96088, -27.0245], [31.15027, -27.20151], [31.49834, -27.31549], [31.97592, -27.31675], [31.97463, -27.11057], [32.00893, -26.8096], [32.09664, -26.80721], [32.13315, -26.84345], [32.13409, -26.5317], [32.07352, -26.40185], [32.10435, -26.15656], [32.08599, -26.00978], [32.00916, -25.999], [31.974, -25.95387], [31.86881, -25.99973]]]] } },
+ { type: "Feature", properties: { iso1A2: "TA", iso1A3: "TAA", wikidata: "Q220982", nameEn: "Tristan da Cunha", aliases: ["SH-TA"], country: "GB", groups: ["SH", "BOTS", "011", "202", "002", "UN"], isoStatus: "excRes", driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["290 8", "44 20"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-13.38232, -34.07258], [-16.67337, -41.9188], [-5.88482, -41.4829], [-13.38232, -34.07258]]]] } },
+ { type: "Feature", properties: { iso1A2: "TC", iso1A3: "TCA", iso1N3: "796", wikidata: "Q18221", nameEn: "Turks and Caicos Islands", country: "GB", groups: ["BOTS", "029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 649"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-71.70065, 25.7637], [-72.98446, 20.4801], [-69.80718, 21.35956], [-71.70065, 25.7637]]]] } },
+ { type: "Feature", properties: { iso1A2: "TD", iso1A3: "TCD", iso1N3: "148", wikidata: "Q657", nameEn: "Chad", groups: ["017", "202", "002", "UN"], callingCodes: ["235"] }, geometry: { type: "MultiPolygon", coordinates: [[[[23.99539, 19.49944], [15.99566, 23.49639], [14.99751, 23.00539], [15.19692, 21.99339], [15.20213, 21.49365], [15.28332, 21.44557], [15.62515, 20.95395], [15.57248, 20.92138], [15.55382, 20.86507], [15.56004, 20.79488], [15.59841, 20.74039], [15.6721, 20.70069], [15.99632, 20.35364], [15.75098, 19.93002], [15.6032, 18.77402], [15.50373, 16.89649], [14.37425, 15.72591], [13.86301, 15.04043], [13.78991, 14.87519], [13.809, 14.72915], [13.67878, 14.64013], [13.68573, 14.55276], [13.48259, 14.46704], [13.47559, 14.40881], [13.6302, 13.71094], [14.08251, 13.0797], [14.46881, 13.08259], [14.56101, 12.91036], [14.55058, 12.78256], [14.83314, 12.62963], [14.90827, 12.3269], [14.89019, 12.16593], [14.96952, 12.0925], [15.00146, 12.1223], [15.0349, 12.10698], [15.05786, 12.0608], [15.04808, 11.8731], [15.11579, 11.79313], [15.06595, 11.71126], [15.13149, 11.5537], [15.0585, 11.40481], [15.10021, 11.04101], [15.04957, 11.02347], [15.09127, 10.87431], [15.06737, 10.80921], [15.15532, 10.62846], [15.14936, 10.53915], [15.23724, 10.47764], [15.30874, 10.31063], [15.50535, 10.1098], [15.68761, 9.99344], [15.41408, 9.92876], [15.24618, 9.99246], [15.14043, 9.99246], [15.05999, 9.94845], [14.95722, 9.97926], [14.80082, 9.93818], [14.4673, 10.00264], [14.20411, 10.00055], [14.1317, 9.82413], [14.01793, 9.73169], [13.97544, 9.6365], [14.37094, 9.2954], [14.35707, 9.19611], [14.83566, 8.80557], [15.09484, 8.65982], [15.20426, 8.50892], [15.50743, 7.79302], [15.59272, 7.7696], [15.56964, 7.58936], [15.49743, 7.52179], [15.73118, 7.52006], [15.79942, 7.44149], [16.40703, 7.68809], [16.41583, 7.77971], [16.58315, 7.88657], [16.59415, 7.76444], [16.658, 7.75353], [16.6668, 7.67281], [16.8143, 7.53971], [17.67288, 7.98905], [17.93926, 7.95853], [18.02731, 8.01085], [18.6085, 8.05009], [18.64153, 8.08714], [18.62612, 8.14163], [18.67455, 8.22226], [18.79783, 8.25929], [19.11044, 8.68172], [18.86388, 8.87971], [19.06421, 9.00367], [20.36748, 9.11019], [20.82979, 9.44696], [21.26348, 9.97642], [21.34934, 9.95907], [21.52766, 10.2105], [21.63553, 10.217], [21.71479, 10.29932], [21.72139, 10.64136], [22.45889, 11.00246], [22.87758, 10.91915], [22.97249, 11.21955], [22.93124, 11.41645], [22.7997, 11.40424], [22.54907, 11.64372], [22.64092, 12.07485], [22.48369, 12.02766], [22.50548, 12.16769], [22.38873, 12.45514], [22.46345, 12.61925], [22.22684, 12.74682], [22.15679, 12.66634], [21.98711, 12.63292], [21.89371, 12.68001], [21.81432, 12.81362], [21.94819, 13.05637], [22.02914, 13.13976], [22.1599, 13.19281], [22.29689, 13.3731], [22.08674, 13.77863], [22.22995, 13.96754], [22.5553, 14.11704], [22.55997, 14.23024], [22.44944, 14.24986], [22.38562, 14.58907], [22.70474, 14.69149], [22.66115, 14.86308], [22.99584, 15.22989], [22.99584, 15.40105], [22.92579, 15.47007], [22.93201, 15.55107], [23.10792, 15.71297], [23.38812, 15.69649], [23.62785, 15.7804], [23.99997, 15.69575], [23.99539, 19.49944]]]] } },
+ { type: "Feature", properties: { iso1A2: "TF", iso1A3: "ATF", iso1N3: "260", wikidata: "Q129003", nameEn: "French Southern Territories", country: "FR", groups: ["EU", "UN"] }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "TG", iso1A3: "TGO", iso1N3: "768", wikidata: "Q945", nameEn: "Togo", groups: ["011", "202", "002", "UN"], callingCodes: ["228"] }, geometry: { type: "MultiPolygon", coordinates: [[[[0.50388, 11.01011], [-0.13493, 11.14075], [-0.14462, 11.10811], [-0.05733, 11.08628], [-0.0275, 11.11202], [-514e-5, 11.10763], [342e-5, 11.08317], [0.02395, 11.06229], [0.03355, 10.9807], [-63e-4, 10.96417], [-908e-5, 10.91644], [-0.02685, 10.8783], [-0.0228, 10.81916], [-0.07183, 10.76794], [-0.07327, 10.71845], [-0.09141, 10.7147], [-0.05945, 10.63458], [0.12886, 10.53149], [0.18846, 10.4096], [0.29453, 10.41546], [0.33028, 10.30408], [0.39584, 10.31112], [0.35293, 10.09412], [0.41371, 10.06361], [0.41252, 10.02018], [0.36366, 10.03309], [0.32075, 9.72781], [0.34816, 9.71607], [0.34816, 9.66907], [0.32313, 9.6491], [0.28261, 9.69022], [0.26712, 9.66437], [0.29334, 9.59387], [0.36008, 9.6256], [0.38153, 9.58682], [0.23851, 9.57389], [0.2409, 9.52335], [0.30406, 9.521], [0.31241, 9.50337], [0.2254, 9.47869], [0.25758, 9.42696], [0.33148, 9.44812], [0.36485, 9.49749], [0.49118, 9.48339], [0.56388, 9.40697], [0.45424, 9.04581], [0.52455, 8.87746], [0.37319, 8.75262], [0.47211, 8.59945], [0.64731, 8.48866], [0.73432, 8.29529], [0.63897, 8.25873], [0.5913, 8.19622], [0.61156, 8.18324], [0.6056, 8.13959], [0.58891, 8.12779], [0.62943, 7.85751], [0.58295, 7.62368], [0.51979, 7.58706], [0.52455, 7.45354], [0.57223, 7.39326], [0.62943, 7.41099], [0.65327, 7.31643], [0.59606, 7.01252], [0.52217, 6.9723], [0.52098, 6.94391], [0.56508, 6.92971], [0.52853, 6.82921], [0.57406, 6.80348], [0.58176, 6.76049], [0.6497, 6.73682], [0.63659, 6.63857], [0.74862, 6.56517], [0.71048, 6.53083], [0.89283, 6.33779], [0.99652, 6.33779], [1.03108, 6.24064], [1.05969, 6.22998], [1.09187, 6.17074], [1.19966, 6.17069], [1.19771, 6.11522], [1.27574, 5.93551], [1.67336, 6.02702], [1.62913, 6.24075], [1.79826, 6.28221], [1.76906, 6.43189], [1.58105, 6.68619], [1.61812, 6.74843], [1.55877, 6.99737], [1.64249, 6.99562], [1.61838, 9.0527], [1.5649, 9.16941], [1.41746, 9.3226], [1.33675, 9.54765], [1.36624, 9.5951], [1.35507, 9.99525], [0.77666, 10.37665], [0.80358, 10.71459], [0.8804, 10.803], [0.91245, 10.99597], [0.66104, 10.99964], [0.4958, 10.93269], [0.50521, 10.98035], [0.48852, 10.98561], [0.50388, 11.01011]]]] } },
+ { type: "Feature", properties: { iso1A2: "TH", iso1A3: "THA", iso1N3: "764", wikidata: "Q869", nameEn: "Thailand", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["66"] }, geometry: { type: "MultiPolygon", coordinates: [[[[100.08404, 20.36626], [99.95721, 20.46301], [99.91616, 20.44986], [99.90499, 20.4487], [99.89692, 20.44789], [99.89301, 20.44311], [99.89168, 20.44548], [99.88451, 20.44596], [99.88211, 20.44488], [99.86383, 20.44371], [99.81096, 20.33687], [99.68255, 20.32077], [99.46008, 20.39673], [99.46077, 20.36198], [99.5569, 20.20676], [99.52943, 20.14811], [99.416, 20.08614], [99.20328, 20.12877], [99.0735, 20.10298], [98.98679, 19.7419], [98.83661, 19.80931], [98.56065, 19.67807], [98.51182, 19.71303], [98.24884, 19.67876], [98.13829, 19.78541], [98.03314, 19.80941], [98.04364, 19.65755], [97.84715, 19.55782], [97.88423, 19.5041], [97.78769, 19.39429], [97.84186, 19.29526], [97.78606, 19.26769], [97.84024, 19.22217], [97.83479, 19.09972], [97.73797, 19.04261], [97.73654, 18.9812], [97.66487, 18.9371], [97.73836, 18.88478], [97.76752, 18.58097], [97.5258, 18.4939], [97.36444, 18.57138], [97.34522, 18.54596], [97.50383, 18.26844], [97.56219, 18.33885], [97.64116, 18.29778], [97.60841, 18.23846], [97.73723, 17.97912], [97.66794, 17.88005], [97.76407, 17.71595], [97.91829, 17.54504], [98.11185, 17.36829], [98.10439, 17.33847], [98.34566, 17.04822], [98.39441, 17.06266], [98.52624, 16.89979], [98.49603, 16.8446], [98.53833, 16.81934], [98.46994, 16.73613], [98.50253, 16.7139], [98.49713, 16.69022], [98.51043, 16.70107], [98.51579, 16.69433], [98.51472, 16.68521], [98.51833, 16.676], [98.51113, 16.64503], [98.5695, 16.62826], [98.57912, 16.55983], [98.63817, 16.47424], [98.68074, 16.27068], [98.84485, 16.42354], [98.92656, 16.36425], [98.8376, 16.11706], [98.69585, 16.13353], [98.57019, 16.04578], [98.59853, 15.87197], [98.541, 15.65406], [98.58598, 15.46821], [98.56027, 15.33471], [98.4866, 15.39154], [98.39351, 15.34177], [98.41906, 15.27103], [98.40522, 15.25268], [98.30446, 15.30667], [98.22, 15.21327], [98.18821, 15.13125], [98.24874, 14.83013], [98.56762, 14.37701], [98.97356, 14.04868], [99.16695, 13.72621], [99.20617, 13.20575], [99.12225, 13.19847], [99.10646, 13.05804], [99.18748, 12.9898], [99.18905, 12.84799], [99.29254, 12.68921], [99.409, 12.60603], [99.47519, 12.1353], [99.56445, 12.14805], [99.53424, 12.02317], [99.64891, 11.82699], [99.64108, 11.78948], [99.5672, 11.62732], [99.47598, 11.62434], [99.39485, 11.3925], [99.31573, 11.32081], [99.32756, 11.28545], [99.06938, 10.94857], [99.02337, 10.97217], [98.99701, 10.92962], [99.0069, 10.85485], [98.86819, 10.78336], [98.78511, 10.68351], [98.77275, 10.62548], [98.81944, 10.52761], [98.7391, 10.31488], [98.55174, 9.92804], [98.52291, 9.92389], [98.47298, 9.95782], [98.33094, 9.91973], [98.12555, 9.44056], [97.63455, 9.60854], [97.19814, 8.18901], [99.31854, 5.99868], [99.50117, 6.44501], [99.91873, 6.50233], [100.0756, 6.4045], [100.12, 6.42105], [100.19511, 6.72559], [100.29651, 6.68439], [100.30828, 6.66462], [100.31618, 6.66781], [100.31884, 6.66423], [100.32671, 6.66526], [100.32607, 6.65933], [100.31929, 6.65413], [100.35413, 6.54932], [100.41152, 6.52299], [100.41791, 6.5189], [100.42351, 6.51762], [100.43027, 6.52389], [100.66986, 6.45086], [100.74361, 6.50811], [100.74822, 6.46231], [100.81045, 6.45086], [100.85884, 6.24929], [101.10313, 6.25617], [101.12618, 6.19431], [101.06165, 6.14161], [101.12388, 6.11411], [101.087, 5.9193], [101.02708, 5.91013], [100.98815, 5.79464], [101.14062, 5.61613], [101.25755, 5.71065], [101.25524, 5.78633], [101.58019, 5.93534], [101.69773, 5.75881], [101.75074, 5.79091], [101.80144, 5.74505], [101.89188, 5.8386], [101.91776, 5.84269], [101.92819, 5.85511], [101.94712, 5.98421], [101.9714, 6.00575], [101.97114, 6.01992], [101.99209, 6.04075], [102.01835, 6.05407], [102.09182, 6.14161], [102.07732, 6.193], [102.08127, 6.22679], [102.09086, 6.23546], [102.46318, 7.22462], [102.47649, 9.66162], [102.52395, 11.25257], [102.91449, 11.65512], [102.90973, 11.75613], [102.83957, 11.8519], [102.78427, 11.98746], [102.77026, 12.06815], [102.70176, 12.1686], [102.73134, 12.37091], [102.78116, 12.40284], [102.7796, 12.43781], [102.57567, 12.65358], [102.51963, 12.66117], [102.4994, 12.71736], [102.53053, 12.77506], [102.49335, 12.92711], [102.48694, 12.97537], [102.52275, 12.99813], [102.46011, 13.08057], [102.43422, 13.09061], [102.36146, 13.26006], [102.36001, 13.31142], [102.34611, 13.35618], [102.35692, 13.38274], [102.35563, 13.47307], [102.361, 13.50551], [102.33828, 13.55613], [102.36859, 13.57488], [102.44601, 13.5637], [102.5358, 13.56933], [102.57573, 13.60461], [102.62483, 13.60883], [102.58635, 13.6286], [102.5481, 13.6589], [102.56848, 13.69366], [102.72727, 13.77806], [102.77864, 13.93374], [102.91251, 14.01531], [102.93275, 14.19044], [103.16469, 14.33075], [103.39353, 14.35639], [103.53518, 14.42575], [103.71109, 14.4348], [103.70175, 14.38052], [103.93836, 14.3398], [104.27616, 14.39861], [104.55014, 14.36091], [104.69335, 14.42726], [104.97667, 14.38806], [105.02804, 14.23722], [105.08408, 14.20402], [105.14012, 14.23873], [105.17748, 14.34432], [105.20894, 14.34967], [105.43783, 14.43865], [105.53864, 14.55731], [105.5121, 14.80802], [105.61162, 15.00037], [105.46661, 15.13132], [105.58043, 15.32724], [105.50662, 15.32054], [105.4692, 15.33709], [105.47635, 15.3796], [105.58191, 15.41031], [105.60446, 15.53301], [105.61756, 15.68792], [105.46573, 15.74742], [105.42285, 15.76971], [105.37959, 15.84074], [105.34115, 15.92737], [105.38508, 15.987], [105.42001, 16.00657], [105.06204, 16.09792], [105.00262, 16.25627], [104.88057, 16.37311], [104.73349, 16.565], [104.76099, 16.69302], [104.7397, 16.81005], [104.76442, 16.84752], [104.7373, 16.91125], [104.73712, 17.01404], [104.80716, 17.19025], [104.80061, 17.39367], [104.69867, 17.53038], [104.45404, 17.66788], [104.35432, 17.82871], [104.2757, 17.86139], [104.21776, 17.99335], [104.10927, 18.10826], [104.06533, 18.21656], [103.97725, 18.33631], [103.93916, 18.33914], [103.85642, 18.28666], [103.82449, 18.33979], [103.699, 18.34125], [103.60957, 18.40528], [103.47773, 18.42841], [103.41044, 18.4486], [103.30977, 18.4341], [103.24779, 18.37807], [103.23818, 18.34875], [103.29757, 18.30475], [103.17093, 18.2618], [103.14994, 18.23172], [103.1493, 18.17799], [103.07343, 18.12351], [103.07823, 18.03833], [103.0566, 18.00144], [103.01998, 17.97095], [102.9912, 17.9949], [102.95812, 18.0054], [102.86323, 17.97531], [102.81988, 17.94233], [102.79044, 17.93612], [102.75954, 17.89561], [102.68538, 17.86653], [102.67543, 17.84529], [102.69946, 17.81686], [102.68194, 17.80151], [102.59485, 17.83537], [102.5896, 17.84889], [102.61432, 17.92273], [102.60971, 17.95411], [102.59234, 17.96127], [102.45523, 17.97106], [102.11359, 18.21532], [101.88485, 18.02474], [101.78087, 18.07559], [101.72294, 17.92867], [101.44667, 17.7392], [101.15108, 17.47586], [100.96541, 17.57926], [101.02185, 17.87637], [101.1793, 18.0544], [101.19118, 18.2125], [101.15108, 18.25624], [101.18227, 18.34367], [101.06047, 18.43247], [101.27585, 18.68875], [101.22832, 18.73377], [101.25803, 18.89545], [101.35606, 19.04716], [101.261, 19.12717], [101.24911, 19.33334], [101.20604, 19.35296], [101.21347, 19.46223], [101.26991, 19.48324], [101.26545, 19.59242], [101.08928, 19.59748], [100.90302, 19.61901], [100.77231, 19.48324], [100.64606, 19.55884], [100.58219, 19.49164], [100.49604, 19.53504], [100.398, 19.75047], [100.5094, 19.87904], [100.58808, 20.15791], [100.55218, 20.17741], [100.51052, 20.14928], [100.47567, 20.19133], [100.4537, 20.19971], [100.44992, 20.23644], [100.41473, 20.25625], [100.37439, 20.35156], [100.33383, 20.4028], [100.25769, 20.3992], [100.22076, 20.31598], [100.16668, 20.2986], [100.1712, 20.24324], [100.11785, 20.24787], [100.09337, 20.26293], [100.09999, 20.31614], [100.08404, 20.36626]]]] } },
+ { type: "Feature", properties: { iso1A2: "TJ", iso1A3: "TJK", iso1N3: "762", wikidata: "Q863", nameEn: "Tajikistan", groups: ["143", "142", "UN"], callingCodes: ["992"] }, geometry: { type: "MultiPolygon", coordinates: [[[[70.45251, 41.04438], [70.38028, 41.02014], [70.36655, 40.90296], [69.69434, 40.62615], [69.59441, 40.70181], [69.53021, 40.77621], [69.38327, 40.7918], [69.32834, 40.70233], [69.3455, 40.57988], [69.2643, 40.57506], [69.21063, 40.54469], [69.27066, 40.49274], [69.28525, 40.41894], [69.30774, 40.36102], [69.33794, 40.34819], [69.32833, 40.29794], [69.30808, 40.2821], [69.24817, 40.30357], [69.25229, 40.26362], [69.30104, 40.24502], [69.30448, 40.18774], [69.2074, 40.21488], [69.15659, 40.2162], [69.04544, 40.22904], [68.85832, 40.20885], [68.84357, 40.18604], [68.79276, 40.17555], [68.77902, 40.20492], [68.5332, 40.14826], [68.52771, 40.11676], [68.62796, 40.07789], [69.01523, 40.15771], [69.01935, 40.11466], [68.96579, 40.06949], [68.84906, 40.04952], [68.93695, 39.91167], [68.88889, 39.87163], [68.63071, 39.85265], [68.61972, 39.68905], [68.54166, 39.53929], [68.12053, 39.56317], [67.70992, 39.66156], [67.62889, 39.60234], [67.44899, 39.57799], [67.46547, 39.53564], [67.39681, 39.52505], [67.46822, 39.46146], [67.45998, 39.315], [67.36522, 39.31287], [67.33226, 39.23739], [67.67833, 39.14479], [67.68915, 39.00775], [68.09704, 39.02589], [68.19743, 38.85985], [68.06948, 38.82115], [68.12877, 38.73677], [68.05598, 38.71641], [68.0807, 38.64136], [68.05873, 38.56087], [68.11366, 38.47169], [68.06274, 38.39435], [68.13289, 38.40822], [68.40343, 38.19484], [68.27159, 37.91477], [68.12635, 37.93], [67.81566, 37.43107], [67.8474, 37.31594], [67.78329, 37.1834], [67.7803, 37.08978], [67.87917, 37.0591], [68.02194, 36.91923], [68.18542, 37.02074], [68.27605, 37.00977], [68.29253, 37.10621], [68.41201, 37.10402], [68.41888, 37.13906], [68.61851, 37.19815], [68.6798, 37.27906], [68.81438, 37.23862], [68.80889, 37.32494], [68.91189, 37.26704], [68.88168, 37.33368], [68.96407, 37.32603], [69.03274, 37.25174], [69.25152, 37.09426], [69.39529, 37.16752], [69.45022, 37.23315], [69.36645, 37.40462], [69.44954, 37.4869], [69.51888, 37.5844], [69.80041, 37.5746], [69.84435, 37.60616], [69.93362, 37.61378], [69.95971, 37.5659], [70.15015, 37.52519], [70.28243, 37.66706], [70.27694, 37.81258], [70.1863, 37.84296], [70.17206, 37.93276], [70.4898, 38.12546], [70.54673, 38.24541], [70.60407, 38.28046], [70.61526, 38.34774], [70.64966, 38.34999], [70.69189, 38.37031], [70.6761, 38.39144], [70.67438, 38.40597], [70.69807, 38.41861], [70.72485, 38.4131], [70.75455, 38.4252], [70.77132, 38.45548], [70.78581, 38.45502], [70.78702, 38.45031], [70.79766, 38.44944], [70.80521, 38.44447], [70.81697, 38.44507], [70.82538, 38.45394], [70.84376, 38.44688], [70.88719, 38.46826], [70.92728, 38.43021], [70.98693, 38.48862], [71.03545, 38.44779], [71.0556, 38.40176], [71.09542, 38.42517], [71.10592, 38.42077], [71.10957, 38.40671], [71.1451, 38.40106], [71.21291, 38.32797], [71.33114, 38.30339], [71.33869, 38.27335], [71.37803, 38.25641], [71.36444, 38.15358], [71.29878, 38.04429], [71.28922, 38.01272], [71.27622, 37.99946], [71.27278, 37.96496], [71.24969, 37.93031], [71.2809, 37.91995], [71.296, 37.93403], [71.32871, 37.88564], [71.51565, 37.95349], [71.58843, 37.92425], [71.59255, 37.79956], [71.55752, 37.78677], [71.54324, 37.77104], [71.53053, 37.76534], [71.55234, 37.73209], [71.54186, 37.69691], [71.51972, 37.61945], [71.5065, 37.60912], [71.49693, 37.53527], [71.50616, 37.50733], [71.5256, 37.47971], [71.49612, 37.4279], [71.47685, 37.40281], [71.4862, 37.33405], [71.49821, 37.31975], [71.50674, 37.31502], [71.48536, 37.26017], [71.4824, 37.24921], [71.48339, 37.23937], [71.47386, 37.2269], [71.4555, 37.21418], [71.4494, 37.18137], [71.44127, 37.11856], [71.43097, 37.05855], [71.45578, 37.03094], [71.46923, 36.99925], [71.48481, 36.93218], [71.51502, 36.89128], [71.57195, 36.74943], [71.67083, 36.67346], [71.83229, 36.68084], [72.31676, 36.98115], [72.54095, 37.00007], [72.66381, 37.02014], [72.79693, 37.22222], [73.06884, 37.31729], [73.29633, 37.46495], [73.77197, 37.4417], [73.76647, 37.33913], [73.61129, 37.27469], [73.64974, 37.23643], [73.82552, 37.22659], [73.8564, 37.26158], [74.20308, 37.34208], [74.23339, 37.41116], [74.41055, 37.3948], [74.56161, 37.37734], [74.68383, 37.3948], [74.8294, 37.3435], [74.88887, 37.23275], [75.12328, 37.31839], [75.09719, 37.37297], [75.15899, 37.41443], [75.06011, 37.52779], [74.94338, 37.55501], [74.8912, 37.67576], [75.00935, 37.77486], [74.92416, 37.83428], [74.9063, 38.03033], [74.82665, 38.07359], [74.80331, 38.19889], [74.69894, 38.22155], [74.69619, 38.42947], [74.51217, 38.47034], [74.17022, 38.65504], [73.97933, 38.52945], [73.79806, 38.61106], [73.80656, 38.66449], [73.7033, 38.84782], [73.7445, 38.93867], [73.82964, 38.91517], [73.81728, 39.04007], [73.75823, 39.023], [73.60638, 39.24534], [73.54572, 39.27567], [73.55396, 39.3543], [73.5004, 39.38402], [73.59241, 39.40843], [73.59831, 39.46425], [73.45096, 39.46677], [73.31912, 39.38615], [73.18454, 39.35536], [72.85934, 39.35116], [72.62027, 39.39696], [72.33173, 39.33093], [72.23834, 39.17248], [72.17242, 39.2661], [72.09689, 39.26823], [72.04059, 39.36704], [71.90601, 39.27674], [71.79202, 39.27355], [71.7522, 39.32031], [71.80164, 39.40631], [71.76816, 39.45456], [71.62688, 39.44056], [71.5517, 39.45722], [71.55856, 39.57588], [71.49814, 39.61397], [71.08752, 39.50704], [71.06418, 39.41586], [70.7854, 39.38933], [70.64087, 39.58792], [70.44757, 39.60128], [70.2869, 39.53141], [70.11111, 39.58223], [69.87491, 39.53882], [69.68677, 39.59281], [69.3594, 39.52516], [69.26938, 39.8127], [69.35649, 40.01994], [69.43134, 39.98431], [69.43557, 39.92877], [69.53615, 39.93991], [69.5057, 40.03277], [69.53855, 40.0887], [69.53794, 40.11833], [69.55555, 40.12296], [69.57615, 40.10524], [69.64704, 40.12165], [69.67001, 40.10639], [70.01283, 40.23288], [70.58297, 40.00891], [70.57384, 39.99394], [70.47557, 39.93216], [70.55033, 39.96619], [70.58912, 39.95211], [70.65946, 39.9878], [70.65827, 40.0981], [70.7928, 40.12797], [70.80495, 40.16813], [70.9818, 40.22392], [70.8607, 40.217], [70.62342, 40.17396], [70.56394, 40.26421], [70.57149, 40.3442], [70.37511, 40.38605], [70.32626, 40.45174], [70.49871, 40.52503], [70.80009, 40.72825], [70.45251, 41.04438]]], [[[70.68112, 40.90612], [70.6158, 40.97661], [70.56077, 41.00642], [70.54223, 40.98787], [70.57501, 40.98941], [70.6721, 40.90555], [70.68112, 40.90612]]], [[[70.74189, 39.86319], [70.53651, 39.89155], [70.52631, 39.86989], [70.54998, 39.85137], [70.59667, 39.83542], [70.63105, 39.77923], [70.74189, 39.86319]]]] } },
+ { type: "Feature", properties: { iso1A2: "TK", iso1A3: "TKL", iso1N3: "772", wikidata: "Q36823", nameEn: "Tokelau", country: "NZ", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["690"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-168.251, -9.44289], [-174.18635, -7.80441], [-174.17993, -10.13616], [-168.251, -9.44289]]]] } },
+ { type: "Feature", properties: { iso1A2: "TL", iso1A3: "TLS", iso1N3: "626", wikidata: "Q574", nameEn: "East Timor", aliases: ["Timor-Leste", "TP"], groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["670"] }, geometry: { type: "MultiPolygon", coordinates: [[[[124.46701, -9.13002], [124.94011, -8.85617], [124.97742, -9.08128], [125.11764, -8.96359], [125.18632, -9.03142], [125.18907, -9.16434], [125.09434, -9.19669], [125.04044, -9.17093], [124.97892, -9.19281], [125.09025, -9.46406], [125.68138, -9.85176], [127.55165, -9.05052], [127.42116, -8.22471], [125.87691, -8.31789], [125.58506, -7.95311], [124.92337, -8.75859], [124.33472, -9.11416], [124.04628, -9.22671], [124.04286, -9.34243], [124.10539, -9.41206], [124.14517, -9.42324], [124.21247, -9.36904], [124.28115, -9.42189], [124.28115, -9.50453], [124.3535, -9.48493], [124.35258, -9.43002], [124.38554, -9.3582], [124.45971, -9.30263], [124.46701, -9.13002]]]] } },
+ { type: "Feature", properties: { iso1A2: "TM", iso1A3: "TKM", iso1N3: "795", wikidata: "Q874", nameEn: "Turkmenistan", groups: ["143", "142", "UN"], callingCodes: ["993"] }, geometry: { type: "MultiPolygon", coordinates: [[[[60.5078, 41.21694], [60.06581, 41.4363], [60.18117, 41.60082], [60.06032, 41.76287], [60.08504, 41.80997], [60.33223, 41.75058], [59.95046, 41.97966], [60.0356, 42.01028], [60.04659, 42.08982], [59.96419, 42.1428], [60.00539, 42.212], [59.94633, 42.27655], [59.4341, 42.29738], [59.2955, 42.37064], [59.17317, 42.52248], [58.93422, 42.5407], [58.6266, 42.79314], [58.57991, 42.64988], [58.27504, 42.69632], [58.14321, 42.62159], [58.29427, 42.56497], [58.51674, 42.30348], [58.40688, 42.29535], [58.3492, 42.43335], [57.99214, 42.50021], [57.90975, 42.4374], [57.92897, 42.24047], [57.84932, 42.18555], [57.6296, 42.16519], [57.30275, 42.14076], [57.03633, 41.92043], [56.96218, 41.80383], [57.03359, 41.41777], [57.13796, 41.36625], [57.03423, 41.25435], [56.00314, 41.32584], [55.45471, 41.25609], [54.95182, 41.92424], [54.20635, 42.38477], [52.97575, 42.1308], [52.47884, 41.78034], [52.26048, 41.69249], [51.7708, 40.29239], [53.89734, 37.3464], [54.24565, 37.32047], [54.36211, 37.34912], [54.58664, 37.45809], [54.67247, 37.43532], [54.77822, 37.51597], [54.81804, 37.61285], [54.77684, 37.62264], [54.851, 37.75739], [55.13412, 37.94705], [55.44152, 38.08564], [55.76561, 38.12238], [55.97847, 38.08024], [56.33278, 38.08132], [56.32454, 38.18502], [56.43303, 38.26054], [56.62255, 38.24005], [56.73928, 38.27887], [57.03453, 38.18717], [57.21169, 38.28965], [57.37236, 38.09321], [57.35042, 37.98546], [57.79534, 37.89299], [58.21399, 37.77281], [58.22999, 37.6856], [58.39959, 37.63134], [58.47786, 37.6433], [58.5479, 37.70526], [58.6921, 37.64548], [58.9338, 37.67374], [59.22905, 37.51161], [59.33507, 37.53146], [59.39797, 37.47892], [59.39385, 37.34257], [59.55178, 37.13594], [59.74678, 37.12499], [60.00768, 37.04102], [60.34767, 36.63214], [61.14516, 36.64644], [61.18187, 36.55348], [61.1393, 36.38782], [61.22719, 36.12759], [61.12007, 35.95992], [61.22444, 35.92879], [61.26152, 35.80749], [61.22719, 35.67038], [61.27371, 35.61482], [61.58742, 35.43803], [61.77693, 35.41341], [61.97743, 35.4604], [62.05709, 35.43803], [62.15871, 35.33278], [62.29191, 35.25964], [62.29878, 35.13312], [62.48006, 35.28796], [62.62288, 35.22067], [62.74098, 35.25432], [62.90853, 35.37086], [63.0898, 35.43131], [63.12276, 35.53196], [63.10079, 35.63024], [63.23262, 35.67487], [63.10318, 35.81782], [63.12276, 35.86208], [63.29579, 35.85985], [63.53475, 35.90881], [63.56496, 35.95106], [63.98519, 36.03773], [64.05385, 36.10433], [64.43288, 36.24401], [64.57295, 36.34362], [64.62514, 36.44311], [64.61141, 36.6351], [64.97945, 37.21913], [65.51778, 37.23881], [65.64263, 37.34388], [65.64137, 37.45061], [65.72274, 37.55438], [66.30993, 37.32409], [66.55743, 37.35409], [66.52303, 37.39827], [66.65761, 37.45497], [66.52852, 37.58568], [66.53676, 37.80084], [66.67684, 37.96776], [66.56697, 38.0435], [66.41042, 38.02403], [66.24013, 38.16238], [65.83913, 38.25733], [65.55873, 38.29052], [64.32576, 38.98691], [64.19086, 38.95561], [63.70778, 39.22349], [63.6913, 39.27666], [62.43337, 39.98528], [62.34273, 40.43206], [62.11751, 40.58242], [61.87856, 41.12257], [61.4446, 41.29407], [61.39732, 41.19873], [61.33199, 41.14946], [61.22212, 41.14946], [61.03261, 41.25691], [60.5078, 41.21694]]]] } },
+ { type: "Feature", properties: { iso1A2: "TN", iso1A3: "TUN", iso1N3: "788", wikidata: "Q948", nameEn: "Tunisia", groups: ["015", "002", "UN"], callingCodes: ["216"] }, geometry: { type: "MultiPolygon", coordinates: [[[[11.2718, 37.6713], [7.89009, 38.19924], [8.59123, 37.14286], [8.64044, 36.9401], [8.62972, 36.86499], [8.67706, 36.8364], [8.57613, 36.78062], [8.46537, 36.7706], [8.47609, 36.66607], [8.16167, 36.48817], [8.18936, 36.44939], [8.40731, 36.42208], [8.2626, 35.91733], [8.26472, 35.73669], [8.35371, 35.66373], [8.36086, 35.47774], [8.30329, 35.29884], [8.47318, 35.23376], [8.3555, 35.10007], [8.30727, 34.95378], [8.25189, 34.92009], [8.29655, 34.72798], [8.20482, 34.57575], [7.86264, 34.3987], [7.81242, 34.21841], [7.74207, 34.16492], [7.66174, 34.20167], [7.52851, 34.06493], [7.54088, 33.7726], [7.73687, 33.42114], [7.83028, 33.18851], [8.11433, 33.10175], [8.1179, 33.05086], [8.31895, 32.83483], [8.35999, 32.50101], [9.07483, 32.07865], [9.55544, 30.23971], [9.76848, 30.34366], [9.88152, 30.34074], [10.29516, 30.90337], [10.12239, 31.42098], [10.31364, 31.72648], [10.48497, 31.72956], [10.62788, 31.96629], [10.7315, 31.97235], [11.04234, 32.2145], [11.53898, 32.4138], [11.57828, 32.48013], [11.46037, 32.6307], [11.51549, 33.09826], [11.55852, 33.1409], [11.58941, 33.36891], [11.2718, 37.6713]]]] } },
+ { type: "Feature", properties: { iso1A2: "TO", iso1A3: "TON", iso1N3: "776", wikidata: "Q678", nameEn: "Tonga", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["676"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-176.74538, -22.89767], [-180, -22.90585], [-180, -24.21376], [-173.10761, -24.19665], [-173.13438, -14.94228], [-176.76826, -14.95183], [-176.74538, -22.89767]]]] } },
+ { type: "Feature", properties: { iso1A2: "TR", iso1A3: "TUR", iso1N3: "792", wikidata: "Q43", nameEn: "Turkey", groups: ["145", "142", "UN"], callingCodes: ["90"] }, geometry: { type: "MultiPolygon", coordinates: [[[[41.54366, 41.52185], [40.89217, 41.72528], [34.8305, 42.4581], [28.32297, 41.98371], [28.02971, 41.98066], [27.91479, 41.97902], [27.83492, 41.99709], [27.81235, 41.94803], [27.69949, 41.97515], [27.55191, 41.90928], [27.52379, 41.93756], [27.45478, 41.96591], [27.27411, 42.10409], [27.22376, 42.10152], [27.19251, 42.06028], [27.08486, 42.08735], [27.03277, 42.0809], [26.95638, 42.00741], [26.79143, 41.97386], [26.62996, 41.97644], [26.56051, 41.92995], [26.57961, 41.90024], [26.53968, 41.82653], [26.36952, 41.82265], [26.33589, 41.76802], [26.32952, 41.73637], [26.35957, 41.71149], [26.47958, 41.67037], [26.5209, 41.62592], [26.59196, 41.60491], [26.59742, 41.48058], [26.61767, 41.42281], [26.62997, 41.34613], [26.5837, 41.32131], [26.5209, 41.33993], [26.39861, 41.25053], [26.32259, 41.24929], [26.31928, 41.07386], [26.3606, 41.02027], [26.33297, 40.98388], [26.35894, 40.94292], [26.32259, 40.94042], [26.28623, 40.93005], [26.29441, 40.89119], [26.26169, 40.9168], [26.20856, 40.86048], [26.21351, 40.83298], [26.15685, 40.80709], [26.12854, 40.77339], [26.12495, 40.74283], [26.08638, 40.73214], [26.0754, 40.72772], [26.03489, 40.73051], [25.94795, 40.72797], [26.04292, 40.3958], [25.61285, 40.17161], [25.94257, 39.39358], [26.43357, 39.43096], [26.70773, 39.0312], [26.61814, 38.81372], [26.21136, 38.65436], [26.32173, 38.48731], [26.24183, 38.44695], [26.21136, 38.17558], [27.05537, 37.9131], [27.16428, 37.72343], [26.99377, 37.69034], [26.95583, 37.64989], [27.14757, 37.32], [27.20312, 36.94571], [27.45627, 36.9008], [27.24613, 36.71622], [27.46117, 36.53789], [27.89482, 36.69898], [27.95037, 36.46155], [28.23708, 36.56812], [29.30783, 36.01033], [29.48192, 36.18377], [29.61002, 36.1731], [29.61805, 36.14179], [29.69611, 36.10365], [29.73302, 35.92555], [32.82353, 35.70297], [35.51152, 36.10954], [35.931, 35.92109], [35.98499, 35.94107], [36.00514, 35.94113], [36.01844, 35.92403], [35.99829, 35.88242], [36.11827, 35.85923], [36.13919, 35.83692], [36.14029, 35.81015], [36.1623, 35.80925], [36.17441, 35.92076], [36.19973, 35.95195], [36.25366, 35.96264], [36.27678, 35.94839], [36.29769, 35.96086], [36.28338, 36.00273], [36.30099, 36.00985], [36.33956, 35.98687], [36.37474, 36.01163], [36.39206, 36.22088], [36.4617, 36.20461], [36.50463, 36.2419], [36.6125, 36.22592], [36.68672, 36.23677], [36.65653, 36.33861], [36.6081, 36.33772], [36.54206, 36.49539], [36.58829, 36.58295], [36.57398, 36.65186], [36.62681, 36.71189], [36.61581, 36.74629], [36.66727, 36.82901], [36.99557, 36.75997], [36.99886, 36.74012], [37.04399, 36.73483], [37.04619, 36.71101], [37.01647, 36.69512], [37.02088, 36.66422], [37.08279, 36.63495], [37.10894, 36.6704], [37.16177, 36.66069], [37.21988, 36.6736], [37.47253, 36.63243], [37.49103, 36.66904], [37.68048, 36.75065], [37.81974, 36.76055], [38.21064, 36.91842], [38.38859, 36.90064], [38.55908, 36.84429], [38.74042, 36.70629], [39.03217, 36.70911], [39.21538, 36.66834], [39.81589, 36.75538], [40.69136, 37.0996], [40.90856, 37.13147], [41.21937, 37.07665], [41.515, 37.08084], [42.00894, 37.17209], [42.18225, 37.28569], [42.19301, 37.31323], [42.2112, 37.32491], [42.22257, 37.31395], [42.22381, 37.30238], [42.20454, 37.28715], [42.21548, 37.28026], [42.23683, 37.2863], [42.26039, 37.27017], [42.2824, 37.2798], [42.34735, 37.22548], [42.32313, 37.17814], [42.35724, 37.10998], [42.56725, 37.14878], [42.78887, 37.38615], [42.93705, 37.32015], [43.11403, 37.37436], [43.30083, 37.30629], [43.33508, 37.33105], [43.50787, 37.24436], [43.56702, 37.25675], [43.63085, 37.21957], [43.7009, 37.23692], [43.8052, 37.22825], [43.82699, 37.19477], [43.84878, 37.22205], [43.90949, 37.22453], [44.02002, 37.33229], [44.13521, 37.32486], [44.2613, 37.25055], [44.27998, 37.16501], [44.22239, 37.15756], [44.18503, 37.09551], [44.25975, 36.98119], [44.30645, 36.97373], [44.35937, 37.02843], [44.35315, 37.04955], [44.38117, 37.05825], [44.42631, 37.05825], [44.63179, 37.19229], [44.76698, 37.16162], [44.78319, 37.1431], [44.7868, 37.16644], [44.75986, 37.21549], [44.81021, 37.2915], [44.58449, 37.45018], [44.61401, 37.60165], [44.56887, 37.6429], [44.62096, 37.71985], [44.55498, 37.783], [44.45948, 37.77065], [44.3883, 37.85433], [44.22509, 37.88859], [44.42476, 38.25763], [44.50115, 38.33939], [44.44386, 38.38295], [44.38309, 38.36117], [44.3119, 38.37887], [44.3207, 38.49799], [44.32058, 38.62752], [44.28065, 38.6465], [44.26155, 38.71427], [44.30322, 38.81581], [44.18863, 38.93881], [44.20946, 39.13975], [44.1043, 39.19842], [44.03667, 39.39223], [44.22452, 39.4169], [44.29818, 39.378], [44.37921, 39.4131], [44.42832, 39.4131], [44.41849, 39.56659], [44.48111, 39.61579], [44.47298, 39.68788], [44.6137, 39.78393], [44.65422, 39.72163], [44.71806, 39.71124], [44.81043, 39.62677], [44.80977, 39.65768], [44.75779, 39.7148], [44.61845, 39.8281], [44.46635, 39.97733], [44.26973, 40.04866], [44.1778, 40.02845], [44.1057, 40.03555], [43.92307, 40.01787], [43.65688, 40.11199], [43.65221, 40.14889], [43.71136, 40.16673], [43.59928, 40.34019], [43.60862, 40.43267], [43.54791, 40.47413], [43.63664, 40.54159], [43.7425, 40.66805], [43.74872, 40.7365], [43.67712, 40.84846], [43.67712, 40.93084], [43.58683, 40.98961], [43.47319, 41.02251], [43.44984, 41.0988], [43.4717, 41.12611], [43.44973, 41.17666], [43.36118, 41.2028], [43.23096, 41.17536], [43.1945, 41.25242], [43.13373, 41.25503], [43.21707, 41.30331], [43.02956, 41.37891], [42.8785, 41.50516], [42.84899, 41.47265], [42.78995, 41.50126], [42.84471, 41.58912], [42.72794, 41.59714], [42.59202, 41.58183], [42.51772, 41.43606], [42.26387, 41.49346], [41.95134, 41.52466], [41.81939, 41.43621], [41.7124, 41.47417], [41.7148, 41.4932], [41.54366, 41.52185]]]] } },
+ { type: "Feature", properties: { iso1A2: "TT", iso1A3: "TTO", iso1N3: "780", wikidata: "Q754", nameEn: "Trinidad and Tobago", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", callingCodes: ["1 868"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-61.62505, 11.18974], [-62.08693, 10.04435], [-60.89962, 9.81445], [-60.07172, 11.77667], [-61.62505, 11.18974]]]] } },
+ { type: "Feature", properties: { iso1A2: "TV", iso1A3: "TUV", iso1N3: "798", wikidata: "Q672", nameEn: "Tuvalu", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["688"] }, geometry: { type: "MultiPolygon", coordinates: [[[[174, -5], [174, -11.5], [179.99999, -11.5], [179.99999, -5], [174, -5]]]] } },
+ { type: "Feature", properties: { iso1A2: "TW", iso1A3: "TWN", iso1N3: "158", wikidata: "Q865", nameEn: "Taiwan", aliases: ["RC"], groups: ["030", "142"], callingCodes: ["886"] }, geometry: { type: "MultiPolygon", coordinates: [[[[121.8109, 21.77688], [122.26612, 25.98197], [120.49232, 25.22863], [118.56434, 24.49266], [118.42453, 24.54644], [118.35291, 24.51645], [118.28244, 24.51231], [118.11703, 24.39734], [120.69238, 21.52331], [121.8109, 21.77688]]]] } },
+ { type: "Feature", properties: { iso1A2: "TZ", iso1A3: "TZA", iso1N3: "834", wikidata: "Q924", nameEn: "Tanzania", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["255"] }, geometry: { type: "MultiPolygon", coordinates: [[[[30.80408, -0.99911], [30.76635, -0.9852], [30.70631, -1.01175], [30.64166, -1.06601], [30.47194, -1.0555], [30.45116, -1.10641], [30.50889, -1.16412], [30.57123, -1.33264], [30.71974, -1.43244], [30.84079, -1.64652], [30.80802, -1.91477], [30.89303, -2.08223], [30.83915, -2.35795], [30.54501, -2.41404], [30.41789, -2.66266], [30.52747, -2.65841], [30.40662, -2.86151], [30.4987, -2.9573], [30.57926, -2.89791], [30.6675, -2.98987], [30.83823, -2.97837], [30.84165, -3.25152], [30.45915, -3.56532], [30.22042, -4.01738], [30.03323, -4.26631], [29.88172, -4.35743], [29.82885, -4.36153], [29.77289, -4.41733], [29.75109, -4.45836], [29.63827, -4.44681], [29.43673, -4.44845], [29.52552, -6.2731], [30.2567, -7.14121], [30.79243, -8.27382], [31.00796, -8.58615], [31.37533, -8.60769], [31.57147, -8.70619], [31.57147, -8.81388], [31.71158, -8.91386], [31.81587, -8.88618], [31.94663, -8.93846], [31.94196, -9.02303], [31.98866, -9.07069], [32.08206, -9.04609], [32.16146, -9.05993], [32.25486, -9.13371], [32.43543, -9.11988], [32.49147, -9.14754], [32.53661, -9.24281], [32.75611, -9.28583], [32.76233, -9.31963], [32.95389, -9.40138], [32.99397, -9.36712], [33.14925, -9.49322], [33.31581, -9.48554], [33.48052, -9.62442], [33.76677, -9.58516], [33.93298, -9.71647], [33.9638, -9.62206], [33.95829, -9.54066], [34.03865, -9.49398], [34.54499, -10.0678], [34.51911, -10.12279], [34.57581, -10.56271], [34.65946, -10.6828], [34.67047, -10.93796], [34.61161, -11.01611], [34.63305, -11.11731], [34.79375, -11.32245], [34.91153, -11.39799], [34.96296, -11.57354], [35.63599, -11.55927], [35.82767, -11.41081], [36.19094, -11.57593], [36.19094, -11.70008], [36.62068, -11.72884], [36.80309, -11.56836], [37.3936, -11.68949], [37.76614, -11.53352], [37.8388, -11.3123], [37.93618, -11.26228], [38.21598, -11.27289], [38.47258, -11.4199], [38.88996, -11.16978], [39.24395, -11.17433], [39.58249, -10.96043], [40.00295, -10.80255], [40.44265, -10.4618], [40.74206, -10.25691], [40.14328, -4.64201], [39.62121, -4.68136], [39.44306, -4.93877], [39.21631, -4.67835], [37.81321, -3.69179], [37.75036, -3.54243], [37.63099, -3.50723], [37.5903, -3.42735], [37.71745, -3.304], [37.67199, -3.06222], [34.0824, -1.02264], [34.03084, -1.05101], [34.02286, -1.00779], [33.93107, -0.99298], [30.80408, -0.99911]]]] } },
+ { type: "Feature", properties: { iso1A2: "UA", iso1A3: "UKR", iso1N3: "804", wikidata: "Q212", nameEn: "Ukraine", groups: ["151", "150", "UN"], callingCodes: ["380"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.57318, 46.10317], [33.61467, 46.13561], [33.63854, 46.14147], [33.61517, 46.22615], [33.646, 46.23028], [33.74047, 46.18555], [33.79715, 46.20482], [33.85234, 46.19863], [33.91549, 46.15938], [34.05272, 46.10838], [34.07311, 46.11769], [34.12929, 46.10494], [34.181, 46.06804], [34.25111, 46.0532], [34.33912, 46.06114], [34.41221, 46.00245], [34.44155, 45.95995], [34.48729, 45.94267], [34.52011, 45.95097], [34.55889, 45.99347], [34.60861, 45.99347], [34.66679, 45.97136], [34.75479, 45.90705], [34.80153, 45.90047], [34.79905, 45.81009], [34.96015, 45.75634], [35.23066, 45.79231], [37.62608, 46.82615], [38.12112, 46.86078], [38.3384, 46.98085], [38.22955, 47.12069], [38.23049, 47.2324], [38.32112, 47.2585], [38.33074, 47.30508], [38.22225, 47.30788], [38.28954, 47.39255], [38.28679, 47.53552], [38.35062, 47.61631], [38.76379, 47.69346], [38.79628, 47.81109], [38.87979, 47.87719], [39.73935, 47.82876], [39.82213, 47.96396], [39.77544, 48.04206], [39.88256, 48.04482], [39.83724, 48.06501], [39.94847, 48.22811], [40.00752, 48.22445], [39.99241, 48.31768], [39.97325, 48.31399], [39.9693, 48.29904], [39.95248, 48.29972], [39.91465, 48.26743], [39.90041, 48.3049], [39.84273, 48.30947], [39.84136, 48.33321], [39.94847, 48.35055], [39.88794, 48.44226], [39.86196, 48.46633], [39.84548, 48.57821], [39.79764, 48.58668], [39.67226, 48.59368], [39.71765, 48.68673], [39.73104, 48.7325], [39.79466, 48.83739], [39.97182, 48.79398], [40.08168, 48.87443], [40.03636, 48.91957], [39.98967, 48.86901], [39.78368, 48.91596], [39.74874, 48.98675], [39.72649, 48.9754], [39.71353, 48.98959], [39.6683, 48.99454], [39.6836, 49.05121], [39.93437, 49.05709], [40.01988, 49.1761], [40.22176, 49.25683], [40.18331, 49.34996], [40.14912, 49.37681], [40.1141, 49.38798], [40.03087, 49.45452], [40.03636, 49.52321], [40.16683, 49.56865], [40.13249, 49.61672], [39.84548, 49.56064], [39.65047, 49.61761], [39.59142, 49.73758], [39.44496, 49.76067], [39.27968, 49.75976], [39.1808, 49.88911], [38.9391, 49.79524], [38.90477, 49.86787], [38.73311, 49.90238], [38.68677, 50.00904], [38.65688, 49.97176], [38.35408, 50.00664], [38.32524, 50.08866], [38.18517, 50.08161], [38.21675, 49.98104], [38.02999, 49.90592], [38.02999, 49.94482], [37.90776, 50.04194], [37.79515, 50.08425], [37.75807, 50.07896], [37.61113, 50.21976], [37.62879, 50.24481], [37.62486, 50.29966], [37.47243, 50.36277], [37.48204, 50.46079], [37.08468, 50.34935], [36.91762, 50.34963], [36.69377, 50.26982], [36.64571, 50.218], [36.56655, 50.2413], [36.58371, 50.28563], [36.47817, 50.31457], [36.30101, 50.29088], [36.20763, 50.3943], [36.06893, 50.45205], [35.8926, 50.43829], [35.80388, 50.41356], [35.73659, 50.35489], [35.61711, 50.35707], [35.58003, 50.45117], [35.47463, 50.49247], [35.39464, 50.64751], [35.48116, 50.66405], [35.47704, 50.77274], [35.41367, 50.80227], [35.39307, 50.92145], [35.32598, 50.94524], [35.40837, 51.04119], [35.31774, 51.08434], [35.20375, 51.04723], [35.12685, 51.16191], [35.14058, 51.23162], [34.97304, 51.2342], [34.82472, 51.17483], [34.6874, 51.18], [34.6613, 51.25053], [34.38802, 51.2746], [34.31661, 51.23936], [34.23009, 51.26429], [34.33446, 51.363], [34.22048, 51.4187], [34.30562, 51.5205], [34.17599, 51.63253], [34.07765, 51.67065], [34.42922, 51.72852], [34.41136, 51.82793], [34.09413, 52.00835], [34.11199, 52.14087], [34.05239, 52.20132], [33.78789, 52.37204], [33.55718, 52.30324], [33.48027, 52.31499], [33.51323, 52.35779], [33.18913, 52.3754], [32.89937, 52.2461], [32.85405, 52.27888], [32.69475, 52.25535], [32.54781, 52.32423], [32.3528, 52.32842], [32.38988, 52.24946], [32.33083, 52.23685], [32.34044, 52.1434], [32.2777, 52.10266], [32.23331, 52.08085], [32.08813, 52.03319], [31.92159, 52.05144], [31.96141, 52.08015], [31.85018, 52.11305], [31.81722, 52.09955], [31.7822, 52.11406], [31.38326, 52.12991], [31.25142, 52.04131], [31.13332, 52.1004], [30.95589, 52.07775], [30.90897, 52.00699], [30.76443, 51.89739], [30.68804, 51.82806], [30.51946, 51.59649], [30.64992, 51.35014], [30.56203, 51.25655], [30.36153, 51.33984], [30.34642, 51.42555], [30.17888, 51.51025], [29.77376, 51.4461], [29.7408, 51.53417], [29.54372, 51.48372], [29.49773, 51.39814], [29.42357, 51.4187], [29.32881, 51.37843], [29.25191, 51.49828], [29.25603, 51.57089], [29.20659, 51.56918], [29.16402, 51.64679], [29.1187, 51.65872], [28.99098, 51.56833], [28.95528, 51.59222], [28.81795, 51.55552], [28.76027, 51.48802], [28.78224, 51.45294], [28.75615, 51.41442], [28.73143, 51.46236], [28.69161, 51.44695], [28.64429, 51.5664], [28.47051, 51.59734], [28.37592, 51.54505], [28.23452, 51.66988], [28.10658, 51.57857], [27.95827, 51.56065], [27.91844, 51.61952], [27.85253, 51.62293], [27.76052, 51.47604], [27.67125, 51.50854], [27.71932, 51.60672], [27.55727, 51.63486], [27.51058, 51.5854], [27.47212, 51.61184], [27.24828, 51.60161], [27.26613, 51.65957], [27.20948, 51.66713], [27.20602, 51.77291], [26.99422, 51.76933], [26.9489, 51.73788], [26.80043, 51.75777], [26.69759, 51.82284], [26.46962, 51.80501], [26.39367, 51.87315], [26.19084, 51.86781], [26.00408, 51.92967], [25.83217, 51.92587], [25.80574, 51.94556], [25.73673, 51.91973], [25.46163, 51.92205], [25.20228, 51.97143], [24.98784, 51.91273], [24.37123, 51.88222], [24.29021, 51.80841], [24.3163, 51.75063], [24.13075, 51.66979], [23.99907, 51.58369], [23.8741, 51.59734], [23.91118, 51.63316], [23.7766, 51.66809], [23.60906, 51.62122], [23.6736, 51.50255], [23.62751, 51.50512], [23.69905, 51.40871], [23.63858, 51.32182], [23.80678, 51.18405], [23.90376, 51.07697], [23.92217, 51.00836], [24.04576, 50.90196], [24.14524, 50.86128], [24.0952, 50.83262], [23.99254, 50.83847], [23.95925, 50.79271], [24.0595, 50.71625], [24.0996, 50.60752], [24.07048, 50.5071], [24.03668, 50.44507], [23.99563, 50.41289], [23.79445, 50.40481], [23.71382, 50.38248], [23.67635, 50.33385], [23.28221, 50.0957], [22.99329, 49.84249], [22.83179, 49.69875], [22.80261, 49.69098], [22.78304, 49.65543], [22.64534, 49.53094], [22.69444, 49.49378], [22.748, 49.32759], [22.72009, 49.20288], [22.86336, 49.10513], [22.89122, 49.00725], [22.56155, 49.08865], [22.54338, 49.01424], [22.48296, 48.99172], [22.42934, 48.92857], [22.34151, 48.68893], [22.21379, 48.6218], [22.16023, 48.56548], [22.14689, 48.4005], [22.2083, 48.42534], [22.38133, 48.23726], [22.49806, 48.25189], [22.59007, 48.15121], [22.58733, 48.10813], [22.66835, 48.09162], [22.73427, 48.12005], [22.81804, 48.11363], [22.87847, 48.04665], [22.84276, 47.98602], [22.89849, 47.95851], [22.94301, 47.96672], [22.92241, 48.02002], [23.0158, 47.99338], [23.08858, 48.00716], [23.1133, 48.08061], [23.15999, 48.12188], [23.27397, 48.08245], [23.33577, 48.0237], [23.4979, 47.96858], [23.52803, 48.01818], [23.5653, 48.00499], [23.63894, 48.00293], [23.66262, 47.98786], [23.75188, 47.99705], [23.80904, 47.98142], [23.8602, 47.9329], [23.89352, 47.94512], [23.94192, 47.94868], [23.96337, 47.96672], [23.98553, 47.96076], [24.00801, 47.968], [24.02999, 47.95087], [24.06466, 47.95317], [24.11281, 47.91487], [24.22566, 47.90231], [24.34926, 47.9244], [24.43578, 47.97131], [24.61994, 47.95062], [24.70632, 47.84428], [24.81893, 47.82031], [24.88896, 47.7234], [25.11144, 47.75203], [25.23778, 47.89403], [25.63878, 47.94924], [25.77723, 47.93919], [26.05901, 47.9897], [26.17711, 47.99246], [26.33504, 48.18418], [26.55202, 48.22445], [26.62823, 48.25804], [26.6839, 48.35828], [26.79239, 48.29071], [26.82809, 48.31629], [26.71274, 48.40388], [26.85556, 48.41095], [26.93384, 48.36558], [27.03821, 48.37653], [27.0231, 48.42485], [27.08078, 48.43214], [27.13434, 48.37288], [27.27855, 48.37534], [27.32159, 48.4434], [27.37604, 48.44398], [27.37741, 48.41026], [27.44333, 48.41209], [27.46942, 48.454], [27.5889, 48.49224], [27.59027, 48.46311], [27.6658, 48.44034], [27.74422, 48.45926], [27.79225, 48.44244], [27.81902, 48.41874], [27.87533, 48.4037], [27.88391, 48.36699], [27.95883, 48.32368], [28.04527, 48.32661], [28.09873, 48.3124], [28.07504, 48.23494], [28.17666, 48.25963], [28.19314, 48.20749], [28.2856, 48.23202], [28.32508, 48.23384], [28.35519, 48.24957], [28.36996, 48.20543], [28.34912, 48.1787], [28.30586, 48.1597], [28.30609, 48.14018], [28.34009, 48.13147], [28.38712, 48.17567], [28.43701, 48.15832], [28.42454, 48.12047], [28.48428, 48.0737], [28.53921, 48.17453], [28.69896, 48.13106], [28.85232, 48.12506], [28.8414, 48.03392], [28.9306, 47.96255], [29.1723, 47.99013], [29.19839, 47.89261], [29.27804, 47.88893], [29.20663, 47.80367], [29.27255, 47.79953], [29.22242, 47.73607], [29.22414, 47.60012], [29.11743, 47.55001], [29.18603, 47.43387], [29.3261, 47.44664], [29.39889, 47.30179], [29.47854, 47.30366], [29.48678, 47.36043], [29.5733, 47.36508], [29.59665, 47.25521], [29.54996, 47.24962], [29.57696, 47.13581], [29.49732, 47.12878], [29.53044, 47.07851], [29.61038, 47.09932], [29.62137, 47.05069], [29.57056, 46.94766], [29.72986, 46.92234], [29.75458, 46.8604], [29.87405, 46.88199], [29.98814, 46.82358], [29.94522, 46.80055], [29.9743, 46.75325], [29.94409, 46.56002], [29.88916, 46.54302], [30.02511, 46.45132], [30.16794, 46.40967], [30.09103, 46.38694], [29.94114, 46.40114], [29.88329, 46.35851], [29.74496, 46.45605], [29.66359, 46.4215], [29.6763, 46.36041], [29.5939, 46.35472], [29.49914, 46.45889], [29.35357, 46.49505], [29.24886, 46.37912], [29.23547, 46.55435], [29.02409, 46.49582], [29.01241, 46.46177], [28.9306, 46.45699], [29.004, 46.31495], [28.98478, 46.31803], [28.94953, 46.25852], [29.06656, 46.19716], [28.94643, 46.09176], [29.00613, 46.04962], [28.98004, 46.00385], [28.74383, 45.96664], [28.78503, 45.83475], [28.69852, 45.81753], [28.70401, 45.78019], [28.52823, 45.73803], [28.47879, 45.66994], [28.51587, 45.6613], [28.54196, 45.58062], [28.49252, 45.56716], [28.51449, 45.49982], [28.43072, 45.48538], [28.41836, 45.51715], [28.30201, 45.54744], [28.21139, 45.46895], [28.28504, 45.43907], [28.34554, 45.32102], [28.5735, 45.24759], [28.71358, 45.22631], [28.78911, 45.24179], [28.81383, 45.3384], [28.94292, 45.28045], [28.96077, 45.33164], [29.24779, 45.43388], [29.42632, 45.44545], [29.59798, 45.38857], [29.68175, 45.26885], [29.65428, 45.25629], [29.69272, 45.19227], [30.04414, 45.08461], [31.62627, 45.50633], [33.54017, 46.0123], [33.59087, 46.06013], [33.57318, 46.10317]]]] } },
+ { type: "Feature", properties: { iso1A2: "UG", iso1A3: "UGA", iso1N3: "800", wikidata: "Q1036", nameEn: "Uganda", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["256"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.93107, -0.99298], [33.9264, -0.54188], [33.98449, -0.13079], [33.90936, 0.10581], [34.10067, 0.36372], [34.08727, 0.44713], [34.11408, 0.48884], [34.13493, 0.58118], [34.20196, 0.62289], [34.27345, 0.63182], [34.31516, 0.75693], [34.40041, 0.80266], [34.43349, 0.85254], [34.52369, 1.10692], [34.57427, 1.09868], [34.58029, 1.14712], [34.67562, 1.21265], [34.80223, 1.22754], [34.82606, 1.26626], [34.82606, 1.30944], [34.7918, 1.36752], [34.87819, 1.5596], [34.92734, 1.56109], [34.9899, 1.6668], [34.98692, 1.97348], [34.90947, 2.42447], [34.95267, 2.47209], [34.77244, 2.70272], [34.78137, 2.76223], [34.73967, 2.85447], [34.65774, 2.8753], [34.60114, 2.93034], [34.56242, 3.11478], [34.45815, 3.18319], [34.40006, 3.37949], [34.41794, 3.44342], [34.39112, 3.48802], [34.44922, 3.51627], [34.45815, 3.67385], [34.15429, 3.80464], [34.06046, 4.15235], [33.9873, 4.23316], [33.51264, 3.75068], [33.18356, 3.77812], [33.02852, 3.89296], [32.89746, 3.81339], [32.72021, 3.77327], [32.41337, 3.748], [32.20782, 3.6053], [32.19888, 3.50867], [32.08866, 3.53543], [32.08491, 3.56287], [32.05187, 3.589], [31.95907, 3.57408], [31.96205, 3.6499], [31.86821, 3.78664], [31.81459, 3.82083], [31.72075, 3.74354], [31.50776, 3.63652], [31.50478, 3.67814], [31.29476, 3.8015], [31.16666, 3.79853], [30.97601, 3.693], [30.85153, 3.48867], [30.94081, 3.50847], [30.93486, 3.40737], [30.84251, 3.26908], [30.77101, 3.04897], [30.8574, 2.9508], [30.8857, 2.83923], [30.75612, 2.5863], [30.74271, 2.43601], [30.83059, 2.42559], [30.91102, 2.33332], [30.96911, 2.41071], [31.06593, 2.35862], [31.07934, 2.30207], [31.12104, 2.27676], [31.1985, 2.29462], [31.20148, 2.2217], [31.28042, 2.17853], [31.30127, 2.11006], [30.48503, 1.21675], [30.24671, 1.14974], [30.22139, 0.99635], [30.1484, 0.89805], [29.98307, 0.84295], [29.95477, 0.64486], [29.97413, 0.52124], [29.87284, 0.39166], [29.81922, 0.16824], [29.77454, 0.16675], [29.7224, 0.07291], [29.72687, -0.08051], [29.65091, -0.46777], [29.67474, -0.47969], [29.67176, -0.55714], [29.62708, -0.71055], [29.63006, -0.8997], [29.58388, -0.89821], [29.59061, -1.39016], [29.82657, -1.31187], [29.912, -1.48269], [30.16369, -1.34303], [30.35212, -1.06896], [30.47194, -1.0555], [30.64166, -1.06601], [30.70631, -1.01175], [30.76635, -0.9852], [30.80408, -0.99911], [33.93107, -0.99298]]]] } },
+ { type: "Feature", properties: { iso1A2: "UM", iso1A3: "UMI", iso1N3: "581", wikidata: "Q16645", nameEn: "United States Minor Outlying Islands", country: "US" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "UN", wikidata: "Q1065", nameEn: "United Nations", level: "unitedNations", isoStatus: "excRes" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "US", iso1A3: "USA", iso1N3: "840", wikidata: "Q30", nameEn: "United States of America" }, geometry: null },
+ { type: "Feature", properties: { iso1A2: "UY", iso1A3: "URY", iso1N3: "858", wikidata: "Q77", nameEn: "Uruguay", groups: ["005", "419", "019", "UN"], callingCodes: ["598"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-57.65132, -30.19229], [-57.61478, -30.25165], [-57.64859, -30.35095], [-57.89115, -30.49572], [-57.8024, -30.77193], [-57.89476, -30.95994], [-57.86729, -31.06352], [-57.9908, -31.34924], [-57.98127, -31.3872], [-58.07569, -31.44916], [-58.0023, -31.53084], [-58.00076, -31.65016], [-58.20252, -31.86966], [-58.10036, -32.25338], [-58.22362, -32.52416], [-58.1224, -32.98842], [-58.40475, -33.11777], [-58.44442, -33.84033], [-58.34425, -34.15035], [-57.83001, -34.69099], [-54.78916, -36.21945], [-52.83257, -34.01481], [-53.37138, -33.74313], [-53.39593, -33.75169], [-53.44031, -33.69344], [-53.52794, -33.68908], [-53.53459, -33.16843], [-53.1111, -32.71147], [-53.37671, -32.57005], [-53.39572, -32.58596], [-53.76024, -32.0751], [-54.17384, -31.86168], [-55.50821, -30.91349], [-55.50841, -30.9027], [-55.51862, -30.89828], [-55.52712, -30.89997], [-55.53276, -30.90218], [-55.53431, -30.89714], [-55.54572, -30.89051], [-55.55218, -30.88193], [-55.55373, -30.8732], [-55.5634, -30.8686], [-55.58866, -30.84117], [-55.87388, -31.05053], [-56.4619, -30.38457], [-56.4795, -30.3899], [-56.49267, -30.39471], [-56.90236, -30.02578], [-57.22502, -30.26121], [-57.65132, -30.19229]]]] } },
+ { type: "Feature", properties: { iso1A2: "UZ", iso1A3: "UZB", iso1N3: "860", wikidata: "Q265", nameEn: "Uzbekistan", groups: ["143", "142", "UN"], callingCodes: ["998"] }, geometry: { type: "MultiPolygon", coordinates: [[[[65.85194, 42.85481], [65.53277, 43.31856], [65.18666, 43.48835], [64.96464, 43.74748], [64.53885, 43.56941], [63.34656, 43.64003], [62.01711, 43.51008], [61.01475, 44.41383], [58.59711, 45.58671], [55.97842, 44.99622], [55.97832, 44.99622], [55.97822, 44.99617], [55.97811, 44.99617], [55.97801, 44.99612], [55.97801, 44.99607], [55.97791, 44.99607], [55.9778, 44.99607], [55.9777, 44.99601], [55.9777, 44.99596], [55.9776, 44.99591], [55.97749, 44.99591], [55.97739, 44.99591], [55.97739, 44.99586], [55.97729, 44.99586], [55.97718, 44.99581], [55.97708, 44.99576], [55.97698, 44.9957], [55.97698, 44.99565], [55.97687, 44.9956], [55.97677, 44.9956], [55.97677, 44.99555], [55.97677, 44.9955], [55.97667, 44.99545], [55.97656, 44.99539], [55.97646, 44.99534], [55.97646, 44.99529], [55.97636, 44.99524], [55.97636, 44.99519], [55.97625, 44.99514], [55.97615, 44.99508], [55.97615, 44.99503], [55.97615, 44.99498], [55.97615, 44.99493], [55.97615, 44.99483], [55.97615, 44.99477], [55.97605, 44.99477], [55.97605, 44.99467], [55.97605, 44.99462], [55.97605, 44.99457], [55.97605, 44.99452], [55.97594, 44.99446], [55.97584, 44.99441], [55.97584, 44.99436], [55.97584, 44.99431], [55.97584, 44.99426], [55.97584, 44.99421], [55.97584, 44.99415], [55.97584, 44.99405], [55.97584, 44.994], [55.97584, 44.9939], [55.97584, 44.99384], [55.97584, 44.99374], [55.97584, 44.99369], [55.97584, 44.99359], [55.97584, 44.99353], [55.97584, 44.99348], [55.97584, 44.99343], [55.97584, 44.99338], [55.97584, 44.99328], [55.97584, 44.99322], [56.00314, 41.32584], [57.03423, 41.25435], [57.13796, 41.36625], [57.03359, 41.41777], [56.96218, 41.80383], [57.03633, 41.92043], [57.30275, 42.14076], [57.6296, 42.16519], [57.84932, 42.18555], [57.92897, 42.24047], [57.90975, 42.4374], [57.99214, 42.50021], [58.3492, 42.43335], [58.40688, 42.29535], [58.51674, 42.30348], [58.29427, 42.56497], [58.14321, 42.62159], [58.27504, 42.69632], [58.57991, 42.64988], [58.6266, 42.79314], [58.93422, 42.5407], [59.17317, 42.52248], [59.2955, 42.37064], [59.4341, 42.29738], [59.94633, 42.27655], [60.00539, 42.212], [59.96419, 42.1428], [60.04659, 42.08982], [60.0356, 42.01028], [59.95046, 41.97966], [60.33223, 41.75058], [60.08504, 41.80997], [60.06032, 41.76287], [60.18117, 41.60082], [60.06581, 41.4363], [60.5078, 41.21694], [61.03261, 41.25691], [61.22212, 41.14946], [61.33199, 41.14946], [61.39732, 41.19873], [61.4446, 41.29407], [61.87856, 41.12257], [62.11751, 40.58242], [62.34273, 40.43206], [62.43337, 39.98528], [63.6913, 39.27666], [63.70778, 39.22349], [64.19086, 38.95561], [64.32576, 38.98691], [65.55873, 38.29052], [65.83913, 38.25733], [66.24013, 38.16238], [66.41042, 38.02403], [66.56697, 38.0435], [66.67684, 37.96776], [66.53676, 37.80084], [66.52852, 37.58568], [66.65761, 37.45497], [66.52303, 37.39827], [66.55743, 37.35409], [66.64699, 37.32958], [66.95598, 37.40162], [67.08232, 37.35469], [67.13039, 37.27168], [67.2224, 37.24545], [67.2581, 37.17216], [67.51868, 37.26102], [67.78329, 37.1834], [67.8474, 37.31594], [67.81566, 37.43107], [68.12635, 37.93], [68.27159, 37.91477], [68.40343, 38.19484], [68.13289, 38.40822], [68.06274, 38.39435], [68.11366, 38.47169], [68.05873, 38.56087], [68.0807, 38.64136], [68.05598, 38.71641], [68.12877, 38.73677], [68.06948, 38.82115], [68.19743, 38.85985], [68.09704, 39.02589], [67.68915, 39.00775], [67.67833, 39.14479], [67.33226, 39.23739], [67.36522, 39.31287], [67.45998, 39.315], [67.46822, 39.46146], [67.39681, 39.52505], [67.46547, 39.53564], [67.44899, 39.57799], [67.62889, 39.60234], [67.70992, 39.66156], [68.12053, 39.56317], [68.54166, 39.53929], [68.61972, 39.68905], [68.63071, 39.85265], [68.88889, 39.87163], [68.93695, 39.91167], [68.84906, 40.04952], [68.96579, 40.06949], [69.01935, 40.11466], [69.01523, 40.15771], [68.62796, 40.07789], [68.52771, 40.11676], [68.5332, 40.14826], [68.77902, 40.20492], [68.79276, 40.17555], [68.84357, 40.18604], [68.85832, 40.20885], [69.04544, 40.22904], [69.15659, 40.2162], [69.2074, 40.21488], [69.30448, 40.18774], [69.30104, 40.24502], [69.25229, 40.26362], [69.24817, 40.30357], [69.30808, 40.2821], [69.32833, 40.29794], [69.33794, 40.34819], [69.30774, 40.36102], [69.28525, 40.41894], [69.27066, 40.49274], [69.21063, 40.54469], [69.2643, 40.57506], [69.3455, 40.57988], [69.32834, 40.70233], [69.38327, 40.7918], [69.53021, 40.77621], [69.59441, 40.70181], [69.69434, 40.62615], [70.36655, 40.90296], [70.38028, 41.02014], [70.45251, 41.04438], [70.80009, 40.72825], [70.49871, 40.52503], [70.32626, 40.45174], [70.37511, 40.38605], [70.57149, 40.3442], [70.56394, 40.26421], [70.62342, 40.17396], [70.8607, 40.217], [70.9818, 40.22392], [70.95789, 40.28761], [71.05901, 40.28765], [71.13042, 40.34106], [71.36663, 40.31593], [71.4246, 40.28619], [71.51215, 40.26943], [71.51549, 40.22986], [71.61725, 40.20615], [71.61931, 40.26775], [71.68386, 40.26984], [71.70569, 40.20391], [71.69621, 40.18492], [71.71719, 40.17886], [71.73054, 40.14818], [71.82646, 40.21872], [71.85002, 40.25647], [72.05464, 40.27586], [71.96401, 40.31907], [72.18648, 40.49893], [72.24368, 40.46091], [72.40346, 40.4007], [72.44191, 40.48222], [72.41513, 40.50856], [72.38384, 40.51535], [72.41714, 40.55736], [72.34406, 40.60144], [72.40517, 40.61917], [72.47795, 40.5532], [72.66713, 40.5219], [72.66713, 40.59076], [72.69579, 40.59778], [72.73995, 40.58409], [72.74768, 40.58051], [72.74862, 40.57131], [72.75982, 40.57273], [72.74894, 40.59592], [72.74866, 40.60873], [72.80137, 40.67856], [72.84754, 40.67229], [72.85372, 40.7116], [72.8722, 40.71111], [72.93296, 40.73089], [72.99133, 40.76457], [73.0612, 40.76678], [73.13412, 40.79122], [73.13267, 40.83512], [73.01869, 40.84681], [72.94454, 40.8094], [72.84291, 40.85512], [72.68157, 40.84942], [72.59136, 40.86947], [72.55109, 40.96046], [72.48742, 40.97136], [72.45206, 41.03018], [72.38511, 41.02785], [72.36138, 41.04384], [72.34757, 41.06104], [72.34026, 41.04539], [72.324, 41.03381], [72.18339, 40.99571], [72.17594, 41.02377], [72.21061, 41.05607], [72.1792, 41.10621], [72.14864, 41.13363], [72.17594, 41.15522], [72.16433, 41.16483], [72.10745, 41.15483], [72.07249, 41.11739], [71.85964, 41.19081], [71.91457, 41.2982], [71.83914, 41.3546], [71.76625, 41.4466], [71.71132, 41.43012], [71.73054, 41.54713], [71.65914, 41.49599], [71.6787, 41.42111], [71.57227, 41.29175], [71.46688, 41.31883], [71.43814, 41.19644], [71.46148, 41.13958], [71.40198, 41.09436], [71.34877, 41.16807], [71.27187, 41.11015], [71.25813, 41.18796], [71.11806, 41.15359], [71.02193, 41.19494], [70.9615, 41.16393], [70.86263, 41.23833], [70.77885, 41.24813], [70.78572, 41.36419], [70.67586, 41.47953], [70.48909, 41.40335], [70.17682, 41.5455], [70.69777, 41.92554], [71.28719, 42.18033], [71.13263, 42.28356], [70.94483, 42.26238], [69.49545, 41.545], [69.45751, 41.56863], [69.39485, 41.51518], [69.45081, 41.46246], [69.37468, 41.46555], [69.35554, 41.47211], [69.29778, 41.43673], [69.25059, 41.46693], [69.23332, 41.45847], [69.22671, 41.46298], [69.20439, 41.45391], [69.18528, 41.45175], [69.17701, 41.43769], [69.15137, 41.43078], [69.05006, 41.36183], [69.01308, 41.22804], [68.7217, 41.05025], [68.73945, 40.96989], [68.65662, 40.93861], [68.62221, 41.03019], [68.49983, 40.99669], [68.58444, 40.91447], [68.63, 40.59358], [68.49983, 40.56437], [67.96736, 40.83798], [68.1271, 41.0324], [68.08273, 41.08148], [67.98511, 41.02794], [67.9644, 41.14611], [66.69129, 41.1311], [66.53302, 41.87388], [66.00546, 41.94455], [66.09482, 42.93426], [65.85194, 42.85481]], [[70.68112, 40.90612], [70.6721, 40.90555], [70.57501, 40.98941], [70.54223, 40.98787], [70.56077, 41.00642], [70.6158, 40.97661], [70.68112, 40.90612]]], [[[71.21139, 40.03369], [71.12218, 40.03052], [71.06305, 40.1771], [71.00236, 40.18154], [71.01035, 40.05481], [71.11037, 40.01984], [71.11668, 39.99291], [71.09063, 39.99], [71.10501, 39.95568], [71.04979, 39.89808], [71.10531, 39.91354], [71.16101, 39.88423], [71.23067, 39.93581], [71.1427, 39.95026], [71.21139, 40.03369]]], [[[71.86463, 39.98598], [71.78838, 40.01404], [71.71511, 39.96348], [71.7504, 39.93701], [71.84316, 39.95582], [71.86463, 39.98598]]]] } },
+ { type: "Feature", properties: { iso1A2: "VA", iso1A3: "VAT", iso1N3: "336", wikidata: "Q237", nameEn: "Vatican City", aliases: ["Holy See"], groups: ["039", "150"], callingCodes: ["379", "39 06"] }, geometry: { type: "MultiPolygon", coordinates: [[[[12.45181, 41.90056], [12.45446, 41.90028], [12.45435, 41.90143], [12.45626, 41.90172], [12.45691, 41.90125], [12.4577, 41.90115], [12.45834, 41.90174], [12.45826, 41.90281], [12.45755, 41.9033], [12.45762, 41.9058], [12.45561, 41.90629], [12.45543, 41.90738], [12.45091, 41.90625], [12.44984, 41.90545], [12.44815, 41.90326], [12.44582, 41.90194], [12.44834, 41.90095], [12.45181, 41.90056]]]] } },
+ { type: "Feature", properties: { iso1A2: "VC", iso1A3: "VCT", iso1N3: "670", wikidata: "Q757", nameEn: "St. Vincent and the Grenadines", aliases: ["WV"], groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 784"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-62.64026, 12.69984], [-59.94058, 12.34011], [-61.69315, 14.26451], [-62.64026, 12.69984]]]] } },
+ { type: "Feature", properties: { iso1A2: "VE", iso1A3: "VEN", iso1N3: "862", wikidata: "Q717", nameEn: "Venezuela", aliases: ["YV"], groups: ["005", "419", "019", "UN"], callingCodes: ["58"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-71.22331, 13.01387], [-70.92579, 11.96275], [-71.3275, 11.85], [-71.9675, 11.65536], [-72.24983, 11.14138], [-72.4767, 11.1117], [-72.88002, 10.44309], [-72.98085, 9.85253], [-73.36905, 9.16636], [-73.02119, 9.27584], [-72.94052, 9.10663], [-72.77415, 9.10165], [-72.65474, 8.61428], [-72.4042, 8.36513], [-72.36987, 8.19976], [-72.35163, 8.01163], [-72.39137, 8.03534], [-72.47213, 7.96106], [-72.48801, 7.94329], [-72.48183, 7.92909], [-72.47042, 7.92306], [-72.45806, 7.91141], [-72.46183, 7.90682], [-72.44454, 7.86031], [-72.46763, 7.79518], [-72.47827, 7.65604], [-72.45321, 7.57232], [-72.47415, 7.48928], [-72.43132, 7.40034], [-72.19437, 7.37034], [-72.04895, 7.03837], [-71.82441, 7.04314], [-71.44118, 7.02116], [-71.42212, 7.03854], [-71.37234, 7.01588], [-71.03941, 6.98163], [-70.7596, 7.09799], [-70.10716, 6.96516], [-69.41843, 6.1072], [-67.60654, 6.2891], [-67.4625, 6.20625], [-67.43513, 5.98835], [-67.58558, 5.84537], [-67.63914, 5.64963], [-67.59141, 5.5369], [-67.83341, 5.31104], [-67.85358, 4.53249], [-67.62671, 3.74303], [-67.50067, 3.75812], [-67.30945, 3.38393], [-67.85862, 2.86727], [-67.85862, 2.79173], [-67.65696, 2.81691], [-67.21967, 2.35778], [-66.85795, 1.22998], [-66.28507, 0.74585], [-65.6727, 1.01353], [-65.50158, 0.92086], [-65.57288, 0.62856], [-65.11657, 1.12046], [-64.38932, 1.5125], [-64.34654, 1.35569], [-64.08274, 1.64792], [-64.06135, 1.94722], [-63.39827, 2.16098], [-63.39114, 2.4317], [-64.0257, 2.48156], [-64.02908, 2.79797], [-64.48379, 3.7879], [-64.84028, 4.24665], [-64.72977, 4.28931], [-64.57648, 4.12576], [-64.14512, 4.12932], [-63.99183, 3.90172], [-63.86082, 3.94796], [-63.70218, 3.91417], [-63.67099, 4.01731], [-63.50611, 3.83592], [-63.42233, 3.89995], [-63.4464, 3.9693], [-63.21111, 3.96219], [-62.98296, 3.59935], [-62.7655, 3.73099], [-62.74411, 4.03331], [-62.57656, 4.04754], [-62.44822, 4.18621], [-62.13094, 4.08309], [-61.54629, 4.2822], [-61.48569, 4.43149], [-61.29675, 4.44216], [-61.31457, 4.54167], [-61.15703, 4.49839], [-60.98303, 4.54167], [-60.86539, 4.70512], [-60.5802, 4.94312], [-60.73204, 5.20931], [-61.4041, 5.95304], [-61.15058, 6.19558], [-61.20762, 6.58174], [-61.13632, 6.70922], [-60.54873, 6.8631], [-60.39419, 6.94847], [-60.28074, 7.1162], [-60.44116, 7.20817], [-60.54098, 7.14804], [-60.63367, 7.25061], [-60.59802, 7.33194], [-60.71923, 7.55817], [-60.64793, 7.56877], [-60.51959, 7.83373], [-60.38056, 7.8302], [-60.02407, 8.04557], [-59.97059, 8.20791], [-59.83156, 8.23261], [-59.80661, 8.28906], [-59.85562, 8.35213], [-59.98508, 8.53046], [-59.54058, 8.6862], [-60.89962, 9.81445], [-62.08693, 10.04435], [-61.62505, 11.18974], [-63.73917, 11.92623], [-63.19938, 16.44103], [-67.89186, 12.4116], [-68.01417, 11.77722], [-68.33524, 11.78151], [-68.99639, 11.79035], [-71.22331, 13.01387]]]] } },
+ { type: "Feature", properties: { iso1A2: "VG", iso1A3: "VGB", iso1N3: "092", wikidata: "Q25305", nameEn: "British Virgin Islands", country: "GB", groups: ["BOTS", "029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 284"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-64.47127, 17.55688], [-63.88746, 19.15706], [-65.02435, 18.73231], [-64.86027, 18.39056], [-64.64673, 18.36549], [-64.47127, 17.55688]]]] } },
+ { type: "Feature", properties: { iso1A2: "VI", iso1A3: "VIR", iso1N3: "850", wikidata: "Q11703", nameEn: "United States Virgin Islands", aliases: ["US-VI"], country: "US", groups: ["Q1352230", "029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 340"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-65.02435, 18.73231], [-65.27974, 17.56928], [-64.47127, 17.55688], [-64.64673, 18.36549], [-64.86027, 18.39056], [-65.02435, 18.73231]]]] } },
+ { type: "Feature", properties: { iso1A2: "VN", iso1A3: "VNM", iso1N3: "704", wikidata: "Q881", nameEn: "Vietnam", groups: ["035", "142", "UN"], callingCodes: ["84"] }, geometry: { type: "MultiPolygon", coordinates: [[[[108.10003, 21.47338], [108.0569, 21.53604], [108.02926, 21.54997], [107.97932, 21.54503], [107.97383, 21.53961], [107.97074, 21.54072], [107.96774, 21.53601], [107.95232, 21.5388], [107.92652, 21.58906], [107.90006, 21.5905], [107.86114, 21.65128], [107.80355, 21.66141], [107.66967, 21.60787], [107.56537, 21.61945], [107.54047, 21.5934], [107.49065, 21.59774], [107.49532, 21.62958], [107.47197, 21.6672], [107.41593, 21.64839], [107.38636, 21.59774], [107.35989, 21.60063], [107.35834, 21.6672], [107.29296, 21.74674], [107.24625, 21.7077], [107.20734, 21.71493], [107.10771, 21.79879], [107.02615, 21.81981], [107.00964, 21.85948], [107.06101, 21.88982], [107.05634, 21.92303], [106.99252, 21.95191], [106.97228, 21.92592], [106.92714, 21.93459], [106.9178, 21.97357], [106.81038, 21.97934], [106.74345, 22.00965], [106.72551, 21.97923], [106.69276, 21.96013], [106.68274, 21.99811], [106.70142, 22.02409], [106.6983, 22.15102], [106.67495, 22.1885], [106.69986, 22.22309], [106.6516, 22.33977], [106.55976, 22.34841], [106.57221, 22.37], [106.55665, 22.46498], [106.58395, 22.474], [106.61269, 22.60301], [106.65316, 22.5757], [106.71698, 22.58432], [106.72321, 22.63606], [106.76293, 22.73491], [106.82404, 22.7881], [106.83685, 22.8098], [106.81271, 22.8226], [106.78422, 22.81532], [106.71128, 22.85982], [106.71387, 22.88296], [106.6734, 22.89587], [106.6516, 22.86862], [106.60179, 22.92884], [106.55976, 22.92311], [106.51306, 22.94891], [106.49749, 22.91164], [106.34961, 22.86718], [106.27022, 22.87722], [106.19705, 22.98475], [106.00179, 22.99049], [105.99568, 22.94178], [105.90119, 22.94168], [105.8726, 22.92756], [105.72382, 23.06641], [105.57594, 23.075], [105.56037, 23.16806], [105.49966, 23.20669], [105.42805, 23.30824], [105.40782, 23.28107], [105.32376, 23.39684], [105.22569, 23.27249], [105.17276, 23.28679], [105.11672, 23.25247], [105.07002, 23.26248], [104.98712, 23.19176], [104.96532, 23.20463], [104.9486, 23.17235], [104.91435, 23.18666], [104.87992, 23.17141], [104.87382, 23.12854], [104.79478, 23.12934], [104.8334, 23.01484], [104.86765, 22.95178], [104.84942, 22.93631], [104.77114, 22.90017], [104.72755, 22.81984], [104.65283, 22.83419], [104.60457, 22.81841], [104.58122, 22.85571], [104.47225, 22.75813], [104.35593, 22.69353], [104.25683, 22.76534], [104.27084, 22.8457], [104.11384, 22.80363], [104.03734, 22.72945], [104.01088, 22.51823], [103.99247, 22.51958], [103.97384, 22.50634], [103.96783, 22.51173], [103.96352, 22.50584], [103.95191, 22.5134], [103.94513, 22.52553], [103.93286, 22.52703], [103.87904, 22.56683], [103.64506, 22.79979], [103.56255, 22.69499], [103.57812, 22.65764], [103.52675, 22.59155], [103.43646, 22.70648], [103.43179, 22.75816], [103.32282, 22.8127], [103.28079, 22.68063], [103.18895, 22.64471], [103.15782, 22.59873], [103.17961, 22.55705], [103.07843, 22.50097], [103.0722, 22.44775], [102.9321, 22.48659], [102.8636, 22.60735], [102.60675, 22.73376], [102.57095, 22.7036], [102.51802, 22.77969], [102.46665, 22.77108], [102.42618, 22.69212], [102.38415, 22.67919], [102.41061, 22.64184], [102.25339, 22.4607], [102.26428, 22.41321], [102.16621, 22.43336], [102.14099, 22.40092], [102.18712, 22.30403], [102.51734, 22.02676], [102.49092, 21.99002], [102.62301, 21.91447], [102.67145, 21.65894], [102.74189, 21.66713], [102.82115, 21.73667], [102.81894, 21.83888], [102.85637, 21.84501], [102.86077, 21.71213], [102.97965, 21.74076], [102.98846, 21.58936], [102.86297, 21.4255], [102.94223, 21.46034], [102.88939, 21.3107], [102.80794, 21.25736], [102.89825, 21.24707], [102.97745, 21.05821], [103.03469, 21.05821], [103.12055, 20.89994], [103.21497, 20.89832], [103.38032, 20.79501], [103.45737, 20.82382], [103.68633, 20.66324], [103.73478, 20.6669], [103.82282, 20.8732], [103.98024, 20.91531], [104.11121, 20.96779], [104.27412, 20.91433], [104.63957, 20.6653], [104.38199, 20.47155], [104.40621, 20.3849], [104.47886, 20.37459], [104.66158, 20.47774], [104.72102, 20.40554], [104.62195, 20.36633], [104.61315, 20.24452], [104.86852, 20.14121], [104.91695, 20.15567], [104.9874, 20.09573], [104.8465, 19.91783], [104.8355, 19.80395], [104.68359, 19.72729], [104.64837, 19.62365], [104.53169, 19.61743], [104.41281, 19.70035], [104.23229, 19.70242], [104.06498, 19.66926], [104.05617, 19.61743], [104.10832, 19.51575], [104.06058, 19.43484], [103.87125, 19.31854], [104.5361, 18.97747], [104.64617, 18.85668], [105.12829, 18.70453], [105.19654, 18.64196], [105.1327, 18.58355], [105.10408, 18.43533], [105.15942, 18.38691], [105.38366, 18.15315], [105.46292, 18.22008], [105.64784, 17.96687], [105.60381, 17.89356], [105.76612, 17.67147], [105.85744, 17.63221], [106.09019, 17.36399], [106.18991, 17.28227], [106.24444, 17.24714], [106.29287, 17.3018], [106.31929, 17.20509], [106.43597, 17.01362], [106.50862, 16.9673], [106.55045, 17.0031], [106.54824, 16.92729], [106.51963, 16.92097], [106.52183, 16.87884], [106.55265, 16.86831], [106.55485, 16.68704], [106.59013, 16.62259], [106.58267, 16.6012], [106.61477, 16.60713], [106.66052, 16.56892], [106.65832, 16.47816], [106.74418, 16.41904], [106.84104, 16.55415], [106.88727, 16.52671], [106.88067, 16.43594], [106.96638, 16.34938], [106.97385, 16.30204], [107.02597, 16.31132], [107.09091, 16.3092], [107.15035, 16.26271], [107.14595, 16.17816], [107.25822, 16.13587], [107.33968, 16.05549], [107.44975, 16.08511], [107.46296, 16.01106], [107.39471, 15.88829], [107.34188, 15.89464], [107.21419, 15.83747], [107.21859, 15.74638], [107.27143, 15.71459], [107.27583, 15.62769], [107.34408, 15.62345], [107.3815, 15.49832], [107.50699, 15.48771], [107.53341, 15.40496], [107.62367, 15.42193], [107.60605, 15.37524], [107.62587, 15.2266], [107.58844, 15.20111], [107.61926, 15.13949], [107.61486, 15.0566], [107.46516, 15.00982], [107.48277, 14.93751], [107.59285, 14.87795], [107.51579, 14.79282], [107.54361, 14.69092], [107.55371, 14.628], [107.52102, 14.59034], [107.52569, 14.54665], [107.48521, 14.40346], [107.44941, 14.41552], [107.39493, 14.32655], [107.40427, 14.24509], [107.33577, 14.11832], [107.37158, 14.07906], [107.35757, 14.02319], [107.38247, 13.99147], [107.44318, 13.99751], [107.46498, 13.91593], [107.45252, 13.78897], [107.53503, 13.73908], [107.61909, 13.52577], [107.62843, 13.3668], [107.49144, 13.01215], [107.49611, 12.88926], [107.55993, 12.7982], [107.5755, 12.52177], [107.55059, 12.36824], [107.4463, 12.29373], [107.42917, 12.24657], [107.34511, 12.33327], [107.15831, 12.27547], [106.99953, 12.08983], [106.92325, 12.06548], [106.79405, 12.0807], [106.70687, 11.96956], [106.4111, 11.97413], [106.4687, 11.86751], [106.44068, 11.86294], [106.44535, 11.8279], [106.41577, 11.76999], [106.45158, 11.68616], [106.44691, 11.66787], [106.37219, 11.69836], [106.30525, 11.67549], [106.26478, 11.72122], [106.18539, 11.75171], [106.13158, 11.73283], [106.06708, 11.77761], [106.02038, 11.77457], [106.00792, 11.7197], [105.95188, 11.63738], [105.88962, 11.67854], [105.8507, 11.66635], [105.80867, 11.60536], [105.81645, 11.56876], [105.87328, 11.55953], [105.88962, 11.43605], [105.86782, 11.28343], [106.10444, 11.07879], [106.1527, 11.10476], [106.1757, 11.07301], [106.20095, 10.97795], [106.14301, 10.98176], [106.18539, 10.79451], [106.06708, 10.8098], [105.94535, 10.9168], [105.93403, 10.83853], [105.84603, 10.85873], [105.86376, 10.89839], [105.77751, 11.03671], [105.50045, 10.94586], [105.42884, 10.96878], [105.34011, 10.86179], [105.11449, 10.96332], [105.08326, 10.95656], [105.02722, 10.89236], [105.09571, 10.72722], [104.95094, 10.64003], [104.87933, 10.52833], [104.59018, 10.53073], [104.49869, 10.4057], [104.47963, 10.43046], [104.43778, 10.42386], [103.99198, 10.48391], [102.47649, 9.66162], [104.81582, 8.03101], [109.55486, 8.10026], [111.60491, 13.57105], [108.00365, 17.98159], [108.10003, 21.47338]]]] } },
+ { type: "Feature", properties: { iso1A2: "VU", iso1A3: "VUT", iso1N3: "548", wikidata: "Q686", nameEn: "Vanuatu", groups: ["054", "009", "UN"], callingCodes: ["678"] }, geometry: { type: "MultiPolygon", coordinates: [[[[156.73836, -14.50464], [174.245, -23.1974], [172.71443, -12.01327], [156.73836, -14.50464]]]] } },
+ { type: "Feature", properties: { iso1A2: "WF", iso1A3: "WLF", iso1N3: "876", wikidata: "Q35555", nameEn: "Wallis and Futuna", country: "FR", groups: ["EU", "Q1451600", "061", "009", "UN"], callingCodes: ["681"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-178.66551, -14.32452], [-176.76826, -14.95183], [-175.59809, -12.61507], [-178.66551, -14.32452]]]] } },
+ { type: "Feature", properties: { iso1A2: "WS", iso1A3: "WSM", iso1N3: "882", wikidata: "Q683", nameEn: "Samoa", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["685"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-173.74402, -14.26669], [-170.99605, -15.1275], [-171.39864, -10.21587], [-173.74402, -14.26669]]]] } },
+ { type: "Feature", properties: { iso1A2: "XK", iso1A3: "XKX", wikidata: "Q1246", nameEn: "Kosovo", aliases: ["KV"], groups: ["039", "150"], isoStatus: "usrAssn", callingCodes: ["383"] }, geometry: { type: "MultiPolygon", coordinates: [[[[21.39045, 42.74888], [21.44047, 42.87276], [21.36941, 42.87397], [21.32974, 42.90424], [21.2719, 42.8994], [21.23534, 42.95523], [21.23877, 43.00848], [21.2041, 43.02277], [21.16734, 42.99694], [21.14465, 43.11089], [21.08952, 43.13471], [21.05378, 43.10707], [21.00749, 43.13984], [20.96287, 43.12416], [20.83727, 43.17842], [20.88685, 43.21697], [20.82145, 43.26769], [20.73811, 43.25068], [20.68688, 43.21335], [20.59929, 43.20492], [20.69515, 43.09641], [20.64557, 43.00826], [20.59929, 43.01067], [20.48692, 42.93208], [20.53484, 42.8885], [20.43734, 42.83157], [20.40594, 42.84853], [20.35692, 42.8335], [20.27869, 42.81945], [20.2539, 42.76245], [20.04898, 42.77701], [20.02088, 42.74789], [20.02915, 42.71147], [20.0969, 42.65559], [20.07761, 42.55582], [20.17127, 42.50469], [20.21797, 42.41237], [20.24399, 42.32168], [20.34479, 42.32656], [20.3819, 42.3029], [20.48857, 42.25444], [20.56955, 42.12097], [20.55633, 42.08173], [20.59434, 42.03879], [20.63069, 41.94913], [20.57946, 41.91593], [20.59524, 41.8818], [20.68523, 41.85318], [20.76786, 41.91839], [20.75464, 42.05229], [21.11491, 42.20794], [21.16614, 42.19815], [21.22728, 42.08909], [21.31983, 42.10993], [21.29913, 42.13954], [21.30496, 42.1418], [21.38428, 42.24465], [21.43882, 42.23609], [21.43882, 42.2789], [21.50823, 42.27156], [21.52145, 42.24465], [21.58992, 42.25915], [21.56772, 42.30946], [21.5264, 42.33634], [21.53467, 42.36809], [21.57021, 42.3647], [21.59029, 42.38042], [21.62887, 42.37664], [21.64209, 42.41081], [21.62556, 42.45106], [21.7035, 42.51899], [21.70522, 42.54176], [21.7327, 42.55041], [21.75672, 42.62695], [21.79413, 42.65923], [21.75025, 42.70125], [21.6626, 42.67813], [21.58755, 42.70418], [21.59154, 42.72643], [21.47498, 42.74695], [21.39045, 42.74888]]]] } },
+ { type: "Feature", properties: { iso1A2: "YE", iso1A3: "YEM", iso1N3: "887", wikidata: "Q805", nameEn: "Yemen", groups: ["145", "142", "UN"], callingCodes: ["967"] }, geometry: { type: "MultiPolygon", coordinates: [[[[57.49095, 8.14549], [52.81185, 17.28568], [52.74267, 17.29519], [52.78009, 17.35124], [52.00311, 19.00083], [49.04884, 18.59899], [48.19996, 18.20584], [47.58351, 17.50366], [47.48245, 17.10808], [47.00571, 16.94765], [46.76494, 17.29151], [46.31018, 17.20464], [44.50126, 17.47475], [43.70631, 17.35762], [43.43005, 17.56148], [43.29185, 17.53224], [43.22533, 17.38343], [43.32653, 17.31179], [43.20156, 17.25901], [43.17787, 17.14717], [43.23967, 17.03428], [43.18233, 17.02673], [43.1813, 16.98438], [43.19328, 16.94703], [43.1398, 16.90696], [43.18338, 16.84852], [43.22012, 16.83932], [43.22956, 16.80613], [43.24801, 16.80613], [43.26303, 16.79479], [43.25857, 16.75304], [43.21325, 16.74416], [43.22066, 16.65179], [43.15274, 16.67248], [43.11601, 16.53166], [42.97215, 16.51093], [42.94351, 16.49467], [42.94625, 16.39721], [42.76801, 16.40371], [42.15205, 16.40211], [40.99158, 15.81743], [43.29075, 12.79154], [43.32909, 12.59711], [43.90659, 12.3823], [51.12877, 12.56479], [57.49095, 8.14549]]]] } },
+ { type: "Feature", properties: { iso1A2: "YT", iso1A3: "MYT", iso1N3: "175", wikidata: "Q17063", nameEn: "Mayotte", country: "FR", groups: ["Q3320166", "EU", "014", "202", "002", "UN"], callingCodes: ["262"] }, geometry: { type: "MultiPolygon", coordinates: [[[[43.28731, -13.97126], [45.54824, -13.22353], [45.4971, -11.75965], [43.28731, -13.97126]]]] } },
+ { type: "Feature", properties: { iso1A2: "ZA", iso1A3: "ZAF", iso1N3: "710", wikidata: "Q258", nameEn: "South Africa", groups: ["018", "202", "002", "UN"], driveSide: "left", callingCodes: ["27"] }, geometry: { type: "MultiPolygon", coordinates: [[[[31.30611, -22.422], [31.16344, -22.32599], [31.08932, -22.34884], [30.86696, -22.28907], [30.6294, -22.32599], [30.48686, -22.31368], [30.38614, -22.34533], [30.28351, -22.35587], [30.2265, -22.2961], [30.13147, -22.30841], [29.92242, -22.19408], [29.76848, -22.14128], [29.64609, -22.12917], [29.37703, -22.19581], [29.21955, -22.17771], [29.18974, -22.18599], [29.15268, -22.21399], [29.10881, -22.21202], [29.0151, -22.22907], [28.91889, -22.44299], [28.63287, -22.55887], [28.34874, -22.5694], [28.04562, -22.8394], [28.04752, -22.90243], [27.93729, -22.96194], [27.93539, -23.04941], [27.74154, -23.2137], [27.6066, -23.21894], [27.52393, -23.37952], [27.33768, -23.40917], [26.99749, -23.65486], [26.84165, -24.24885], [26.51667, -24.47219], [26.46346, -24.60358], [26.39409, -24.63468], [25.8515, -24.75727], [25.84295, -24.78661], [25.88571, -24.87802], [25.72702, -25.25503], [25.69661, -25.29284], [25.6643, -25.4491], [25.58543, -25.6343], [25.33076, -25.76616], [25.12266, -25.75931], [25.01718, -25.72507], [24.8946, -25.80723], [24.67319, -25.81749], [24.44703, -25.73021], [24.36531, -25.773], [24.18287, -25.62916], [23.9244, -25.64286], [23.47588, -25.29971], [23.03497, -25.29971], [22.86012, -25.50572], [22.70808, -25.99186], [22.56365, -26.19668], [22.41921, -26.23078], [22.21206, -26.3773], [22.06192, -26.61882], [21.90703, -26.66808], [21.83291, -26.65959], [21.77114, -26.69015], [21.7854, -26.79199], [21.69322, -26.86152], [21.37869, -26.82083], [21.13353, -26.86661], [20.87031, -26.80047], [20.68596, -26.9039], [20.63275, -26.78181], [20.61754, -26.4692], [20.86081, -26.14892], [20.64795, -25.47827], [20.29826, -24.94869], [20.03678, -24.81004], [20.02809, -24.78725], [19.99817, -24.76768], [19.99882, -28.42622], [18.99885, -28.89165], [17.4579, -28.68718], [17.15405, -28.08573], [16.90446, -28.057], [16.59922, -28.53246], [16.46592, -28.57126], [16.45332, -28.63117], [12.51595, -32.27486], [38.88176, -48.03306], [34.51034, -26.91792], [32.35222, -26.86027], [32.29584, -26.852], [32.22302, -26.84136], [32.19409, -26.84032], [32.13315, -26.84345], [32.09664, -26.80721], [32.00893, -26.8096], [31.97463, -27.11057], [31.97592, -27.31675], [31.49834, -27.31549], [31.15027, -27.20151], [30.96088, -27.0245], [30.97757, -26.92706], [30.88826, -26.79622], [30.81101, -26.84722], [30.78927, -26.48271], [30.95819, -26.26303], [31.13073, -25.91558], [31.31237, -25.7431], [31.4175, -25.71886], [31.86881, -25.99973], [31.974, -25.95387], [31.92649, -25.84216], [32.00631, -25.65044], [31.97875, -25.46356], [32.01676, -25.38117], [32.03196, -25.10785], [31.9835, -24.29983], [31.90368, -24.18892], [31.87707, -23.95293], [31.77445, -23.90082], [31.70223, -23.72695], [31.67942, -23.60858], [31.56539, -23.47268], [31.55779, -23.176], [31.30611, -22.422]], [[29.33204, -29.45598], [29.28545, -29.58456], [29.12553, -29.76266], [29.16548, -29.91706], [28.9338, -30.05072], [28.80222, -30.10579], [28.68627, -30.12885], [28.399, -30.1592], [28.2319, -30.28476], [28.12073, -30.68072], [27.74814, -30.60635], [27.69467, -30.55862], [27.67819, -30.53437], [27.6521, -30.51707], [27.62137, -30.50509], [27.56781, -30.44562], [27.56901, -30.42504], [27.45452, -30.32239], [27.38108, -30.33456], [27.36649, -30.27246], [27.37293, -30.19401], [27.40778, -30.14577], [27.32555, -30.14785], [27.29603, -30.05473], [27.22719, -30.00718], [27.09489, -29.72796], [27.01016, -29.65439], [27.33464, -29.48161], [27.4358, -29.33465], [27.47254, -29.31968], [27.45125, -29.29708], [27.48679, -29.29349], [27.54258, -29.25575], [27.5158, -29.2261], [27.55974, -29.18954], [27.75458, -28.89839], [27.8907, -28.91612], [27.88933, -28.88156], [27.9392, -28.84864], [27.98675, -28.8787], [28.02503, -28.85991], [28.1317, -28.7293], [28.2348, -28.69471], [28.30518, -28.69531], [28.40612, -28.6215], [28.65091, -28.57025], [28.68043, -28.58744], [29.40524, -29.21246], [29.44883, -29.3772], [29.33204, -29.45598]]]] } },
+ { type: "Feature", properties: { iso1A2: "ZM", iso1A3: "ZMB", iso1N3: "894", wikidata: "Q953", nameEn: "Zambia", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["260"] }, geometry: { type: "MultiPolygon", coordinates: [[[[32.95389, -9.40138], [32.76233, -9.31963], [32.75611, -9.28583], [32.53661, -9.24281], [32.49147, -9.14754], [32.43543, -9.11988], [32.25486, -9.13371], [32.16146, -9.05993], [32.08206, -9.04609], [31.98866, -9.07069], [31.94196, -9.02303], [31.94663, -8.93846], [31.81587, -8.88618], [31.71158, -8.91386], [31.57147, -8.81388], [31.57147, -8.70619], [31.37533, -8.60769], [31.00796, -8.58615], [30.79243, -8.27382], [28.88917, -8.4831], [28.9711, -8.66935], [28.38526, -9.23393], [28.36562, -9.30091], [28.52636, -9.35379], [28.51627, -9.44726], [28.56208, -9.49122], [28.68532, -9.78], [28.62795, -9.92942], [28.65032, -10.65133], [28.37241, -11.57848], [28.48357, -11.87532], [29.18592, -12.37921], [29.4992, -12.43843], [29.48404, -12.23604], [29.8139, -12.14898], [29.81551, -13.44683], [29.65078, -13.41844], [29.60531, -13.21685], [29.01918, -13.41353], [28.33199, -12.41375], [27.59932, -12.22123], [27.21025, -11.76157], [27.22541, -11.60323], [27.04351, -11.61312], [26.88687, -12.01868], [26.01777, -11.91488], [25.33058, -11.65767], [25.34069, -11.19707], [24.42612, -11.44975], [24.34528, -11.06816], [24.00027, -10.89356], [24.02603, -11.15368], [23.98804, -12.13149], [24.06672, -12.29058], [23.90937, -12.844], [24.03339, -12.99091], [21.97988, -13.00148], [22.00323, -16.18028], [22.17217, -16.50269], [23.20038, -17.47563], [23.47474, -17.62877], [24.23619, -17.47489], [24.32811, -17.49082], [24.38712, -17.46818], [24.5621, -17.52963], [24.70864, -17.49501], [25.00198, -17.58221], [25.26433, -17.79571], [25.51646, -17.86232], [25.6827, -17.81987], [25.85738, -17.91403], [25.85892, -17.97726], [26.08925, -17.98168], [26.0908, -17.93021], [26.21601, -17.88608], [26.55918, -17.99638], [26.68403, -18.07411], [26.74314, -18.0199], [26.89926, -17.98756], [27.14196, -17.81398], [27.30736, -17.60487], [27.61377, -17.34378], [27.62795, -17.24365], [27.83141, -16.96274], [28.73725, -16.5528], [28.76199, -16.51575], [28.81454, -16.48611], [28.8501, -16.04537], [28.9243, -15.93987], [29.01298, -15.93805], [29.21955, -15.76589], [29.4437, -15.68702], [29.8317, -15.6126], [30.35574, -15.6513], [30.41902, -15.62269], [30.22098, -14.99447], [33.24249, -14.00019], [33.16749, -13.93992], [33.07568, -13.98447], [33.02977, -14.05022], [32.99042, -13.95689], [32.88985, -13.82956], [32.79015, -13.80755], [32.76962, -13.77224], [32.84528, -13.71576], [32.7828, -13.64805], [32.68654, -13.64268], [32.66468, -13.60019], [32.68436, -13.55769], [32.73683, -13.57682], [32.84176, -13.52794], [32.86113, -13.47292], [33.0078, -13.19492], [32.98289, -13.12671], [33.02181, -12.88707], [32.96733, -12.88251], [32.94397, -12.76868], [33.05917, -12.59554], [33.18837, -12.61377], [33.28177, -12.54692], [33.37517, -12.54085], [33.54485, -12.35996], [33.47636, -12.32498], [33.3705, -12.34931], [33.25998, -12.14242], [33.33937, -11.91252], [33.32692, -11.59248], [33.24252, -11.59302], [33.23663, -11.40637], [33.29267, -11.43536], [33.29267, -11.3789], [33.39697, -11.15296], [33.25998, -10.88862], [33.28022, -10.84428], [33.47636, -10.78465], [33.70675, -10.56896], [33.54797, -10.36077], [33.53863, -10.20148], [33.31297, -10.05133], [33.37902, -9.9104], [33.36581, -9.81063], [33.31517, -9.82364], [33.2095, -9.61099], [33.12144, -9.58929], [33.10163, -9.66525], [33.05485, -9.61316], [33.00256, -9.63053], [33.00476, -9.5133], [32.95389, -9.40138]]]] } },
+ { type: "Feature", properties: { iso1A2: "ZW", iso1A3: "ZWE", iso1N3: "716", wikidata: "Q954", nameEn: "Zimbabwe", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["263"] }, geometry: { type: "MultiPolygon", coordinates: [[[[30.41902, -15.62269], [30.35574, -15.6513], [29.8317, -15.6126], [29.4437, -15.68702], [29.21955, -15.76589], [29.01298, -15.93805], [28.9243, -15.93987], [28.8501, -16.04537], [28.81454, -16.48611], [28.76199, -16.51575], [28.73725, -16.5528], [27.83141, -16.96274], [27.62795, -17.24365], [27.61377, -17.34378], [27.30736, -17.60487], [27.14196, -17.81398], [26.89926, -17.98756], [26.74314, -18.0199], [26.68403, -18.07411], [26.55918, -17.99638], [26.21601, -17.88608], [26.0908, -17.93021], [26.08925, -17.98168], [25.85892, -17.97726], [25.85738, -17.91403], [25.6827, -17.81987], [25.51646, -17.86232], [25.26433, -17.79571], [25.23909, -17.90832], [25.31799, -18.07091], [25.39972, -18.12691], [25.53465, -18.39041], [25.68859, -18.56165], [25.79217, -18.6355], [25.82353, -18.82808], [25.94326, -18.90362], [25.99837, -19.02943], [25.96226, -19.08152], [26.17227, -19.53709], [26.72246, -19.92707], [27.21278, -20.08244], [27.29831, -20.28935], [27.28865, -20.49873], [27.69361, -20.48531], [27.72972, -20.51735], [27.69171, -21.08409], [27.91407, -21.31621], [28.01669, -21.57624], [28.29416, -21.59037], [28.49942, -21.66634], [28.58114, -21.63455], [29.07763, -21.81877], [29.04023, -21.85864], [29.02191, -21.90647], [29.02191, -21.95665], [29.04108, -22.00563], [29.08495, -22.04867], [29.14501, -22.07275], [29.1974, -22.07472], [29.24648, -22.05967], [29.3533, -22.18363], [29.37703, -22.19581], [29.64609, -22.12917], [29.76848, -22.14128], [29.92242, -22.19408], [30.13147, -22.30841], [30.2265, -22.2961], [30.28351, -22.35587], [30.38614, -22.34533], [30.48686, -22.31368], [30.6294, -22.32599], [30.86696, -22.28907], [31.08932, -22.34884], [31.16344, -22.32599], [31.30611, -22.422], [31.38336, -22.36919], [32.41234, -21.31246], [32.48236, -21.32873], [32.37115, -21.133], [32.51644, -20.91929], [32.48122, -20.63319], [32.55167, -20.56312], [32.66174, -20.56106], [32.85987, -20.27841], [32.85987, -20.16686], [32.93032, -20.03868], [33.01178, -20.02007], [33.06461, -19.77787], [32.95013, -19.67219], [32.84666, -19.68462], [32.84446, -19.48343], [32.78282, -19.47513], [32.77966, -19.36098], [32.85107, -19.29238], [32.87088, -19.09279], [32.84006, -19.0262], [32.72118, -19.02204], [32.69917, -18.94293], [32.73439, -18.92628], [32.70137, -18.84712], [32.82465, -18.77419], [32.9017, -18.7992], [32.95013, -18.69079], [32.88629, -18.58023], [32.88629, -18.51344], [33.02278, -18.4696], [33.03159, -18.35054], [32.94133, -17.99705], [33.0492, -17.60298], [32.98536, -17.55891], [32.96554, -17.48964], [33.0426, -17.3468], [33.00517, -17.30477], [32.96554, -17.11971], [32.84113, -16.92259], [32.91051, -16.89446], [32.97655, -16.70689], [32.78943, -16.70267], [32.69917, -16.66893], [32.71017, -16.59932], [32.42838, -16.4727], [32.28529, -16.43892], [32.02772, -16.43892], [31.91324, -16.41569], [31.90223, -16.34388], [31.67988, -16.19595], [31.42451, -16.15154], [31.30563, -16.01193], [31.13171, -15.98019], [30.97761, -16.05848], [30.91597, -15.99924], [30.42568, -15.9962], [30.41902, -15.62269]]]] } }
+ ];
+ var borders_default = { type, features };
+ var borders = borders_default;
+ var whichPolygonGetter = {};
+ var featuresByCode = {};
+ var idFilterRegex = /(?=(?!^(and|the|of|el|la|de)$))(\b(and|the|of|el|la|de)\b)|[-_ .,'()&[\]/]/gi;
+ function canonicalID(id2) {
+ const s = id2 || "";
+ if (s.charAt(0) === ".") {
+ return s.toUpperCase();
+ } else {
+ return s.replace(idFilterRegex, "").toUpperCase();
+ }
+ }
+ var levels = [
+ "subterritory",
+ "territory",
+ "subcountryGroup",
+ "country",
+ "sharedLandform",
+ "intermediateRegion",
+ "subregion",
+ "region",
+ "subunion",
+ "union",
+ "unitedNations",
+ "world"
+ ];
+ loadDerivedDataAndCaches(borders);
+ function loadDerivedDataAndCaches(borders2) {
+ const identifierProps = ["iso1A2", "iso1A3", "m49", "wikidata", "emojiFlag", "ccTLD", "nameEn"];
+ let geometryFeatures = [];
+ borders2.features.forEach((feature22) => {
+ feature22.properties.id = feature22.properties.iso1A2 || feature22.properties.m49 || feature22.properties.wikidata;
+ loadM49(feature22);
+ loadTLD(feature22);
+ loadIsoStatus(feature22);
+ loadLevel(feature22);
+ loadGroups(feature22);
+ loadFlag(feature22);
+ cacheFeatureByIDs(feature22);
+ if (feature22.geometry)
+ geometryFeatures.push(feature22);
+ });
+ borders2.features.forEach((feature22) => {
+ feature22.properties.groups = feature22.properties.groups.map((groupID) => {
+ return featuresByCode[groupID].properties.id;
+ });
+ loadMembersForGroupsOf(feature22);
+ });
+ borders2.features.forEach((feature22) => {
+ loadRoadSpeedUnit(feature22);
+ loadRoadHeightUnit(feature22);
+ loadDriveSide(feature22);
+ loadCallingCodes(feature22);
+ loadGroupGroups(feature22);
+ });
+ borders2.features.forEach((feature22) => {
+ feature22.properties.groups.sort((groupID1, groupID2) => {
+ return levels.indexOf(featuresByCode[groupID1].properties.level) - levels.indexOf(featuresByCode[groupID2].properties.level);
+ });
+ if (feature22.properties.members)
+ feature22.properties.members.sort((id1, id2) => {
+ const diff = levels.indexOf(featuresByCode[id1].properties.level) - levels.indexOf(featuresByCode[id2].properties.level);
+ if (diff === 0) {
+ return borders2.features.indexOf(featuresByCode[id1]) - borders2.features.indexOf(featuresByCode[id2]);
+ }
+ return diff;
+ });
+ });
+ const geometryOnlyCollection = {
+ type: "FeatureCollection",
+ features: geometryFeatures
+ };
+ whichPolygonGetter = (0, import_which_polygon.default)(geometryOnlyCollection);
+ function loadGroups(feature22) {
+ const props = feature22.properties;
+ if (!props.groups) {
+ props.groups = [];
+ }
+ if (feature22.geometry && props.country) {
+ props.groups.push(props.country);
+ }
+ if (props.m49 !== "001") {
+ props.groups.push("001");
+ }
+ }
+ function loadM49(feature22) {
+ const props = feature22.properties;
+ if (!props.m49 && props.iso1N3) {
+ props.m49 = props.iso1N3;
+ }
+ }
+ function loadTLD(feature22) {
+ const props = feature22.properties;
+ if (props.level === "unitedNations")
+ return;
+ if (!props.ccTLD && props.iso1A2) {
+ props.ccTLD = "." + props.iso1A2.toLowerCase();
+ }
+ }
+ function loadIsoStatus(feature22) {
+ const props = feature22.properties;
+ if (!props.isoStatus && props.iso1A2) {
+ props.isoStatus = "official";
+ }
+ }
+ function loadLevel(feature22) {
+ const props = feature22.properties;
+ if (props.level)
+ return;
+ if (!props.country) {
+ props.level = "country";
+ } else if (!props.iso1A2 || props.isoStatus === "official") {
+ props.level = "territory";
+ } else {
+ props.level = "subterritory";
+ }
+ }
+ function loadGroupGroups(feature22) {
+ const props = feature22.properties;
+ if (feature22.geometry || !props.members)
+ return;
+ const featureLevelIndex = levels.indexOf(props.level);
+ let sharedGroups = [];
+ props.members.forEach((memberID, index) => {
+ const member = featuresByCode[memberID];
+ const memberGroups = member.properties.groups.filter((groupID) => {
+ return groupID !== feature22.properties.id && featureLevelIndex < levels.indexOf(featuresByCode[groupID].properties.level);
+ });
+ if (index === 0) {
+ sharedGroups = memberGroups;
+ } else {
+ sharedGroups = sharedGroups.filter((groupID) => memberGroups.indexOf(groupID) !== -1);
+ }
+ });
+ props.groups = props.groups.concat(sharedGroups.filter((groupID) => props.groups.indexOf(groupID) === -1));
+ sharedGroups.forEach((groupID) => {
+ const groupFeature = featuresByCode[groupID];
+ if (groupFeature.properties.members.indexOf(props.id) === -1) {
+ groupFeature.properties.members.push(props.id);
+ }
+ });
+ }
+ function loadRoadSpeedUnit(feature22) {
+ const props = feature22.properties;
+ if (feature22.geometry) {
+ if (!props.roadSpeedUnit)
+ props.roadSpeedUnit = "km/h";
+ } else if (props.members) {
+ const vals = Array.from(new Set(props.members.map((id2) => {
+ const member = featuresByCode[id2];
+ if (member.geometry)
+ return member.properties.roadSpeedUnit || "km/h";
+ }).filter(Boolean)));
+ if (vals.length === 1)
+ props.roadSpeedUnit = vals[0];
+ }
+ }
+ function loadRoadHeightUnit(feature22) {
+ const props = feature22.properties;
+ if (feature22.geometry) {
+ if (!props.roadHeightUnit)
+ props.roadHeightUnit = "m";
+ } else if (props.members) {
+ const vals = Array.from(new Set(props.members.map((id2) => {
+ const member = featuresByCode[id2];
+ if (member.geometry)
+ return member.properties.roadHeightUnit || "m";
+ }).filter(Boolean)));
+ if (vals.length === 1)
+ props.roadHeightUnit = vals[0];
+ }
+ }
+ function loadDriveSide(feature22) {
+ const props = feature22.properties;
+ if (feature22.geometry) {
+ if (!props.driveSide)
+ props.driveSide = "right";
+ } else if (props.members) {
+ const vals = Array.from(new Set(props.members.map((id2) => {
+ const member = featuresByCode[id2];
+ if (member.geometry)
+ return member.properties.driveSide || "right";
+ }).filter(Boolean)));
+ if (vals.length === 1)
+ props.driveSide = vals[0];
+ }
+ }
+ function loadCallingCodes(feature22) {
+ const props = feature22.properties;
+ if (!feature22.geometry && props.members) {
+ props.callingCodes = Array.from(new Set(props.members.reduce((array2, id2) => {
+ const member = featuresByCode[id2];
+ if (member.geometry && member.properties.callingCodes) {
+ return array2.concat(member.properties.callingCodes);
+ }
+ return array2;
+ }, [])));
+ }
+ }
+ function loadFlag(feature22) {
+ if (!feature22.properties.iso1A2)
+ return;
+ const flag = feature22.properties.iso1A2.replace(/./g, function(char) {
+ return String.fromCodePoint(char.charCodeAt(0) + 127397);
+ });
+ feature22.properties.emojiFlag = flag;
+ }
+ function loadMembersForGroupsOf(feature22) {
+ feature22.properties.groups.forEach((groupID) => {
+ const groupFeature = featuresByCode[groupID];
+ if (!groupFeature.properties.members) {
+ groupFeature.properties.members = [];
+ }
+ groupFeature.properties.members.push(feature22.properties.id);
+ });
+ }
+ function cacheFeatureByIDs(feature22) {
+ let ids = [];
+ identifierProps.forEach((prop) => {
+ const id2 = feature22.properties[prop];
+ if (id2)
+ ids.push(id2);
+ });
+ (feature22.properties.aliases || []).forEach((alias) => {
+ ids.push(alias);
+ });
+ ids.forEach((id2) => {
+ let cid = canonicalID(id2);
+ featuresByCode[cid] = feature22;
+ });
+ }
+ }
+ function locArray(loc) {
+ if (Array.isArray(loc)) {
+ return loc;
+ } else if (loc.coordinates) {
+ return loc.coordinates;
+ }
+ return loc.geometry.coordinates;
+ }
+ function smallestFeature(loc) {
+ const query = locArray(loc);
+ const featureProperties = whichPolygonGetter(query);
+ if (!featureProperties)
+ return null;
+ return featuresByCode[featureProperties.id];
+ }
+ function countryFeature(loc) {
+ const feature22 = smallestFeature(loc);
+ if (!feature22)
+ return null;
+ const countryCode = feature22.properties.country || feature22.properties.iso1A2;
+ return featuresByCode[countryCode] || null;
+ }
+ var defaultOpts = {
+ level: void 0,
+ maxLevel: void 0,
+ withProp: void 0
+ };
+ function featureForLoc(loc, opts) {
+ const targetLevel = opts.level || "country";
+ const maxLevel = opts.maxLevel || "world";
+ const withProp = opts.withProp;
+ const targetLevelIndex = levels.indexOf(targetLevel);
+ if (targetLevelIndex === -1)
+ return null;
+ const maxLevelIndex = levels.indexOf(maxLevel);
+ if (maxLevelIndex === -1)
+ return null;
+ if (maxLevelIndex < targetLevelIndex)
+ return null;
+ if (targetLevel === "country") {
+ const fastFeature = countryFeature(loc);
+ if (fastFeature) {
+ if (!withProp || fastFeature.properties[withProp]) {
+ return fastFeature;
+ }
+ }
+ }
+ const features2 = featuresContaining(loc);
+ const match = features2.find((feature22) => {
+ let levelIndex = levels.indexOf(feature22.properties.level);
+ if (feature22.properties.level === targetLevel || levelIndex > targetLevelIndex && levelIndex <= maxLevelIndex) {
+ if (!withProp || feature22.properties[withProp]) {
+ return feature22;
+ }
+ }
+ return false;
+ });
+ return match || null;
+ }
+ function featureForID(id2) {
+ let stringID;
+ if (typeof id2 === "number") {
+ stringID = id2.toString();
+ if (stringID.length === 1) {
+ stringID = "00" + stringID;
+ } else if (stringID.length === 2) {
+ stringID = "0" + stringID;
+ }
+ } else {
+ stringID = canonicalID(id2);
+ }
+ return featuresByCode[stringID] || null;
+ }
+ function smallestFeaturesForBbox(bbox) {
+ return whichPolygonGetter.bbox(bbox).map((props) => featuresByCode[props.id]);
+ }
+ function smallestOrMatchingFeature(query) {
+ if (typeof query === "object") {
+ return smallestFeature(query);
+ }
+ return featureForID(query);
+ }
+ function feature(query, opts = defaultOpts) {
+ if (typeof query === "object") {
+ return featureForLoc(query, opts);
+ }
+ return featureForID(query);
+ }
+ function iso1A2Code(query, opts = defaultOpts) {
+ opts.withProp = "iso1A2";
+ const match = feature(query, opts);
+ if (!match)
+ return null;
+ return match.properties.iso1A2 || null;
+ }
+ function featuresContaining(query, strict) {
+ let matchingFeatures;
+ if (Array.isArray(query) && query.length === 4) {
+ matchingFeatures = smallestFeaturesForBbox(query);
+ } else {
+ const smallestOrMatching = smallestOrMatchingFeature(query);
+ matchingFeatures = smallestOrMatching ? [smallestOrMatching] : [];
+ }
+ if (!matchingFeatures.length)
+ return [];
+ let returnFeatures;
+ if (!strict || typeof query === "object") {
+ returnFeatures = matchingFeatures.slice();
+ } else {
+ returnFeatures = [];
+ }
+ matchingFeatures.forEach((feature22) => {
+ const properties = feature22.properties;
+ properties.groups.forEach((groupID) => {
+ const groupFeature = featuresByCode[groupID];
+ if (returnFeatures.indexOf(groupFeature) === -1) {
+ returnFeatures.push(groupFeature);
+ }
+ });
+ });
+ return returnFeatures;
+ }
+ function featuresIn(id2, strict) {
+ const feature22 = featureForID(id2);
+ if (!feature22)
+ return [];
+ let features2 = [];
+ if (!strict) {
+ features2.push(feature22);
+ }
+ const properties = feature22.properties;
+ (properties.members || []).forEach((memberID) => {
+ features2.push(featuresByCode[memberID]);
+ });
+ return features2;
+ }
+ function aggregateFeature(id2) {
+ const features2 = featuresIn(id2, false);
+ if (features2.length === 0)
+ return null;
+ let aggregateCoordinates = [];
+ features2.forEach((feature22) => {
+ if (feature22.geometry && feature22.geometry.type === "MultiPolygon" && feature22.geometry.coordinates) {
+ aggregateCoordinates = aggregateCoordinates.concat(feature22.geometry.coordinates);
+ }
+ });
+ return {
+ type: "Feature",
+ properties: features2[0].properties,
+ geometry: {
+ type: "MultiPolygon",
+ coordinates: aggregateCoordinates
+ }
+ };
+ }
+ function roadSpeedUnit(query) {
+ const feature22 = smallestOrMatchingFeature(query);
+ return feature22 && feature22.properties.roadSpeedUnit || null;
+ }
+ function roadHeightUnit(query) {
+ const feature22 = smallestOrMatchingFeature(query);
+ return feature22 && feature22.properties.roadHeightUnit || null;
+ }
+
+ // node_modules/@ideditor/location-conflation/index.mjs
+ var import_geojson_area = __toESM(require_geojson_area(), 1);
+ var import_circle_to_polygon = __toESM(require_circle_to_polygon(), 1);
+ var import_polygon_clipping = __toESM(require_polygon_clipping_umd(), 1);
+ var import_geojson_precision = __toESM(require_geojson_precision(), 1);
+ var import_json_stringify_pretty_compact = __toESM(require_json_stringify_pretty_compact(), 1);
+ var location_conflation_default = class {
+ constructor(fc) {
+ this._cache = {};
+ this._strict = true;
+ if (fc && fc.type === "FeatureCollection" && Array.isArray(fc.features)) {
+ fc.features.forEach((feature3) => {
+ feature3.properties = feature3.properties || {};
+ let props = feature3.properties;
+ let id2 = feature3.id || props.id;
+ if (!id2 || !/^\S+\.geojson$/i.test(id2))
+ return;
+ id2 = id2.toLowerCase();
+ feature3.id = id2;
+ props.id = id2;
+ if (!props.area) {
+ const area = import_geojson_area.default.geometry(feature3.geometry) / 1e6;
+ props.area = Number(area.toFixed(2));
+ }
+ this._cache[id2] = feature3;
+ });
+ }
+ let world = _cloneDeep(feature("Q2"));
+ world.geometry = {
+ type: "Polygon",
+ coordinates: [[[-180, -90], [180, -90], [180, 90], [-180, 90], [-180, -90]]]
+ };
+ world.id = "Q2";
+ world.properties.id = "Q2";
+ world.properties.area = import_geojson_area.default.geometry(world.geometry) / 1e6;
+ this._cache.Q2 = world;
+ }
+ validateLocation(location) {
+ if (Array.isArray(location) && (location.length === 2 || location.length === 3)) {
+ const lon = location[0];
+ const lat = location[1];
+ const radius = location[2];
+ if (Number.isFinite(lon) && lon >= -180 && lon <= 180 && Number.isFinite(lat) && lat >= -90 && lat <= 90 && (location.length === 2 || Number.isFinite(radius) && radius > 0)) {
+ const id2 = "[" + location.toString() + "]";
+ return { type: "point", location, id: id2 };
+ }
+ } else if (typeof location === "string" && /^\S+\.geojson$/i.test(location)) {
+ const id2 = location.toLowerCase();
+ if (this._cache[id2]) {
+ return { type: "geojson", location, id: id2 };
+ }
+ } else if (typeof location === "string" || typeof location === "number") {
+ const feature3 = feature(location);
+ if (feature3) {
+ const id2 = feature3.properties.wikidata;
+ return { type: "countrycoder", location, id: id2 };
+ }
+ }
+ if (this._strict) {
+ throw new Error(`validateLocation: Invalid location: "${location}".`);
+ } else {
+ return null;
+ }
+ }
+ resolveLocation(location) {
+ const valid = this.validateLocation(location);
+ if (!valid)
+ return null;
+ const id2 = valid.id;
+ if (this._cache[id2]) {
+ return Object.assign(valid, { feature: this._cache[id2] });
+ }
+ if (valid.type === "point") {
+ const lon = location[0];
+ const lat = location[1];
+ const radius = location[2] || 25;
+ const EDGES = 10;
+ const PRECISION = 3;
+ const area = Math.PI * radius * radius;
+ const feature3 = this._cache[id2] = (0, import_geojson_precision.default)({
+ type: "Feature",
+ id: id2,
+ properties: { id: id2, area: Number(area.toFixed(2)) },
+ geometry: (0, import_circle_to_polygon.default)([lon, lat], radius * 1e3, EDGES)
+ }, PRECISION);
+ return Object.assign(valid, { feature: feature3 });
+ } else if (valid.type === "geojson") {
+ } else if (valid.type === "countrycoder") {
+ let feature3 = _cloneDeep(feature(id2));
+ let props = feature3.properties;
+ if (Array.isArray(props.members)) {
+ let aggregate = aggregateFeature(id2);
+ aggregate.geometry.coordinates = _clip([aggregate], "UNION").geometry.coordinates;
+ feature3.geometry = aggregate.geometry;
+ }
+ if (!props.area) {
+ const area = import_geojson_area.default.geometry(feature3.geometry) / 1e6;
+ props.area = Number(area.toFixed(2));
+ }
+ feature3.id = id2;
+ props.id = id2;
+ this._cache[id2] = feature3;
+ return Object.assign(valid, { feature: feature3 });
+ }
+ if (this._strict) {
+ throw new Error(`resolveLocation: Couldn't resolve location "${location}".`);
+ } else {
+ return null;
+ }
+ }
+ validateLocationSet(locationSet) {
+ locationSet = locationSet || {};
+ const validator = this.validateLocation.bind(this);
+ let include = (locationSet.include || []).map(validator).filter(Boolean);
+ let exclude = (locationSet.exclude || []).map(validator).filter(Boolean);
+ if (!include.length) {
+ if (this._strict) {
+ throw new Error(`validateLocationSet: LocationSet includes nothing.`);
+ } else {
+ locationSet.include = ["Q2"];
+ include = [{ type: "countrycoder", location: "Q2", id: "Q2" }];
+ }
+ }
+ include.sort(_sortLocations);
+ let id2 = "+[" + include.map((d) => d.id).join(",") + "]";
+ if (exclude.length) {
+ exclude.sort(_sortLocations);
+ id2 += "-[" + exclude.map((d) => d.id).join(",") + "]";
+ }
+ return { type: "locationset", locationSet, id: id2 };
+ }
+ resolveLocationSet(locationSet) {
+ locationSet = locationSet || {};
+ const valid = this.validateLocationSet(locationSet);
+ if (!valid)
+ return null;
+ const id2 = valid.id;
+ if (this._cache[id2]) {
+ return Object.assign(valid, { feature: this._cache[id2] });
+ }
+ const resolver = this.resolveLocation.bind(this);
+ const includes = (locationSet.include || []).map(resolver).filter(Boolean);
+ const excludes = (locationSet.exclude || []).map(resolver).filter(Boolean);
+ if (includes.length === 1 && excludes.length === 0) {
+ return Object.assign(valid, { feature: includes[0].feature });
+ }
+ const includeGeoJSON = _clip(includes.map((d) => d.feature), "UNION");
+ const excludeGeoJSON = _clip(excludes.map((d) => d.feature), "UNION");
+ let resultGeoJSON = excludeGeoJSON ? _clip([includeGeoJSON, excludeGeoJSON], "DIFFERENCE") : includeGeoJSON;
+ const area = import_geojson_area.default.geometry(resultGeoJSON.geometry) / 1e6;
+ resultGeoJSON.id = id2;
+ resultGeoJSON.properties = { id: id2, area: Number(area.toFixed(2)) };
+ this._cache[id2] = resultGeoJSON;
+ return Object.assign(valid, { feature: resultGeoJSON });
+ }
+ strict(val) {
+ if (val === void 0) {
+ return this._strict;
+ } else {
+ this._strict = val;
+ return this;
+ }
+ }
+ cache() {
+ return this._cache;
+ }
+ stringify(obj, options2) {
+ return (0, import_json_stringify_pretty_compact.default)(obj, options2);
+ }
+ };
+ function _clip(features2, which) {
+ if (!Array.isArray(features2) || !features2.length)
+ return null;
+ const fn = { UNION: import_polygon_clipping.default.union, DIFFERENCE: import_polygon_clipping.default.difference }[which];
+ const args = features2.map((feature3) => feature3.geometry.coordinates);
+ const coords = fn.apply(null, args);
+ return {
+ type: "Feature",
+ properties: {},
+ geometry: {
+ type: whichType(coords),
+ coordinates: coords
+ }
+ };
+ function whichType(coords2) {
+ const a = Array.isArray(coords2);
+ const b = a && Array.isArray(coords2[0]);
+ const c = b && Array.isArray(coords2[0][0]);
+ const d = c && Array.isArray(coords2[0][0][0]);
+ return d ? "MultiPolygon" : "Polygon";
+ }
+ }
+ function _cloneDeep(obj) {
+ return JSON.parse(JSON.stringify(obj));
+ }
+ function _sortLocations(a, b) {
+ const rank = { countrycoder: 1, geojson: 2, point: 3 };
+ const aRank = rank[a.type];
+ const bRank = rank[b.type];
+ return aRank > bRank ? 1 : aRank < bRank ? -1 : a.id.localeCompare(b.id);
+ }
+
+ // modules/core/locations.js
+ var import_which_polygon2 = __toESM(require_which_polygon());
+ var import_geojson_area2 = __toESM(require_geojson_area());
+
+ // modules/util/aes.js
+ var import_aes_js = __toESM(require_aes_js());
+ var DEFAULT_128 = [250, 157, 60, 79, 142, 134, 229, 129, 138, 126, 210, 129, 29, 71, 160, 208];
+ function utilAesEncrypt(text2, key) {
+ key = key || DEFAULT_128;
+ const textBytes = import_aes_js.default.utils.utf8.toBytes(text2);
+ const aesCtr = new import_aes_js.default.ModeOfOperation.ctr(key);
+ const encryptedBytes = aesCtr.encrypt(textBytes);
+ const encryptedHex = import_aes_js.default.utils.hex.fromBytes(encryptedBytes);
+ return encryptedHex;
+ }
+ function utilAesDecrypt(encryptedHex, key) {
+ key = key || DEFAULT_128;
+ const encryptedBytes = import_aes_js.default.utils.hex.toBytes(encryptedHex);
+ const aesCtr = new import_aes_js.default.ModeOfOperation.ctr(key);
+ const decryptedBytes = aesCtr.decrypt(encryptedBytes);
+ const text2 = import_aes_js.default.utils.utf8.fromBytes(decryptedBytes);
+ return text2;
+ }
+
+ // modules/util/clean_tags.js
+ function utilCleanTags(tags) {
+ var out = {};
+ for (var k in tags) {
+ if (!k)
+ continue;
+ var v = tags[k];
+ if (v !== void 0) {
+ out[k] = cleanValue(k, v);
+ }
+ }
+ return out;
+ function cleanValue(k2, v2) {
+ function keepSpaces(k3) {
+ return /_hours|_times|:conditional$/.test(k3);
+ }
+ function skip(k3) {
+ return /^(description|note|fixme)$/.test(k3);
+ }
+ if (skip(k2))
+ return v2;
+ var cleaned = v2.split(";").map(function(s) {
+ return s.trim();
+ }).join(keepSpaces(k2) ? "; " : ";");
+ if (k2.indexOf("website") !== -1 || k2.indexOf("email") !== -1 || cleaned.indexOf("http") === 0) {
+ cleaned = cleaned.replace(/[\u200B-\u200F\uFEFF]/g, "");
+ }
+ return cleaned;
+ }
+ }
+
+ // modules/util/detect.js
+ var _detected;
+ function utilDetect(refresh2) {
+ if (_detected && !refresh2)
+ return _detected;
+ _detected = {};
+ const ua = navigator.userAgent;
+ let m = null;
+ m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);
+ if (m !== null) {
+ _detected.browser = m[1];
+ _detected.version = m[2];
+ }
+ if (!_detected.browser) {
+ m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);
+ if (m !== null) {
+ _detected.browser = "msie";
+ _detected.version = m[1];
+ }
+ }
+ if (!_detected.browser) {
+ m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);
+ if (m !== null) {
+ _detected.browser = "Opera";
+ _detected.version = m[2];
+ }
+ }
+ if (!_detected.browser) {
+ m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
+ if (m !== null) {
+ _detected.browser = m[1];
+ _detected.version = m[2];
+ m = ua.match(/version\/([\.\d]+)/i);
+ if (m !== null)
+ _detected.version = m[1];
+ }
+ }
+ if (!_detected.browser) {
+ _detected.browser = navigator.appName;
+ _detected.version = navigator.appVersion;
+ }
+ _detected.version = _detected.version.split(/\W/).slice(0, 2).join(".");
+ _detected.opera = _detected.browser.toLowerCase() === "opera" && parseFloat(_detected.version) < 15;
+ if (_detected.browser.toLowerCase() === "msie") {
+ _detected.ie = true;
+ _detected.browser = "Internet Explorer";
+ _detected.support = false;
+ } else {
+ _detected.ie = false;
+ _detected.support = true;
+ }
+ _detected.filedrop = window.FileReader && "ondrop" in window;
+ if (/Win/.test(ua)) {
+ _detected.os = "win";
+ _detected.platform = "Windows";
+ } else if (/Mac/.test(ua)) {
+ _detected.os = "mac";
+ _detected.platform = "Macintosh";
+ } else if (/X11/.test(ua) || /Linux/.test(ua)) {
+ _detected.os = "linux";
+ _detected.platform = "Linux";
+ } else {
+ _detected.os = "win";
+ _detected.platform = "Unknown";
+ }
+ _detected.isMobileWebKit = (/\b(iPad|iPhone|iPod)\b/.test(ua) || navigator.platform === "MacIntel" && "maxTouchPoints" in navigator && navigator.maxTouchPoints > 1) && /WebKit/.test(ua) && !/Edge/.test(ua) && !window.MSStream;
+ _detected.browserLocales = Array.from(new Set([navigator.language].concat(navigator.languages || []).concat([
+ navigator.userLanguage
+ ]).filter(Boolean)));
+ const loc = window.top.location;
+ let origin = loc.origin;
+ if (!origin) {
+ origin = loc.protocol + "//" + loc.hostname + (loc.port ? ":" + loc.port : "");
+ }
+ _detected.host = origin + loc.pathname;
+ return _detected;
+ }
+
+ // modules/util/get_set_value.js
+ function utilGetSetValue(selection2, value) {
+ function d3_selection_value(value2) {
+ function valueNull() {
+ delete this.value;
+ }
+ function valueConstant() {
+ if (this.value !== value2) {
+ this.value = value2;
+ }
+ }
+ function valueFunction() {
+ var x = value2.apply(this, arguments);
+ if (x === null || x === void 0) {
+ delete this.value;
+ } else if (this.value !== x) {
+ this.value = x;
+ }
+ }
+ return value2 === null || value2 === void 0 ? valueNull : typeof value2 === "function" ? valueFunction : valueConstant;
+ }
+ if (arguments.length === 1) {
+ return selection2.property("value");
+ }
+ return selection2.each(d3_selection_value(value));
+ }
+
+ // modules/util/keybinding.js
+ function utilKeybinding(namespace) {
+ var _keybindings = {};
+ function testBindings(d3_event, isCapturing) {
+ var didMatch = false;
+ var bindings = Object.keys(_keybindings).map(function(id2) {
+ return _keybindings[id2];
+ });
+ var i2, binding;
+ for (i2 = 0; i2 < bindings.length; i2++) {
+ binding = bindings[i2];
+ if (!binding.event.modifiers.shiftKey)
+ continue;
+ if (!!binding.capture !== isCapturing)
+ continue;
+ if (matches(d3_event, binding, true)) {
+ binding.callback(d3_event);
+ didMatch = true;
+ break;
+ }
+ }
+ if (didMatch)
+ return;
+ for (i2 = 0; i2 < bindings.length; i2++) {
+ binding = bindings[i2];
+ if (binding.event.modifiers.shiftKey)
+ continue;
+ if (!!binding.capture !== isCapturing)
+ continue;
+ if (matches(d3_event, binding, false)) {
+ binding.callback(d3_event);
+ break;
+ }
+ }
+ function matches(d3_event2, binding2, testShift) {
+ var event = d3_event2;
+ var isMatch = false;
+ var tryKeyCode = true;
+ if (event.key !== void 0) {
+ tryKeyCode = event.key.charCodeAt(0) > 127;
+ isMatch = true;
+ if (binding2.event.key === void 0) {
+ isMatch = false;
+ } else if (Array.isArray(binding2.event.key)) {
+ if (binding2.event.key.map(function(s) {
+ return s.toLowerCase();
+ }).indexOf(event.key.toLowerCase()) === -1) {
+ isMatch = false;
+ }
+ } else {
+ if (event.key.toLowerCase() !== binding2.event.key.toLowerCase()) {
+ isMatch = false;
+ }
+ }
+ }
+ if (!isMatch && (tryKeyCode || binding2.event.modifiers.altKey)) {
+ isMatch = event.keyCode === binding2.event.keyCode;
+ }
+ if (!isMatch)
+ return false;
+ if (!(event.ctrlKey && event.altKey)) {
+ if (event.ctrlKey !== binding2.event.modifiers.ctrlKey)
+ return false;
+ if (event.altKey !== binding2.event.modifiers.altKey)
+ return false;
+ }
+ if (event.metaKey !== binding2.event.modifiers.metaKey)
+ return false;
+ if (testShift && event.shiftKey !== binding2.event.modifiers.shiftKey)
+ return false;
+ return true;
+ }
+ }
+ function capture(d3_event) {
+ testBindings(d3_event, true);
+ }
+ function bubble(d3_event) {
+ var tagName = select_default2(d3_event.target).node().tagName;
+ if (tagName === "INPUT" || tagName === "SELECT" || tagName === "TEXTAREA") {
+ return;
+ }
+ testBindings(d3_event, false);
+ }
+ function keybinding(selection2) {
+ selection2 = selection2 || select_default2(document);
+ selection2.on("keydown.capture." + namespace, capture, true);
+ selection2.on("keydown.bubble." + namespace, bubble, false);
+ return keybinding;
+ }
+ keybinding.unbind = function(selection2) {
+ _keybindings = [];
+ selection2 = selection2 || select_default2(document);
+ selection2.on("keydown.capture." + namespace, null);
+ selection2.on("keydown.bubble." + namespace, null);
+ return keybinding;
+ };
+ keybinding.clear = function() {
+ _keybindings = {};
+ return keybinding;
+ };
+ keybinding.off = function(codes, capture2) {
+ var arr = utilArrayUniq([].concat(codes));
+ for (var i2 = 0; i2 < arr.length; i2++) {
+ var id2 = arr[i2] + (capture2 ? "-capture" : "-bubble");
+ delete _keybindings[id2];
+ }
+ return keybinding;
+ };
+ keybinding.on = function(codes, callback, capture2) {
+ if (typeof callback !== "function") {
+ return keybinding.off(codes, capture2);
+ }
+ var arr = utilArrayUniq([].concat(codes));
+ for (var i2 = 0; i2 < arr.length; i2++) {
+ var id2 = arr[i2] + (capture2 ? "-capture" : "-bubble");
+ var binding = {
+ id: id2,
+ capture: capture2,
+ callback,
+ event: {
+ key: void 0,
+ keyCode: 0,
+ modifiers: {
+ shiftKey: false,
+ ctrlKey: false,
+ altKey: false,
+ metaKey: false
+ }
+ }
+ };
+ if (_keybindings[id2]) {
+ console.warn('warning: duplicate keybinding for "' + id2 + '"');
+ }
+ _keybindings[id2] = binding;
+ var matches = arr[i2].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
+ for (var j2 = 0; j2 < matches.length; j2++) {
+ if (matches[j2] === "++")
+ matches[j2] = "+";
+ if (matches[j2] in utilKeybinding.modifierCodes) {
+ var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j2]]];
+ binding.event.modifiers[prop] = true;
+ } else {
+ binding.event.key = utilKeybinding.keys[matches[j2]] || matches[j2];
+ if (matches[j2] in utilKeybinding.keyCodes) {
+ binding.event.keyCode = utilKeybinding.keyCodes[matches[j2]];
+ }
+ }
+ }
+ }
+ return keybinding;
+ };
+ return keybinding;
+ }
+ utilKeybinding.modifierCodes = {
+ "\u21E7": 16,
+ shift: 16,
+ "\u2303": 17,
+ ctrl: 17,
+ "\u2325": 18,
+ alt: 18,
+ option: 18,
+ "\u2318": 91,
+ meta: 91,
+ cmd: 91,
+ "super": 91,
+ win: 91
+ };
+ utilKeybinding.modifierProperties = {
+ 16: "shiftKey",
+ 17: "ctrlKey",
+ 18: "altKey",
+ 91: "metaKey"
+ };
+ utilKeybinding.plusKeys = ["plus", "ffplus", "=", "ffequals", "\u2260", "\xB1"];
+ utilKeybinding.minusKeys = ["_", "-", "ffminus", "dash", "\u2013", "\u2014"];
+ utilKeybinding.keys = {
+ "\u232B": "Backspace",
+ backspace: "Backspace",
+ "\u21E5": "Tab",
+ "\u21C6": "Tab",
+ tab: "Tab",
+ "\u21A9": "Enter",
+ "\u21B5": "Enter",
+ "\u23CE": "Enter",
+ "return": "Enter",
+ enter: "Enter",
+ "\u2305": "Enter",
+ "pause": "Pause",
+ "pause-break": "Pause",
+ "\u21EA": "CapsLock",
+ caps: "CapsLock",
+ "caps-lock": "CapsLock",
+ "\u238B": ["Escape", "Esc"],
+ escape: ["Escape", "Esc"],
+ esc: ["Escape", "Esc"],
+ space: [" ", "Spacebar"],
+ "\u2196": "PageUp",
+ pgup: "PageUp",
+ "page-up": "PageUp",
+ "\u2198": "PageDown",
+ pgdown: "PageDown",
+ "page-down": "PageDown",
+ "\u21DF": "End",
+ end: "End",
+ "\u21DE": "Home",
+ home: "Home",
+ ins: "Insert",
+ insert: "Insert",
+ "\u2326": ["Delete", "Del"],
+ del: ["Delete", "Del"],
+ "delete": ["Delete", "Del"],
+ "\u2190": ["ArrowLeft", "Left"],
+ left: ["ArrowLeft", "Left"],
+ "arrow-left": ["ArrowLeft", "Left"],
+ "\u2191": ["ArrowUp", "Up"],
+ up: ["ArrowUp", "Up"],
+ "arrow-up": ["ArrowUp", "Up"],
+ "\u2192": ["ArrowRight", "Right"],
+ right: ["ArrowRight", "Right"],
+ "arrow-right": ["ArrowRight", "Right"],
+ "\u2193": ["ArrowDown", "Down"],
+ down: ["ArrowDown", "Down"],
+ "arrow-down": ["ArrowDown", "Down"],
+ "*": ["*", "Multiply"],
+ star: ["*", "Multiply"],
+ asterisk: ["*", "Multiply"],
+ multiply: ["*", "Multiply"],
+ "+": ["+", "Add"],
+ "plus": ["+", "Add"],
+ "-": ["-", "Subtract"],
+ subtract: ["-", "Subtract"],
+ "dash": ["-", "Subtract"],
+ semicolon: ";",
+ equals: "=",
+ comma: ",",
+ period: ".",
+ "full-stop": ".",
+ slash: "/",
+ "forward-slash": "/",
+ tick: "`",
+ "back-quote": "`",
+ "open-bracket": "[",
+ "back-slash": "\\",
+ "close-bracket": "]",
+ quote: "'",
+ apostrophe: "'",
+ "num-0": "0",
+ "num-1": "1",
+ "num-2": "2",
+ "num-3": "3",
+ "num-4": "4",
+ "num-5": "5",
+ "num-6": "6",
+ "num-7": "7",
+ "num-8": "8",
+ "num-9": "9",
+ f1: "F1",
+ f2: "F2",
+ f3: "F3",
+ f4: "F4",
+ f5: "F5",
+ f6: "F6",
+ f7: "F7",
+ f8: "F8",
+ f9: "F9",
+ f10: "F10",
+ f11: "F11",
+ f12: "F12",
+ f13: "F13",
+ f14: "F14",
+ f15: "F15",
+ f16: "F16",
+ f17: "F17",
+ f18: "F18",
+ f19: "F19",
+ f20: "F20",
+ f21: "F21",
+ f22: "F22",
+ f23: "F23",
+ f24: "F24",
+ f25: "F25"
+ };
+ utilKeybinding.keyCodes = {
+ "\u232B": 8,
+ backspace: 8,
+ "\u21E5": 9,
+ "\u21C6": 9,
+ tab: 9,
+ "\u21A9": 13,
+ "\u21B5": 13,
+ "\u23CE": 13,
+ "return": 13,
+ enter: 13,
+ "\u2305": 13,
+ "pause": 19,
+ "pause-break": 19,
+ "\u21EA": 20,
+ caps: 20,
+ "caps-lock": 20,
+ "\u238B": 27,
+ escape: 27,
+ esc: 27,
+ space: 32,
+ "\u2196": 33,
+ pgup: 33,
+ "page-up": 33,
+ "\u2198": 34,
+ pgdown: 34,
+ "page-down": 34,
+ "\u21DF": 35,
+ end: 35,
+ "\u21DE": 36,
+ home: 36,
+ ins: 45,
+ insert: 45,
+ "\u2326": 46,
+ del: 46,
+ "delete": 46,
+ "\u2190": 37,
+ left: 37,
+ "arrow-left": 37,
+ "\u2191": 38,
+ up: 38,
+ "arrow-up": 38,
+ "\u2192": 39,
+ right: 39,
+ "arrow-right": 39,
+ "\u2193": 40,
+ down: 40,
+ "arrow-down": 40,
+ "ffequals": 61,
+ "*": 106,
+ star: 106,
+ asterisk: 106,
+ multiply: 106,
+ "+": 107,
+ "plus": 107,
+ "-": 109,
+ subtract: 109,
+ "|": 124,
+ "ffplus": 171,
+ "ffminus": 173,
+ ";": 186,
+ semicolon: 186,
+ "=": 187,
+ "equals": 187,
+ ",": 188,
+ comma: 188,
+ "dash": 189,
+ ".": 190,
+ period: 190,
+ "full-stop": 190,
+ "/": 191,
+ slash: 191,
+ "forward-slash": 191,
+ "`": 192,
+ tick: 192,
+ "back-quote": 192,
+ "[": 219,
+ "open-bracket": 219,
+ "\\": 220,
+ "back-slash": 220,
+ "]": 221,
+ "close-bracket": 221,
+ "'": 222,
+ quote: 222,
+ apostrophe: 222
+ };
+ var i = 95;
+ var n = 0;
+ while (++i < 106) {
+ utilKeybinding.keyCodes["num-" + n] = i;
+ ++n;
+ }
+ i = 47;
+ n = 0;
+ while (++i < 58) {
+ utilKeybinding.keyCodes[n] = i;
+ ++n;
+ }
+ i = 111;
+ n = 1;
+ while (++i < 136) {
+ utilKeybinding.keyCodes["f" + n] = i;
+ ++n;
+ }
+ i = 64;
+ while (++i < 91) {
+ utilKeybinding.keyCodes[String.fromCharCode(i).toLowerCase()] = i;
+ }
+
+ // modules/util/object.js
+ function utilObjectOmit(obj, omitKeys) {
+ return Object.keys(obj).reduce(function(result, key) {
+ if (omitKeys.indexOf(key) === -1) {
+ result[key] = obj[key];
+ }
+ return result;
+ }, {});
+ }
+
+ // modules/util/rebind.js
+ function utilRebind(target, source) {
+ var i2 = 1, n2 = arguments.length, method;
+ while (++i2 < n2) {
+ target[method = arguments[i2]] = d3_rebind(target, source, source[method]);
+ }
+ return target;
+ }
+ function d3_rebind(target, source, method) {
+ return function() {
+ var value = method.apply(source, arguments);
+ return value === source ? target : value;
+ };
+ }
+
+ // modules/util/session_mutex.js
+ function utilSessionMutex(name2) {
+ var mutex = {};
+ var intervalID;
+ function renew() {
+ var expires = new Date();
+ expires.setSeconds(expires.getSeconds() + 5);
+ document.cookie = name2 + "=1; expires=" + expires.toUTCString() + "; sameSite=strict";
+ }
+ mutex.lock = function() {
+ if (intervalID)
+ return true;
+ var cookie = document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + name2 + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1");
+ if (cookie)
+ return false;
+ renew();
+ intervalID = window.setInterval(renew, 4e3);
+ return true;
+ };
+ mutex.unlock = function() {
+ if (!intervalID)
+ return;
+ document.cookie = name2 + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict";
+ clearInterval(intervalID);
+ intervalID = null;
+ };
+ mutex.locked = function() {
+ return !!intervalID;
+ };
+ return mutex;
+ }
+
+ // modules/util/tiler.js
+ function utilTiler() {
+ var _size = [256, 256];
+ var _scale = 256;
+ var _tileSize = 256;
+ var _zoomExtent = [0, 20];
+ var _translate = [_size[0] / 2, _size[1] / 2];
+ var _margin = 0;
+ var _skipNullIsland = false;
+ function clamp3(num, min3, max3) {
+ return Math.max(min3, Math.min(num, max3));
+ }
+ function nearNullIsland(tile) {
+ var x = tile[0];
+ var y = tile[1];
+ var z = tile[2];
+ if (z >= 7) {
+ var center = Math.pow(2, z - 1);
+ var width = Math.pow(2, z - 6);
+ var min3 = center - width / 2;
+ var max3 = center + width / 2 - 1;
+ return x >= min3 && x <= max3 && y >= min3 && y <= max3;
+ }
+ return false;
+ }
+ function tiler8() {
+ var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
+ var z0 = clamp3(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
+ var tileMin = 0;
+ var tileMax = Math.pow(2, z0) - 1;
+ var log2ts = Math.log(_tileSize) * Math.LOG2E;
+ var k = Math.pow(2, z - z0 + log2ts);
+ var origin = [
+ (_translate[0] - _scale / 2) / k,
+ (_translate[1] - _scale / 2) / k
+ ];
+ var cols = range(clamp3(Math.floor(-origin[0]) - _margin, tileMin, tileMax + 1), clamp3(Math.ceil(_size[0] / k - origin[0]) + _margin, tileMin, tileMax + 1));
+ var rows = range(clamp3(Math.floor(-origin[1]) - _margin, tileMin, tileMax + 1), clamp3(Math.ceil(_size[1] / k - origin[1]) + _margin, tileMin, tileMax + 1));
+ var tiles = [];
+ for (var i2 = 0; i2 < rows.length; i2++) {
+ var y = rows[i2];
+ for (var j2 = 0; j2 < cols.length; j2++) {
+ var x = cols[j2];
+ if (i2 >= _margin && i2 <= rows.length - _margin && j2 >= _margin && j2 <= cols.length - _margin) {
+ tiles.unshift([x, y, z0]);
+ } else {
+ tiles.push([x, y, z0]);
+ }
+ }
+ }
+ tiles.translate = origin;
+ tiles.scale = k;
+ return tiles;
+ }
+ tiler8.getTiles = function(projection2) {
+ var origin = [
+ projection2.scale() * Math.PI - projection2.translate()[0],
+ projection2.scale() * Math.PI - projection2.translate()[1]
+ ];
+ this.size(projection2.clipExtent()[1]).scale(projection2.scale() * 2 * Math.PI).translate(projection2.translate());
+ var tiles = tiler8();
+ var ts = tiles.scale;
+ return tiles.map(function(tile) {
+ if (_skipNullIsland && nearNullIsland(tile)) {
+ return false;
+ }
+ var x = tile[0] * ts - origin[0];
+ var y = tile[1] * ts - origin[1];
+ return {
+ id: tile.toString(),
+ xyz: tile,
+ extent: geoExtent(projection2.invert([x, y + ts]), projection2.invert([x + ts, y]))
+ };
+ }).filter(Boolean);
+ };
+ tiler8.getGeoJSON = function(projection2) {
+ var features2 = tiler8.getTiles(projection2).map(function(tile) {
+ return {
+ type: "Feature",
+ properties: {
+ id: tile.id,
+ name: tile.id
+ },
+ geometry: {
+ type: "Polygon",
+ coordinates: [tile.extent.polygon()]
+ }
+ };
+ });
+ return {
+ type: "FeatureCollection",
+ features: features2
+ };
+ };
+ tiler8.tileSize = function(val) {
+ if (!arguments.length)
+ return _tileSize;
+ _tileSize = val;
+ return tiler8;
+ };
+ tiler8.zoomExtent = function(val) {
+ if (!arguments.length)
+ return _zoomExtent;
+ _zoomExtent = val;
+ return tiler8;
+ };
+ tiler8.size = function(val) {
+ if (!arguments.length)
+ return _size;
+ _size = val;
+ return tiler8;
+ };
+ tiler8.scale = function(val) {
+ if (!arguments.length)
+ return _scale;
+ _scale = val;
+ return tiler8;
+ };
+ tiler8.translate = function(val) {
+ if (!arguments.length)
+ return _translate;
+ _translate = val;
+ return tiler8;
+ };
+ tiler8.margin = function(val) {
+ if (!arguments.length)
+ return _margin;
+ _margin = +val;
+ return tiler8;
+ };
+ tiler8.skipNullIsland = function(val) {
+ if (!arguments.length)
+ return _skipNullIsland;
+ _skipNullIsland = val;
+ return tiler8;
+ };
+ return tiler8;
+ }
+
+ // modules/util/trigger_event.js
+ function utilTriggerEvent(target, type3) {
+ target.each(function() {
+ var evt = document.createEvent("HTMLEvents");
+ evt.initEvent(type3, true, true);
+ this.dispatchEvent(evt);
+ });
+ }
+
+ // modules/core/locations.js
+ var _mainLocations = coreLocations();
+ function coreLocations() {
+ let _this = {};
+ let _resolvedFeatures = {};
+ let _loco = new location_conflation_default();
+ let _wp;
+ const world = { locationSet: { include: ["Q2"] } };
+ resolveLocationSet(world);
+ rebuildIndex();
+ let _queue = [];
+ let _deferred2 = /* @__PURE__ */ new Set();
+ let _inProcess;
+ function processQueue() {
+ if (!_queue.length)
+ return Promise.resolve();
+ const chunk = _queue.pop();
+ return new Promise((resolvePromise) => {
+ const handle = window.requestIdleCallback(() => {
+ _deferred2.delete(handle);
+ chunk.forEach(resolveLocationSet);
+ resolvePromise();
+ });
+ _deferred2.add(handle);
+ }).then(() => processQueue());
+ }
+ function resolveLocationSet(obj) {
+ if (obj.locationSetID)
+ return;
+ try {
+ let locationSet = obj.locationSet;
+ if (!locationSet) {
+ throw new Error("object missing locationSet property");
+ }
+ if (!locationSet.include) {
+ locationSet.include = ["Q2"];
+ }
+ const resolved = _loco.resolveLocationSet(locationSet);
+ const locationSetID = resolved.id;
+ obj.locationSetID = locationSetID;
+ if (!resolved.feature.geometry.coordinates.length || !resolved.feature.properties.area) {
+ throw new Error(`locationSet ${locationSetID} resolves to an empty feature.`);
+ }
+ if (!_resolvedFeatures[locationSetID]) {
+ let feature3 = JSON.parse(JSON.stringify(resolved.feature));
+ feature3.id = locationSetID;
+ feature3.properties.id = locationSetID;
+ _resolvedFeatures[locationSetID] = feature3;
+ }
+ } catch (err) {
+ obj.locationSet = { include: ["Q2"] };
+ obj.locationSetID = "+[Q2]";
+ }
+ }
+ function rebuildIndex() {
+ _wp = (0, import_which_polygon2.default)({ features: Object.values(_resolvedFeatures) });
+ }
+ _this.mergeCustomGeoJSON = (fc) => {
+ if (fc && fc.type === "FeatureCollection" && Array.isArray(fc.features)) {
+ fc.features.forEach((feature3) => {
+ feature3.properties = feature3.properties || {};
+ let props = feature3.properties;
+ let id2 = feature3.id || props.id;
+ if (!id2 || !/^\S+\.geojson$/i.test(id2))
+ return;
+ id2 = id2.toLowerCase();
+ feature3.id = id2;
+ props.id = id2;
+ if (!props.area) {
+ const area = import_geojson_area2.default.geometry(feature3.geometry) / 1e6;
+ props.area = Number(area.toFixed(2));
+ }
+ _loco._cache[id2] = feature3;
+ });
+ }
+ };
+ _this.mergeLocationSets = (objects) => {
+ if (!Array.isArray(objects))
+ return Promise.reject("nothing to do");
+ _queue = _queue.concat(utilArrayChunk(objects, 200));
+ if (!_inProcess) {
+ _inProcess = processQueue().then(() => {
+ rebuildIndex();
+ _inProcess = null;
+ return objects;
+ });
+ }
+ return _inProcess;
+ };
+ _this.locationSetID = (locationSet) => {
+ let locationSetID;
+ try {
+ locationSetID = _loco.validateLocationSet(locationSet).id;
+ } catch (err) {
+ locationSetID = "+[Q2]";
+ }
+ return locationSetID;
+ };
+ _this.feature = (locationSetID) => _resolvedFeatures[locationSetID] || _resolvedFeatures["+[Q2]"];
+ _this.locationsAt = (loc) => {
+ let result = {};
+ (_wp(loc, true) || []).forEach((prop) => result[prop.id] = prop.area);
+ return result;
+ };
+ _this.query = (loc, multi) => _wp(loc, multi);
+ _this.loco = () => _loco;
+ _this.wp = () => _wp;
+ return _this;
+ }
+
+ // node_modules/lodash-es/_freeGlobal.js
+ var freeGlobal = typeof global == "object" && global && global.Object === Object && global;
+ var freeGlobal_default = freeGlobal;
+
+ // node_modules/lodash-es/_root.js
+ var freeSelf = typeof self == "object" && self && self.Object === Object && self;
+ var root2 = freeGlobal_default || freeSelf || Function("return this")();
+ var root_default = root2;
+
+ // node_modules/lodash-es/_Symbol.js
+ var Symbol2 = root_default.Symbol;
+ var Symbol_default = Symbol2;
+
+ // node_modules/lodash-es/_getRawTag.js
+ var objectProto = Object.prototype;
+ var hasOwnProperty = objectProto.hasOwnProperty;
+ var nativeObjectToString = objectProto.toString;
+ var symToStringTag = Symbol_default ? Symbol_default.toStringTag : void 0;
+ function getRawTag(value) {
+ var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];
+ try {
+ value[symToStringTag] = void 0;
+ var unmasked = true;
+ } catch (e) {
+ }
+ var result = nativeObjectToString.call(value);
+ if (unmasked) {
+ if (isOwn) {
+ value[symToStringTag] = tag;
+ } else {
+ delete value[symToStringTag];
+ }
+ }
+ return result;
+ }
+ var getRawTag_default = getRawTag;
+
+ // node_modules/lodash-es/_objectToString.js
+ var objectProto2 = Object.prototype;
+ var nativeObjectToString2 = objectProto2.toString;
+ function objectToString(value) {
+ return nativeObjectToString2.call(value);
+ }
+ var objectToString_default = objectToString;
+
+ // node_modules/lodash-es/_baseGetTag.js
+ var nullTag = "[object Null]";
+ var undefinedTag = "[object Undefined]";
+ var symToStringTag2 = Symbol_default ? Symbol_default.toStringTag : void 0;
+ function baseGetTag(value) {
+ if (value == null) {
+ return value === void 0 ? undefinedTag : nullTag;
+ }
+ return symToStringTag2 && symToStringTag2 in Object(value) ? getRawTag_default(value) : objectToString_default(value);
+ }
+ var baseGetTag_default = baseGetTag;
+
+ // node_modules/lodash-es/isObjectLike.js
+ function isObjectLike(value) {
+ return value != null && typeof value == "object";
+ }
+ var isObjectLike_default = isObjectLike;
+
+ // node_modules/lodash-es/isSymbol.js
+ var symbolTag = "[object Symbol]";
+ function isSymbol(value) {
+ return typeof value == "symbol" || isObjectLike_default(value) && baseGetTag_default(value) == symbolTag;
+ }
+ var isSymbol_default = isSymbol;
+
+ // node_modules/lodash-es/_arrayMap.js
+ function arrayMap(array2, iteratee) {
+ var index = -1, length = array2 == null ? 0 : array2.length, result = Array(length);
+ while (++index < length) {
+ result[index] = iteratee(array2[index], index, array2);
+ }
+ return result;
+ }
+ var arrayMap_default = arrayMap;
+
+ // node_modules/lodash-es/isArray.js
+ var isArray = Array.isArray;
+ var isArray_default = isArray;
+
+ // node_modules/lodash-es/_baseToString.js
+ var INFINITY = 1 / 0;
+ var symbolProto = Symbol_default ? Symbol_default.prototype : void 0;
+ var symbolToString = symbolProto ? symbolProto.toString : void 0;
+ function baseToString(value) {
+ if (typeof value == "string") {
+ return value;
+ }
+ if (isArray_default(value)) {
+ return arrayMap_default(value, baseToString) + "";
+ }
+ if (isSymbol_default(value)) {
+ return symbolToString ? symbolToString.call(value) : "";
+ }
+ var result = value + "";
+ return result == "0" && 1 / value == -INFINITY ? "-0" : result;
+ }
+ var baseToString_default = baseToString;
+
+ // node_modules/lodash-es/_trimmedEndIndex.js
+ var reWhitespace = /\s/;
+ function trimmedEndIndex(string) {
+ var index = string.length;
+ while (index-- && reWhitespace.test(string.charAt(index))) {
+ }
+ return index;
+ }
+ var trimmedEndIndex_default = trimmedEndIndex;
+
+ // node_modules/lodash-es/_baseTrim.js
+ var reTrimStart = /^\s+/;
+ function baseTrim(string) {
+ return string ? string.slice(0, trimmedEndIndex_default(string) + 1).replace(reTrimStart, "") : string;
+ }
+ var baseTrim_default = baseTrim;
+
+ // node_modules/lodash-es/isObject.js
+ function isObject(value) {
+ var type3 = typeof value;
+ return value != null && (type3 == "object" || type3 == "function");
+ }
+ var isObject_default = isObject;
+
+ // node_modules/lodash-es/toNumber.js
+ var NAN = 0 / 0;
+ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+ var reIsBinary = /^0b[01]+$/i;
+ var reIsOctal = /^0o[0-7]+$/i;
+ var freeParseInt = parseInt;
+ function toNumber(value) {
+ if (typeof value == "number") {
+ return value;
+ }
+ if (isSymbol_default(value)) {
+ return NAN;
+ }
+ if (isObject_default(value)) {
+ var other = typeof value.valueOf == "function" ? value.valueOf() : value;
+ value = isObject_default(other) ? other + "" : other;
+ }
+ if (typeof value != "string") {
+ return value === 0 ? value : +value;
+ }
+ value = baseTrim_default(value);
+ var isBinary = reIsBinary.test(value);
+ return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
+ }
+ var toNumber_default = toNumber;
+
+ // node_modules/lodash-es/toString.js
+ function toString(value) {
+ return value == null ? "" : baseToString_default(value);
+ }
+ var toString_default = toString;
+
+ // node_modules/lodash-es/_basePropertyOf.js
+ function basePropertyOf(object) {
+ return function(key) {
+ return object == null ? void 0 : object[key];
+ };
+ }
+ var basePropertyOf_default = basePropertyOf;
+
+ // node_modules/lodash-es/now.js
+ var now2 = function() {
+ return root_default.Date.now();
+ };
+ var now_default = now2;
+
+ // node_modules/lodash-es/debounce.js
+ var FUNC_ERROR_TEXT = "Expected a function";
+ var nativeMax = Math.max;
+ var nativeMin = Math.min;
+ function debounce(func, wait, options2) {
+ var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
+ if (typeof func != "function") {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ wait = toNumber_default(wait) || 0;
+ if (isObject_default(options2)) {
+ leading = !!options2.leading;
+ maxing = "maxWait" in options2;
+ maxWait = maxing ? nativeMax(toNumber_default(options2.maxWait) || 0, wait) : maxWait;
+ trailing = "trailing" in options2 ? !!options2.trailing : trailing;
+ }
+ function invokeFunc(time) {
+ var args = lastArgs, thisArg = lastThis;
+ lastArgs = lastThis = void 0;
+ lastInvokeTime = time;
+ result = func.apply(thisArg, args);
+ return result;
+ }
+ function leadingEdge(time) {
+ lastInvokeTime = time;
+ timerId = setTimeout(timerExpired, wait);
+ return leading ? invokeFunc(time) : result;
+ }
+ function remainingWait(time) {
+ var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
+ return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
+ }
+ function shouldInvoke(time) {
+ var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
+ return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
+ }
+ function timerExpired() {
+ var time = now_default();
+ if (shouldInvoke(time)) {
+ return trailingEdge(time);
+ }
+ timerId = setTimeout(timerExpired, remainingWait(time));
+ }
+ function trailingEdge(time) {
+ timerId = void 0;
+ if (trailing && lastArgs) {
+ return invokeFunc(time);
+ }
+ lastArgs = lastThis = void 0;
+ return result;
+ }
+ function cancel() {
+ if (timerId !== void 0) {
+ clearTimeout(timerId);
+ }
+ lastInvokeTime = 0;
+ lastArgs = lastCallTime = lastThis = timerId = void 0;
+ }
+ function flush() {
+ return timerId === void 0 ? result : trailingEdge(now_default());
+ }
+ function debounced() {
+ var time = now_default(), isInvoking = shouldInvoke(time);
+ lastArgs = arguments;
+ lastThis = this;
+ lastCallTime = time;
+ if (isInvoking) {
+ if (timerId === void 0) {
+ return leadingEdge(lastCallTime);
+ }
+ if (maxing) {
+ clearTimeout(timerId);
+ timerId = setTimeout(timerExpired, wait);
+ return invokeFunc(lastCallTime);
+ }
+ }
+ if (timerId === void 0) {
+ timerId = setTimeout(timerExpired, wait);
+ }
+ return result;
+ }
+ debounced.cancel = cancel;
+ debounced.flush = flush;
+ return debounced;
+ }
+ var debounce_default = debounce;
+
+ // node_modules/lodash-es/_escapeHtmlChar.js
+ var htmlEscapes = {
+ "&": "&",
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'"
+ };
+ var escapeHtmlChar = basePropertyOf_default(htmlEscapes);
+ var escapeHtmlChar_default = escapeHtmlChar;
+
+ // node_modules/lodash-es/escape.js
+ var reUnescapedHtml = /[&<>"']/g;
+ var reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
+ function escape2(string) {
+ string = toString_default(string);
+ return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar_default) : string;
+ }
+ var escape_default = escape2;
+
+ // node_modules/lodash-es/throttle.js
+ var FUNC_ERROR_TEXT2 = "Expected a function";
+ function throttle(func, wait, options2) {
+ var leading = true, trailing = true;
+ if (typeof func != "function") {
+ throw new TypeError(FUNC_ERROR_TEXT2);
+ }
+ if (isObject_default(options2)) {
+ leading = "leading" in options2 ? !!options2.leading : leading;
+ trailing = "trailing" in options2 ? !!options2.trailing : trailing;
+ }
+ return debounce_default(func, wait, {
+ "leading": leading,
+ "maxWait": wait,
+ "trailing": trailing
+ });
+ }
+ var throttle_default = throttle;
+
+ // node_modules/lodash-es/_unescapeHtmlChar.js
+ var htmlUnescapes = {
+ "&": "&",
+ "<": "<",
+ ">": ">",
+ """: '"',
+ "'": "'"
+ };
+ var unescapeHtmlChar = basePropertyOf_default(htmlUnescapes);
+ var unescapeHtmlChar_default = unescapeHtmlChar;
+
+ // node_modules/lodash-es/unescape.js
+ var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g;
+ var reHasEscapedHtml = RegExp(reEscapedHtml.source);
+ function unescape2(string) {
+ string = toString_default(string);
+ return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar_default) : string;
+ }
+ var unescape_default = unescape2;
+
+ // modules/core/localizer.js
+ var _mainLocalizer = coreLocalizer();
+ var _t = _mainLocalizer.t;
+ function coreLocalizer() {
+ let localizer = {};
+ let _dataLanguages = {};
+ let _dataLocales = {};
+ let _localeStrings = {};
+ let _localeCode = "en-US";
+ let _localeCodes = ["en-US", "en"];
+ let _languageCode = "en";
+ let _textDirection = "ltr";
+ let _usesMetric = false;
+ let _languageNames = {};
+ let _scriptNames = {};
+ localizer.localeCode = () => _localeCode;
+ localizer.localeCodes = () => _localeCodes;
+ localizer.languageCode = () => _languageCode;
+ localizer.textDirection = () => _textDirection;
+ localizer.usesMetric = () => _usesMetric;
+ localizer.languageNames = () => _languageNames;
+ localizer.scriptNames = () => _scriptNames;
+ let _preferredLocaleCodes = [];
+ localizer.preferredLocaleCodes = function(codes) {
+ if (!arguments.length)
+ return _preferredLocaleCodes;
+ if (typeof codes === "string") {
+ _preferredLocaleCodes = codes.split(/,|;| /gi).filter(Boolean);
+ } else {
+ _preferredLocaleCodes = codes;
+ }
+ return localizer;
+ };
+ var _loadPromise;
+ localizer.ensureLoaded = () => {
+ if (_loadPromise)
+ return _loadPromise;
+ let filesToFetch = [
+ "languages",
+ "locales"
+ ];
+ const localeDirs = {
+ general: "locales",
+ tagging: "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/translations"
+ };
+ let fileMap = _mainFileFetcher.fileMap();
+ for (let scopeId in localeDirs) {
+ const key = `locales_index_${scopeId}`;
+ if (!fileMap[key]) {
+ fileMap[key] = localeDirs[scopeId] + "/index.min.json";
+ }
+ filesToFetch.push(key);
+ }
+ return _loadPromise = Promise.all(filesToFetch.map((key) => _mainFileFetcher.get(key))).then((results) => {
+ _dataLanguages = results[0];
+ _dataLocales = results[1];
+ let indexes = results.slice(2);
+ let requestedLocales = (_preferredLocaleCodes || []).concat(utilDetect().browserLocales).concat(["en"]);
+ _localeCodes = localesToUseFrom(requestedLocales);
+ _localeCode = _localeCodes[0];
+ let loadStringsPromises = [];
+ indexes.forEach((index, i2) => {
+ const fullCoverageIndex = _localeCodes.findIndex(function(locale2) {
+ return index[locale2] && index[locale2].pct === 1;
+ });
+ _localeCodes.slice(0, fullCoverageIndex + 1).forEach(function(code) {
+ let scopeId = Object.keys(localeDirs)[i2];
+ let directory = Object.values(localeDirs)[i2];
+ if (index[code])
+ loadStringsPromises.push(localizer.loadLocale(code, scopeId, directory));
+ });
+ });
+ return Promise.all(loadStringsPromises);
+ }).then(() => {
+ updateForCurrentLocale();
+ }).catch((err) => console.error(err));
+ };
+ function localesToUseFrom(requestedLocales) {
+ let supportedLocales = _dataLocales;
+ let toUse = [];
+ for (let i2 in requestedLocales) {
+ let locale2 = requestedLocales[i2];
+ if (supportedLocales[locale2])
+ toUse.push(locale2);
+ if (locale2.includes("-")) {
+ let langPart = locale2.split("-")[0];
+ if (supportedLocales[langPart])
+ toUse.push(langPart);
+ }
+ }
+ return utilArrayUniq(toUse);
+ }
+ function updateForCurrentLocale() {
+ if (!_localeCode)
+ return;
+ _languageCode = _localeCode.split("-")[0];
+ const currentData = _dataLocales[_localeCode] || _dataLocales[_languageCode];
+ const hash = utilStringQs(window.location.hash);
+ if (hash.rtl === "true") {
+ _textDirection = "rtl";
+ } else if (hash.rtl === "false") {
+ _textDirection = "ltr";
+ } else {
+ _textDirection = currentData && currentData.rtl ? "rtl" : "ltr";
+ }
+ let locale2 = _localeCode;
+ if (locale2.toLowerCase() === "en-us")
+ locale2 = "en";
+ _languageNames = _localeStrings.general[locale2].languageNames;
+ _scriptNames = _localeStrings.general[locale2].scriptNames;
+ _usesMetric = _localeCode.slice(-3).toLowerCase() !== "-us";
+ }
+ localizer.loadLocale = (locale2, scopeId, directory) => {
+ if (locale2.toLowerCase() === "en-us")
+ locale2 = "en";
+ if (_localeStrings[scopeId] && _localeStrings[scopeId][locale2]) {
+ return Promise.resolve(locale2);
+ }
+ let fileMap = _mainFileFetcher.fileMap();
+ const key = `locale_${scopeId}_${locale2}`;
+ if (!fileMap[key]) {
+ fileMap[key] = `${directory}/${locale2}.min.json`;
+ }
+ return _mainFileFetcher.get(key).then((d) => {
+ if (!_localeStrings[scopeId])
+ _localeStrings[scopeId] = {};
+ _localeStrings[scopeId][locale2] = d[locale2];
+ return locale2;
+ });
+ };
+ localizer.pluralRule = function(number3) {
+ return pluralRule(number3, _localeCode);
+ };
+ function pluralRule(number3, localeCode) {
+ const rules = "Intl" in window && Intl.PluralRules && new Intl.PluralRules(localeCode);
+ if (rules) {
+ return rules.select(number3);
+ }
+ if (number3 === 1)
+ return "one";
+ return "other";
+ }
+ localizer.tInfo = function(origStringId, replacements, locale2) {
+ let stringId = origStringId.trim();
+ let scopeId = "general";
+ if (stringId[0] === "_") {
+ let split = stringId.split(".");
+ scopeId = split[0].slice(1);
+ stringId = split.slice(1).join(".");
+ }
+ locale2 = locale2 || _localeCode;
+ let path = stringId.split(".").map((s) => s.replace(/<TX_DOT>/g, ".")).reverse();
+ let stringsKey = locale2;
+ if (stringsKey.toLowerCase() === "en-us")
+ stringsKey = "en";
+ let result = _localeStrings && _localeStrings[scopeId] && _localeStrings[scopeId][stringsKey];
+ while (result !== void 0 && path.length) {
+ result = result[path.pop()];
+ }
+ if (result !== void 0) {
+ if (replacements) {
+ if (typeof result === "object" && Object.keys(result).length) {
+ const number3 = Object.values(replacements).find(function(value) {
+ return typeof value === "number";
+ });
+ if (number3 !== void 0) {
+ const rule = pluralRule(number3, locale2);
+ if (result[rule]) {
+ result = result[rule];
+ } else {
+ result = Object.values(result)[0];
+ }
+ }
+ }
+ if (typeof result === "string") {
+ for (let key in replacements) {
+ let value = replacements[key];
+ if (typeof value === "number") {
+ if (value.toLocaleString) {
+ value = value.toLocaleString(locale2, {
+ style: "decimal",
+ useGrouping: true,
+ minimumFractionDigits: 0
+ });
+ } else {
+ value = value.toString();
+ }
+ }
+ const token = `{${key}}`;
+ const regex = new RegExp(token, "g");
+ result = result.replace(regex, value);
+ }
+ }
+ }
+ if (typeof result === "string") {
+ return {
+ text: result,
+ locale: locale2
+ };
+ }
+ }
+ let index = _localeCodes.indexOf(locale2);
+ if (index >= 0 && index < _localeCodes.length - 1) {
+ let fallback = _localeCodes[index + 1];
+ return localizer.tInfo(origStringId, replacements, fallback);
+ }
+ if (replacements && "default" in replacements) {
+ return {
+ text: replacements.default,
+ locale: null
+ };
+ }
+ const missing = `Missing ${locale2} translation: ${origStringId}`;
+ if (typeof console !== "undefined")
+ console.error(missing);
+ return {
+ text: missing,
+ locale: "en"
+ };
+ };
+ localizer.hasTextForStringId = function(stringId) {
+ return !!localizer.tInfo(stringId, { default: "nothing found" }).locale;
+ };
+ localizer.t = function(stringId, replacements, locale2) {
+ return localizer.tInfo(stringId, replacements, locale2).text;
+ };
+ localizer.t.html = function(stringId, replacements, locale2) {
+ replacements = Object.assign({}, replacements);
+ for (var k in replacements) {
+ if (typeof replacements[k] === "string") {
+ replacements[k] = escape_default(replacements[k]);
+ }
+ if (typeof replacements[k] === "object" && typeof replacements[k].html === "string") {
+ replacements[k] = replacements[k].html;
+ }
+ }
+ const info = localizer.tInfo(stringId, replacements, locale2);
+ if (info.text) {
+ return `<span class="localized-text" lang="${info.locale || "und"}">${info.text}</span>`;
+ } else {
+ return "";
+ }
+ };
+ localizer.t.append = function(stringId, replacements, locale2) {
+ return function(selection2) {
+ const info = localizer.tInfo(stringId, replacements, locale2);
+ return selection2.append("span").attr("class", "localized-text").attr("lang", info.locale || "und").text((replacements && replacements.prefix || "") + info.text + (replacements && replacements.suffix || ""));
+ };
+ };
+ localizer.languageName = (code, options2) => {
+ if (_languageNames[code]) {
+ return _languageNames[code];
+ }
+ if (options2 && options2.localOnly)
+ return null;
+ const langInfo = _dataLanguages[code];
+ if (langInfo) {
+ if (langInfo.nativeName) {
+ return localizer.t("translate.language_and_code", { language: langInfo.nativeName, code });
+ } else if (langInfo.base && langInfo.script) {
+ const base = langInfo.base;
+ if (_languageNames[base]) {
+ const scriptCode = langInfo.script;
+ const script = _scriptNames[scriptCode] || scriptCode;
+ return localizer.t("translate.language_and_code", { language: _languageNames[base], code: script });
+ } else if (_dataLanguages[base] && _dataLanguages[base].nativeName) {
+ return localizer.t("translate.language_and_code", { language: _dataLanguages[base].nativeName, code });
+ }
+ }
+ }
+ return code;
+ };
+ return localizer;
+ }
+
+ // modules/presets/collection.js
+ function presetCollection(collection) {
+ const MAXRESULTS = 50;
+ let _this = {};
+ let _memo = {};
+ _this.collection = collection;
+ _this.item = (id2) => {
+ if (_memo[id2])
+ return _memo[id2];
+ const found = _this.collection.find((d) => d.id === id2);
+ if (found)
+ _memo[id2] = found;
+ return found;
+ };
+ _this.index = (id2) => _this.collection.findIndex((d) => d.id === id2);
+ _this.matchGeometry = (geometry) => {
+ return presetCollection(_this.collection.filter((d) => d.matchGeometry(geometry)));
+ };
+ _this.matchAllGeometry = (geometries) => {
+ return presetCollection(_this.collection.filter((d) => d && d.matchAllGeometry(geometries)));
+ };
+ _this.matchAnyGeometry = (geometries) => {
+ return presetCollection(_this.collection.filter((d) => geometries.some((geom) => d.matchGeometry(geom))));
+ };
+ _this.fallback = (geometry) => {
+ let id2 = geometry;
+ if (id2 === "vertex")
+ id2 = "point";
+ return _this.item(id2);
+ };
+ _this.search = (value, geometry, loc) => {
+ if (!value)
+ return _this;
+ value = value.toLowerCase().trim();
+ function leading(a) {
+ const index = a.indexOf(value);
+ return index === 0 || a[index - 1] === " ";
+ }
+ function leadingStrict(a) {
+ const index = a.indexOf(value);
+ return index === 0;
+ }
+ function sortPresets(nameProp, aliasesProp) {
+ return function sortNames(a, b) {
+ let aCompare = a[nameProp]();
+ let bCompare = b[nameProp]();
+ if (aliasesProp) {
+ const findMatchingAlias = (strings) => {
+ if (strings.some((s) => s === value)) {
+ return strings.find((s) => s === value);
+ } else {
+ return strings.find((s) => s.includes(value));
+ }
+ };
+ aCompare = findMatchingAlias([aCompare].concat(a[aliasesProp]()));
+ bCompare = findMatchingAlias([bCompare].concat(b[aliasesProp]()));
+ }
+ if (value === aCompare)
+ return -1;
+ if (value === bCompare)
+ return 1;
+ let i2 = b.originalScore - a.originalScore;
+ if (i2 !== 0)
+ return i2;
+ i2 = aCompare.indexOf(value) - bCompare.indexOf(value);
+ if (i2 !== 0)
+ return i2;
+ return aCompare.length - bCompare.length;
+ };
+ }
+ let pool = _this.collection;
+ if (Array.isArray(loc)) {
+ const validLocations = _mainLocations.locationsAt(loc);
+ pool = pool.filter((a) => !a.locationSetID || validLocations[a.locationSetID]);
+ }
+ const searchable = pool.filter((a) => a.searchable !== false && a.suggestion !== true);
+ const suggestions = pool.filter((a) => a.suggestion === true);
+ const leadingNames = searchable.filter((a) => leading(a.searchName()) || a.searchAliases().some(leading)).sort(sortPresets("searchName", "searchAliases"));
+ const leadingSuggestions = suggestions.filter((a) => leadingStrict(a.searchName())).sort(sortPresets("searchName"));
+ const leadingNamesStripped = searchable.filter((a) => leading(a.searchNameStripped()) || a.searchAliasesStripped().some(leading)).sort(sortPresets("searchNameStripped", "searchAliasesStripped"));
+ const leadingSuggestionsStripped = suggestions.filter((a) => leadingStrict(a.searchNameStripped())).sort(sortPresets("searchNameStripped"));
+ const leadingTerms = searchable.filter((a) => (a.terms() || []).some(leading));
+ const leadingSuggestionTerms = suggestions.filter((a) => (a.terms() || []).some(leading));
+ const leadingTagValues = searchable.filter((a) => Object.values(a.tags || {}).filter((val) => val !== "*").some(leading));
+ const similarName = searchable.map((a) => ({ preset: a, dist: utilEditDistance(value, a.searchName()) })).filter((a) => a.dist + Math.min(value.length - a.preset.searchName().length, 0) < 3).sort((a, b) => a.dist - b.dist).map((a) => a.preset);
+ const similarSuggestions = suggestions.map((a) => ({ preset: a, dist: utilEditDistance(value, a.searchName()) })).filter((a) => a.dist + Math.min(value.length - a.preset.searchName().length, 0) < 1).sort((a, b) => a.dist - b.dist).map((a) => a.preset);
+ const similarTerms = searchable.filter((a) => {
+ return (a.terms() || []).some((b) => {
+ return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
+ });
+ });
+ let leadingTagKeyValues = [];
+ if (value.includes("=")) {
+ leadingTagKeyValues = searchable.filter((a) => a.tags && Object.keys(a.tags).some((key) => key + "=" + a.tags[key] === value)).concat(searchable.filter((a) => a.tags && Object.keys(a.tags).some((key) => leading(key + "=" + a.tags[key]))));
+ }
+ let results = leadingNames.concat(leadingSuggestions, leadingNamesStripped, leadingSuggestionsStripped, leadingTerms, leadingSuggestionTerms, leadingTagValues, similarName, similarSuggestions, similarTerms, leadingTagKeyValues).slice(0, MAXRESULTS - 1);
+ if (geometry) {
+ if (typeof geometry === "string") {
+ results.push(_this.fallback(geometry));
+ } else {
+ geometry.forEach((geom) => results.push(_this.fallback(geom)));
+ }
+ }
+ return presetCollection(utilArrayUniq(results));
+ };
+ return _this;
+ }
+
+ // modules/presets/category.js
+ function presetCategory(categoryID, category, allPresets) {
+ let _this = Object.assign({}, category);
+ let _searchName;
+ let _searchNameStripped;
+ _this.id = categoryID;
+ _this.members = presetCollection((category.members || []).map((presetID) => allPresets[presetID]).filter(Boolean));
+ _this.geometry = _this.members.collection.reduce((acc, preset) => {
+ for (let i2 in preset.geometry) {
+ const geometry = preset.geometry[i2];
+ if (acc.indexOf(geometry) === -1) {
+ acc.push(geometry);
+ }
+ }
+ return acc;
+ }, []);
+ _this.matchGeometry = (geom) => _this.geometry.indexOf(geom) >= 0;
+ _this.matchAllGeometry = (geometries) => _this.members.collection.some((preset) => preset.matchAllGeometry(geometries));
+ _this.matchScore = () => -1;
+ _this.name = () => _t(`_tagging.presets.categories.${categoryID}.name`, { "default": categoryID });
+ _this.nameLabel = () => _t.html(`_tagging.presets.categories.${categoryID}.name`, { "default": categoryID });
+ _this.terms = () => [];
+ _this.searchName = () => {
+ if (!_searchName) {
+ _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase();
+ }
+ return _searchName;
+ };
+ _this.searchNameStripped = () => {
+ if (!_searchNameStripped) {
+ _searchNameStripped = _this.searchName();
+ if (_searchNameStripped.normalize)
+ _searchNameStripped = _searchNameStripped.normalize("NFD");
+ _searchNameStripped = _searchNameStripped.replace(/[\u0300-\u036f]/g, "");
+ }
+ return _searchNameStripped;
+ };
+ _this.searchAliases = () => [];
+ _this.searchAliasesStripped = () => [];
+ return _this;
+ }
+
+ // modules/presets/field.js
+ function presetField(fieldID, field) {
+ let _this = Object.assign({}, field);
+ _this.id = fieldID;
+ _this.safeid = utilSafeClassName(fieldID);
+ _this.matchGeometry = (geom) => !_this.geometry || _this.geometry.indexOf(geom) !== -1;
+ _this.matchAllGeometry = (geometries) => {
+ return !_this.geometry || geometries.every((geom) => _this.geometry.indexOf(geom) !== -1);
+ };
+ _this.t = (scope, options2) => _t(`_tagging.presets.fields.${fieldID}.${scope}`, options2);
+ _this.t.html = (scope, options2) => _t.html(`_tagging.presets.fields.${fieldID}.${scope}`, options2);
+ _this.hasTextForStringId = (scope) => _mainLocalizer.hasTextForStringId(`_tagging.presets.fields.${fieldID}.${scope}`);
+ _this.title = () => _this.overrideLabel || _this.t("label", { "default": fieldID });
+ _this.label = () => _this.overrideLabel || _this.t.html("label", { "default": fieldID });
+ const _placeholder = _this.placeholder;
+ _this.placeholder = () => _this.t("placeholder", { "default": _placeholder });
+ _this.originalTerms = (_this.terms || []).join();
+ _this.terms = () => _this.t("terms", { "default": _this.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
+ _this.increment = _this.type === "number" ? _this.increment || 1 : void 0;
+ return _this;
+ }
+
+ // modules/presets/preset.js
+ function presetPreset(presetID, preset, addable, allFields, allPresets) {
+ allFields = allFields || {};
+ allPresets = allPresets || {};
+ let _this = Object.assign({}, preset);
+ let _addable = addable || false;
+ let _resolvedFields;
+ let _resolvedMoreFields;
+ let _searchName;
+ let _searchNameStripped;
+ let _searchAliases;
+ let _searchAliasesStripped;
+ _this.id = presetID;
+ _this.safeid = utilSafeClassName(presetID);
+ _this.originalTerms = (_this.terms || []).join();
+ _this.originalName = _this.name || "";
+ _this.originalAliases = (_this.aliases || []).join("\n");
+ _this.originalScore = _this.matchScore || 1;
+ _this.originalReference = _this.reference || {};
+ _this.originalFields = _this.fields || [];
+ _this.originalMoreFields = _this.moreFields || [];
+ _this.fields = () => _resolvedFields || (_resolvedFields = resolve("fields"));
+ _this.moreFields = () => _resolvedMoreFields || (_resolvedMoreFields = resolve("moreFields"));
+ _this.resetFields = () => _resolvedFields = _resolvedMoreFields = null;
+ _this.tags = _this.tags || {};
+ _this.addTags = _this.addTags || _this.tags;
+ _this.removeTags = _this.removeTags || _this.addTags;
+ _this.geometry = _this.geometry || [];
+ _this.matchGeometry = (geom) => _this.geometry.indexOf(geom) >= 0;
+ _this.matchAllGeometry = (geoms) => geoms.every(_this.matchGeometry);
+ _this.matchScore = (entityTags) => {
+ const tags = _this.tags;
+ let seen = {};
+ let score = 0;
+ for (let k in tags) {
+ seen[k] = true;
+ if (entityTags[k] === tags[k]) {
+ score += _this.originalScore;
+ } else if (tags[k] === "*" && k in entityTags) {
+ score += _this.originalScore / 2;
+ } else {
+ return -1;
+ }
+ }
+ const addTags = _this.addTags;
+ for (let k in addTags) {
+ if (!seen[k] && entityTags[k] === addTags[k]) {
+ score += _this.originalScore;
+ }
+ }
+ if (_this.searchable === false) {
+ score *= 0.999;
+ }
+ return score;
+ };
+ _this.t = (scope, options2) => {
+ const textID = `_tagging.presets.presets.${presetID}.${scope}`;
+ return _t(textID, options2);
+ };
+ _this.t.html = (scope, options2) => {
+ const textID = `_tagging.presets.presets.${presetID}.${scope}`;
+ return _t.html(textID, options2);
+ };
+ _this.name = () => {
+ return _this.t("name", { "default": _this.originalName });
+ };
+ _this.nameLabel = () => {
+ return _this.t.html("name", { "default": _this.originalName });
+ };
+ _this.subtitle = () => {
+ if (_this.suggestion) {
+ let path = presetID.split("/");
+ path.pop();
+ return _t("_tagging.presets.presets." + path.join("/") + ".name");
+ }
+ return null;
+ };
+ _this.subtitleLabel = () => {
+ if (_this.suggestion) {
+ let path = presetID.split("/");
+ path.pop();
+ return _t.html("_tagging.presets.presets." + path.join("/") + ".name");
+ }
+ return null;
+ };
+ _this.aliases = () => {
+ return _this.t("aliases", { "default": _this.originalAliases }).trim().split(/\s*[\r\n]+\s*/);
+ };
+ _this.terms = () => _this.t("terms", { "default": _this.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
+ _this.searchName = () => {
+ if (!_searchName) {
+ _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase();
+ }
+ return _searchName;
+ };
+ _this.searchNameStripped = () => {
+ if (!_searchNameStripped) {
+ _searchNameStripped = stripDiacritics(_this.searchName());
+ }
+ return _searchNameStripped;
+ };
+ _this.searchAliases = () => {
+ if (!_searchAliases) {
+ _searchAliases = _this.aliases().map((alias) => alias.toLowerCase());
+ }
+ return _searchAliases;
+ };
+ _this.searchAliasesStripped = () => {
+ if (!_searchAliasesStripped) {
+ _searchAliasesStripped = _this.searchAliases();
+ _searchAliasesStripped = _searchAliasesStripped.map(stripDiacritics);
+ }
+ return _searchAliasesStripped;
+ };
+ _this.isFallback = () => {
+ const tagCount = Object.keys(_this.tags).length;
+ return tagCount === 0 || tagCount === 1 && _this.tags.hasOwnProperty("area");
+ };
+ _this.addable = function(val) {
+ if (!arguments.length)
+ return _addable;
+ _addable = val;
+ return _this;
+ };
+ _this.reference = () => {
+ const qid = _this.tags.wikidata || _this.tags["flag:wikidata"] || _this.tags["brand:wikidata"] || _this.tags["network:wikidata"] || _this.tags["operator:wikidata"];
+ if (qid) {
+ return { qid };
+ }
+ let key = _this.originalReference.key || Object.keys(utilObjectOmit(_this.tags, "name"))[0];
+ let value = _this.originalReference.value || _this.tags[key];
+ if (value === "*") {
+ return { key };
+ } else {
+ return { key, value };
+ }
+ };
+ _this.unsetTags = (tags, geometry, ignoringKeys, skipFieldDefaults) => {
+ let removeTags = ignoringKeys ? utilObjectOmit(_this.removeTags, ignoringKeys) : _this.removeTags;
+ tags = utilObjectOmit(tags, Object.keys(removeTags));
+ if (geometry && !skipFieldDefaults) {
+ _this.fields().forEach((field) => {
+ if (field.matchGeometry(geometry) && field.key && field.default === tags[field.key]) {
+ delete tags[field.key];
+ }
+ });
+ }
+ delete tags.area;
+ return tags;
+ };
+ _this.setTags = (tags, geometry, skipFieldDefaults) => {
+ const addTags = _this.addTags;
+ tags = Object.assign({}, tags);
+ for (let k in addTags) {
+ if (addTags[k] === "*") {
+ if (_this.tags[k] || !tags[k]) {
+ tags[k] = "yes";
+ }
+ } else {
+ tags[k] = addTags[k];
+ }
+ }
+ if (!addTags.hasOwnProperty("area")) {
+ delete tags.area;
+ if (geometry === "area") {
+ let needsAreaTag = true;
+ for (let k in addTags) {
+ if (_this.geometry.indexOf("line") === -1 && k in osmAreaKeys || k in osmAreaKeysExceptions && addTags[k] in osmAreaKeysExceptions[k]) {
+ needsAreaTag = false;
+ break;
+ }
+ }
+ if (needsAreaTag) {
+ tags.area = "yes";
+ }
+ }
+ }
+ if (geometry && !skipFieldDefaults) {
+ _this.fields().forEach((field) => {
+ if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
+ tags[field.key] = field.default;
+ }
+ });
+ }
+ return tags;
+ };
+ function resolve(which) {
+ const fieldIDs = which === "fields" ? _this.originalFields : _this.originalMoreFields;
+ let resolved = [];
+ fieldIDs.forEach((fieldID) => {
+ const match = fieldID.match(/\{(.*)\}/);
+ if (match !== null) {
+ resolved = resolved.concat(inheritFields(match[1], which));
+ } else if (allFields[fieldID]) {
+ resolved.push(allFields[fieldID]);
+ } else {
+ console.log(`Cannot resolve "${fieldID}" found in ${_this.id}.${which}`);
+ }
+ });
+ if (!resolved.length) {
+ const endIndex = _this.id.lastIndexOf("/");
+ const parentID = endIndex && _this.id.substring(0, endIndex);
+ if (parentID) {
+ resolved = inheritFields(parentID, which);
+ }
+ }
+ return utilArrayUniq(resolved);
+ function inheritFields(presetID2, which2) {
+ const parent = allPresets[presetID2];
+ if (!parent)
+ return [];
+ if (which2 === "fields") {
+ return parent.fields().filter(shouldInherit);
+ } else if (which2 === "moreFields") {
+ return parent.moreFields();
+ } else {
+ return [];
+ }
+ }
+ function shouldInherit(f2) {
+ if (f2.key && _this.tags[f2.key] !== void 0 && f2.type !== "multiCombo" && f2.type !== "semiCombo" && f2.type !== "manyCombo" && f2.type !== "check")
+ return false;
+ return true;
+ }
+ }
+ function stripDiacritics(s) {
+ if (s.normalize)
+ s = s.normalize("NFD");
+ s = s.replace(/[\u0300-\u036f]/g, "");
+ return s;
+ }
+ return _this;
+ }
+
+ // modules/presets/index.js
+ var _mainPresetIndex = presetIndex();
+ function presetIndex() {
+ const dispatch10 = dispatch_default("favoritePreset", "recentsChange");
+ const MAXRECENTS = 30;
+ const POINT = presetPreset("point", { name: "Point", tags: {}, geometry: ["point", "vertex"], matchScore: 0.1 });
+ const LINE = presetPreset("line", { name: "Line", tags: {}, geometry: ["line"], matchScore: 0.1 });
+ const AREA = presetPreset("area", { name: "Area", tags: { area: "yes" }, geometry: ["area"], matchScore: 0.1 });
+ const RELATION = presetPreset("relation", { name: "Relation", tags: {}, geometry: ["relation"], matchScore: 0.1 });
+ let _this = presetCollection([POINT, LINE, AREA, RELATION]);
+ let _presets = { point: POINT, line: LINE, area: AREA, relation: RELATION };
+ let _defaults = {
+ point: presetCollection([POINT]),
+ vertex: presetCollection([POINT]),
+ line: presetCollection([LINE]),
+ area: presetCollection([AREA]),
+ relation: presetCollection([RELATION])
+ };
+ let _fields = {};
+ let _categories = {};
+ let _universal = [];
+ let _addablePresetIDs = null;
+ let _recents;
+ let _favorites;
+ let _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
+ let _loadPromise;
+ _this.ensureLoaded = () => {
+ if (_loadPromise)
+ return _loadPromise;
+ return _loadPromise = Promise.all([
+ _mainFileFetcher.get("preset_categories"),
+ _mainFileFetcher.get("preset_defaults"),
+ _mainFileFetcher.get("preset_presets"),
+ _mainFileFetcher.get("preset_fields")
+ ]).then((vals) => {
+ _this.merge({
+ categories: vals[0],
+ defaults: vals[1],
+ presets: vals[2],
+ fields: vals[3]
+ });
+ osmSetAreaKeys(_this.areaKeys());
+ osmSetPointTags(_this.pointTags());
+ osmSetVertexTags(_this.vertexTags());
+ });
+ };
+ _this.merge = (d) => {
+ let newLocationSets = [];
+ if (d.fields) {
+ Object.keys(d.fields).forEach((fieldID) => {
+ let f2 = d.fields[fieldID];
+ if (f2) {
+ f2 = presetField(fieldID, f2);
+ if (f2.locationSet)
+ newLocationSets.push(f2);
+ _fields[fieldID] = f2;
+ } else {
+ delete _fields[fieldID];
+ }
+ });
+ }
+ if (d.presets) {
+ Object.keys(d.presets).forEach((presetID) => {
+ let p = d.presets[presetID];
+ if (p) {
+ const isAddable = !_addablePresetIDs || _addablePresetIDs.has(presetID);
+ p = presetPreset(presetID, p, isAddable, _fields, _presets);
+ if (p.locationSet)
+ newLocationSets.push(p);
+ _presets[presetID] = p;
+ } else {
+ const existing = _presets[presetID];
+ if (existing && !existing.isFallback()) {
+ delete _presets[presetID];
+ }
+ }
+ });
+ }
+ if (d.categories) {
+ Object.keys(d.categories).forEach((categoryID) => {
+ let c = d.categories[categoryID];
+ if (c) {
+ c = presetCategory(categoryID, c, _presets);
+ if (c.locationSet)
+ newLocationSets.push(c);
+ _categories[categoryID] = c;
+ } else {
+ delete _categories[categoryID];
+ }
+ });
+ }
+ _this.collection = Object.values(_presets).concat(Object.values(_categories));
+ if (d.defaults) {
+ Object.keys(d.defaults).forEach((geometry) => {
+ const def = d.defaults[geometry];
+ if (Array.isArray(def)) {
+ _defaults[geometry] = presetCollection(def.map((id2) => _presets[id2] || _categories[id2]).filter(Boolean));
+ } else {
+ delete _defaults[geometry];
+ }
+ });
+ }
+ _universal = Object.values(_fields).filter((field) => field.universal);
+ Object.values(_presets).forEach((preset) => preset.resetFields());
+ _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
+ _this.collection.forEach((preset) => {
+ (preset.geometry || []).forEach((geometry) => {
+ let g = _geometryIndex[geometry];
+ for (let key in preset.tags) {
+ g[key] = g[key] || {};
+ let value = preset.tags[key];
+ (g[key][value] = g[key][value] || []).push(preset);
+ }
+ });
+ });
+ if (d.featureCollection && Array.isArray(d.featureCollection.features)) {
+ _mainLocations.mergeCustomGeoJSON(d.featureCollection);
+ }
+ if (newLocationSets.length) {
+ _mainLocations.mergeLocationSets(newLocationSets);
+ }
+ return _this;
+ };
+ _this.match = (entity, resolver) => {
+ return resolver.transient(entity, "presetMatch", () => {
+ let geometry = entity.geometry(resolver);
+ if (geometry === "vertex" && entity.isOnAddressLine(resolver)) {
+ geometry = "point";
+ }
+ const entityExtent = entity.extent(resolver);
+ return _this.matchTags(entity.tags, geometry, entityExtent.center());
+ });
+ };
+ _this.matchTags = (tags, geometry, loc) => {
+ const keyIndex = _geometryIndex[geometry];
+ let bestScore = -1;
+ let bestMatch;
+ let matchCandidates = [];
+ for (let k in tags) {
+ let indexMatches = [];
+ let valueIndex = keyIndex[k];
+ if (!valueIndex)
+ continue;
+ let keyValueMatches = valueIndex[tags[k]];
+ if (keyValueMatches)
+ indexMatches.push(...keyValueMatches);
+ let keyStarMatches = valueIndex["*"];
+ if (keyStarMatches)
+ indexMatches.push(...keyStarMatches);
+ if (indexMatches.length === 0)
+ continue;
+ for (let i2 = 0; i2 < indexMatches.length; i2++) {
+ const candidate = indexMatches[i2];
+ const score = candidate.matchScore(tags);
+ if (score === -1) {
+ continue;
+ }
+ matchCandidates.push({ score, candidate });
+ if (score > bestScore) {
+ bestScore = score;
+ bestMatch = candidate;
+ }
+ }
+ }
+ if (bestMatch && bestMatch.locationSetID && bestMatch.locationSetID !== "+[Q2]" && Array.isArray(loc)) {
+ let validLocations = _mainLocations.locationsAt(loc);
+ if (!validLocations[bestMatch.locationSetID]) {
+ matchCandidates.sort((a, b) => a.score < b.score ? 1 : -1);
+ for (let i2 = 0; i2 < matchCandidates.length; i2++) {
+ const candidateScore = matchCandidates[i2];
+ if (!candidateScore.candidate.locationSetID || validLocations[candidateScore.candidate.locationSetID]) {
+ bestMatch = candidateScore.candidate;
+ bestScore = candidateScore.score;
+ break;
+ }
+ }
+ }
+ }
+ if (!bestMatch || bestMatch.isFallback()) {
+ for (let k in tags) {
+ if (/^addr:/.test(k) && keyIndex["addr:*"] && keyIndex["addr:*"]["*"]) {
+ bestMatch = keyIndex["addr:*"]["*"][0];
+ break;
+ }
+ }
+ }
+ return bestMatch || _this.fallback(geometry);
+ };
+ _this.allowsVertex = (entity, resolver) => {
+ if (entity.type !== "node")
+ return false;
+ if (Object.keys(entity.tags).length === 0)
+ return true;
+ return resolver.transient(entity, "vertexMatch", () => {
+ if (entity.isOnAddressLine(resolver))
+ return true;
+ const geometries = osmNodeGeometriesForTags(entity.tags);
+ if (geometries.vertex)
+ return true;
+ if (geometries.point)
+ return false;
+ return true;
+ });
+ };
+ _this.areaKeys = () => {
+ const ignore = {
+ barrier: true,
+ highway: true,
+ footway: true,
+ railway: true,
+ junction: true,
+ type: true
+ };
+ let areaKeys = {};
+ const presets = _this.collection.filter((p) => !p.suggestion && !p.replacement);
+ presets.forEach((p) => {
+ const keys = p.tags && Object.keys(p.tags);
+ const key = keys && keys.length && keys[0];
+ if (!key)
+ return;
+ if (ignore[key])
+ return;
+ if (p.geometry.indexOf("area") !== -1) {
+ areaKeys[key] = areaKeys[key] || {};
+ }
+ });
+ presets.forEach((p) => {
+ let key;
+ for (key in p.addTags) {
+ const value = p.addTags[key];
+ if (key in areaKeys && p.geometry.indexOf("line") !== -1 && value !== "*") {
+ areaKeys[key][value] = true;
+ }
+ }
+ });
+ return areaKeys;
+ };
+ _this.pointTags = () => {
+ return _this.collection.reduce((pointTags, d) => {
+ if (d.suggestion || d.replacement || d.searchable === false)
+ return pointTags;
+ const keys = d.tags && Object.keys(d.tags);
+ const key = keys && keys.length && keys[0];
+ if (!key)
+ return pointTags;
+ if (d.geometry.indexOf("point") !== -1) {
+ pointTags[key] = pointTags[key] || {};
+ pointTags[key][d.tags[key]] = true;
+ }
+ return pointTags;
+ }, {});
+ };
+ _this.vertexTags = () => {
+ return _this.collection.reduce((vertexTags, d) => {
+ if (d.suggestion || d.replacement || d.searchable === false)
+ return vertexTags;
+ const keys = d.tags && Object.keys(d.tags);
+ const key = keys && keys.length && keys[0];
+ if (!key)
+ return vertexTags;
+ if (d.geometry.indexOf("vertex") !== -1) {
+ vertexTags[key] = vertexTags[key] || {};
+ vertexTags[key][d.tags[key]] = true;
+ }
+ return vertexTags;
+ }, {});
+ };
+ _this.field = (id2) => _fields[id2];
+ _this.universal = () => _universal;
+ _this.defaults = (geometry, n2, startWithRecents, loc) => {
+ let recents = [];
+ if (startWithRecents) {
+ recents = _this.recent().matchGeometry(geometry).collection.slice(0, 4);
+ }
+ let defaults2;
+ if (_addablePresetIDs) {
+ defaults2 = Array.from(_addablePresetIDs).map(function(id2) {
+ var preset = _this.item(id2);
+ if (preset && preset.matchGeometry(geometry))
+ return preset;
+ return null;
+ }).filter(Boolean);
+ } else {
+ defaults2 = _defaults[geometry].collection.concat(_this.fallback(geometry));
+ }
+ let result = presetCollection(utilArrayUniq(recents.concat(defaults2)).slice(0, n2 - 1));
+ if (Array.isArray(loc)) {
+ const validLocations = _mainLocations.locationsAt(loc);
+ result.collection = result.collection.filter((a) => !a.locationSetID || validLocations[a.locationSetID]);
+ }
+ return result;
+ };
+ _this.addablePresetIDs = function(val) {
+ if (!arguments.length)
+ return _addablePresetIDs;
+ if (Array.isArray(val))
+ val = new Set(val);
+ _addablePresetIDs = val;
+ if (_addablePresetIDs) {
+ _this.collection.forEach((p) => {
+ if (p.addable)
+ p.addable(_addablePresetIDs.has(p.id));
+ });
+ } else {
+ _this.collection.forEach((p) => {
+ if (p.addable)
+ p.addable(true);
+ });
+ }
+ return _this;
+ };
+ _this.recent = () => {
+ return presetCollection(utilArrayUniq(_this.getRecents().map((d) => d.preset)));
+ };
+ function RibbonItem(preset, source) {
+ let item = {};
+ item.preset = preset;
+ item.source = source;
+ item.isFavorite = () => item.source === "favorite";
+ item.isRecent = () => item.source === "recent";
+ item.matches = (preset2) => item.preset.id === preset2.id;
+ item.minified = () => ({ pID: item.preset.id });
+ return item;
+ }
+ function ribbonItemForMinified(d, source) {
+ if (d && d.pID) {
+ const preset = _this.item(d.pID);
+ if (!preset)
+ return null;
+ return RibbonItem(preset, source);
+ }
+ return null;
+ }
+ _this.getGenericRibbonItems = () => {
+ return ["point", "line", "area"].map((id2) => RibbonItem(_this.item(id2), "generic"));
+ };
+ _this.getAddable = () => {
+ if (!_addablePresetIDs)
+ return [];
+ return _addablePresetIDs.map((id2) => {
+ const preset = _this.item(id2);
+ if (preset)
+ return RibbonItem(preset, "addable");
+ return null;
+ }).filter(Boolean);
+ };
+ function setRecents(items) {
+ _recents = items;
+ const minifiedItems = items.map((d) => d.minified());
+ corePreferences("preset_recents", JSON.stringify(minifiedItems));
+ dispatch10.call("recentsChange");
+ }
+ _this.getRecents = () => {
+ if (!_recents) {
+ _recents = (JSON.parse(corePreferences("preset_recents")) || []).reduce((acc, d) => {
+ let item = ribbonItemForMinified(d, "recent");
+ if (item && item.preset.addable())
+ acc.push(item);
+ return acc;
+ }, []);
+ }
+ return _recents;
+ };
+ _this.addRecent = (preset, besidePreset, after) => {
+ const recents = _this.getRecents();
+ const beforeItem = _this.recentMatching(besidePreset);
+ let toIndex = recents.indexOf(beforeItem);
+ if (after)
+ toIndex += 1;
+ const newItem = RibbonItem(preset, "recent");
+ recents.splice(toIndex, 0, newItem);
+ setRecents(recents);
+ };
+ _this.removeRecent = (preset) => {
+ const item = _this.recentMatching(preset);
+ if (item) {
+ let items = _this.getRecents();
+ items.splice(items.indexOf(item), 1);
+ setRecents(items);
+ }
+ };
+ _this.recentMatching = (preset) => {
+ const items = _this.getRecents();
+ for (let i2 in items) {
+ if (items[i2].matches(preset)) {
+ return items[i2];
+ }
+ }
+ return null;
+ };
+ _this.moveItem = (items, fromIndex, toIndex) => {
+ if (fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= items.length || toIndex >= items.length)
+ return null;
+ items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]);
+ return items;
+ };
+ _this.moveRecent = (item, beforeItem) => {
+ const recents = _this.getRecents();
+ const fromIndex = recents.indexOf(item);
+ const toIndex = recents.indexOf(beforeItem);
+ const items = _this.moveItem(recents, fromIndex, toIndex);
+ if (items)
+ setRecents(items);
+ };
+ _this.setMostRecent = (preset) => {
+ if (preset.searchable === false)
+ return;
+ let items = _this.getRecents();
+ let item = _this.recentMatching(preset);
+ if (item) {
+ items.splice(items.indexOf(item), 1);
+ } else {
+ item = RibbonItem(preset, "recent");
+ }
+ while (items.length >= MAXRECENTS) {
+ items.pop();
+ }
+ items.unshift(item);
+ setRecents(items);
+ };
+ function setFavorites(items) {
+ _favorites = items;
+ const minifiedItems = items.map((d) => d.minified());
+ corePreferences("preset_favorites", JSON.stringify(minifiedItems));
+ dispatch10.call("favoritePreset");
+ }
+ _this.addFavorite = (preset, besidePreset, after) => {
+ const favorites = _this.getFavorites();
+ const beforeItem = _this.favoriteMatching(besidePreset);
+ let toIndex = favorites.indexOf(beforeItem);
+ if (after)
+ toIndex += 1;
+ const newItem = RibbonItem(preset, "favorite");
+ favorites.splice(toIndex, 0, newItem);
+ setFavorites(favorites);
+ };
+ _this.toggleFavorite = (preset) => {
+ const favs = _this.getFavorites();
+ const favorite = _this.favoriteMatching(preset);
+ if (favorite) {
+ favs.splice(favs.indexOf(favorite), 1);
+ } else {
+ if (favs.length === 10) {
+ favs.pop();
+ }
+ favs.push(RibbonItem(preset, "favorite"));
+ }
+ setFavorites(favs);
+ };
+ _this.removeFavorite = (preset) => {
+ const item = _this.favoriteMatching(preset);
+ if (item) {
+ const items = _this.getFavorites();
+ items.splice(items.indexOf(item), 1);
+ setFavorites(items);
+ }
+ };
+ _this.getFavorites = () => {
+ if (!_favorites) {
+ let rawFavorites = JSON.parse(corePreferences("preset_favorites"));
+ if (!rawFavorites) {
+ rawFavorites = [];
+ corePreferences("preset_favorites", JSON.stringify(rawFavorites));
+ }
+ _favorites = rawFavorites.reduce((output, d) => {
+ const item = ribbonItemForMinified(d, "favorite");
+ if (item && item.preset.addable())
+ output.push(item);
+ return output;
+ }, []);
+ }
+ return _favorites;
+ };
+ _this.favoriteMatching = (preset) => {
+ const favs = _this.getFavorites();
+ for (let index in favs) {
+ if (favs[index].matches(preset)) {
+ return favs[index];
+ }
+ }
+ return null;
+ };
+ return utilRebind(_this, dispatch10, "on");
+ }
+
+ // modules/util/util.js
+ function utilTagText(entity) {
+ var obj = entity && entity.tags || {};
+ return Object.keys(obj).map(function(k) {
+ return k + "=" + obj[k];
+ }).join(", ");
+ }
+ function utilTotalExtent(array2, graph) {
+ var extent = geoExtent();
+ var val, entity;
+ for (var i2 = 0; i2 < array2.length; i2++) {
+ val = array2[i2];
+ entity = typeof val === "string" ? graph.hasEntity(val) : val;
+ if (entity) {
+ extent._extend(entity.extent(graph));
+ }
+ }
+ return extent;
+ }
+ function utilTagDiff(oldTags, newTags) {
+ var tagDiff = [];
+ var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort();
+ keys.forEach(function(k) {
+ var oldVal = oldTags[k];
+ var newVal = newTags[k];
+ if ((oldVal || oldVal === "") && (newVal === void 0 || newVal !== oldVal)) {
+ tagDiff.push({
+ type: "-",
+ key: k,
+ oldVal,
+ newVal,
+ display: "- " + k + "=" + oldVal
+ });
+ }
+ if ((newVal || newVal === "") && (oldVal === void 0 || newVal !== oldVal)) {
+ tagDiff.push({
+ type: "+",
+ key: k,
+ oldVal,
+ newVal,
+ display: "+ " + k + "=" + newVal
+ });
+ }
+ });
+ return tagDiff;
+ }
+ function utilEntitySelector(ids) {
+ return ids.length ? "." + ids.join(",.") : "nothing";
+ }
+ function utilEntityOrMemberSelector(ids, graph) {
+ var seen = new Set(ids);
+ ids.forEach(collectShallowDescendants);
+ return utilEntitySelector(Array.from(seen));
+ function collectShallowDescendants(id2) {
+ var entity = graph.hasEntity(id2);
+ if (!entity || entity.type !== "relation")
+ return;
+ entity.members.map(function(member) {
+ return member.id;
+ }).forEach(function(id3) {
+ seen.add(id3);
+ });
+ }
+ }
+ function utilEntityOrDeepMemberSelector(ids, graph) {
+ return utilEntitySelector(utilEntityAndDeepMemberIDs(ids, graph));
+ }
+ function utilEntityAndDeepMemberIDs(ids, graph) {
+ var seen = /* @__PURE__ */ new Set();
+ ids.forEach(collectDeepDescendants);
+ return Array.from(seen);
+ function collectDeepDescendants(id2) {
+ if (seen.has(id2))
+ return;
+ seen.add(id2);
+ var entity = graph.hasEntity(id2);
+ if (!entity || entity.type !== "relation")
+ return;
+ entity.members.map(function(member) {
+ return member.id;
+ }).forEach(collectDeepDescendants);
+ }
+ }
+ function utilDeepMemberSelector(ids, graph, skipMultipolgonMembers) {
+ var idsSet = new Set(ids);
+ var seen = /* @__PURE__ */ new Set();
+ var returners = /* @__PURE__ */ new Set();
+ ids.forEach(collectDeepDescendants);
+ return utilEntitySelector(Array.from(returners));
+ function collectDeepDescendants(id2) {
+ if (seen.has(id2))
+ return;
+ seen.add(id2);
+ if (!idsSet.has(id2)) {
+ returners.add(id2);
+ }
+ var entity = graph.hasEntity(id2);
+ if (!entity || entity.type !== "relation")
+ return;
+ if (skipMultipolgonMembers && entity.isMultipolygon())
+ return;
+ entity.members.map(function(member) {
+ return member.id;
+ }).forEach(collectDeepDescendants);
+ }
+ }
+ function utilHighlightEntities(ids, highlighted, context) {
+ context.surface().selectAll(utilEntityOrDeepMemberSelector(ids, context.graph())).classed("highlighted", highlighted);
+ }
+ function utilGetAllNodes(ids, graph) {
+ var seen = /* @__PURE__ */ new Set();
+ var nodes = /* @__PURE__ */ new Set();
+ ids.forEach(collectNodes);
+ return Array.from(nodes);
+ function collectNodes(id2) {
+ if (seen.has(id2))
+ return;
+ seen.add(id2);
+ var entity = graph.hasEntity(id2);
+ if (!entity)
+ return;
+ if (entity.type === "node") {
+ nodes.add(entity);
+ } else if (entity.type === "way") {
+ entity.nodes.forEach(collectNodes);
+ } else {
+ entity.members.map(function(member) {
+ return member.id;
+ }).forEach(collectNodes);
+ }
+ }
+ }
+ function utilDisplayName(entity) {
+ var localizedNameKey = "name:" + _mainLocalizer.languageCode().toLowerCase();
+ var name2 = entity.tags[localizedNameKey] || entity.tags.name || "";
+ if (name2)
+ return name2;
+ var tags = {
+ direction: entity.tags.direction,
+ from: entity.tags.from,
+ network: entity.tags.cycle_network || entity.tags.network,
+ ref: entity.tags.ref,
+ to: entity.tags.to,
+ via: entity.tags.via
+ };
+ var keyComponents = [];
+ if (tags.network) {
+ keyComponents.push("network");
+ }
+ if (tags.ref) {
+ keyComponents.push("ref");
+ }
+ if (entity.tags.route) {
+ if (tags.direction) {
+ keyComponents.push("direction");
+ } else if (tags.from && tags.to) {
+ keyComponents.push("from");
+ keyComponents.push("to");
+ if (tags.via) {
+ keyComponents.push("via");
+ }
+ }
+ }
+ if (keyComponents.length) {
+ name2 = _t("inspector.display_name." + keyComponents.join("_"), tags);
+ }
+ return name2;
+ }
+ function utilDisplayNameForPath(entity) {
+ var name2 = utilDisplayName(entity);
+ var isFirefox = utilDetect().browser.toLowerCase().indexOf("firefox") > -1;
+ var isNewChromium = Number(utilDetect().version.split(".")[0]) >= 96;
+ if (!isFirefox && !isNewChromium && name2 && rtlRegex.test(name2)) {
+ name2 = fixRTLTextForSvg(name2);
+ }
+ return name2;
+ }
+ function utilDisplayType(id2) {
+ return {
+ n: _t("inspector.node"),
+ w: _t("inspector.way"),
+ r: _t("inspector.relation")
+ }[id2.charAt(0)];
+ }
+ function utilDisplayLabel(entity, graphOrGeometry, verbose) {
+ var result;
+ var displayName = utilDisplayName(entity);
+ var preset = typeof graphOrGeometry === "string" ? _mainPresetIndex.matchTags(entity.tags, graphOrGeometry) : _mainPresetIndex.match(entity, graphOrGeometry);
+ var presetName = preset && (preset.suggestion ? preset.subtitle() : preset.name());
+ if (verbose) {
+ result = [presetName, displayName].filter(Boolean).join(" ");
+ } else {
+ result = displayName || presetName;
+ }
+ return result || utilDisplayType(entity.id);
+ }
+ function utilEntityRoot(entityType) {
+ return {
+ node: "n",
+ way: "w",
+ relation: "r"
+ }[entityType];
+ }
+ function utilCombinedTags(entityIDs, graph) {
+ var tags = {};
+ var tagCounts = {};
+ var allKeys = /* @__PURE__ */ new Set();
+ var entities = entityIDs.map(function(entityID) {
+ return graph.hasEntity(entityID);
+ }).filter(Boolean);
+ entities.forEach(function(entity) {
+ var keys = Object.keys(entity.tags).filter(Boolean);
+ keys.forEach(function(key2) {
+ allKeys.add(key2);
+ });
+ });
+ entities.forEach(function(entity) {
+ allKeys.forEach(function(key2) {
+ var value = entity.tags[key2];
+ if (!tags.hasOwnProperty(key2)) {
+ tags[key2] = value;
+ } else {
+ if (!Array.isArray(tags[key2])) {
+ if (tags[key2] !== value) {
+ tags[key2] = [tags[key2], value];
+ }
+ } else {
+ if (tags[key2].indexOf(value) === -1) {
+ tags[key2].push(value);
+ }
+ }
+ }
+ var tagHash = key2 + "=" + value;
+ if (!tagCounts[tagHash])
+ tagCounts[tagHash] = 0;
+ tagCounts[tagHash] += 1;
+ });
+ });
+ for (var key in tags) {
+ if (!Array.isArray(tags[key]))
+ continue;
+ tags[key] = tags[key].sort(function(val1, val2) {
+ var key2 = key2;
+ var count2 = tagCounts[key2 + "=" + val2];
+ var count1 = tagCounts[key2 + "=" + val1];
+ if (count2 !== count1) {
+ return count2 - count1;
+ }
+ if (val2 && val1) {
+ return val1.localeCompare(val2);
+ }
+ return val1 ? 1 : -1;
+ });
+ }
+ return tags;
+ }
+ function utilStringQs(str2) {
+ var i2 = 0;
+ while (i2 < str2.length && (str2[i2] === "?" || str2[i2] === "#"))
+ i2++;
+ str2 = str2.slice(i2);
+ return str2.split("&").reduce(function(obj, pair2) {
+ var parts = pair2.split("=");
+ if (parts.length === 2) {
+ obj[parts[0]] = parts[1] === null ? "" : decodeURIComponent(parts[1]);
+ }
+ return obj;
+ }, {});
+ }
+ function utilQsString(obj, noencode) {
+ function softEncode(s) {
+ return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
+ }
+ return Object.keys(obj).sort().map(function(key) {
+ return encodeURIComponent(key) + "=" + (noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
+ }).join("&");
+ }
+ function utilPrefixDOMProperty(property) {
+ var prefixes2 = ["webkit", "ms", "moz", "o"];
+ var i2 = -1;
+ var n2 = prefixes2.length;
+ var s = document.body;
+ if (property in s)
+ return property;
+ property = property.substr(0, 1).toUpperCase() + property.substr(1);
+ while (++i2 < n2) {
+ if (prefixes2[i2] + property in s) {
+ return prefixes2[i2] + property;
+ }
+ }
+ return false;
+ }
+ function utilPrefixCSSProperty(property) {
+ var prefixes2 = ["webkit", "ms", "Moz", "O"];
+ var i2 = -1;
+ var n2 = prefixes2.length;
+ var s = document.body.style;
+ if (property.toLowerCase() in s) {
+ return property.toLowerCase();
+ }
+ while (++i2 < n2) {
+ if (prefixes2[i2] + property in s) {
+ return "-" + prefixes2[i2].toLowerCase() + property.replace(/([A-Z])/g, "-$1").toLowerCase();
+ }
+ }
+ return false;
+ }
+ var transformProperty;
+ function utilSetTransform(el, x, y, scale) {
+ var prop = transformProperty = transformProperty || utilPrefixCSSProperty("Transform");
+ var translate = utilDetect().opera ? "translate(" + x + "px," + y + "px)" : "translate3d(" + x + "px," + y + "px,0)";
+ return el.style(prop, translate + (scale ? " scale(" + scale + ")" : ""));
+ }
+ function utilEditDistance(a, b) {
+ a = (0, import_diacritics.remove)(a.toLowerCase());
+ b = (0, import_diacritics.remove)(b.toLowerCase());
+ if (a.length === 0)
+ return b.length;
+ if (b.length === 0)
+ return a.length;
+ var matrix = [];
+ var i2, j2;
+ for (i2 = 0; i2 <= b.length; i2++) {
+ matrix[i2] = [i2];
+ }
+ for (j2 = 0; j2 <= a.length; j2++) {
+ matrix[0][j2] = j2;
+ }
+ for (i2 = 1; i2 <= b.length; i2++) {
+ for (j2 = 1; j2 <= a.length; j2++) {
+ if (b.charAt(i2 - 1) === a.charAt(j2 - 1)) {
+ matrix[i2][j2] = matrix[i2 - 1][j2 - 1];
+ } else {
+ matrix[i2][j2] = Math.min(matrix[i2 - 1][j2 - 1] + 1, Math.min(matrix[i2][j2 - 1] + 1, matrix[i2 - 1][j2] + 1));
+ }
+ }
+ }
+ return matrix[b.length][a.length];
+ }
+ function utilFastMouse(container) {
+ var rect = container.getBoundingClientRect();
+ var rectLeft = rect.left;
+ var rectTop = rect.top;
+ var clientLeft = +container.clientLeft;
+ var clientTop = +container.clientTop;
+ return function(e) {
+ return [
+ e.clientX - rectLeft - clientLeft,
+ e.clientY - rectTop - clientTop
+ ];
+ };
+ }
+ function utilAsyncMap(inputs, func, callback) {
+ var remaining = inputs.length;
+ var results = [];
+ var errors = [];
+ inputs.forEach(function(d, i2) {
+ func(d, function done(err, data) {
+ errors[i2] = err;
+ results[i2] = data;
+ remaining--;
+ if (!remaining)
+ callback(errors, results);
+ });
+ });
+ }
+ function utilWrap(index, length) {
+ if (index < 0) {
+ index += Math.ceil(-index / length) * length;
+ }
+ return index % length;
+ }
+ function utilFunctor(value) {
+ if (typeof value === "function")
+ return value;
+ return function() {
+ return value;
+ };
+ }
+ function utilNoAuto(selection2) {
+ var isText = selection2.size() && selection2.node().tagName.toLowerCase() === "textarea";
+ return selection2.attr("autocomplete", "new-password").attr("autocorrect", "off").attr("autocapitalize", "off").attr("spellcheck", isText ? "true" : "false");
+ }
+ function utilHashcode(str2) {
+ var hash = 0;
+ if (str2.length === 0) {
+ return hash;
+ }
+ for (var i2 = 0; i2 < str2.length; i2++) {
+ var char = str2.charCodeAt(i2);
+ hash = (hash << 5) - hash + char;
+ hash = hash & hash;
+ }
+ return hash;
+ }
+ function utilSafeClassName(str2) {
+ return str2.toLowerCase().replace(/[^a-z0-9]+/g, "_");
+ }
+ function utilUniqueDomId(val) {
+ return "ideditor-" + utilSafeClassName(val.toString()) + "-" + new Date().getTime().toString();
+ }
+ function utilUnicodeCharsCount(str2) {
+ return Array.from(str2).length;
+ }
+ function utilUnicodeCharsTruncated(str2, limit) {
+ return Array.from(str2).slice(0, limit).join("");
+ }
+ function toNumericID(id2) {
+ var match = id2.match(/^[cnwr](-?\d+)$/);
+ if (match) {
+ return parseInt(match[1], 10);
+ }
+ return NaN;
+ }
+ function compareNumericIDs(left, right) {
+ if (isNaN(left) && isNaN(right))
+ return -1;
+ if (isNaN(left))
+ return 1;
+ if (isNaN(right))
+ return -1;
+ if (Math.sign(left) !== Math.sign(right))
+ return -Math.sign(left);
+ if (Math.sign(left) < 0)
+ return Math.sign(right - left);
+ return Math.sign(left - right);
+ }
+ function utilCompareIDs(left, right) {
+ return compareNumericIDs(toNumericID(left), toNumericID(right));
+ }
+ function utilOldestID(ids) {
+ if (ids.length === 0) {
+ return void 0;
+ }
+ var oldestIDIndex = 0;
+ var oldestID = toNumericID(ids[0]);
+ for (var i2 = 1; i2 < ids.length; i2++) {
+ var num = toNumericID(ids[i2]);
+ if (compareNumericIDs(oldestID, num) === 1) {
+ oldestIDIndex = i2;
+ oldestID = num;
+ }
+ }
+ return ids[oldestIDIndex];
+ }
+
+ // modules/osm/entity.js
+ function osmEntity(attrs) {
+ if (this instanceof osmEntity)
+ return;
+ if (attrs && attrs.type) {
+ return osmEntity[attrs.type].apply(this, arguments);
+ } else if (attrs && attrs.id) {
+ return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
+ }
+ return new osmEntity().initialize(arguments);
+ }
+ osmEntity.id = function(type3) {
+ return osmEntity.id.fromOSM(type3, osmEntity.id.next[type3]--);
+ };
+ osmEntity.id.next = {
+ changeset: -1,
+ node: -1,
+ way: -1,
+ relation: -1
+ };
+ osmEntity.id.fromOSM = function(type3, id2) {
+ return type3[0] + id2;
+ };
+ osmEntity.id.toOSM = function(id2) {
+ var match = id2.match(/^[cnwr](-?\d+)$/);
+ if (match) {
+ return match[1];
+ }
+ return "";
+ };
+ osmEntity.id.type = function(id2) {
+ return { "c": "changeset", "n": "node", "w": "way", "r": "relation" }[id2[0]];
+ };
+ osmEntity.key = function(entity) {
+ return entity.id + "v" + (entity.v || 0);
+ };
+ var _deprecatedTagValuesByKey;
+ osmEntity.deprecatedTagValuesByKey = function(dataDeprecated) {
+ if (!_deprecatedTagValuesByKey) {
+ _deprecatedTagValuesByKey = {};
+ dataDeprecated.forEach(function(d) {
+ var oldKeys = Object.keys(d.old);
+ if (oldKeys.length === 1) {
+ var oldKey = oldKeys[0];
+ var oldValue = d.old[oldKey];
+ if (oldValue !== "*") {
+ if (!_deprecatedTagValuesByKey[oldKey]) {
+ _deprecatedTagValuesByKey[oldKey] = [oldValue];
+ } else {
+ _deprecatedTagValuesByKey[oldKey].push(oldValue);
+ }
+ }
+ }
+ });
+ }
+ return _deprecatedTagValuesByKey;
+ };
+ osmEntity.prototype = {
+ tags: {},
+ initialize: function(sources) {
+ for (var i2 = 0; i2 < sources.length; ++i2) {
+ var source = sources[i2];
+ for (var prop in source) {
+ if (Object.prototype.hasOwnProperty.call(source, prop)) {
+ if (source[prop] === void 0) {
+ delete this[prop];
+ } else {
+ this[prop] = source[prop];
+ }
+ }
+ }
+ }
+ if (!this.id && this.type) {
+ this.id = osmEntity.id(this.type);
+ }
+ if (!this.hasOwnProperty("visible")) {
+ this.visible = true;
+ }
+ if (debug) {
+ Object.freeze(this);
+ Object.freeze(this.tags);
+ if (this.loc)
+ Object.freeze(this.loc);
+ if (this.nodes)
+ Object.freeze(this.nodes);
+ if (this.members)
+ Object.freeze(this.members);
+ }
+ return this;
+ },
+ copy: function(resolver, copies) {
+ if (copies[this.id])
+ return copies[this.id];
+ var copy2 = osmEntity(this, { id: void 0, user: void 0, version: void 0 });
+ copies[this.id] = copy2;
+ return copy2;
+ },
+ osmId: function() {
+ return osmEntity.id.toOSM(this.id);
+ },
+ isNew: function() {
+ var osmId = osmEntity.id.toOSM(this.id);
+ return osmId.length === 0 || osmId[0] === "-";
+ },
+ update: function(attrs) {
+ return osmEntity(this, attrs, { v: 1 + (this.v || 0) });
+ },
+ mergeTags: function(tags) {
+ var merged = Object.assign({}, this.tags);
+ var changed = false;
+ for (var k in tags) {
+ var t1 = merged[k];
+ var t2 = tags[k];
+ if (!t1) {
+ changed = true;
+ merged[k] = t2;
+ } else if (t1 !== t2) {
+ changed = true;
+ merged[k] = utilUnicodeCharsTruncated(utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(";"), 255);
+ }
+ }
+ return changed ? this.update({ tags: merged }) : this;
+ },
+ intersects: function(extent, resolver) {
+ return this.extent(resolver).intersects(extent);
+ },
+ hasNonGeometryTags: function() {
+ return Object.keys(this.tags).some(function(k) {
+ return k !== "area";
+ });
+ },
+ hasParentRelations: function(resolver) {
+ return resolver.parentRelations(this).length > 0;
+ },
+ hasInterestingTags: function() {
+ return Object.keys(this.tags).some(osmIsInterestingTag);
+ },
+ isHighwayIntersection: function() {
+ return false;
+ },
+ isDegenerate: function() {
+ return true;
+ },
+ deprecatedTags: function(dataDeprecated) {
+ var tags = this.tags;
+ if (Object.keys(tags).length === 0)
+ return [];
+ var deprecated = [];
+ dataDeprecated.forEach(function(d) {
+ var oldKeys = Object.keys(d.old);
+ if (d.replace) {
+ var hasExistingValues = Object.keys(d.replace).some(function(replaceKey) {
+ if (!tags[replaceKey] || d.old[replaceKey])
+ return false;
+ var replaceValue = d.replace[replaceKey];
+ if (replaceValue === "*")
+ return false;
+ if (replaceValue === tags[replaceKey])
+ return false;
+ return true;
+ });
+ if (hasExistingValues)
+ return;
+ }
+ var matchesDeprecatedTags = oldKeys.every(function(oldKey) {
+ if (!tags[oldKey])
+ return false;
+ if (d.old[oldKey] === "*")
+ return true;
+ if (d.old[oldKey] === tags[oldKey])
+ return true;
+ var vals = tags[oldKey].split(";").filter(Boolean);
+ if (vals.length === 0) {
+ return false;
+ } else if (vals.length > 1) {
+ return vals.indexOf(d.old[oldKey]) !== -1;
+ } else {
+ if (tags[oldKey] === d.old[oldKey]) {
+ if (d.replace && d.old[oldKey] === d.replace[oldKey]) {
+ var replaceKeys = Object.keys(d.replace);
+ return !replaceKeys.every(function(replaceKey) {
+ return tags[replaceKey] === d.replace[replaceKey];
+ });
+ } else {
+ return true;
+ }
+ }
+ }
+ return false;
+ });
+ if (matchesDeprecatedTags) {
+ deprecated.push(d);
+ }
+ });
+ return deprecated;
+ }
+ };
+
+ // modules/osm/lanes.js
+ function osmLanes(entity) {
+ if (entity.type !== "way")
+ return null;
+ if (!entity.tags.highway)
+ return null;
+ var tags = entity.tags;
+ var isOneWay = entity.isOneWay();
+ var laneCount = getLaneCount(tags, isOneWay);
+ var maxspeed = parseMaxspeed(tags);
+ var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
+ var forward = laneDirections.forward;
+ var backward = laneDirections.backward;
+ var bothways = laneDirections.bothways;
+ var turnLanes = {};
+ turnLanes.unspecified = parseTurnLanes(tags["turn:lanes"]);
+ turnLanes.forward = parseTurnLanes(tags["turn:lanes:forward"]);
+ turnLanes.backward = parseTurnLanes(tags["turn:lanes:backward"]);
+ var maxspeedLanes = {};
+ maxspeedLanes.unspecified = parseMaxspeedLanes(tags["maxspeed:lanes"], maxspeed);
+ maxspeedLanes.forward = parseMaxspeedLanes(tags["maxspeed:lanes:forward"], maxspeed);
+ maxspeedLanes.backward = parseMaxspeedLanes(tags["maxspeed:lanes:backward"], maxspeed);
+ var psvLanes = {};
+ psvLanes.unspecified = parseMiscLanes(tags["psv:lanes"]);
+ psvLanes.forward = parseMiscLanes(tags["psv:lanes:forward"]);
+ psvLanes.backward = parseMiscLanes(tags["psv:lanes:backward"]);
+ var busLanes = {};
+ busLanes.unspecified = parseMiscLanes(tags["bus:lanes"]);
+ busLanes.forward = parseMiscLanes(tags["bus:lanes:forward"]);
+ busLanes.backward = parseMiscLanes(tags["bus:lanes:backward"]);
+ var taxiLanes = {};
+ taxiLanes.unspecified = parseMiscLanes(tags["taxi:lanes"]);
+ taxiLanes.forward = parseMiscLanes(tags["taxi:lanes:forward"]);
+ taxiLanes.backward = parseMiscLanes(tags["taxi:lanes:backward"]);
+ var hovLanes = {};
+ hovLanes.unspecified = parseMiscLanes(tags["hov:lanes"]);
+ hovLanes.forward = parseMiscLanes(tags["hov:lanes:forward"]);
+ hovLanes.backward = parseMiscLanes(tags["hov:lanes:backward"]);
+ var hgvLanes = {};
+ hgvLanes.unspecified = parseMiscLanes(tags["hgv:lanes"]);
+ hgvLanes.forward = parseMiscLanes(tags["hgv:lanes:forward"]);
+ hgvLanes.backward = parseMiscLanes(tags["hgv:lanes:backward"]);
+ var bicyclewayLanes = {};
+ bicyclewayLanes.unspecified = parseBicycleWay(tags["bicycleway:lanes"]);
+ bicyclewayLanes.forward = parseBicycleWay(tags["bicycleway:lanes:forward"]);
+ bicyclewayLanes.backward = parseBicycleWay(tags["bicycleway:lanes:backward"]);
+ var lanesObj = {
+ forward: [],
+ backward: [],
+ unspecified: []
+ };
+ mapToLanesObj(lanesObj, turnLanes, "turnLane");
+ mapToLanesObj(lanesObj, maxspeedLanes, "maxspeed");
+ mapToLanesObj(lanesObj, psvLanes, "psv");
+ mapToLanesObj(lanesObj, busLanes, "bus");
+ mapToLanesObj(lanesObj, taxiLanes, "taxi");
+ mapToLanesObj(lanesObj, hovLanes, "hov");
+ mapToLanesObj(lanesObj, hgvLanes, "hgv");
+ mapToLanesObj(lanesObj, bicyclewayLanes, "bicycleway");
+ return {
+ metadata: {
+ count: laneCount,
+ oneway: isOneWay,
+ forward,
+ backward,
+ bothways,
+ turnLanes,
+ maxspeed,
+ maxspeedLanes,
+ psvLanes,
+ busLanes,
+ taxiLanes,
+ hovLanes,
+ hgvLanes,
+ bicyclewayLanes
+ },
+ lanes: lanesObj
+ };
+ }
+ function getLaneCount(tags, isOneWay) {
+ var count;
+ if (tags.lanes) {
+ count = parseInt(tags.lanes, 10);
+ if (count > 0) {
+ return count;
+ }
+ }
+ switch (tags.highway) {
+ case "trunk":
+ case "motorway":
+ count = isOneWay ? 2 : 4;
+ break;
+ default:
+ count = isOneWay ? 1 : 2;
+ break;
+ }
+ return count;
+ }
+ function parseMaxspeed(tags) {
+ var maxspeed = tags.maxspeed;
+ if (!maxspeed)
+ return;
+ var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/;
+ if (!maxspeedRegex.test(maxspeed))
+ return;
+ return parseInt(maxspeed, 10);
+ }
+ function parseLaneDirections(tags, isOneWay, laneCount) {
+ var forward = parseInt(tags["lanes:forward"], 10);
+ var backward = parseInt(tags["lanes:backward"], 10);
+ var bothways = parseInt(tags["lanes:both_ways"], 10) > 0 ? 1 : 0;
+ if (parseInt(tags.oneway, 10) === -1) {
+ forward = 0;
+ bothways = 0;
+ backward = laneCount;
+ } else if (isOneWay) {
+ forward = laneCount;
+ bothways = 0;
+ backward = 0;
+ } else if (isNaN(forward) && isNaN(backward)) {
+ backward = Math.floor((laneCount - bothways) / 2);
+ forward = laneCount - bothways - backward;
+ } else if (isNaN(forward)) {
+ if (backward > laneCount - bothways) {
+ backward = laneCount - bothways;
+ }
+ forward = laneCount - bothways - backward;
+ } else if (isNaN(backward)) {
+ if (forward > laneCount - bothways) {
+ forward = laneCount - bothways;
+ }
+ backward = laneCount - bothways - forward;
+ }
+ return {
+ forward,
+ backward,
+ bothways
+ };
+ }
+ function parseTurnLanes(tag) {
+ if (!tag)
+ return;
+ var validValues = [
+ "left",
+ "slight_left",
+ "sharp_left",
+ "through",
+ "right",
+ "slight_right",
+ "sharp_right",
+ "reverse",
+ "merge_to_left",
+ "merge_to_right",
+ "none"
+ ];
+ return tag.split("|").map(function(s) {
+ if (s === "")
+ s = "none";
+ return s.split(";").map(function(d) {
+ return validValues.indexOf(d) === -1 ? "unknown" : d;
+ });
+ });
+ }
+ function parseMaxspeedLanes(tag, maxspeed) {
+ if (!tag)
+ return;
+ return tag.split("|").map(function(s) {
+ if (s === "none")
+ return s;
+ var m = parseInt(s, 10);
+ if (s === "" || m === maxspeed)
+ return null;
+ return isNaN(m) ? "unknown" : m;
+ });
+ }
+ function parseMiscLanes(tag) {
+ if (!tag)
+ return;
+ var validValues = [
+ "yes",
+ "no",
+ "designated"
+ ];
+ return tag.split("|").map(function(s) {
+ if (s === "")
+ s = "no";
+ return validValues.indexOf(s) === -1 ? "unknown" : s;
+ });
+ }
+ function parseBicycleWay(tag) {
+ if (!tag)
+ return;
+ var validValues = [
+ "yes",
+ "no",
+ "designated",
+ "lane"
+ ];
+ return tag.split("|").map(function(s) {
+ if (s === "")
+ s = "no";
+ return validValues.indexOf(s) === -1 ? "unknown" : s;
+ });
+ }
+ function mapToLanesObj(lanesObj, data, key) {
+ if (data.forward) {
+ data.forward.forEach(function(l, i2) {
+ if (!lanesObj.forward[i2])
+ lanesObj.forward[i2] = {};
+ lanesObj.forward[i2][key] = l;
+ });
+ }
+ if (data.backward) {
+ data.backward.forEach(function(l, i2) {
+ if (!lanesObj.backward[i2])
+ lanesObj.backward[i2] = {};
+ lanesObj.backward[i2][key] = l;
+ });
+ }
+ if (data.unspecified) {
+ data.unspecified.forEach(function(l, i2) {
+ if (!lanesObj.unspecified[i2])
+ lanesObj.unspecified[i2] = {};
+ lanesObj.unspecified[i2][key] = l;
+ });
+ }
+ }
+
+ // modules/osm/way.js
+ function osmWay() {
+ if (!(this instanceof osmWay)) {
+ return new osmWay().initialize(arguments);
+ } else if (arguments.length) {
+ this.initialize(arguments);
+ }
+ }
+ osmEntity.way = osmWay;
+ osmWay.prototype = Object.create(osmEntity.prototype);
+ Object.assign(osmWay.prototype, {
+ type: "way",
+ nodes: [],
+ copy: function(resolver, copies) {
+ if (copies[this.id])
+ return copies[this.id];
+ var copy2 = osmEntity.prototype.copy.call(this, resolver, copies);
+ var nodes = this.nodes.map(function(id2) {
+ return resolver.entity(id2).copy(resolver, copies).id;
+ });
+ copy2 = copy2.update({ nodes });
+ copies[this.id] = copy2;
+ return copy2;
+ },
+ extent: function(resolver) {
+ return resolver.transient(this, "extent", function() {
+ var extent = geoExtent();
+ for (var i2 = 0; i2 < this.nodes.length; i2++) {
+ var node = resolver.hasEntity(this.nodes[i2]);
+ if (node) {
+ extent._extend(node.extent());
+ }
+ }
+ return extent;
+ });
+ },
+ first: function() {
+ return this.nodes[0];
+ },
+ last: function() {
+ return this.nodes[this.nodes.length - 1];
+ },
+ contains: function(node) {
+ return this.nodes.indexOf(node) >= 0;
+ },
+ affix: function(node) {
+ if (this.nodes[0] === node)
+ return "prefix";
+ if (this.nodes[this.nodes.length - 1] === node)
+ return "suffix";
+ },
+ layer: function() {
+ if (isFinite(this.tags.layer)) {
+ return Math.max(-10, Math.min(+this.tags.layer, 10));
+ }
+ if (this.tags.covered === "yes")
+ return -1;
+ if (this.tags.location === "overground")
+ return 1;
+ if (this.tags.location === "underground")
+ return -1;
+ if (this.tags.location === "underwater")
+ return -10;
+ if (this.tags.power === "line")
+ return 10;
+ if (this.tags.power === "minor_line")
+ return 10;
+ if (this.tags.aerialway)
+ return 10;
+ if (this.tags.bridge)
+ return 1;
+ if (this.tags.cutting)
+ return -1;
+ if (this.tags.tunnel)
+ return -1;
+ if (this.tags.waterway)
+ return -1;
+ if (this.tags.man_made === "pipeline")
+ return -10;
+ if (this.tags.boundary)
+ return -10;
+ return 0;
+ },
+ impliedLineWidthMeters: function() {
+ var averageWidths = {
+ highway: {
+ motorway: 5,
+ motorway_link: 5,
+ trunk: 4.5,
+ trunk_link: 4.5,
+ primary: 4,
+ secondary: 4,
+ tertiary: 4,
+ primary_link: 4,
+ secondary_link: 4,
+ tertiary_link: 4,
+ unclassified: 4,
+ road: 4,
+ living_street: 4,
+ bus_guideway: 4,
+ pedestrian: 4,
+ residential: 3.5,
+ service: 3.5,
+ track: 3,
+ cycleway: 2.5,
+ bridleway: 2,
+ corridor: 2,
+ steps: 2,
+ path: 1.5,
+ footway: 1.5
+ },
+ railway: {
+ rail: 2.5,
+ light_rail: 2.5,
+ tram: 2.5,
+ subway: 2.5,
+ monorail: 2.5,
+ funicular: 2.5,
+ disused: 2.5,
+ preserved: 2.5,
+ miniature: 1.5,
+ narrow_gauge: 1.5
+ },
+ waterway: {
+ river: 50,
+ canal: 25,
+ stream: 5,
+ tidal_channel: 5,
+ fish_pass: 2.5,
+ drain: 2.5,
+ ditch: 1.5
+ }
+ };
+ for (var key in averageWidths) {
+ if (this.tags[key] && averageWidths[key][this.tags[key]]) {
+ var width = averageWidths[key][this.tags[key]];
+ if (key === "highway") {
+ var laneCount = this.tags.lanes && parseInt(this.tags.lanes, 10);
+ if (!laneCount)
+ laneCount = this.isOneWay() ? 1 : 2;
+ return width * laneCount;
+ }
+ return width;
+ }
+ }
+ return null;
+ },
+ isOneWay: function() {
+ var values = {
+ "yes": true,
+ "1": true,
+ "-1": true,
+ "reversible": true,
+ "alternating": true,
+ "no": false,
+ "0": false
+ };
+ if (values[this.tags.oneway] !== void 0) {
+ return values[this.tags.oneway];
+ }
+ for (var key in this.tags) {
+ if (key in osmOneWayTags && this.tags[key] in osmOneWayTags[key]) {
+ return true;
+ }
+ }
+ return false;
+ },
+ sidednessIdentifier: function() {
+ for (var key in this.tags) {
+ var value = this.tags[key];
+ if (key in osmRightSideIsInsideTags && value in osmRightSideIsInsideTags[key]) {
+ if (osmRightSideIsInsideTags[key][value] === true) {
+ return key;
+ } else {
+ return osmRightSideIsInsideTags[key][value];
+ }
+ }
+ }
+ return null;
+ },
+ isSided: function() {
+ if (this.tags.two_sided === "yes") {
+ return false;
+ }
+ return this.sidednessIdentifier() !== null;
+ },
+ lanes: function() {
+ return osmLanes(this);
+ },
+ isClosed: function() {
+ return this.nodes.length > 1 && this.first() === this.last();
+ },
+ isConvex: function(resolver) {
+ if (!this.isClosed() || this.isDegenerate())
+ return null;
+ var nodes = utilArrayUniq(resolver.childNodes(this));
+ var coords = nodes.map(function(n2) {
+ return n2.loc;
+ });
+ var curr = 0;
+ var prev = 0;
+ for (var i2 = 0; i2 < coords.length; i2++) {
+ var o = coords[(i2 + 1) % coords.length];
+ var a = coords[i2];
+ var b = coords[(i2 + 2) % coords.length];
+ var res = geoVecCross(a, b, o);
+ curr = res > 0 ? 1 : res < 0 ? -1 : 0;
+ if (curr === 0) {
+ continue;
+ } else if (prev && curr !== prev) {
+ return false;
+ }
+ prev = curr;
+ }
+ return true;
+ },
+ tagSuggestingArea: function() {
+ return osmTagSuggestingArea(this.tags);
+ },
+ isArea: function() {
+ if (this.tags.area === "yes")
+ return true;
+ if (!this.isClosed() || this.tags.area === "no")
+ return false;
+ return this.tagSuggestingArea() !== null;
+ },
+ isDegenerate: function() {
+ return new Set(this.nodes).size < (this.isArea() ? 3 : 2);
+ },
+ areAdjacent: function(n1, n2) {
+ for (var i2 = 0; i2 < this.nodes.length; i2++) {
+ if (this.nodes[i2] === n1) {
+ if (this.nodes[i2 - 1] === n2)
+ return true;
+ if (this.nodes[i2 + 1] === n2)
+ return true;
+ }
+ }
+ return false;
+ },
+ geometry: function(graph) {
+ return graph.transient(this, "geometry", function() {
+ return this.isArea() ? "area" : "line";
+ });
+ },
+ segments: function(graph) {
+ function segmentExtent(graph2) {
+ var n1 = graph2.hasEntity(this.nodes[0]);
+ var n2 = graph2.hasEntity(this.nodes[1]);
+ return n1 && n2 && geoExtent([
+ [
+ Math.min(n1.loc[0], n2.loc[0]),
+ Math.min(n1.loc[1], n2.loc[1])
+ ],
+ [
+ Math.max(n1.loc[0], n2.loc[0]),
+ Math.max(n1.loc[1], n2.loc[1])
+ ]
+ ]);
+ }
+ return graph.transient(this, "segments", function() {
+ var segments = [];
+ for (var i2 = 0; i2 < this.nodes.length - 1; i2++) {
+ segments.push({
+ id: this.id + "-" + i2,
+ wayId: this.id,
+ index: i2,
+ nodes: [this.nodes[i2], this.nodes[i2 + 1]],
+ extent: segmentExtent
+ });
+ }
+ return segments;
+ });
+ },
+ close: function() {
+ if (this.isClosed() || !this.nodes.length)
+ return this;
+ var nodes = this.nodes.slice();
+ nodes = nodes.filter(noRepeatNodes);
+ nodes.push(nodes[0]);
+ return this.update({ nodes });
+ },
+ unclose: function() {
+ if (!this.isClosed())
+ return this;
+ var nodes = this.nodes.slice();
+ var connector = this.first();
+ var i2 = nodes.length - 1;
+ while (i2 > 0 && nodes.length > 1 && nodes[i2] === connector) {
+ nodes.splice(i2, 1);
+ i2 = nodes.length - 1;
+ }
+ nodes = nodes.filter(noRepeatNodes);
+ return this.update({ nodes });
+ },
+ addNode: function(id2, index) {
+ var nodes = this.nodes.slice();
+ var isClosed = this.isClosed();
+ var max3 = isClosed ? nodes.length - 1 : nodes.length;
+ if (index === void 0) {
+ index = max3;
+ }
+ if (index < 0 || index > max3) {
+ throw new RangeError("index " + index + " out of range 0.." + max3);
+ }
+ if (isClosed) {
+ var connector = this.first();
+ var i2 = 1;
+ while (i2 < nodes.length && nodes.length > 2 && nodes[i2] === connector) {
+ nodes.splice(i2, 1);
+ if (index > i2)
+ index--;
+ }
+ i2 = nodes.length - 1;
+ while (i2 > 0 && nodes.length > 1 && nodes[i2] === connector) {
+ nodes.splice(i2, 1);
+ if (index > i2)
+ index--;
+ i2 = nodes.length - 1;
+ }
+ }
+ nodes.splice(index, 0, id2);
+ nodes = nodes.filter(noRepeatNodes);
+ if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+ nodes.push(nodes[0]);
+ }
+ return this.update({ nodes });
+ },
+ updateNode: function(id2, index) {
+ var nodes = this.nodes.slice();
+ var isClosed = this.isClosed();
+ var max3 = nodes.length - 1;
+ if (index === void 0 || index < 0 || index > max3) {
+ throw new RangeError("index " + index + " out of range 0.." + max3);
+ }
+ if (isClosed) {
+ var connector = this.first();
+ var i2 = 1;
+ while (i2 < nodes.length && nodes.length > 2 && nodes[i2] === connector) {
+ nodes.splice(i2, 1);
+ if (index > i2)
+ index--;
+ }
+ i2 = nodes.length - 1;
+ while (i2 > 0 && nodes.length > 1 && nodes[i2] === connector) {
+ nodes.splice(i2, 1);
+ if (index === i2)
+ index = 0;
+ i2 = nodes.length - 1;
+ }
+ }
+ nodes.splice(index, 1, id2);
+ nodes = nodes.filter(noRepeatNodes);
+ if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+ nodes.push(nodes[0]);
+ }
+ return this.update({ nodes });
+ },
+ replaceNode: function(needleID, replacementID) {
+ var nodes = this.nodes.slice();
+ var isClosed = this.isClosed();
+ for (var i2 = 0; i2 < nodes.length; i2++) {
+ if (nodes[i2] === needleID) {
+ nodes[i2] = replacementID;
+ }
+ }
+ nodes = nodes.filter(noRepeatNodes);
+ if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+ nodes.push(nodes[0]);
+ }
+ return this.update({ nodes });
+ },
+ removeNode: function(id2) {
+ var nodes = this.nodes.slice();
+ var isClosed = this.isClosed();
+ nodes = nodes.filter(function(node) {
+ return node !== id2;
+ }).filter(noRepeatNodes);
+ if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+ nodes.push(nodes[0]);
+ }
+ return this.update({ nodes });
+ },
+ asJXON: function(changeset_id) {
+ var r = {
+ way: {
+ "@id": this.osmId(),
+ "@version": this.version || 0,
+ nd: this.nodes.map(function(id2) {
+ return { keyAttributes: { ref: osmEntity.id.toOSM(id2) } };
+ }, this),
+ tag: Object.keys(this.tags).map(function(k) {
+ return { keyAttributes: { k, v: this.tags[k] } };
+ }, this)
+ }
+ };
+ if (changeset_id) {
+ r.way["@changeset"] = changeset_id;
+ }
+ return r;
+ },
+ asGeoJSON: function(resolver) {
+ return resolver.transient(this, "GeoJSON", function() {
+ var coordinates = resolver.childNodes(this).map(function(n2) {
+ return n2.loc;
+ });
+ if (this.isArea() && this.isClosed()) {
+ return {
+ type: "Polygon",
+ coordinates: [coordinates]
+ };
+ } else {
+ return {
+ type: "LineString",
+ coordinates
+ };
+ }
+ });
+ },
+ area: function(resolver) {
+ return resolver.transient(this, "area", function() {
+ var nodes = resolver.childNodes(this);
+ var json = {
+ type: "Polygon",
+ coordinates: [nodes.map(function(n2) {
+ return n2.loc;
+ })]
+ };
+ if (!this.isClosed() && nodes.length) {
+ json.coordinates[0].push(nodes[0].loc);
+ }
+ var area = area_default(json);
+ if (area > 2 * Math.PI) {
+ json.coordinates[0] = json.coordinates[0].reverse();
+ area = area_default(json);
+ }
+ return isNaN(area) ? 0 : area;
+ });
+ }
+ });
+ function noRepeatNodes(node, i2, arr) {
+ return i2 === 0 || node !== arr[i2 - 1];
+ }
+
+ // modules/osm/multipolygon.js
+ function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
+ if (entity.type !== "relation" || !entity.isMultipolygon() || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
+ return false;
+ }
+ var outerMember;
+ for (var memberIndex in entity.members) {
+ var member = entity.members[memberIndex];
+ if (!member.role || member.role === "outer") {
+ if (outerMember)
+ return false;
+ if (member.type !== "way")
+ return false;
+ if (!graph.hasEntity(member.id))
+ return false;
+ outerMember = graph.entity(member.id);
+ if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
+ return false;
+ }
+ }
+ }
+ return outerMember;
+ }
+ function osmIsOldMultipolygonOuterMember(entity, graph) {
+ if (entity.type !== "way" || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0) {
+ return false;
+ }
+ var parents = graph.parentRelations(entity);
+ if (parents.length !== 1)
+ return false;
+ var parent = parents[0];
+ if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) {
+ return false;
+ }
+ var members = parent.members, member;
+ for (var i2 = 0; i2 < members.length; i2++) {
+ member = members[i2];
+ if (member.id === entity.id && member.role && member.role !== "outer") {
+ return false;
+ }
+ if (member.id !== entity.id && (!member.role || member.role === "outer")) {
+ return false;
+ }
+ }
+ return parent;
+ }
+ function osmOldMultipolygonOuterMember(entity, graph) {
+ if (entity.type !== "way")
+ return false;
+ var parents = graph.parentRelations(entity);
+ if (parents.length !== 1)
+ return false;
+ var parent = parents[0];
+ if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) {
+ return false;
+ }
+ var members = parent.members, member, outerMember;
+ for (var i2 = 0; i2 < members.length; i2++) {
+ member = members[i2];
+ if (!member.role || member.role === "outer") {
+ if (outerMember)
+ return false;
+ outerMember = member;
+ }
+ }
+ if (!outerMember)
+ return false;
+ var outerEntity = graph.hasEntity(outerMember.id);
+ if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length) {
+ return false;
+ }
+ return outerEntity;
+ }
+ function osmJoinWays(toJoin, graph) {
+ function resolve(member) {
+ return graph.childNodes(graph.entity(member.id));
+ }
+ function reverse(item2) {
+ var action = actionReverse(item2.id, { reverseOneway: true });
+ sequences.actions.push(action);
+ return item2 instanceof osmWay ? action(graph).entity(item2.id) : item2;
+ }
+ toJoin = toJoin.filter(function(member) {
+ return member.type === "way" && graph.hasEntity(member.id);
+ });
+ var i2;
+ var joinAsMembers = true;
+ for (i2 = 0; i2 < toJoin.length; i2++) {
+ if (toJoin[i2] instanceof osmWay) {
+ joinAsMembers = false;
+ break;
+ }
+ }
+ var sequences = [];
+ sequences.actions = [];
+ while (toJoin.length) {
+ var item = toJoin.shift();
+ var currWays = [item];
+ var currNodes = resolve(item).slice();
+ while (toJoin.length) {
+ var start2 = currNodes[0];
+ var end = currNodes[currNodes.length - 1];
+ var fn = null;
+ var nodes = null;
+ for (i2 = 0; i2 < toJoin.length; i2++) {
+ item = toJoin[i2];
+ nodes = resolve(item);
+ if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end && (nodes[nodes.length - 1] === start2 || nodes[0] === start2)) {
+ currWays[0] = reverse(currWays[0]);
+ currNodes.reverse();
+ start2 = currNodes[0];
+ end = currNodes[currNodes.length - 1];
+ }
+ if (nodes[0] === end) {
+ fn = currNodes.push;
+ nodes = nodes.slice(1);
+ break;
+ } else if (nodes[nodes.length - 1] === end) {
+ fn = currNodes.push;
+ nodes = nodes.slice(0, -1).reverse();
+ item = reverse(item);
+ break;
+ } else if (nodes[nodes.length - 1] === start2) {
+ fn = currNodes.unshift;
+ nodes = nodes.slice(0, -1);
+ break;
+ } else if (nodes[0] === start2) {
+ fn = currNodes.unshift;
+ nodes = nodes.slice(1).reverse();
+ item = reverse(item);
+ break;
+ } else {
+ fn = nodes = null;
+ }
+ }
+ if (!nodes) {
+ break;
+ }
+ fn.apply(currWays, [item]);
+ fn.apply(currNodes, nodes);
+ toJoin.splice(i2, 1);
+ }
+ currWays.nodes = currNodes;
+ sequences.push(currWays);
+ }
+ return sequences;
+ }
+
+ // modules/actions/add_member.js
+ function actionAddMember(relationId, member, memberIndex, insertPair) {
+ return function action(graph) {
+ var relation = graph.entity(relationId);
+ var isPTv2 = /stop|platform/.test(member.role);
+ if ((isNaN(memberIndex) || insertPair) && member.type === "way" && !isPTv2) {
+ graph = addWayMember(relation, graph);
+ } else {
+ if (isPTv2 && isNaN(memberIndex)) {
+ memberIndex = 0;
+ }
+ graph = graph.replace(relation.addMember(member, memberIndex));
+ }
+ return graph;
+ };
+ function addWayMember(relation, graph) {
+ var groups, tempWay, insertPairIsReversed, item, i2, j2, k;
+ var PTv2members = [];
+ var members = [];
+ for (i2 = 0; i2 < relation.members.length; i2++) {
+ var m = relation.members[i2];
+ if (/stop|platform/.test(m.role)) {
+ PTv2members.push(m);
+ } else {
+ members.push(m);
+ }
+ }
+ relation = relation.update({ members });
+ if (insertPair) {
+ tempWay = osmWay({ id: "wTemp", nodes: insertPair.nodes });
+ graph = graph.replace(tempWay);
+ var tempMember = { id: tempWay.id, type: "way", role: member.role };
+ var tempRelation = relation.replaceMember({ id: insertPair.originalID }, tempMember, true);
+ groups = utilArrayGroupBy(tempRelation.members, "type");
+ groups.way = groups.way || [];
+ var originalWay = graph.entity(insertPair.originalID);
+ var insertedWay = graph.entity(insertPair.insertedID);
+ insertPairIsReversed = originalWay.nodes.length > 0 && insertedWay.nodes.length > 0 && insertedWay.nodes[insertedWay.nodes.length - 1] === originalWay.nodes[0] && originalWay.nodes[originalWay.nodes.length - 1] !== insertedWay.nodes[0];
+ } else {
+ groups = utilArrayGroupBy(relation.members, "type");
+ groups.way = groups.way || [];
+ groups.way.push(member);
+ }
+ members = withIndex(groups.way);
+ var joined = osmJoinWays(members, graph);
+ for (i2 = 0; i2 < joined.length; i2++) {
+ var segment = joined[i2];
+ var nodes = segment.nodes.slice();
+ var startIndex = segment[0].index;
+ for (j2 = 0; j2 < members.length; j2++) {
+ if (members[j2].index === startIndex) {
+ break;
+ }
+ }
+ for (k = 0; k < segment.length; k++) {
+ item = segment[k];
+ var way = graph.entity(item.id);
+ if (tempWay && item.id === tempWay.id) {
+ var reverse = nodes[0].id !== insertPair.nodes[0] ^ insertPairIsReversed;
+ if (reverse) {
+ item.pair = [
+ { id: insertPair.insertedID, type: "way", role: item.role },
+ { id: insertPair.originalID, type: "way", role: item.role }
+ ];
+ } else {
+ item.pair = [
+ { id: insertPair.originalID, type: "way", role: item.role },
+ { id: insertPair.insertedID, type: "way", role: item.role }
+ ];
+ }
+ }
+ if (k > 0) {
+ if (j2 + k >= members.length || item.index !== members[j2 + k].index) {
+ moveMember(members, item.index, j2 + k);
+ }
+ }
+ nodes.splice(0, way.nodes.length - 1);
+ }
+ }
+ if (tempWay) {
+ graph = graph.remove(tempWay);
+ }
+ var wayMembers = [];
+ for (i2 = 0; i2 < members.length; i2++) {
+ item = members[i2];
+ if (item.index === -1)
+ continue;
+ if (item.pair) {
+ wayMembers.push(item.pair[0]);
+ wayMembers.push(item.pair[1]);
+ } else {
+ wayMembers.push(utilObjectOmit(item, ["index"]));
+ }
+ }
+ var newMembers = PTv2members.concat(groups.node || [], wayMembers, groups.relation || []);
+ return graph.replace(relation.update({ members: newMembers }));
+ function moveMember(arr, findIndex, toIndex) {
+ var i3;
+ for (i3 = 0; i3 < arr.length; i3++) {
+ if (arr[i3].index === findIndex) {
+ break;
+ }
+ }
+ var item2 = Object.assign({}, arr[i3]);
+ arr[i3].index = -1;
+ item2.index = toIndex;
+ arr.splice(toIndex, 0, item2);
+ }
+ function withIndex(arr) {
+ var result = new Array(arr.length);
+ for (var i3 = 0; i3 < arr.length; i3++) {
+ result[i3] = Object.assign({}, arr[i3]);
+ result[i3].index = i3;
+ }
+ return result;
+ }
+ }
+ }
+
+ // modules/actions/add_midpoint.js
+ function actionAddMidpoint(midpoint, node) {
+ return function(graph) {
+ graph = graph.replace(node.move(midpoint.loc));
+ var parents = utilArrayIntersection(graph.parentWays(graph.entity(midpoint.edge[0])), graph.parentWays(graph.entity(midpoint.edge[1])));
+ parents.forEach(function(way) {
+ for (var i2 = 0; i2 < way.nodes.length - 1; i2++) {
+ if (geoEdgeEqual([way.nodes[i2], way.nodes[i2 + 1]], midpoint.edge)) {
+ graph = graph.replace(graph.entity(way.id).addNode(node.id, i2 + 1));
+ return;
+ }
+ }
+ });
+ return graph;
+ };
+ }
+
+ // modules/actions/add_vertex.js
+ function actionAddVertex(wayId, nodeId, index) {
+ return function(graph) {
+ return graph.replace(graph.entity(wayId).addNode(nodeId, index));
+ };
+ }
+
+ // modules/actions/change_member.js
+ function actionChangeMember(relationId, member, memberIndex) {
+ return function(graph) {
+ return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
+ };
+ }
+
+ // modules/actions/change_preset.js
+ function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) {
+ return function action(graph) {
+ var entity = graph.entity(entityID);
+ var geometry = entity.geometry(graph);
+ var tags = entity.tags;
+ if (oldPreset)
+ tags = oldPreset.unsetTags(tags, geometry, newPreset && newPreset.addTags ? Object.keys(newPreset.addTags) : null);
+ if (newPreset)
+ tags = newPreset.setTags(tags, geometry, skipFieldDefaults);
+ return graph.replace(entity.update({ tags }));
+ };
+ }
+
+ // modules/actions/change_tags.js
+ function actionChangeTags(entityId, tags) {
+ return function(graph) {
+ var entity = graph.entity(entityId);
+ return graph.replace(entity.update({ tags }));
+ };
+ }
+
+ // modules/osm/node.js
+ function osmNode() {
+ if (!(this instanceof osmNode)) {
+ return new osmNode().initialize(arguments);
+ } else if (arguments.length) {
+ this.initialize(arguments);
+ }
+ }
+ osmEntity.node = osmNode;
+ osmNode.prototype = Object.create(osmEntity.prototype);
+ Object.assign(osmNode.prototype, {
+ type: "node",
+ loc: [9999, 9999],
+ extent: function() {
+ return new geoExtent(this.loc);
+ },
+ geometry: function(graph) {
+ return graph.transient(this, "geometry", function() {
+ return graph.isPoi(this) ? "point" : "vertex";
+ });
+ },
+ move: function(loc) {
+ return this.update({ loc });
+ },
+ isDegenerate: function() {
+ return !(Array.isArray(this.loc) && this.loc.length === 2 && this.loc[0] >= -180 && this.loc[0] <= 180 && this.loc[1] >= -90 && this.loc[1] <= 90);
+ },
+ directions: function(resolver, projection2) {
+ var val;
+ var i2;
+ if (this.isHighwayIntersection(resolver) && (this.tags.stop || "").toLowerCase() === "all") {
+ val = "all";
+ } else {
+ val = (this.tags.direction || "").toLowerCase();
+ var re2 = /:direction$/i;
+ var keys = Object.keys(this.tags);
+ for (i2 = 0; i2 < keys.length; i2++) {
+ if (re2.test(keys[i2])) {
+ val = this.tags[keys[i2]].toLowerCase();
+ break;
+ }
+ }
+ }
+ if (val === "")
+ return [];
+ var cardinal = {
+ north: 0,
+ n: 0,
+ northnortheast: 22,
+ nne: 22,
+ northeast: 45,
+ ne: 45,
+ eastnortheast: 67,
+ ene: 67,
+ east: 90,
+ e: 90,
+ eastsoutheast: 112,
+ ese: 112,
+ southeast: 135,
+ se: 135,
+ southsoutheast: 157,
+ sse: 157,
+ south: 180,
+ s: 180,
+ southsouthwest: 202,
+ ssw: 202,
+ southwest: 225,
+ sw: 225,
+ westsouthwest: 247,
+ wsw: 247,
+ west: 270,
+ w: 270,
+ westnorthwest: 292,
+ wnw: 292,
+ northwest: 315,
+ nw: 315,
+ northnorthwest: 337,
+ nnw: 337
+ };
+ var values = val.split(";");
+ var results = [];
+ values.forEach(function(v) {
+ if (cardinal[v] !== void 0) {
+ v = cardinal[v];
+ }
+ if (v !== "" && !isNaN(+v)) {
+ results.push(+v);
+ return;
+ }
+ var lookBackward = this.tags["traffic_sign:backward"] || v === "backward" || v === "both" || v === "all";
+ var lookForward = this.tags["traffic_sign:forward"] || v === "forward" || v === "both" || v === "all";
+ if (!lookForward && !lookBackward)
+ return;
+ var nodeIds = {};
+ resolver.parentWays(this).forEach(function(parent) {
+ var nodes = parent.nodes;
+ for (i2 = 0; i2 < nodes.length; i2++) {
+ if (nodes[i2] === this.id) {
+ if (lookForward && i2 > 0) {
+ nodeIds[nodes[i2 - 1]] = true;
+ }
+ if (lookBackward && i2 < nodes.length - 1) {
+ nodeIds[nodes[i2 + 1]] = true;
+ }
+ }
+ }
+ }, this);
+ Object.keys(nodeIds).forEach(function(nodeId) {
+ results.push(geoAngle(this, resolver.entity(nodeId), projection2) * (180 / Math.PI) + 90);
+ }, this);
+ }, this);
+ return utilArrayUniq(results);
+ },
+ isCrossing: function() {
+ return this.tags.highway === "crossing" || this.tags.railway && this.tags.railway.indexOf("crossing") !== -1;
+ },
+ isEndpoint: function(resolver) {
+ return resolver.transient(this, "isEndpoint", function() {
+ var id2 = this.id;
+ return resolver.parentWays(this).filter(function(parent) {
+ return !parent.isClosed() && !!parent.affix(id2);
+ }).length > 0;
+ });
+ },
+ isConnected: function(resolver) {
+ return resolver.transient(this, "isConnected", function() {
+ var parents = resolver.parentWays(this);
+ if (parents.length > 1) {
+ for (var i2 in parents) {
+ if (parents[i2].geometry(resolver) === "line" && parents[i2].hasInterestingTags())
+ return true;
+ }
+ } else if (parents.length === 1) {
+ var way = parents[0];
+ var nodes = way.nodes.slice();
+ if (way.isClosed()) {
+ nodes.pop();
+ }
+ return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
+ }
+ return false;
+ });
+ },
+ parentIntersectionWays: function(resolver) {
+ return resolver.transient(this, "parentIntersectionWays", function() {
+ return resolver.parentWays(this).filter(function(parent) {
+ return (parent.tags.highway || parent.tags.waterway || parent.tags.railway || parent.tags.aeroway) && parent.geometry(resolver) === "line";
+ });
+ });
+ },
+ isIntersection: function(resolver) {
+ return this.parentIntersectionWays(resolver).length > 1;
+ },
+ isHighwayIntersection: function(resolver) {
+ return resolver.transient(this, "isHighwayIntersection", function() {
+ return resolver.parentWays(this).filter(function(parent) {
+ return parent.tags.highway && parent.geometry(resolver) === "line";
+ }).length > 1;
+ });
+ },
+ isOnAddressLine: function(resolver) {
+ return resolver.transient(this, "isOnAddressLine", function() {
+ return resolver.parentWays(this).filter(function(parent) {
+ return parent.tags.hasOwnProperty("addr:interpolation") && parent.geometry(resolver) === "line";
+ }).length > 0;
+ });
+ },
+ asJXON: function(changeset_id) {
+ var r = {
+ node: {
+ "@id": this.osmId(),
+ "@lon": this.loc[0],
+ "@lat": this.loc[1],
+ "@version": this.version || 0,
+ tag: Object.keys(this.tags).map(function(k) {
+ return { keyAttributes: { k, v: this.tags[k] } };
+ }, this)
+ }
+ };
+ if (changeset_id)
+ r.node["@changeset"] = changeset_id;
+ return r;
+ },
+ asGeoJSON: function() {
+ return {
+ type: "Point",
+ coordinates: this.loc
+ };
+ }
+ });
+
+ // modules/actions/circularize.js
+ function actionCircularize(wayId, projection2, maxAngle) {
+ maxAngle = (maxAngle || 20) * Math.PI / 180;
+ var action = function(graph, t) {
+ if (t === null || !isFinite(t))
+ t = 1;
+ t = Math.min(Math.max(+t, 0), 1);
+ var way = graph.entity(wayId);
+ var origNodes = {};
+ graph.childNodes(way).forEach(function(node2) {
+ if (!origNodes[node2.id])
+ origNodes[node2.id] = node2;
+ });
+ if (!way.isConvex(graph)) {
+ graph = action.makeConvex(graph);
+ }
+ var nodes = utilArrayUniq(graph.childNodes(way));
+ var keyNodes = nodes.filter(function(n2) {
+ return graph.parentWays(n2).length !== 1;
+ });
+ var points = nodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ var keyPoints = keyNodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ var centroid = points.length === 2 ? geoVecInterp(points[0], points[1], 0.5) : centroid_default2(points);
+ var radius = median(points, function(p) {
+ return geoVecLength(centroid, p);
+ });
+ var sign2 = area_default3(points) > 0 ? 1 : -1;
+ var ids, i2, j2, k;
+ if (!keyNodes.length) {
+ keyNodes = [nodes[0]];
+ keyPoints = [points[0]];
+ }
+ if (keyNodes.length === 1) {
+ var index = nodes.indexOf(keyNodes[0]);
+ var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
+ keyNodes.push(nodes[oppositeIndex]);
+ keyPoints.push(points[oppositeIndex]);
+ }
+ for (i2 = 0; i2 < keyPoints.length; i2++) {
+ var nextKeyNodeIndex = (i2 + 1) % keyNodes.length;
+ var startNode = keyNodes[i2];
+ var endNode = keyNodes[nextKeyNodeIndex];
+ var startNodeIndex = nodes.indexOf(startNode);
+ var endNodeIndex = nodes.indexOf(endNode);
+ var numberNewPoints = -1;
+ var indexRange = endNodeIndex - startNodeIndex;
+ var nearNodes = {};
+ var inBetweenNodes = [];
+ var startAngle, endAngle, totalAngle, eachAngle;
+ var angle2, loc, node, origNode;
+ if (indexRange < 0) {
+ indexRange += nodes.length;
+ }
+ var distance = geoVecLength(centroid, keyPoints[i2]) || 1e-4;
+ keyPoints[i2] = [
+ centroid[0] + (keyPoints[i2][0] - centroid[0]) / distance * radius,
+ centroid[1] + (keyPoints[i2][1] - centroid[1]) / distance * radius
+ ];
+ loc = projection2.invert(keyPoints[i2]);
+ node = keyNodes[i2];
+ origNode = origNodes[node.id];
+ node = node.move(geoVecInterp(origNode.loc, loc, t));
+ graph = graph.replace(node);
+ startAngle = Math.atan2(keyPoints[i2][1] - centroid[1], keyPoints[i2][0] - centroid[0]);
+ endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
+ totalAngle = endAngle - startAngle;
+ if (totalAngle * sign2 > 0) {
+ totalAngle = -sign2 * (2 * Math.PI - Math.abs(totalAngle));
+ }
+ do {
+ numberNewPoints++;
+ eachAngle = totalAngle / (indexRange + numberNewPoints);
+ } while (Math.abs(eachAngle) > maxAngle);
+ for (j2 = 1; j2 < indexRange; j2++) {
+ angle2 = startAngle + j2 * eachAngle;
+ loc = projection2.invert([
+ centroid[0] + Math.cos(angle2) * radius,
+ centroid[1] + Math.sin(angle2) * radius
+ ]);
+ node = nodes[(j2 + startNodeIndex) % nodes.length];
+ origNode = origNodes[node.id];
+ nearNodes[node.id] = angle2;
+ node = node.move(geoVecInterp(origNode.loc, loc, t));
+ graph = graph.replace(node);
+ }
+ for (j2 = 0; j2 < numberNewPoints; j2++) {
+ angle2 = startAngle + (indexRange + j2) * eachAngle;
+ loc = projection2.invert([
+ centroid[0] + Math.cos(angle2) * radius,
+ centroid[1] + Math.sin(angle2) * radius
+ ]);
+ var min3 = Infinity;
+ for (var nodeId in nearNodes) {
+ var nearAngle = nearNodes[nodeId];
+ var dist = Math.abs(nearAngle - angle2);
+ if (dist < min3) {
+ min3 = dist;
+ origNode = origNodes[nodeId];
+ }
+ }
+ node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
+ graph = graph.replace(node);
+ nodes.splice(endNodeIndex + j2, 0, node);
+ inBetweenNodes.push(node.id);
+ }
+ if (indexRange === 1 && inBetweenNodes.length) {
+ var startIndex1 = way.nodes.lastIndexOf(startNode.id);
+ var endIndex1 = way.nodes.lastIndexOf(endNode.id);
+ var wayDirection1 = endIndex1 - startIndex1;
+ if (wayDirection1 < -1) {
+ wayDirection1 = 1;
+ }
+ var parentWays = graph.parentWays(keyNodes[i2]);
+ for (j2 = 0; j2 < parentWays.length; j2++) {
+ var sharedWay = parentWays[j2];
+ if (sharedWay === way)
+ continue;
+ if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
+ var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id);
+ var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id);
+ var wayDirection2 = endIndex2 - startIndex2;
+ var insertAt = endIndex2;
+ if (wayDirection2 < -1) {
+ wayDirection2 = 1;
+ }
+ if (wayDirection1 !== wayDirection2) {
+ inBetweenNodes.reverse();
+ insertAt = startIndex2;
+ }
+ for (k = 0; k < inBetweenNodes.length; k++) {
+ sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k);
+ }
+ graph = graph.replace(sharedWay);
+ }
+ }
+ }
+ }
+ ids = nodes.map(function(n2) {
+ return n2.id;
+ });
+ ids.push(ids[0]);
+ way = way.update({ nodes: ids });
+ graph = graph.replace(way);
+ return graph;
+ };
+ action.makeConvex = function(graph) {
+ var way = graph.entity(wayId);
+ var nodes = utilArrayUniq(graph.childNodes(way));
+ var points = nodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ var sign2 = area_default3(points) > 0 ? 1 : -1;
+ var hull = hull_default(points);
+ var i2, j2;
+ if (sign2 === -1) {
+ nodes.reverse();
+ points.reverse();
+ }
+ for (i2 = 0; i2 < hull.length - 1; i2++) {
+ var startIndex = points.indexOf(hull[i2]);
+ var endIndex = points.indexOf(hull[i2 + 1]);
+ var indexRange = endIndex - startIndex;
+ if (indexRange < 0) {
+ indexRange += nodes.length;
+ }
+ for (j2 = 1; j2 < indexRange; j2++) {
+ var point = geoVecInterp(hull[i2], hull[i2 + 1], j2 / indexRange);
+ var node = nodes[(j2 + startIndex) % nodes.length].move(projection2.invert(point));
+ graph = graph.replace(node);
+ }
+ }
+ return graph;
+ };
+ action.disabled = function(graph) {
+ if (!graph.entity(wayId).isClosed()) {
+ return "not_closed";
+ }
+ var way = graph.entity(wayId);
+ var nodes = utilArrayUniq(graph.childNodes(way));
+ var points = nodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ var hull = hull_default(points);
+ var epsilonAngle = Math.PI / 180;
+ if (hull.length !== points.length || hull.length < 3) {
+ return false;
+ }
+ var centroid = centroid_default2(points);
+ var radius = geoVecLengthSquare(centroid, points[0]);
+ var i2, actualPoint;
+ for (i2 = 0; i2 < hull.length; i2++) {
+ actualPoint = hull[i2];
+ var actualDist = geoVecLengthSquare(actualPoint, centroid);
+ var diff = Math.abs(actualDist - radius);
+ if (diff > 0.05 * radius) {
+ return false;
+ }
+ }
+ for (i2 = 0; i2 < hull.length; i2++) {
+ actualPoint = hull[i2];
+ var nextPoint = hull[(i2 + 1) % hull.length];
+ var startAngle = Math.atan2(actualPoint[1] - centroid[1], actualPoint[0] - centroid[0]);
+ var endAngle = Math.atan2(nextPoint[1] - centroid[1], nextPoint[0] - centroid[0]);
+ var angle2 = endAngle - startAngle;
+ if (angle2 < 0) {
+ angle2 = -angle2;
+ }
+ if (angle2 > Math.PI) {
+ angle2 = 2 * Math.PI - angle2;
+ }
+ if (angle2 > maxAngle + epsilonAngle) {
+ return false;
+ }
+ }
+ return "already_circular";
+ };
+ action.transitionable = true;
+ return action;
+ }
+
+ // modules/actions/delete_way.js
+ function actionDeleteWay(wayID) {
+ function canDeleteNode(node, graph) {
+ if (graph.parentWays(node).length || graph.parentRelations(node).length)
+ return false;
+ var geometries = osmNodeGeometriesForTags(node.tags);
+ if (geometries.point)
+ return false;
+ if (geometries.vertex)
+ return true;
+ return !node.hasInterestingTags();
+ }
+ var action = function(graph) {
+ var way = graph.entity(wayID);
+ graph.parentRelations(way).forEach(function(parent) {
+ parent = parent.removeMembersWithID(wayID);
+ graph = graph.replace(parent);
+ if (parent.isDegenerate()) {
+ graph = actionDeleteRelation(parent.id)(graph);
+ }
+ });
+ new Set(way.nodes).forEach(function(nodeID) {
+ graph = graph.replace(way.removeNode(nodeID));
+ var node = graph.entity(nodeID);
+ if (canDeleteNode(node, graph)) {
+ graph = graph.remove(node);
+ }
+ });
+ return graph.remove(way);
+ };
+ return action;
+ }
+
+ // modules/actions/delete_multiple.js
+ function actionDeleteMultiple(ids) {
+ var actions = {
+ way: actionDeleteWay,
+ node: actionDeleteNode,
+ relation: actionDeleteRelation
+ };
+ var action = function(graph) {
+ ids.forEach(function(id2) {
+ if (graph.hasEntity(id2)) {
+ graph = actions[graph.entity(id2).type](id2)(graph);
+ }
+ });
+ return graph;
+ };
+ return action;
+ }
+
+ // modules/actions/delete_relation.js
+ function actionDeleteRelation(relationID, allowUntaggedMembers) {
+ function canDeleteEntity(entity, graph) {
+ return !graph.parentWays(entity).length && !graph.parentRelations(entity).length && (!entity.hasInterestingTags() && !allowUntaggedMembers);
+ }
+ var action = function(graph) {
+ var relation = graph.entity(relationID);
+ graph.parentRelations(relation).forEach(function(parent) {
+ parent = parent.removeMembersWithID(relationID);
+ graph = graph.replace(parent);
+ if (parent.isDegenerate()) {
+ graph = actionDeleteRelation(parent.id)(graph);
+ }
+ });
+ var memberIDs = utilArrayUniq(relation.members.map(function(m) {
+ return m.id;
+ }));
+ memberIDs.forEach(function(memberID) {
+ graph = graph.replace(relation.removeMembersWithID(memberID));
+ var entity = graph.entity(memberID);
+ if (canDeleteEntity(entity, graph)) {
+ graph = actionDeleteMultiple([memberID])(graph);
+ }
+ });
+ return graph.remove(relation);
+ };
+ return action;
+ }
+
+ // modules/actions/delete_node.js
+ function actionDeleteNode(nodeId) {
+ var action = function(graph) {
+ var node = graph.entity(nodeId);
+ graph.parentWays(node).forEach(function(parent) {
+ parent = parent.removeNode(nodeId);
+ graph = graph.replace(parent);
+ if (parent.isDegenerate()) {
+ graph = actionDeleteWay(parent.id)(graph);
+ }
+ });
+ graph.parentRelations(node).forEach(function(parent) {
+ parent = parent.removeMembersWithID(nodeId);
+ graph = graph.replace(parent);
+ if (parent.isDegenerate()) {
+ graph = actionDeleteRelation(parent.id)(graph);
+ }
+ });
+ return graph.remove(node);
+ };
+ return action;
+ }
+
+ // modules/actions/connect.js
+ function actionConnect(nodeIDs) {
+ var action = function(graph) {
+ var survivor;
+ var node;
+ var parents;
+ var i2, j2;
+ nodeIDs.reverse();
+ var interestingIDs = [];
+ for (i2 = 0; i2 < nodeIDs.length; i2++) {
+ node = graph.entity(nodeIDs[i2]);
+ if (node.hasInterestingTags()) {
+ if (!node.isNew()) {
+ interestingIDs.push(node.id);
+ }
+ }
+ }
+ survivor = graph.entity(utilOldestID(interestingIDs.length > 0 ? interestingIDs : nodeIDs));
+ for (i2 = 0; i2 < nodeIDs.length; i2++) {
+ node = graph.entity(nodeIDs[i2]);
+ if (node.id === survivor.id)
+ continue;
+ parents = graph.parentWays(node);
+ for (j2 = 0; j2 < parents.length; j2++) {
+ graph = graph.replace(parents[j2].replaceNode(node.id, survivor.id));
+ }
+ parents = graph.parentRelations(node);
+ for (j2 = 0; j2 < parents.length; j2++) {
+ graph = graph.replace(parents[j2].replaceMember(node, survivor));
+ }
+ survivor = survivor.mergeTags(node.tags);
+ graph = actionDeleteNode(node.id)(graph);
+ }
+ graph = graph.replace(survivor);
+ parents = graph.parentWays(survivor);
+ for (i2 = 0; i2 < parents.length; i2++) {
+ if (parents[i2].isDegenerate()) {
+ graph = actionDeleteWay(parents[i2].id)(graph);
+ }
+ }
+ return graph;
+ };
+ action.disabled = function(graph) {
+ var seen = {};
+ var restrictionIDs = [];
+ var survivor;
+ var node, way;
+ var relations, relation, role;
+ var i2, j2, k;
+ survivor = graph.entity(utilOldestID(nodeIDs));
+ for (i2 = 0; i2 < nodeIDs.length; i2++) {
+ node = graph.entity(nodeIDs[i2]);
+ relations = graph.parentRelations(node);
+ for (j2 = 0; j2 < relations.length; j2++) {
+ relation = relations[j2];
+ role = relation.memberById(node.id).role || "";
+ if (relation.hasFromViaTo()) {
+ restrictionIDs.push(relation.id);
+ }
+ if (seen[relation.id] !== void 0 && seen[relation.id] !== role) {
+ return "relation";
+ } else {
+ seen[relation.id] = role;
+ }
+ }
+ }
+ for (i2 = 0; i2 < nodeIDs.length; i2++) {
+ node = graph.entity(nodeIDs[i2]);
+ var parents = graph.parentWays(node);
+ for (j2 = 0; j2 < parents.length; j2++) {
+ var parent = parents[j2];
+ relations = graph.parentRelations(parent);
+ for (k = 0; k < relations.length; k++) {
+ relation = relations[k];
+ if (relation.hasFromViaTo()) {
+ restrictionIDs.push(relation.id);
+ }
+ }
+ }
+ }
+ restrictionIDs = utilArrayUniq(restrictionIDs);
+ for (i2 = 0; i2 < restrictionIDs.length; i2++) {
+ relation = graph.entity(restrictionIDs[i2]);
+ if (!relation.isComplete(graph))
+ continue;
+ var memberWays = relation.members.filter(function(m) {
+ return m.type === "way";
+ }).map(function(m) {
+ return graph.entity(m.id);
+ });
+ memberWays = utilArrayUniq(memberWays);
+ var f2 = relation.memberByRole("from");
+ var t = relation.memberByRole("to");
+ var isUturn = f2.id === t.id;
+ var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
+ for (j2 = 0; j2 < relation.members.length; j2++) {
+ collectNodes(relation.members[j2], nodes);
+ }
+ nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates));
+ nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates));
+ var filter2 = keyNodeFilter(nodes.keyfrom, nodes.keyto);
+ nodes.from = nodes.from.filter(filter2);
+ nodes.via = nodes.via.filter(filter2);
+ nodes.to = nodes.to.filter(filter2);
+ var connectFrom = false;
+ var connectVia = false;
+ var connectTo = false;
+ var connectKeyFrom = false;
+ var connectKeyTo = false;
+ for (j2 = 0; j2 < nodeIDs.length; j2++) {
+ var n2 = nodeIDs[j2];
+ if (nodes.from.indexOf(n2) !== -1) {
+ connectFrom = true;
+ }
+ if (nodes.via.indexOf(n2) !== -1) {
+ connectVia = true;
+ }
+ if (nodes.to.indexOf(n2) !== -1) {
+ connectTo = true;
+ }
+ if (nodes.keyfrom.indexOf(n2) !== -1) {
+ connectKeyFrom = true;
+ }
+ if (nodes.keyto.indexOf(n2) !== -1) {
+ connectKeyTo = true;
+ }
+ }
+ if (connectFrom && connectTo && !isUturn) {
+ return "restriction";
+ }
+ if (connectFrom && connectVia) {
+ return "restriction";
+ }
+ if (connectTo && connectVia) {
+ return "restriction";
+ }
+ if (connectKeyFrom || connectKeyTo) {
+ if (nodeIDs.length !== 2) {
+ return "restriction";
+ }
+ var n0 = null;
+ var n1 = null;
+ for (j2 = 0; j2 < memberWays.length; j2++) {
+ way = memberWays[j2];
+ if (way.contains(nodeIDs[0])) {
+ n0 = nodeIDs[0];
+ }
+ if (way.contains(nodeIDs[1])) {
+ n1 = nodeIDs[1];
+ }
+ }
+ if (n0 && n1) {
+ var ok = false;
+ for (j2 = 0; j2 < memberWays.length; j2++) {
+ way = memberWays[j2];
+ if (way.areAdjacent(n0, n1)) {
+ ok = true;
+ break;
+ }
+ }
+ if (!ok) {
+ return "restriction";
+ }
+ }
+ }
+ for (j2 = 0; j2 < memberWays.length; j2++) {
+ way = memberWays[j2].update({});
+ for (k = 0; k < nodeIDs.length; k++) {
+ if (nodeIDs[k] === survivor.id)
+ continue;
+ if (way.areAdjacent(nodeIDs[k], survivor.id)) {
+ way = way.removeNode(nodeIDs[k]);
+ } else {
+ way = way.replaceNode(nodeIDs[k], survivor.id);
+ }
+ }
+ if (way.isDegenerate()) {
+ return "restriction";
+ }
+ }
+ }
+ return false;
+ function hasDuplicates(n3, i3, arr) {
+ return arr.indexOf(n3) !== arr.lastIndexOf(n3);
+ }
+ function keyNodeFilter(froms, tos) {
+ return function(n3) {
+ return froms.indexOf(n3) === -1 && tos.indexOf(n3) === -1;
+ };
+ }
+ function collectNodes(member, collection) {
+ var entity = graph.hasEntity(member.id);
+ if (!entity)
+ return;
+ var role2 = member.role || "";
+ if (!collection[role2]) {
+ collection[role2] = [];
+ }
+ if (member.type === "node") {
+ collection[role2].push(member.id);
+ if (role2 === "via") {
+ collection.keyfrom.push(member.id);
+ collection.keyto.push(member.id);
+ }
+ } else if (member.type === "way") {
+ collection[role2].push.apply(collection[role2], entity.nodes);
+ if (role2 === "from" || role2 === "via") {
+ collection.keyfrom.push(entity.first());
+ collection.keyfrom.push(entity.last());
+ }
+ if (role2 === "to" || role2 === "via") {
+ collection.keyto.push(entity.first());
+ collection.keyto.push(entity.last());
+ }
+ }
+ }
+ };
+ return action;
+ }
+
+ // modules/actions/copy_entities.js
+ function actionCopyEntities(ids, fromGraph) {
+ var _copies = {};
+ var action = function(graph) {
+ ids.forEach(function(id3) {
+ fromGraph.entity(id3).copy(fromGraph, _copies);
+ });
+ for (var id2 in _copies) {
+ graph = graph.replace(_copies[id2]);
+ }
+ return graph;
+ };
+ action.copies = function() {
+ return _copies;
+ };
+ return action;
+ }
+
+ // modules/actions/delete_member.js
+ function actionDeleteMember(relationId, memberIndex) {
+ return function(graph) {
+ var relation = graph.entity(relationId).removeMember(memberIndex);
+ graph = graph.replace(relation);
+ if (relation.isDegenerate()) {
+ graph = actionDeleteRelation(relation.id)(graph);
+ }
+ return graph;
+ };
+ }
+
+ // modules/actions/discard_tags.js
+ function actionDiscardTags(difference, discardTags) {
+ discardTags = discardTags || {};
+ return (graph) => {
+ difference.modified().forEach(checkTags);
+ difference.created().forEach(checkTags);
+ return graph;
+ function checkTags(entity) {
+ const keys = Object.keys(entity.tags);
+ let didDiscard = false;
+ let tags = {};
+ for (let i2 = 0; i2 < keys.length; i2++) {
+ const k = keys[i2];
+ if (discardTags[k] || !entity.tags[k]) {
+ didDiscard = true;
+ } else {
+ tags[k] = entity.tags[k];
+ }
+ }
+ if (didDiscard) {
+ graph = graph.replace(entity.update({ tags }));
+ }
+ }
+ };
+ }
+
+ // modules/actions/disconnect.js
+ function actionDisconnect(nodeId, newNodeId) {
+ var wayIds;
+ var disconnectableRelationTypes = {
+ "associatedStreet": true,
+ "enforcement": true,
+ "site": true
+ };
+ var action = function(graph) {
+ var node = graph.entity(nodeId);
+ var connections = action.connections(graph);
+ connections.forEach(function(connection) {
+ var way = graph.entity(connection.wayID);
+ var newNode = osmNode({ id: newNodeId, loc: node.loc, tags: node.tags });
+ graph = graph.replace(newNode);
+ if (connection.index === 0 && way.isArea()) {
+ graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
+ } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
+ graph = graph.replace(way.unclose().addNode(newNode.id));
+ } else {
+ graph = graph.replace(way.updateNode(newNode.id, connection.index));
+ }
+ });
+ return graph;
+ };
+ action.connections = function(graph) {
+ var candidates = [];
+ var keeping = false;
+ var parentWays = graph.parentWays(graph.entity(nodeId));
+ var way, waynode;
+ for (var i2 = 0; i2 < parentWays.length; i2++) {
+ way = parentWays[i2];
+ if (wayIds && wayIds.indexOf(way.id) === -1) {
+ keeping = true;
+ continue;
+ }
+ if (way.isArea() && way.nodes[0] === nodeId) {
+ candidates.push({ wayID: way.id, index: 0 });
+ } else {
+ for (var j2 = 0; j2 < way.nodes.length; j2++) {
+ waynode = way.nodes[j2];
+ if (waynode === nodeId) {
+ if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && j2 === way.nodes.length - 1) {
+ continue;
+ }
+ candidates.push({ wayID: way.id, index: j2 });
+ }
+ }
+ }
+ }
+ return keeping ? candidates : candidates.slice(1);
+ };
+ action.disabled = function(graph) {
+ var connections = action.connections(graph);
+ if (connections.length === 0)
+ return "not_connected";
+ var parentWays = graph.parentWays(graph.entity(nodeId));
+ var seenRelationIds = {};
+ var sharedRelation;
+ parentWays.forEach(function(way) {
+ var relations = graph.parentRelations(way);
+ relations.filter((relation) => !disconnectableRelationTypes[relation.tags.type]).forEach(function(relation) {
+ if (relation.id in seenRelationIds) {
+ if (wayIds) {
+ if (wayIds.indexOf(way.id) !== -1 || wayIds.indexOf(seenRelationIds[relation.id]) !== -1) {
+ sharedRelation = relation;
+ }
+ } else {
+ sharedRelation = relation;
+ }
+ } else {
+ seenRelationIds[relation.id] = way.id;
+ }
+ });
+ });
+ if (sharedRelation)
+ return "relation";
+ };
+ action.limitWays = function(val) {
+ if (!arguments.length)
+ return wayIds;
+ wayIds = val;
+ return action;
+ };
+ return action;
+ }
+
+ // modules/actions/extract.js
+ function actionExtract(entityID, projection2) {
+ var extractedNodeID;
+ var action = function(graph) {
+ var entity = graph.entity(entityID);
+ if (entity.type === "node") {
+ return extractFromNode(entity, graph);
+ }
+ return extractFromWayOrRelation(entity, graph);
+ };
+ function extractFromNode(node, graph) {
+ extractedNodeID = node.id;
+ var replacement = osmNode({ loc: node.loc });
+ graph = graph.replace(replacement);
+ graph = graph.parentWays(node).reduce(function(accGraph, parentWay) {
+ return accGraph.replace(parentWay.replaceNode(entityID, replacement.id));
+ }, graph);
+ return graph.parentRelations(node).reduce(function(accGraph, parentRel) {
+ return accGraph.replace(parentRel.replaceMember(node, replacement));
+ }, graph);
+ }
+ function extractFromWayOrRelation(entity, graph) {
+ var fromGeometry = entity.geometry(graph);
+ var keysToCopyAndRetain = ["source", "wheelchair"];
+ var keysToRetain = ["area"];
+ var buildingKeysToRetain = ["architect", "building", "height", "layer"];
+ var extractedLoc = path_default(projection2).centroid(entity.asGeoJSON(graph));
+ extractedLoc = extractedLoc && projection2.invert(extractedLoc);
+ if (!extractedLoc || !isFinite(extractedLoc[0]) || !isFinite(extractedLoc[1])) {
+ extractedLoc = entity.extent(graph).center();
+ }
+ var indoorAreaValues = {
+ area: true,
+ corridor: true,
+ elevator: true,
+ level: true,
+ room: true
+ };
+ var isBuilding = entity.tags.building && entity.tags.building !== "no" || entity.tags["building:part"] && entity.tags["building:part"] !== "no";
+ var isIndoorArea = fromGeometry === "area" && entity.tags.indoor && indoorAreaValues[entity.tags.indoor];
+ var entityTags = Object.assign({}, entity.tags);
+ var pointTags = {};
+ for (var key in entityTags) {
+ if (entity.type === "relation" && key === "type") {
+ continue;
+ }
+ if (keysToRetain.indexOf(key) !== -1) {
+ continue;
+ }
+ if (isBuilding) {
+ if (buildingKeysToRetain.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/))
+ continue;
+ }
+ if (isIndoorArea && key === "indoor") {
+ continue;
+ }
+ pointTags[key] = entityTags[key];
+ if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) {
+ continue;
+ } else if (isIndoorArea && key === "level") {
+ continue;
+ }
+ delete entityTags[key];
+ }
+ if (!isBuilding && !isIndoorArea && fromGeometry === "area") {
+ entityTags.area = "yes";
+ }
+ var replacement = osmNode({ loc: extractedLoc, tags: pointTags });
+ graph = graph.replace(replacement);
+ extractedNodeID = replacement.id;
+ return graph.replace(entity.update({ tags: entityTags }));
+ }
+ action.getExtractedNodeID = function() {
+ return extractedNodeID;
+ };
+ return action;
+ }
+
+ // modules/actions/join.js
+ function actionJoin(ids) {
+ function groupEntitiesByGeometry(graph) {
+ var entities = ids.map(function(id2) {
+ return graph.entity(id2);
+ });
+ return Object.assign({ line: [] }, utilArrayGroupBy(entities, function(entity) {
+ return entity.geometry(graph);
+ }));
+ }
+ var action = function(graph) {
+ var ways = ids.map(graph.entity, graph);
+ var survivorID = utilOldestID(ways.map((way) => way.id));
+ ways.sort(function(a, b) {
+ var aSided = a.isSided();
+ var bSided = b.isSided();
+ return aSided && !bSided ? -1 : bSided && !aSided ? 1 : 0;
+ });
+ var sequences = osmJoinWays(ways, graph);
+ var joined = sequences[0];
+ graph = sequences.actions.reduce(function(g, action2) {
+ return action2(g);
+ }, graph);
+ var survivor = graph.entity(survivorID);
+ survivor = survivor.update({ nodes: joined.nodes.map(function(n2) {
+ return n2.id;
+ }) });
+ graph = graph.replace(survivor);
+ joined.forEach(function(way) {
+ if (way.id === survivorID)
+ return;
+ graph.parentRelations(way).forEach(function(parent) {
+ graph = graph.replace(parent.replaceMember(way, survivor));
+ });
+ survivor = survivor.mergeTags(way.tags);
+ graph = graph.replace(survivor);
+ graph = actionDeleteWay(way.id)(graph);
+ });
+ function checkForSimpleMultipolygon() {
+ if (!survivor.isClosed())
+ return;
+ var multipolygons = graph.parentMultipolygons(survivor).filter(function(multipolygon2) {
+ return multipolygon2.members.length === 1;
+ });
+ if (multipolygons.length !== 1)
+ return;
+ var multipolygon = multipolygons[0];
+ for (var key in survivor.tags) {
+ if (multipolygon.tags[key] && multipolygon.tags[key] !== survivor.tags[key])
+ return;
+ }
+ survivor = survivor.mergeTags(multipolygon.tags);
+ graph = graph.replace(survivor);
+ graph = actionDeleteRelation(multipolygon.id, true)(graph);
+ var tags = Object.assign({}, survivor.tags);
+ if (survivor.geometry(graph) !== "area") {
+ tags.area = "yes";
+ }
+ delete tags.type;
+ survivor = survivor.update({ tags });
+ graph = graph.replace(survivor);
+ }
+ checkForSimpleMultipolygon();
+ return graph;
+ };
+ action.resultingWayNodesLength = function(graph) {
+ return ids.reduce(function(count, id2) {
+ return count + graph.entity(id2).nodes.length;
+ }, 0) - ids.length - 1;
+ };
+ action.disabled = function(graph) {
+ var geometries = groupEntitiesByGeometry(graph);
+ if (ids.length < 2 || ids.length !== geometries.line.length) {
+ return "not_eligible";
+ }
+ var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
+ if (joined.length > 1) {
+ return "not_adjacent";
+ }
+ var i2;
+ var sortedParentRelations = function(id2) {
+ return graph.parentRelations(graph.entity(id2)).filter((rel) => !rel.isRestriction() && !rel.isConnectivity()).sort((a, b) => a.id - b.id);
+ };
+ var relsA = sortedParentRelations(ids[0]);
+ for (i2 = 1; i2 < ids.length; i2++) {
+ var relsB = sortedParentRelations(ids[i2]);
+ if (!utilArrayIdentical(relsA, relsB)) {
+ return "conflicting_relations";
+ }
+ }
+ for (i2 = 0; i2 < ids.length - 1; i2++) {
+ for (var j2 = i2 + 1; j2 < ids.length; j2++) {
+ var path1 = graph.childNodes(graph.entity(ids[i2])).map(function(e) {
+ return e.loc;
+ });
+ var path2 = graph.childNodes(graph.entity(ids[j2])).map(function(e) {
+ return e.loc;
+ });
+ var intersections = geoPathIntersections(path1, path2);
+ var common = utilArrayIntersection(joined[0].nodes.map(function(n2) {
+ return n2.loc.toString();
+ }), intersections.map(function(n2) {
+ return n2.toString();
+ }));
+ if (common.length !== intersections.length) {
+ return "paths_intersect";
+ }
+ }
+ }
+ var nodeIds = joined[0].nodes.map(function(n2) {
+ return n2.id;
+ }).slice(1, -1);
+ var relation;
+ var tags = {};
+ var conflicting = false;
+ joined[0].forEach(function(way) {
+ var parents = graph.parentRelations(way);
+ parents.forEach(function(parent) {
+ if ((parent.isRestriction() || parent.isConnectivity()) && parent.members.some(function(m) {
+ return nodeIds.indexOf(m.id) >= 0;
+ })) {
+ relation = parent;
+ }
+ });
+ for (var k in way.tags) {
+ if (!(k in tags)) {
+ tags[k] = way.tags[k];
+ } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
+ conflicting = true;
+ }
+ }
+ });
+ if (relation) {
+ return relation.isRestriction() ? "restriction" : "connectivity";
+ }
+ if (conflicting) {
+ return "conflicting_tags";
+ }
+ };
+ return action;
+ }
+
+ // modules/actions/merge.js
+ function actionMerge(ids) {
+ function groupEntitiesByGeometry(graph) {
+ var entities = ids.map(function(id2) {
+ return graph.entity(id2);
+ });
+ return Object.assign({ point: [], area: [], line: [], relation: [] }, utilArrayGroupBy(entities, function(entity) {
+ return entity.geometry(graph);
+ }));
+ }
+ var action = function(graph) {
+ var geometries = groupEntitiesByGeometry(graph);
+ var target = geometries.area[0] || geometries.line[0];
+ var points = geometries.point;
+ points.forEach(function(point) {
+ target = target.mergeTags(point.tags);
+ graph = graph.replace(target);
+ graph.parentRelations(point).forEach(function(parent) {
+ graph = graph.replace(parent.replaceMember(point, target));
+ });
+ var nodes = utilArrayUniq(graph.childNodes(target));
+ var removeNode = point;
+ if (!point.isNew()) {
+ var inserted = false;
+ var canBeReplaced = function(node2) {
+ return !(graph.parentWays(node2).length > 1 || graph.parentRelations(node2).length);
+ };
+ var replaceNode = function(node2) {
+ graph = graph.replace(point.update({ tags: node2.tags, loc: node2.loc }));
+ target = target.replaceNode(node2.id, point.id);
+ graph = graph.replace(target);
+ removeNode = node2;
+ inserted = true;
+ };
+ var i2;
+ var node;
+ for (i2 = 0; i2 < nodes.length; i2++) {
+ node = nodes[i2];
+ if (canBeReplaced(node) && node.isNew()) {
+ replaceNode(node);
+ break;
+ }
+ }
+ if (!inserted && point.hasInterestingTags()) {
+ for (i2 = 0; i2 < nodes.length; i2++) {
+ node = nodes[i2];
+ if (canBeReplaced(node) && !node.hasInterestingTags()) {
+ replaceNode(node);
+ break;
+ }
+ }
+ if (!inserted) {
+ for (i2 = 0; i2 < nodes.length; i2++) {
+ node = nodes[i2];
+ if (canBeReplaced(node) && utilCompareIDs(point.id, node.id) < 0) {
+ replaceNode(node);
+ break;
+ }
+ }
+ }
+ }
+ }
+ graph = graph.remove(removeNode);
+ });
+ if (target.tags.area === "yes") {
+ var tags = Object.assign({}, target.tags);
+ delete tags.area;
+ if (osmTagSuggestingArea(tags)) {
+ target = target.update({ tags });
+ graph = graph.replace(target);
+ }
+ }
+ return graph;
+ };
+ action.disabled = function(graph) {
+ var geometries = groupEntitiesByGeometry(graph);
+ if (geometries.point.length === 0 || geometries.area.length + geometries.line.length !== 1 || geometries.relation.length !== 0) {
+ return "not_eligible";
+ }
+ };
+ return action;
+ }
+
+ // modules/actions/merge_nodes.js
+ function actionMergeNodes(nodeIDs, loc) {
+ function chooseLoc(graph) {
+ if (!nodeIDs.length)
+ return null;
+ var sum = [0, 0];
+ var interestingCount = 0;
+ var interestingLoc;
+ for (var i2 = 0; i2 < nodeIDs.length; i2++) {
+ var node = graph.entity(nodeIDs[i2]);
+ if (node.hasInterestingTags()) {
+ interestingLoc = ++interestingCount === 1 ? node.loc : null;
+ }
+ sum = geoVecAdd(sum, node.loc);
+ }
+ return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
+ }
+ var action = function(graph) {
+ if (nodeIDs.length < 2)
+ return graph;
+ var toLoc = loc;
+ if (!toLoc) {
+ toLoc = chooseLoc(graph);
+ }
+ for (var i2 = 0; i2 < nodeIDs.length; i2++) {
+ var node = graph.entity(nodeIDs[i2]);
+ if (node.loc !== toLoc) {
+ graph = graph.replace(node.move(toLoc));
+ }
+ }
+ return actionConnect(nodeIDs)(graph);
+ };
+ action.disabled = function(graph) {
+ if (nodeIDs.length < 2)
+ return "not_eligible";
+ for (var i2 = 0; i2 < nodeIDs.length; i2++) {
+ var entity = graph.entity(nodeIDs[i2]);
+ if (entity.type !== "node")
+ return "not_eligible";
+ }
+ return actionConnect(nodeIDs).disabled(graph);
+ };
+ return action;
+ }
+
+ // modules/osm/changeset.js
+ function osmChangeset() {
+ if (!(this instanceof osmChangeset)) {
+ return new osmChangeset().initialize(arguments);
+ } else if (arguments.length) {
+ this.initialize(arguments);
+ }
+ }
+ osmEntity.changeset = osmChangeset;
+ osmChangeset.prototype = Object.create(osmEntity.prototype);
+ Object.assign(osmChangeset.prototype, {
+ type: "changeset",
+ extent: function() {
+ return new geoExtent();
+ },
+ geometry: function() {
+ return "changeset";
+ },
+ asJXON: function() {
+ return {
+ osm: {
+ changeset: {
+ tag: Object.keys(this.tags).map(function(k) {
+ return { "@k": k, "@v": this.tags[k] };
+ }, this),
+ "@version": 0.6,
+ "@generator": "iD"
+ }
+ }
+ };
+ },
+ osmChangeJXON: function(changes) {
+ var changeset_id = this.id;
+ function nest(x, order) {
+ var groups = {};
+ for (var i2 = 0; i2 < x.length; i2++) {
+ var tagName = Object.keys(x[i2])[0];
+ if (!groups[tagName])
+ groups[tagName] = [];
+ groups[tagName].push(x[i2][tagName]);
+ }
+ var ordered = {};
+ order.forEach(function(o) {
+ if (groups[o])
+ ordered[o] = groups[o];
+ });
+ return ordered;
+ }
+ function sort(changes2) {
+ function resolve(item) {
+ return relations.find(function(relation2) {
+ return item.keyAttributes.type === "relation" && item.keyAttributes.ref === relation2["@id"];
+ });
+ }
+ function isNew(item) {
+ return !sorted[item["@id"]] && !processing.find(function(proc) {
+ return proc["@id"] === item["@id"];
+ });
+ }
+ var processing = [];
+ var sorted = {};
+ var relations = changes2.relation;
+ if (!relations)
+ return changes2;
+ for (var i2 = 0; i2 < relations.length; i2++) {
+ var relation = relations[i2];
+ if (!sorted[relation["@id"]]) {
+ processing.push(relation);
+ }
+ while (processing.length > 0) {
+ var next = processing[0], deps = next.member.map(resolve).filter(Boolean).filter(isNew);
+ if (deps.length === 0) {
+ sorted[next["@id"]] = next;
+ processing.shift();
+ } else {
+ processing = deps.concat(processing);
+ }
+ }
+ }
+ changes2.relation = Object.values(sorted);
+ return changes2;
+ }
+ function rep2(entity) {
+ return entity.asJXON(changeset_id);
+ }
+ return {
+ osmChange: {
+ "@version": 0.6,
+ "@generator": "iD",
+ "create": sort(nest(changes.created.map(rep2), ["node", "way", "relation"])),
+ "modify": nest(changes.modified.map(rep2), ["node", "way", "relation"]),
+ "delete": Object.assign(nest(changes.deleted.map(rep2), ["relation", "way", "node"]), { "@if-unused": true })
+ }
+ };
+ },
+ asGeoJSON: function() {
+ return {};
+ }
+ });
+
+ // modules/osm/note.js
+ function osmNote() {
+ if (!(this instanceof osmNote)) {
+ return new osmNote().initialize(arguments);
+ } else if (arguments.length) {
+ this.initialize(arguments);
+ }
+ }
+ osmNote.id = function() {
+ return osmNote.id.next--;
+ };
+ osmNote.id.next = -1;
+ Object.assign(osmNote.prototype, {
+ type: "note",
+ initialize: function(sources) {
+ for (var i2 = 0; i2 < sources.length; ++i2) {
+ var source = sources[i2];
+ for (var prop in source) {
+ if (Object.prototype.hasOwnProperty.call(source, prop)) {
+ if (source[prop] === void 0) {
+ delete this[prop];
+ } else {
+ this[prop] = source[prop];
+ }
+ }
+ }
+ }
+ if (!this.id) {
+ this.id = osmNote.id().toString();
+ }
+ return this;
+ },
+ extent: function() {
+ return new geoExtent(this.loc);
+ },
+ update: function(attrs) {
+ return osmNote(this, attrs);
+ },
+ isNew: function() {
+ return this.id < 0;
+ },
+ move: function(loc) {
+ return this.update({ loc });
+ }
+ });
+
+ // modules/osm/relation.js
+ function osmRelation() {
+ if (!(this instanceof osmRelation)) {
+ return new osmRelation().initialize(arguments);
+ } else if (arguments.length) {
+ this.initialize(arguments);
+ }
+ }
+ osmEntity.relation = osmRelation;
+ osmRelation.prototype = Object.create(osmEntity.prototype);
+ osmRelation.creationOrder = function(a, b) {
+ var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
+ var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
+ if (aId < 0 || bId < 0)
+ return aId - bId;
+ return bId - aId;
+ };
+ Object.assign(osmRelation.prototype, {
+ type: "relation",
+ members: [],
+ copy: function(resolver, copies) {
+ if (copies[this.id])
+ return copies[this.id];
+ var copy2 = osmEntity.prototype.copy.call(this, resolver, copies);
+ var members = this.members.map(function(member) {
+ return Object.assign({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
+ });
+ copy2 = copy2.update({ members });
+ copies[this.id] = copy2;
+ return copy2;
+ },
+ extent: function(resolver, memo) {
+ return resolver.transient(this, "extent", function() {
+ if (memo && memo[this.id])
+ return geoExtent();
+ memo = memo || {};
+ memo[this.id] = true;
+ var extent = geoExtent();
+ for (var i2 = 0; i2 < this.members.length; i2++) {
+ var member = resolver.hasEntity(this.members[i2].id);
+ if (member) {
+ extent._extend(member.extent(resolver, memo));
+ }
+ }
+ return extent;
+ });
+ },
+ geometry: function(graph) {
+ return graph.transient(this, "geometry", function() {
+ return this.isMultipolygon() ? "area" : "relation";
+ });
+ },
+ isDegenerate: function() {
+ return this.members.length === 0;
+ },
+ indexedMembers: function() {
+ var result = new Array(this.members.length);
+ for (var i2 = 0; i2 < this.members.length; i2++) {
+ result[i2] = Object.assign({}, this.members[i2], { index: i2 });
+ }
+ return result;
+ },
+ memberByRole: function(role) {
+ for (var i2 = 0; i2 < this.members.length; i2++) {
+ if (this.members[i2].role === role) {
+ return Object.assign({}, this.members[i2], { index: i2 });
+ }
+ }
+ },
+ membersByRole: function(role) {
+ var result = [];
+ for (var i2 = 0; i2 < this.members.length; i2++) {
+ if (this.members[i2].role === role) {
+ result.push(Object.assign({}, this.members[i2], { index: i2 }));
+ }
+ }
+ return result;
+ },
+ memberById: function(id2) {
+ for (var i2 = 0; i2 < this.members.length; i2++) {
+ if (this.members[i2].id === id2) {
+ return Object.assign({}, this.members[i2], { index: i2 });
+ }
+ }
+ },
+ memberByIdAndRole: function(id2, role) {
+ for (var i2 = 0; i2 < this.members.length; i2++) {
+ if (this.members[i2].id === id2 && this.members[i2].role === role) {
+ return Object.assign({}, this.members[i2], { index: i2 });
+ }
+ }
+ },
+ addMember: function(member, index) {
+ var members = this.members.slice();
+ members.splice(index === void 0 ? members.length : index, 0, member);
+ return this.update({ members });
+ },
+ updateMember: function(member, index) {
+ var members = this.members.slice();
+ members.splice(index, 1, Object.assign({}, members[index], member));
+ return this.update({ members });
+ },
+ removeMember: function(index) {
+ var members = this.members.slice();
+ members.splice(index, 1);
+ return this.update({ members });
+ },
+ removeMembersWithID: function(id2) {
+ var members = this.members.filter(function(m) {
+ return m.id !== id2;
+ });
+ return this.update({ members });
+ },
+ moveMember: function(fromIndex, toIndex) {
+ var members = this.members.slice();
+ members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]);
+ return this.update({ members });
+ },
+ replaceMember: function(needle, replacement, keepDuplicates) {
+ if (!this.memberById(needle.id))
+ return this;
+ var members = [];
+ for (var i2 = 0; i2 < this.members.length; i2++) {
+ var member = this.members[i2];
+ if (member.id !== needle.id) {
+ members.push(member);
+ } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
+ members.push({ id: replacement.id, type: replacement.type, role: member.role });
+ }
+ }
+ return this.update({ members });
+ },
+ asJXON: function(changeset_id) {
+ var r = {
+ relation: {
+ "@id": this.osmId(),
+ "@version": this.version || 0,
+ member: this.members.map(function(member) {
+ return {
+ keyAttributes: {
+ type: member.type,
+ role: member.role,
+ ref: osmEntity.id.toOSM(member.id)
+ }
+ };
+ }, this),
+ tag: Object.keys(this.tags).map(function(k) {
+ return { keyAttributes: { k, v: this.tags[k] } };
+ }, this)
+ }
+ };
+ if (changeset_id) {
+ r.relation["@changeset"] = changeset_id;
+ }
+ return r;
+ },
+ asGeoJSON: function(resolver) {
+ return resolver.transient(this, "GeoJSON", function() {
+ if (this.isMultipolygon()) {
+ return {
+ type: "MultiPolygon",
+ coordinates: this.multipolygon(resolver)
+ };
+ } else {
+ return {
+ type: "FeatureCollection",
+ properties: this.tags,
+ features: this.members.map(function(member) {
+ return Object.assign({ role: member.role }, resolver.entity(member.id).asGeoJSON(resolver));
+ })
+ };
+ }
+ });
+ },
+ area: function(resolver) {
+ return resolver.transient(this, "area", function() {
+ return area_default(this.asGeoJSON(resolver));
+ });
+ },
+ isMultipolygon: function() {
+ return this.tags.type === "multipolygon";
+ },
+ isComplete: function(resolver) {
+ for (var i2 = 0; i2 < this.members.length; i2++) {
+ if (!resolver.hasEntity(this.members[i2].id)) {
+ return false;
+ }
+ }
+ return true;
+ },
+ hasFromViaTo: function() {
+ return this.members.some(function(m) {
+ return m.role === "from";
+ }) && this.members.some(function(m) {
+ return m.role === "via";
+ }) && this.members.some(function(m) {
+ return m.role === "to";
+ });
+ },
+ isRestriction: function() {
+ return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
+ },
+ isValidRestriction: function() {
+ if (!this.isRestriction())
+ return false;
+ var froms = this.members.filter(function(m) {
+ return m.role === "from";
+ });
+ var vias = this.members.filter(function(m) {
+ return m.role === "via";
+ });
+ var tos = this.members.filter(function(m) {
+ return m.role === "to";
+ });
+ if (froms.length !== 1 && this.tags.restriction !== "no_entry")
+ return false;
+ if (froms.some(function(m) {
+ return m.type !== "way";
+ }))
+ return false;
+ if (tos.length !== 1 && this.tags.restriction !== "no_exit")
+ return false;
+ if (tos.some(function(m) {
+ return m.type !== "way";
+ }))
+ return false;
+ if (vias.length === 0)
+ return false;
+ if (vias.length > 1 && vias.some(function(m) {
+ return m.type !== "way";
+ }))
+ return false;
+ return true;
+ },
+ isConnectivity: function() {
+ return !!(this.tags.type && this.tags.type.match(/^connectivity:?/));
+ },
+ multipolygon: function(resolver) {
+ var outers = this.members.filter(function(m) {
+ return (m.role || "outer") === "outer";
+ });
+ var inners = this.members.filter(function(m) {
+ return m.role === "inner";
+ });
+ outers = osmJoinWays(outers, resolver);
+ inners = osmJoinWays(inners, resolver);
+ var sequenceToLineString = function(sequence) {
+ if (sequence.nodes.length > 2 && sequence.nodes[0] !== sequence.nodes[sequence.nodes.length - 1]) {
+ sequence.nodes.push(sequence.nodes[0]);
+ }
+ return sequence.nodes.map(function(node) {
+ return node.loc;
+ });
+ };
+ outers = outers.map(sequenceToLineString);
+ inners = inners.map(sequenceToLineString);
+ var result = outers.map(function(o2) {
+ return [area_default({ type: "Polygon", coordinates: [o2] }) > 2 * Math.PI ? o2.reverse() : o2];
+ });
+ function findOuter(inner2) {
+ var o2, outer;
+ for (o2 = 0; o2 < outers.length; o2++) {
+ outer = outers[o2];
+ if (geoPolygonContainsPolygon(outer, inner2)) {
+ return o2;
+ }
+ }
+ for (o2 = 0; o2 < outers.length; o2++) {
+ outer = outers[o2];
+ if (geoPolygonIntersectsPolygon(outer, inner2, false)) {
+ return o2;
+ }
+ }
+ }
+ for (var i2 = 0; i2 < inners.length; i2++) {
+ var inner = inners[i2];
+ if (area_default({ type: "Polygon", coordinates: [inner] }) < 2 * Math.PI) {
+ inner = inner.reverse();
+ }
+ var o = findOuter(inners[i2]);
+ if (o !== void 0) {
+ result[o].push(inners[i2]);
+ } else {
+ result.push([inners[i2]]);
+ }
+ }
+ return result;
+ }
+ });
+
+ // modules/osm/qa_item.js
+ var QAItem = class {
+ constructor(loc, service, itemType, id2, props) {
+ this.loc = loc;
+ this.service = service.title;
+ this.itemType = itemType;
+ this.id = id2 ? id2 : `${QAItem.id()}`;
+ this.update(props);
+ if (service && typeof service.getIcon === "function") {
+ this.icon = service.getIcon(itemType);
+ }
+ }
+ update(props) {
+ const { loc, service, itemType, id: id2 } = this;
+ Object.keys(props).forEach((prop) => this[prop] = props[prop]);
+ this.loc = loc;
+ this.service = service;
+ this.itemType = itemType;
+ this.id = id2;
+ return this;
+ }
+ static id() {
+ return this.nextId--;
+ }
+ };
+ QAItem.nextId = -1;
+
+ // modules/actions/split.js
+ function actionSplit(nodeIds, newWayIds) {
+ if (typeof nodeIds === "string")
+ nodeIds = [nodeIds];
+ var _wayIDs;
+ var _keepHistoryOn = "longest";
+ var _createdWayIDs = [];
+ function dist(graph, nA, nB) {
+ var locA = graph.entity(nA).loc;
+ var locB = graph.entity(nB).loc;
+ var epsilon3 = 1e-6;
+ return locA && locB ? geoSphericalDistance(locA, locB) : epsilon3;
+ }
+ function splitArea(nodes, idxA, graph) {
+ var lengths = new Array(nodes.length);
+ var length;
+ var i2;
+ var best = 0;
+ var idxB;
+ function wrap2(index) {
+ return utilWrap(index, nodes.length);
+ }
+ length = 0;
+ for (i2 = wrap2(idxA + 1); i2 !== idxA; i2 = wrap2(i2 + 1)) {
+ length += dist(graph, nodes[i2], nodes[wrap2(i2 - 1)]);
+ lengths[i2] = length;
+ }
+ length = 0;
+ for (i2 = wrap2(idxA - 1); i2 !== idxA; i2 = wrap2(i2 - 1)) {
+ length += dist(graph, nodes[i2], nodes[wrap2(i2 + 1)]);
+ if (length < lengths[i2]) {
+ lengths[i2] = length;
+ }
+ }
+ for (i2 = 0; i2 < nodes.length; i2++) {
+ var cost = lengths[i2] / dist(graph, nodes[idxA], nodes[i2]);
+ if (cost > best) {
+ idxB = i2;
+ best = cost;
+ }
+ }
+ return idxB;
+ }
+ function totalLengthBetweenNodes(graph, nodes) {
+ var totalLength = 0;
+ for (var i2 = 0; i2 < nodes.length - 1; i2++) {
+ totalLength += dist(graph, nodes[i2], nodes[i2 + 1]);
+ }
+ return totalLength;
+ }
+ function split(graph, nodeId, wayA, newWayId) {
+ var wayB = osmWay({ id: newWayId, tags: wayA.tags });
+ var origNodes = wayA.nodes.slice();
+ var nodesA;
+ var nodesB;
+ var isArea = wayA.isArea();
+ var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
+ if (wayA.isClosed()) {
+ var nodes = wayA.nodes.slice(0, -1);
+ var idxA = nodes.indexOf(nodeId);
+ var idxB = splitArea(nodes, idxA, graph);
+ if (idxB < idxA) {
+ nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
+ nodesB = nodes.slice(idxB, idxA + 1);
+ } else {
+ nodesA = nodes.slice(idxA, idxB + 1);
+ nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
+ }
+ } else {
+ var idx = wayA.nodes.indexOf(nodeId, 1);
+ nodesA = wayA.nodes.slice(0, idx + 1);
+ nodesB = wayA.nodes.slice(idx);
+ }
+ var lengthA = totalLengthBetweenNodes(graph, nodesA);
+ var lengthB = totalLengthBetweenNodes(graph, nodesB);
+ if (_keepHistoryOn === "longest" && lengthB > lengthA) {
+ wayA = wayA.update({ nodes: nodesB });
+ wayB = wayB.update({ nodes: nodesA });
+ var temp = lengthA;
+ lengthA = lengthB;
+ lengthB = temp;
+ } else {
+ wayA = wayA.update({ nodes: nodesA });
+ wayB = wayB.update({ nodes: nodesB });
+ }
+ if (wayA.tags.step_count) {
+ var stepCount = parseFloat(wayA.tags.step_count);
+ if (stepCount && isFinite(stepCount) && stepCount > 0 && Math.round(stepCount) === stepCount) {
+ var tagsA = Object.assign({}, wayA.tags);
+ var tagsB = Object.assign({}, wayB.tags);
+ var ratioA = lengthA / (lengthA + lengthB);
+ var countA = Math.round(stepCount * ratioA);
+ tagsA.step_count = countA.toString();
+ tagsB.step_count = (stepCount - countA).toString();
+ wayA = wayA.update({ tags: tagsA });
+ wayB = wayB.update({ tags: tagsB });
+ }
+ }
+ graph = graph.replace(wayA);
+ graph = graph.replace(wayB);
+ graph.parentRelations(wayA).forEach(function(relation) {
+ var member;
+ if (relation.hasFromViaTo()) {
+ var f2 = relation.memberByRole("from");
+ var v = relation.membersByRole("via");
+ var t = relation.memberByRole("to");
+ var i2;
+ if (f2.id === wayA.id || t.id === wayA.id) {
+ var keepB = false;
+ if (v.length === 1 && v[0].type === "node") {
+ keepB = wayB.contains(v[0].id);
+ } else {
+ for (i2 = 0; i2 < v.length; i2++) {
+ if (v[i2].type === "way") {
+ var wayVia = graph.hasEntity(v[i2].id);
+ if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) {
+ keepB = true;
+ break;
+ }
+ }
+ }
+ }
+ if (keepB) {
+ relation = relation.replaceMember(wayA, wayB);
+ graph = graph.replace(relation);
+ }
+ } else {
+ for (i2 = 0; i2 < v.length; i2++) {
+ if (v[i2].type === "way" && v[i2].id === wayA.id) {
+ member = {
+ id: wayB.id,
+ type: "way",
+ role: "via"
+ };
+ graph = actionAddMember(relation.id, member, v[i2].index + 1)(graph);
+ break;
+ }
+ }
+ }
+ } else {
+ if (relation === isOuter) {
+ graph = graph.replace(relation.mergeTags(wayA.tags));
+ graph = graph.replace(wayA.update({ tags: {} }));
+ graph = graph.replace(wayB.update({ tags: {} }));
+ }
+ member = {
+ id: wayB.id,
+ type: "way",
+ role: relation.memberById(wayA.id).role
+ };
+ var insertPair = {
+ originalID: wayA.id,
+ insertedID: wayB.id,
+ nodes: origNodes
+ };
+ graph = actionAddMember(relation.id, member, void 0, insertPair)(graph);
+ }
+ });
+ if (!isOuter && isArea) {
+ var multipolygon = osmRelation({
+ tags: Object.assign({}, wayA.tags, { type: "multipolygon" }),
+ members: [
+ { id: wayA.id, role: "outer", type: "way" },
+ { id: wayB.id, role: "outer", type: "way" }
+ ]
+ });
+ graph = graph.replace(multipolygon);
+ graph = graph.replace(wayA.update({ tags: {} }));
+ graph = graph.replace(wayB.update({ tags: {} }));
+ }
+ _createdWayIDs.push(wayB.id);
+ return graph;
+ }
+ var action = function(graph) {
+ _createdWayIDs = [];
+ var newWayIndex = 0;
+ for (var i2 = 0; i2 < nodeIds.length; i2++) {
+ var nodeId = nodeIds[i2];
+ var candidates = action.waysForNode(nodeId, graph);
+ for (var j2 = 0; j2 < candidates.length; j2++) {
+ graph = split(graph, nodeId, candidates[j2], newWayIds && newWayIds[newWayIndex]);
+ newWayIndex += 1;
+ }
+ }
+ return graph;
+ };
+ action.getCreatedWayIDs = function() {
+ return _createdWayIDs;
+ };
+ action.waysForNode = function(nodeId, graph) {
+ var node = graph.entity(nodeId);
+ var splittableParents = graph.parentWays(node).filter(isSplittable);
+ if (!_wayIDs) {
+ var hasLine = splittableParents.some(function(parent) {
+ return parent.geometry(graph) === "line";
+ });
+ if (hasLine) {
+ return splittableParents.filter(function(parent) {
+ return parent.geometry(graph) === "line";
+ });
+ }
+ }
+ return splittableParents;
+ function isSplittable(parent) {
+ if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
+ return false;
+ if (parent.isClosed())
+ return true;
+ for (var i2 = 1; i2 < parent.nodes.length - 1; i2++) {
+ if (parent.nodes[i2] === nodeId)
+ return true;
+ }
+ return false;
+ }
+ };
+ action.ways = function(graph) {
+ return utilArrayUniq([].concat.apply([], nodeIds.map(function(nodeId) {
+ return action.waysForNode(nodeId, graph);
+ })));
+ };
+ action.disabled = function(graph) {
+ for (var i2 = 0; i2 < nodeIds.length; i2++) {
+ var nodeId = nodeIds[i2];
+ var candidates = action.waysForNode(nodeId, graph);
+ if (candidates.length === 0 || _wayIDs && _wayIDs.length !== candidates.length) {
+ return "not_eligible";
+ }
+ }
+ };
+ action.limitWays = function(val) {
+ if (!arguments.length)
+ return _wayIDs;
+ _wayIDs = val;
+ return action;
+ };
+ action.keepHistoryOn = function(val) {
+ if (!arguments.length)
+ return _keepHistoryOn;
+ _keepHistoryOn = val;
+ return action;
+ };
+ return action;
+ }
+
+ // modules/core/graph.js
+ function coreGraph(other, mutable) {
+ if (!(this instanceof coreGraph))
+ return new coreGraph(other, mutable);
+ if (other instanceof coreGraph) {
+ var base = other.base();
+ this.entities = Object.assign(Object.create(base.entities), other.entities);
+ this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays);
+ this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels);
+ } else {
+ this.entities = /* @__PURE__ */ Object.create({});
+ this._parentWays = /* @__PURE__ */ Object.create({});
+ this._parentRels = /* @__PURE__ */ Object.create({});
+ this.rebase(other || [], [this]);
+ }
+ this.transients = {};
+ this._childNodes = {};
+ this.frozen = !mutable;
+ }
+ coreGraph.prototype = {
+ hasEntity: function(id2) {
+ return this.entities[id2];
+ },
+ entity: function(id2) {
+ var entity = this.entities[id2];
+ if (!entity) {
+ entity = this.entities.__proto__[id2];
+ }
+ if (!entity) {
+ throw new Error("entity " + id2 + " not found");
+ }
+ return entity;
+ },
+ geometry: function(id2) {
+ return this.entity(id2).geometry(this);
+ },
+ transient: function(entity, key, fn) {
+ var id2 = entity.id;
+ var transients = this.transients[id2] || (this.transients[id2] = {});
+ if (transients[key] !== void 0) {
+ return transients[key];
+ }
+ transients[key] = fn.call(entity);
+ return transients[key];
+ },
+ parentWays: function(entity) {
+ var parents = this._parentWays[entity.id];
+ var result = [];
+ if (parents) {
+ parents.forEach(function(id2) {
+ result.push(this.entity(id2));
+ }, this);
+ }
+ return result;
+ },
+ isPoi: function(entity) {
+ var parents = this._parentWays[entity.id];
+ return !parents || parents.size === 0;
+ },
+ isShared: function(entity) {
+ var parents = this._parentWays[entity.id];
+ return parents && parents.size > 1;
+ },
+ parentRelations: function(entity) {
+ var parents = this._parentRels[entity.id];
+ var result = [];
+ if (parents) {
+ parents.forEach(function(id2) {
+ result.push(this.entity(id2));
+ }, this);
+ }
+ return result;
+ },
+ parentMultipolygons: function(entity) {
+ return this.parentRelations(entity).filter(function(relation) {
+ return relation.isMultipolygon();
+ });
+ },
+ childNodes: function(entity) {
+ if (this._childNodes[entity.id])
+ return this._childNodes[entity.id];
+ if (!entity.nodes)
+ return [];
+ var nodes = [];
+ for (var i2 = 0; i2 < entity.nodes.length; i2++) {
+ nodes[i2] = this.entity(entity.nodes[i2]);
+ }
+ if (debug)
+ Object.freeze(nodes);
+ this._childNodes[entity.id] = nodes;
+ return this._childNodes[entity.id];
+ },
+ base: function() {
+ return {
+ "entities": Object.getPrototypeOf(this.entities),
+ "parentWays": Object.getPrototypeOf(this._parentWays),
+ "parentRels": Object.getPrototypeOf(this._parentRels)
+ };
+ },
+ rebase: function(entities, stack, force) {
+ var base = this.base();
+ var i2, j2, k, id2;
+ for (i2 = 0; i2 < entities.length; i2++) {
+ var entity = entities[i2];
+ if (!entity.visible || !force && base.entities[entity.id])
+ continue;
+ base.entities[entity.id] = entity;
+ this._updateCalculated(void 0, entity, base.parentWays, base.parentRels);
+ if (entity.type === "way") {
+ for (j2 = 0; j2 < entity.nodes.length; j2++) {
+ id2 = entity.nodes[j2];
+ for (k = 1; k < stack.length; k++) {
+ var ents = stack[k].entities;
+ if (ents.hasOwnProperty(id2) && ents[id2] === void 0) {
+ delete ents[id2];
+ }
+ }
+ }
+ }
+ }
+ for (i2 = 0; i2 < stack.length; i2++) {
+ stack[i2]._updateRebased();
+ }
+ },
+ _updateRebased: function() {
+ var base = this.base();
+ Object.keys(this._parentWays).forEach(function(child) {
+ if (base.parentWays[child]) {
+ base.parentWays[child].forEach(function(id2) {
+ if (!this.entities.hasOwnProperty(id2)) {
+ this._parentWays[child].add(id2);
+ }
+ }, this);
+ }
+ }, this);
+ Object.keys(this._parentRels).forEach(function(child) {
+ if (base.parentRels[child]) {
+ base.parentRels[child].forEach(function(id2) {
+ if (!this.entities.hasOwnProperty(id2)) {
+ this._parentRels[child].add(id2);
+ }
+ }, this);
+ }
+ }, this);
+ this.transients = {};
+ },
+ _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
+ parentWays = parentWays || this._parentWays;
+ parentRels = parentRels || this._parentRels;
+ var type3 = entity && entity.type || oldentity && oldentity.type;
+ var removed, added, i2;
+ if (type3 === "way") {
+ if (oldentity && entity) {
+ removed = utilArrayDifference(oldentity.nodes, entity.nodes);
+ added = utilArrayDifference(entity.nodes, oldentity.nodes);
+ } else if (oldentity) {
+ removed = oldentity.nodes;
+ added = [];
+ } else if (entity) {
+ removed = [];
+ added = entity.nodes;
+ }
+ for (i2 = 0; i2 < removed.length; i2++) {
+ parentWays[removed[i2]] = new Set(parentWays[removed[i2]]);
+ parentWays[removed[i2]].delete(oldentity.id);
+ }
+ for (i2 = 0; i2 < added.length; i2++) {
+ parentWays[added[i2]] = new Set(parentWays[added[i2]]);
+ parentWays[added[i2]].add(entity.id);
+ }
+ } else if (type3 === "relation") {
+ var oldentityMemberIDs = oldentity ? oldentity.members.map(function(m) {
+ return m.id;
+ }) : [];
+ var entityMemberIDs = entity ? entity.members.map(function(m) {
+ return m.id;
+ }) : [];
+ if (oldentity && entity) {
+ removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs);
+ added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs);
+ } else if (oldentity) {
+ removed = oldentityMemberIDs;
+ added = [];
+ } else if (entity) {
+ removed = [];
+ added = entityMemberIDs;
+ }
+ for (i2 = 0; i2 < removed.length; i2++) {
+ parentRels[removed[i2]] = new Set(parentRels[removed[i2]]);
+ parentRels[removed[i2]].delete(oldentity.id);
+ }
+ for (i2 = 0; i2 < added.length; i2++) {
+ parentRels[added[i2]] = new Set(parentRels[added[i2]]);
+ parentRels[added[i2]].add(entity.id);
+ }
+ }
+ },
+ replace: function(entity) {
+ if (this.entities[entity.id] === entity)
+ return this;
+ return this.update(function() {
+ this._updateCalculated(this.entities[entity.id], entity);
+ this.entities[entity.id] = entity;
+ });
+ },
+ remove: function(entity) {
+ return this.update(function() {
+ this._updateCalculated(entity, void 0);
+ this.entities[entity.id] = void 0;
+ });
+ },
+ revert: function(id2) {
+ var baseEntity = this.base().entities[id2];
+ var headEntity = this.entities[id2];
+ if (headEntity === baseEntity)
+ return this;
+ return this.update(function() {
+ this._updateCalculated(headEntity, baseEntity);
+ delete this.entities[id2];
+ });
+ },
+ update: function() {
+ var graph = this.frozen ? coreGraph(this, true) : this;
+ for (var i2 = 0; i2 < arguments.length; i2++) {
+ arguments[i2].call(graph, graph);
+ }
+ if (this.frozen)
+ graph.frozen = true;
+ return graph;
+ },
+ load: function(entities) {
+ var base = this.base();
+ this.entities = Object.create(base.entities);
+ for (var i2 in entities) {
+ this.entities[i2] = entities[i2];
+ this._updateCalculated(base.entities[i2], this.entities[i2]);
+ }
+ return this;
+ }
+ };
+
+ // modules/osm/intersection.js
+ function osmTurn(turn) {
+ if (!(this instanceof osmTurn)) {
+ return new osmTurn(turn);
+ }
+ Object.assign(this, turn);
+ }
+ function osmIntersection(graph, startVertexId, maxDistance) {
+ maxDistance = maxDistance || 30;
+ var vgraph = coreGraph();
+ var i2, j2, k;
+ function memberOfRestriction(entity) {
+ return graph.parentRelations(entity).some(function(r) {
+ return r.isRestriction();
+ });
+ }
+ function isRoad(way2) {
+ if (way2.isArea() || way2.isDegenerate())
+ return false;
+ var roads = {
+ "motorway": true,
+ "motorway_link": true,
+ "trunk": true,
+ "trunk_link": true,
+ "primary": true,
+ "primary_link": true,
+ "secondary": true,
+ "secondary_link": true,
+ "tertiary": true,
+ "tertiary_link": true,
+ "residential": true,
+ "unclassified": true,
+ "living_street": true,
+ "service": true,
+ "road": true,
+ "track": true
+ };
+ return roads[way2.tags.highway];
+ }
+ var startNode = graph.entity(startVertexId);
+ var checkVertices = [startNode];
+ var checkWays;
+ var vertices = [];
+ var vertexIds = [];
+ var vertex;
+ var ways = [];
+ var wayIds = [];
+ var way;
+ var nodes = [];
+ var node;
+ var parents = [];
+ var parent;
+ var actions = [];
+ while (checkVertices.length) {
+ vertex = checkVertices.pop();
+ checkWays = graph.parentWays(vertex);
+ var hasWays = false;
+ for (i2 = 0; i2 < checkWays.length; i2++) {
+ way = checkWays[i2];
+ if (!isRoad(way) && !memberOfRestriction(way))
+ continue;
+ ways.push(way);
+ hasWays = true;
+ nodes = utilArrayUniq(graph.childNodes(way));
+ for (j2 = 0; j2 < nodes.length; j2++) {
+ node = nodes[j2];
+ if (node === vertex)
+ continue;
+ if (vertices.indexOf(node) !== -1)
+ continue;
+ if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance)
+ continue;
+ var hasParents = false;
+ parents = graph.parentWays(node);
+ for (k = 0; k < parents.length; k++) {
+ parent = parents[k];
+ if (parent === way)
+ continue;
+ if (ways.indexOf(parent) !== -1)
+ continue;
+ if (!isRoad(parent))
+ continue;
+ hasParents = true;
+ break;
+ }
+ if (hasParents) {
+ checkVertices.push(node);
+ }
+ }
+ }
+ if (hasWays) {
+ vertices.push(vertex);
+ }
+ }
+ vertices = utilArrayUniq(vertices);
+ ways = utilArrayUniq(ways);
+ ways.forEach(function(way2) {
+ graph.childNodes(way2).forEach(function(node2) {
+ vgraph = vgraph.replace(node2);
+ });
+ vgraph = vgraph.replace(way2);
+ graph.parentRelations(way2).forEach(function(relation) {
+ if (relation.isRestriction()) {
+ if (relation.isValidRestriction(graph)) {
+ vgraph = vgraph.replace(relation);
+ } else if (relation.isComplete(graph)) {
+ actions.push(actionDeleteRelation(relation.id));
+ }
+ }
+ });
+ });
+ ways.forEach(function(w) {
+ var way2 = vgraph.entity(w.id);
+ if (way2.tags.oneway === "-1") {
+ var action = actionReverse(way2.id, { reverseOneway: true });
+ actions.push(action);
+ vgraph = action(vgraph);
+ }
+ });
+ var origCount = osmEntity.id.next.way;
+ vertices.forEach(function(v) {
+ var splitAll = actionSplit([v.id]).keepHistoryOn("first");
+ if (!splitAll.disabled(vgraph)) {
+ splitAll.ways(vgraph).forEach(function(way2) {
+ var splitOne = actionSplit([v.id]).limitWays([way2.id]).keepHistoryOn("first");
+ actions.push(splitOne);
+ vgraph = splitOne(vgraph);
+ });
+ }
+ });
+ osmEntity.id.next.way = origCount;
+ vertexIds = vertices.map(function(v) {
+ return v.id;
+ });
+ vertices = [];
+ ways = [];
+ vertexIds.forEach(function(id2) {
+ var vertex2 = vgraph.entity(id2);
+ var parents2 = vgraph.parentWays(vertex2);
+ vertices.push(vertex2);
+ ways = ways.concat(parents2);
+ });
+ vertices = utilArrayUniq(vertices);
+ ways = utilArrayUniq(ways);
+ vertexIds = vertices.map(function(v) {
+ return v.id;
+ });
+ wayIds = ways.map(function(w) {
+ return w.id;
+ });
+ function withMetadata(way2, vertexIds2) {
+ var __oneWay = way2.isOneWay();
+ var __first = vertexIds2.indexOf(way2.first()) !== -1;
+ var __last = vertexIds2.indexOf(way2.last()) !== -1;
+ var __via = __first && __last;
+ var __from = __first && !__oneWay || __last;
+ var __to = __first || __last && !__oneWay;
+ return way2.update({
+ __first,
+ __last,
+ __from,
+ __via,
+ __to,
+ __oneWay
+ });
+ }
+ ways = [];
+ wayIds.forEach(function(id2) {
+ var way2 = withMetadata(vgraph.entity(id2), vertexIds);
+ vgraph = vgraph.replace(way2);
+ ways.push(way2);
+ });
+ var keepGoing;
+ var removeWayIds = [];
+ var removeVertexIds = [];
+ do {
+ keepGoing = false;
+ checkVertices = vertexIds.slice();
+ for (i2 = 0; i2 < checkVertices.length; i2++) {
+ var vertexId = checkVertices[i2];
+ vertex = vgraph.hasEntity(vertexId);
+ if (!vertex) {
+ if (vertexIds.indexOf(vertexId) !== -1) {
+ vertexIds.splice(vertexIds.indexOf(vertexId), 1);
+ }
+ removeVertexIds.push(vertexId);
+ continue;
+ }
+ parents = vgraph.parentWays(vertex);
+ if (parents.length < 3) {
+ if (vertexIds.indexOf(vertexId) !== -1) {
+ vertexIds.splice(vertexIds.indexOf(vertexId), 1);
+ }
+ }
+ if (parents.length === 2) {
+ var a = parents[0];
+ var b = parents[1];
+ var aIsLeaf = a && !a.__via;
+ var bIsLeaf = b && !b.__via;
+ var leaf, survivor;
+ if (aIsLeaf && !bIsLeaf) {
+ leaf = a;
+ survivor = b;
+ } else if (!aIsLeaf && bIsLeaf) {
+ leaf = b;
+ survivor = a;
+ }
+ if (leaf && survivor) {
+ survivor = withMetadata(survivor, vertexIds);
+ vgraph = vgraph.replace(survivor).remove(leaf);
+ removeWayIds.push(leaf.id);
+ keepGoing = true;
+ }
+ }
+ parents = vgraph.parentWays(vertex);
+ if (parents.length < 2) {
+ if (vertexIds.indexOf(vertexId) !== -1) {
+ vertexIds.splice(vertexIds.indexOf(vertexId), 1);
+ }
+ removeVertexIds.push(vertexId);
+ keepGoing = true;
+ }
+ if (parents.length < 1) {
+ vgraph = vgraph.remove(vertex);
+ }
+ }
+ } while (keepGoing);
+ vertices = vertices.filter(function(vertex2) {
+ return removeVertexIds.indexOf(vertex2.id) === -1;
+ }).map(function(vertex2) {
+ return vgraph.entity(vertex2.id);
+ });
+ ways = ways.filter(function(way2) {
+ return removeWayIds.indexOf(way2.id) === -1;
+ }).map(function(way2) {
+ return vgraph.entity(way2.id);
+ });
+ var intersection = {
+ graph: vgraph,
+ actions,
+ vertices,
+ ways
+ };
+ intersection.turns = function(fromWayId, maxViaWay) {
+ if (!fromWayId)
+ return [];
+ if (!maxViaWay)
+ maxViaWay = 0;
+ var vgraph2 = intersection.graph;
+ var keyVertexIds = intersection.vertices.map(function(v) {
+ return v.id;
+ });
+ var start2 = vgraph2.entity(fromWayId);
+ if (!start2 || !(start2.__from || start2.__via))
+ return [];
+ var maxPathLength = maxViaWay * 2 + 3;
+ var turns = [];
+ step(start2);
+ return turns;
+ function step(entity, currPath, currRestrictions, matchedRestriction) {
+ currPath = (currPath || []).slice();
+ if (currPath.length >= maxPathLength)
+ return;
+ currPath.push(entity.id);
+ currRestrictions = (currRestrictions || []).slice();
+ var i3, j3;
+ if (entity.type === "node") {
+ var parents2 = vgraph2.parentWays(entity);
+ var nextWays = [];
+ for (i3 = 0; i3 < parents2.length; i3++) {
+ var way2 = parents2[i3];
+ if (way2.__oneWay && way2.nodes[0] !== entity.id)
+ continue;
+ if (currPath.indexOf(way2.id) !== -1 && currPath.length >= 3)
+ continue;
+ var restrict = null;
+ for (j3 = 0; j3 < currRestrictions.length; j3++) {
+ var restriction = currRestrictions[j3];
+ var f2 = restriction.memberByRole("from");
+ var v = restriction.membersByRole("via");
+ var t = restriction.memberByRole("to");
+ var isOnly = /^only_/.test(restriction.tags.restriction);
+ var matchesFrom = f2.id === fromWayId;
+ var matchesViaTo = false;
+ var isAlongOnlyPath = false;
+ if (t.id === way2.id) {
+ if (v.length === 1 && v[0].type === "node") {
+ matchesViaTo = v[0].id === entity.id && (matchesFrom && currPath.length === 2 || !matchesFrom && currPath.length > 2);
+ } else {
+ var pathVias = [];
+ for (k = 2; k < currPath.length; k += 2) {
+ pathVias.push(currPath[k]);
+ }
+ var restrictionVias = [];
+ for (k = 0; k < v.length; k++) {
+ if (v[k].type === "way") {
+ restrictionVias.push(v[k].id);
+ }
+ }
+ var diff = utilArrayDifference(pathVias, restrictionVias);
+ matchesViaTo = !diff.length;
+ }
+ } else if (isOnly) {
+ for (k = 0; k < v.length; k++) {
+ if (v[k].type === "way" && v[k].id === way2.id) {
+ isAlongOnlyPath = true;
+ break;
+ }
+ }
+ }
+ if (matchesViaTo) {
+ if (isOnly) {
+ restrict = { id: restriction.id, direct: matchesFrom, from: f2.id, only: true, end: true };
+ } else {
+ restrict = { id: restriction.id, direct: matchesFrom, from: f2.id, no: true, end: true };
+ }
+ } else {
+ if (isAlongOnlyPath) {
+ restrict = { id: restriction.id, direct: false, from: f2.id, only: true, end: false };
+ } else if (isOnly) {
+ restrict = { id: restriction.id, direct: false, from: f2.id, no: true, end: true };
+ }
+ }
+ if (restrict && restrict.direct)
+ break;
+ }
+ nextWays.push({ way: way2, restrict });
+ }
+ nextWays.forEach(function(nextWay) {
+ step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
+ });
+ } else {
+ if (currPath.length >= 3) {
+ var turnPath = currPath.slice();
+ if (matchedRestriction && matchedRestriction.direct === false) {
+ for (i3 = 0; i3 < turnPath.length; i3++) {
+ if (turnPath[i3] === matchedRestriction.from) {
+ turnPath = turnPath.slice(i3);
+ break;
+ }
+ }
+ }
+ var turn = pathToTurn(turnPath);
+ if (turn) {
+ if (matchedRestriction) {
+ turn.restrictionID = matchedRestriction.id;
+ turn.no = matchedRestriction.no;
+ turn.only = matchedRestriction.only;
+ turn.direct = matchedRestriction.direct;
+ }
+ turns.push(osmTurn(turn));
+ }
+ if (currPath[0] === currPath[2])
+ return;
+ }
+ if (matchedRestriction && matchedRestriction.end)
+ return;
+ var n1 = vgraph2.entity(entity.first());
+ var n2 = vgraph2.entity(entity.last());
+ var dist = geoSphericalDistance(n1.loc, n2.loc);
+ var nextNodes = [];
+ if (currPath.length > 1) {
+ if (dist > maxDistance)
+ return;
+ if (!entity.__via)
+ return;
+ }
+ if (!entity.__oneWay && keyVertexIds.indexOf(n1.id) !== -1 && currPath.indexOf(n1.id) === -1) {
+ nextNodes.push(n1);
+ }
+ if (keyVertexIds.indexOf(n2.id) !== -1 && currPath.indexOf(n2.id) === -1) {
+ nextNodes.push(n2);
+ }
+ nextNodes.forEach(function(nextNode) {
+ var fromRestrictions = vgraph2.parentRelations(entity).filter(function(r) {
+ if (!r.isRestriction())
+ return false;
+ var f3 = r.memberByRole("from");
+ if (!f3 || f3.id !== entity.id)
+ return false;
+ var isOnly2 = /^only_/.test(r.tags.restriction);
+ if (!isOnly2)
+ return true;
+ var isOnlyVia = false;
+ var v2 = r.membersByRole("via");
+ if (v2.length === 1 && v2[0].type === "node") {
+ isOnlyVia = v2[0].id === nextNode.id;
+ } else {
+ for (var i4 = 0; i4 < v2.length; i4++) {
+ if (v2[i4].type !== "way")
+ continue;
+ var viaWay = vgraph2.entity(v2[i4].id);
+ if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
+ isOnlyVia = true;
+ break;
+ }
+ }
+ }
+ return isOnlyVia;
+ });
+ step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
+ });
+ }
+ }
+ function pathToTurn(path) {
+ if (path.length < 3)
+ return;
+ var fromWayId2, fromNodeId, fromVertexId;
+ var toWayId, toNodeId, toVertexId;
+ var viaWayIds, viaNodeId, isUturn;
+ fromWayId2 = path[0];
+ toWayId = path[path.length - 1];
+ if (path.length === 3 && fromWayId2 === toWayId) {
+ var way2 = vgraph2.entity(fromWayId2);
+ if (way2.__oneWay)
+ return null;
+ isUturn = true;
+ viaNodeId = fromVertexId = toVertexId = path[1];
+ fromNodeId = toNodeId = adjacentNode(fromWayId2, viaNodeId);
+ } else {
+ isUturn = false;
+ fromVertexId = path[1];
+ fromNodeId = adjacentNode(fromWayId2, fromVertexId);
+ toVertexId = path[path.length - 2];
+ toNodeId = adjacentNode(toWayId, toVertexId);
+ if (path.length === 3) {
+ viaNodeId = path[1];
+ } else {
+ viaWayIds = path.filter(function(entityId) {
+ return entityId[0] === "w";
+ });
+ viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);
+ }
+ }
+ return {
+ key: path.join("_"),
+ path,
+ from: { node: fromNodeId, way: fromWayId2, vertex: fromVertexId },
+ via: { node: viaNodeId, ways: viaWayIds },
+ to: { node: toNodeId, way: toWayId, vertex: toVertexId },
+ u: isUturn
+ };
+ function adjacentNode(wayId, affixId) {
+ var nodes2 = vgraph2.entity(wayId).nodes;
+ return affixId === nodes2[0] ? nodes2[1] : nodes2[nodes2.length - 2];
+ }
+ }
+ };
+ return intersection;
+ }
+ function osmInferRestriction(graph, turn, projection2) {
+ var fromWay = graph.entity(turn.from.way);
+ var fromNode = graph.entity(turn.from.node);
+ var fromVertex = graph.entity(turn.from.vertex);
+ var toWay = graph.entity(turn.to.way);
+ var toNode = graph.entity(turn.to.node);
+ var toVertex = graph.entity(turn.to.vertex);
+ var fromOneWay = fromWay.tags.oneway === "yes";
+ var toOneWay = toWay.tags.oneway === "yes";
+ var angle2 = (geoAngle(fromVertex, fromNode, projection2) - geoAngle(toVertex, toNode, projection2)) * 180 / Math.PI;
+ while (angle2 < 0) {
+ angle2 += 360;
+ }
+ if (fromNode === toNode) {
+ return "no_u_turn";
+ }
+ if ((angle2 < 23 || angle2 > 336) && fromOneWay && toOneWay) {
+ return "no_u_turn";
+ }
+ if ((angle2 < 40 || angle2 > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex) {
+ return "no_u_turn";
+ }
+ if (angle2 < 158) {
+ return "no_right_turn";
+ }
+ if (angle2 > 202) {
+ return "no_left_turn";
+ }
+ return "no_straight_on";
+ }
+
+ // modules/actions/merge_polygon.js
+ function actionMergePolygon(ids, newRelationId) {
+ function groupEntities(graph) {
+ var entities = ids.map(function(id2) {
+ return graph.entity(id2);
+ });
+ var geometryGroups = utilArrayGroupBy(entities, function(entity) {
+ if (entity.type === "way" && entity.isClosed()) {
+ return "closedWay";
+ } else if (entity.type === "relation" && entity.isMultipolygon()) {
+ return "multipolygon";
+ } else {
+ return "other";
+ }
+ });
+ return Object.assign({ closedWay: [], multipolygon: [], other: [] }, geometryGroups);
+ }
+ var action = function(graph) {
+ var entities = groupEntities(graph);
+ var polygons = entities.multipolygon.reduce(function(polygons2, m) {
+ return polygons2.concat(osmJoinWays(m.members, graph));
+ }, []).concat(entities.closedWay.map(function(d) {
+ var member = [{ id: d.id }];
+ member.nodes = graph.childNodes(d);
+ return member;
+ }));
+ var contained = polygons.map(function(w, i2) {
+ return polygons.map(function(d, n2) {
+ if (i2 === n2)
+ return null;
+ return geoPolygonContainsPolygon(d.nodes.map(function(n3) {
+ return n3.loc;
+ }), w.nodes.map(function(n3) {
+ return n3.loc;
+ }));
+ });
+ });
+ var members = [];
+ var outer = true;
+ while (polygons.length) {
+ extractUncontained(polygons);
+ polygons = polygons.filter(isContained);
+ contained = contained.filter(isContained).map(filterContained);
+ }
+ function isContained(d, i2) {
+ return contained[i2].some(function(val) {
+ return val;
+ });
+ }
+ function filterContained(d) {
+ return d.filter(isContained);
+ }
+ function extractUncontained(polygons2) {
+ polygons2.forEach(function(d, i2) {
+ if (!isContained(d, i2)) {
+ d.forEach(function(member) {
+ members.push({
+ type: "way",
+ id: member.id,
+ role: outer ? "outer" : "inner"
+ });
+ });
+ }
+ });
+ outer = !outer;
+ }
+ var relation;
+ if (entities.multipolygon.length > 0) {
+ var oldestID = utilOldestID(entities.multipolygon.map((entity) => entity.id));
+ relation = entities.multipolygon.find((entity) => entity.id === oldestID);
+ } else {
+ relation = osmRelation({ id: newRelationId, tags: { type: "multipolygon" } });
+ }
+ entities.multipolygon.forEach(function(m) {
+ if (m.id !== relation.id) {
+ relation = relation.mergeTags(m.tags);
+ graph = graph.remove(m);
+ }
+ });
+ entities.closedWay.forEach(function(way) {
+ function isThisOuter(m) {
+ return m.id === way.id && m.role !== "inner";
+ }
+ if (members.some(isThisOuter)) {
+ relation = relation.mergeTags(way.tags);
+ graph = graph.replace(way.update({ tags: {} }));
+ }
+ });
+ return graph.replace(relation.update({
+ members,
+ tags: utilObjectOmit(relation.tags, ["area"])
+ }));
+ };
+ action.disabled = function(graph) {
+ var entities = groupEntities(graph);
+ if (entities.other.length > 0 || entities.closedWay.length + entities.multipolygon.length < 2) {
+ return "not_eligible";
+ }
+ if (!entities.multipolygon.every(function(r) {
+ return r.isComplete(graph);
+ })) {
+ return "incomplete_relation";
+ }
+ if (!entities.multipolygon.length) {
+ var sharedMultipolygons = [];
+ entities.closedWay.forEach(function(way, i2) {
+ if (i2 === 0) {
+ sharedMultipolygons = graph.parentMultipolygons(way);
+ } else {
+ sharedMultipolygons = utilArrayIntersection(sharedMultipolygons, graph.parentMultipolygons(way));
+ }
+ });
+ sharedMultipolygons = sharedMultipolygons.filter(function(relation) {
+ return relation.members.length === entities.closedWay.length;
+ });
+ if (sharedMultipolygons.length) {
+ return "not_eligible";
+ }
+ } else if (entities.closedWay.some(function(way) {
+ return utilArrayIntersection(graph.parentMultipolygons(way), entities.multipolygon).length;
+ })) {
+ return "not_eligible";
+ }
+ };
+ return action;
+ }
+
+ // modules/actions/merge_remote_changes.js
+ var import_fast_deep_equal = __toESM(require_fast_deep_equal());
+
+ // node_modules/node-diff3/index.mjs
+ function LCS(buffer1, buffer2) {
+ let equivalenceClasses = {};
+ for (let j2 = 0; j2 < buffer2.length; j2++) {
+ const item = buffer2[j2];
+ if (equivalenceClasses[item]) {
+ equivalenceClasses[item].push(j2);
+ } else {
+ equivalenceClasses[item] = [j2];
+ }
+ }
+ const NULLRESULT = { buffer1index: -1, buffer2index: -1, chain: null };
+ let candidates = [NULLRESULT];
+ for (let i2 = 0; i2 < buffer1.length; i2++) {
+ const item = buffer1[i2];
+ const buffer2indices = equivalenceClasses[item] || [];
+ let r = 0;
+ let c = candidates[0];
+ for (let jx = 0; jx < buffer2indices.length; jx++) {
+ const j2 = buffer2indices[jx];
+ let s;
+ for (s = r; s < candidates.length; s++) {
+ if (candidates[s].buffer2index < j2 && (s === candidates.length - 1 || candidates[s + 1].buffer2index > j2)) {
+ break;
+ }
+ }
+ if (s < candidates.length) {
+ const newCandidate = { buffer1index: i2, buffer2index: j2, chain: candidates[s] };
+ if (r === candidates.length) {
+ candidates.push(c);
+ } else {
+ candidates[r] = c;
+ }
+ r = s + 1;
+ c = newCandidate;
+ if (r === candidates.length) {
+ break;
+ }
+ }
+ }
+ candidates[r] = c;
+ }
+ return candidates[candidates.length - 1];
+ }
+ function diffIndices(buffer1, buffer2) {
+ const lcs = LCS(buffer1, buffer2);
+ let result = [];
+ let tail1 = buffer1.length;
+ let tail2 = buffer2.length;
+ for (let candidate = lcs; candidate !== null; candidate = candidate.chain) {
+ const mismatchLength1 = tail1 - candidate.buffer1index - 1;
+ const mismatchLength2 = tail2 - candidate.buffer2index - 1;
+ tail1 = candidate.buffer1index;
+ tail2 = candidate.buffer2index;
+ if (mismatchLength1 || mismatchLength2) {
+ result.push({
+ buffer1: [tail1 + 1, mismatchLength1],
+ buffer1Content: buffer1.slice(tail1 + 1, tail1 + 1 + mismatchLength1),
+ buffer2: [tail2 + 1, mismatchLength2],
+ buffer2Content: buffer2.slice(tail2 + 1, tail2 + 1 + mismatchLength2)
+ });
+ }
+ }
+ result.reverse();
+ return result;
+ }
+ function diff3MergeRegions(a, o, b) {
+ let hunks = [];
+ function addHunk(h, ab) {
+ hunks.push({
+ ab,
+ oStart: h.buffer1[0],
+ oLength: h.buffer1[1],
+ abStart: h.buffer2[0],
+ abLength: h.buffer2[1]
+ });
+ }
+ diffIndices(o, a).forEach((item) => addHunk(item, "a"));
+ diffIndices(o, b).forEach((item) => addHunk(item, "b"));
+ hunks.sort((x, y) => x.oStart - y.oStart);
+ let results = [];
+ let currOffset = 0;
+ function advanceTo(endOffset) {
+ if (endOffset > currOffset) {
+ results.push({
+ stable: true,
+ buffer: "o",
+ bufferStart: currOffset,
+ bufferLength: endOffset - currOffset,
+ bufferContent: o.slice(currOffset, endOffset)
+ });
+ currOffset = endOffset;
+ }
+ }
+ while (hunks.length) {
+ let hunk = hunks.shift();
+ let regionStart = hunk.oStart;
+ let regionEnd = hunk.oStart + hunk.oLength;
+ let regionHunks = [hunk];
+ advanceTo(regionStart);
+ while (hunks.length) {
+ const nextHunk = hunks[0];
+ const nextHunkStart = nextHunk.oStart;
+ if (nextHunkStart > regionEnd)
+ break;
+ regionEnd = Math.max(regionEnd, nextHunkStart + nextHunk.oLength);
+ regionHunks.push(hunks.shift());
+ }
+ if (regionHunks.length === 1) {
+ if (hunk.abLength > 0) {
+ const buffer = hunk.ab === "a" ? a : b;
+ results.push({
+ stable: true,
+ buffer: hunk.ab,
+ bufferStart: hunk.abStart,
+ bufferLength: hunk.abLength,
+ bufferContent: buffer.slice(hunk.abStart, hunk.abStart + hunk.abLength)
+ });
+ }
+ } else {
+ let bounds = {
+ a: [a.length, -1, o.length, -1],
+ b: [b.length, -1, o.length, -1]
+ };
+ while (regionHunks.length) {
+ hunk = regionHunks.shift();
+ const oStart = hunk.oStart;
+ const oEnd = oStart + hunk.oLength;
+ const abStart = hunk.abStart;
+ const abEnd = abStart + hunk.abLength;
+ let b2 = bounds[hunk.ab];
+ b2[0] = Math.min(abStart, b2[0]);
+ b2[1] = Math.max(abEnd, b2[1]);
+ b2[2] = Math.min(oStart, b2[2]);
+ b2[3] = Math.max(oEnd, b2[3]);
+ }
+ const aStart = bounds.a[0] + (regionStart - bounds.a[2]);
+ const aEnd = bounds.a[1] + (regionEnd - bounds.a[3]);
+ const bStart = bounds.b[0] + (regionStart - bounds.b[2]);
+ const bEnd = bounds.b[1] + (regionEnd - bounds.b[3]);
+ let result = {
+ stable: false,
+ aStart,
+ aLength: aEnd - aStart,
+ aContent: a.slice(aStart, aEnd),
+ oStart: regionStart,
+ oLength: regionEnd - regionStart,
+ oContent: o.slice(regionStart, regionEnd),
+ bStart,
+ bLength: bEnd - bStart,
+ bContent: b.slice(bStart, bEnd)
+ };
+ results.push(result);
+ }
+ currOffset = regionEnd;
+ }
+ advanceTo(o.length);
+ return results;
+ }
+ function diff3Merge(a, o, b, options2) {
+ let defaults2 = {
+ excludeFalseConflicts: true,
+ stringSeparator: /\s+/
+ };
+ options2 = Object.assign(defaults2, options2);
+ if (typeof a === "string")
+ a = a.split(options2.stringSeparator);
+ if (typeof o === "string")
+ o = o.split(options2.stringSeparator);
+ if (typeof b === "string")
+ b = b.split(options2.stringSeparator);
+ let results = [];
+ const regions = diff3MergeRegions(a, o, b);
+ let okBuffer = [];
+ function flushOk() {
+ if (okBuffer.length) {
+ results.push({ ok: okBuffer });
+ }
+ okBuffer = [];
+ }
+ function isFalseConflict(a2, b2) {
+ if (a2.length !== b2.length)
+ return false;
+ for (let i2 = 0; i2 < a2.length; i2++) {
+ if (a2[i2] !== b2[i2])
+ return false;
+ }
+ return true;
+ }
+ regions.forEach((region) => {
+ if (region.stable) {
+ okBuffer.push(...region.bufferContent);
+ } else {
+ if (options2.excludeFalseConflicts && isFalseConflict(region.aContent, region.bContent)) {
+ okBuffer.push(...region.aContent);
+ } else {
+ flushOk();
+ results.push({
+ conflict: {
+ a: region.aContent,
+ aIndex: region.aStart,
+ o: region.oContent,
+ oIndex: region.oStart,
+ b: region.bContent,
+ bIndex: region.bStart
+ }
+ });
+ }
+ }
+ });
+ flushOk();
+ return results;
+ }
+
+ // modules/actions/merge_remote_changes.js
+ var import_lodash = __toESM(require_lodash());
+ function actionMergeRemoteChanges(id2, localGraph, remoteGraph, discardTags, formatUser) {
+ discardTags = discardTags || {};
+ var _option = "safe";
+ var _conflicts = [];
+ function user(d) {
+ return typeof formatUser === "function" ? formatUser(d) : (0, import_lodash.escape)(d);
+ }
+ function mergeLocation(remote, target) {
+ function pointEqual(a, b) {
+ var epsilon3 = 1e-6;
+ return Math.abs(a[0] - b[0]) < epsilon3 && Math.abs(a[1] - b[1]) < epsilon3;
+ }
+ if (_option === "force_local" || pointEqual(target.loc, remote.loc)) {
+ return target;
+ }
+ if (_option === "force_remote") {
+ return target.update({ loc: remote.loc });
+ }
+ _conflicts.push(_t.html("merge_remote_changes.conflict.location", { user: { html: user(remote.user) } }));
+ return target;
+ }
+ function mergeNodes(base, remote, target) {
+ if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.nodes, remote.nodes)) {
+ return target;
+ }
+ if (_option === "force_remote") {
+ return target.update({ nodes: remote.nodes });
+ }
+ var ccount = _conflicts.length;
+ var o = base.nodes || [];
+ var a = target.nodes || [];
+ var b = remote.nodes || [];
+ var nodes = [];
+ var hunks = diff3Merge(a, o, b, { excludeFalseConflicts: true });
+ for (var i2 = 0; i2 < hunks.length; i2++) {
+ var hunk = hunks[i2];
+ if (hunk.ok) {
+ nodes.push.apply(nodes, hunk.ok);
+ } else {
+ var c = hunk.conflict;
+ if ((0, import_fast_deep_equal.default)(c.o, c.a)) {
+ nodes.push.apply(nodes, c.b);
+ } else if ((0, import_fast_deep_equal.default)(c.o, c.b)) {
+ nodes.push.apply(nodes, c.a);
+ } else {
+ _conflicts.push(_t.html("merge_remote_changes.conflict.nodelist", { user: { html: user(remote.user) } }));
+ break;
+ }
+ }
+ }
+ return _conflicts.length === ccount ? target.update({ nodes }) : target;
+ }
+ function mergeChildren(targetWay, children2, updates, graph) {
+ function isUsed(node2, targetWay2) {
+ var hasInterestingParent = graph.parentWays(node2).some(function(way) {
+ return way.id !== targetWay2.id;
+ });
+ return node2.hasInterestingTags() || hasInterestingParent || graph.parentRelations(node2).length > 0;
+ }
+ var ccount = _conflicts.length;
+ for (var i2 = 0; i2 < children2.length; i2++) {
+ var id3 = children2[i2];
+ var node = graph.hasEntity(id3);
+ if (targetWay.nodes.indexOf(id3) === -1) {
+ if (node && !isUsed(node, targetWay)) {
+ updates.removeIds.push(id3);
+ }
+ continue;
+ }
+ var local = localGraph.hasEntity(id3);
+ var remote = remoteGraph.hasEntity(id3);
+ var target;
+ if (_option === "force_remote" && remote && remote.visible) {
+ updates.replacements.push(remote);
+ } else if (_option === "force_local" && local) {
+ target = osmEntity(local);
+ if (remote) {
+ target = target.update({ version: remote.version });
+ }
+ updates.replacements.push(target);
+ } else if (_option === "safe" && local && remote && local.version !== remote.version) {
+ target = osmEntity(local, { version: remote.version });
+ if (remote.visible) {
+ target = mergeLocation(remote, target);
+ } else {
+ _conflicts.push(_t.html("merge_remote_changes.conflict.deleted", { user: { html: user(remote.user) } }));
+ }
+ if (_conflicts.length !== ccount)
+ break;
+ updates.replacements.push(target);
+ }
+ }
+ return targetWay;
+ }
+ function updateChildren(updates, graph) {
+ for (var i2 = 0; i2 < updates.replacements.length; i2++) {
+ graph = graph.replace(updates.replacements[i2]);
+ }
+ if (updates.removeIds.length) {
+ graph = actionDeleteMultiple(updates.removeIds)(graph);
+ }
+ return graph;
+ }
+ function mergeMembers(remote, target) {
+ if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.members, remote.members)) {
+ return target;
+ }
+ if (_option === "force_remote") {
+ return target.update({ members: remote.members });
+ }
+ _conflicts.push(_t.html("merge_remote_changes.conflict.memberlist", { user: { html: user(remote.user) } }));
+ return target;
+ }
+ function mergeTags(base, remote, target) {
+ if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.tags, remote.tags)) {
+ return target;
+ }
+ if (_option === "force_remote") {
+ return target.update({ tags: remote.tags });
+ }
+ var ccount = _conflicts.length;
+ var o = base.tags || {};
+ var a = target.tags || {};
+ var b = remote.tags || {};
+ var keys = utilArrayUnion(utilArrayUnion(Object.keys(o), Object.keys(a)), Object.keys(b)).filter(function(k2) {
+ return !discardTags[k2];
+ });
+ var tags = Object.assign({}, a);
+ var changed = false;
+ for (var i2 = 0; i2 < keys.length; i2++) {
+ var k = keys[i2];
+ if (o[k] !== b[k] && a[k] !== b[k]) {
+ if (o[k] !== a[k]) {
+ _conflicts.push(_t.html("merge_remote_changes.conflict.tags", { tag: k, local: a[k], remote: b[k], user: { html: user(remote.user) } }));
+ } else {
+ if (b.hasOwnProperty(k)) {
+ tags[k] = b[k];
+ } else {
+ delete tags[k];
+ }
+ changed = true;
+ }
+ }
+ }
+ return changed && _conflicts.length === ccount ? target.update({ tags }) : target;
+ }
+ var action = function(graph) {
+ var updates = { replacements: [], removeIds: [] };
+ var base = graph.base().entities[id2];
+ var local = localGraph.entity(id2);
+ var remote = remoteGraph.entity(id2);
+ var target = osmEntity(local, { version: remote.version });
+ if (!remote.visible) {
+ if (_option === "force_remote") {
+ return actionDeleteMultiple([id2])(graph);
+ } else if (_option === "force_local") {
+ if (target.type === "way") {
+ target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph);
+ graph = updateChildren(updates, graph);
+ }
+ return graph.replace(target);
+ } else {
+ _conflicts.push(_t.html("merge_remote_changes.conflict.deleted", { user: { html: user(remote.user) } }));
+ return graph;
+ }
+ }
+ if (target.type === "node") {
+ target = mergeLocation(remote, target);
+ } else if (target.type === "way") {
+ graph.rebase(remoteGraph.childNodes(remote), [graph], false);
+ target = mergeNodes(base, remote, target);
+ target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph);
+ } else if (target.type === "relation") {
+ target = mergeMembers(remote, target);
+ }
+ target = mergeTags(base, remote, target);
+ if (!_conflicts.length) {
+ graph = updateChildren(updates, graph).replace(target);
+ }
+ return graph;
+ };
+ action.withOption = function(opt) {
+ _option = opt;
+ return action;
+ };
+ action.conflicts = function() {
+ return _conflicts;
+ };
+ return action;
+ }
+
+ // modules/actions/move.js
+ function actionMove(moveIDs, tryDelta, projection2, cache) {
+ var _delta = tryDelta;
+ function setupCache(graph) {
+ function canMove(nodeID) {
+ if (moveIDs.indexOf(nodeID) !== -1)
+ return true;
+ var parents = graph.parentWays(graph.entity(nodeID));
+ if (parents.length < 3)
+ return true;
+ var parentsMoving = parents.every(function(way) {
+ return cache.moving[way.id];
+ });
+ if (!parentsMoving)
+ delete cache.moving[nodeID];
+ return parentsMoving;
+ }
+ function cacheEntities(ids) {
+ for (var i2 = 0; i2 < ids.length; i2++) {
+ var id2 = ids[i2];
+ if (cache.moving[id2])
+ continue;
+ cache.moving[id2] = true;
+ var entity = graph.hasEntity(id2);
+ if (!entity)
+ continue;
+ if (entity.type === "node") {
+ cache.nodes.push(id2);
+ cache.startLoc[id2] = entity.loc;
+ } else if (entity.type === "way") {
+ cache.ways.push(id2);
+ cacheEntities(entity.nodes);
+ } else {
+ cacheEntities(entity.members.map(function(member) {
+ return member.id;
+ }));
+ }
+ }
+ }
+ function cacheIntersections(ids) {
+ function isEndpoint(way2, id3) {
+ return !way2.isClosed() && !!way2.affix(id3);
+ }
+ for (var i2 = 0; i2 < ids.length; i2++) {
+ var id2 = ids[i2];
+ var childNodes = graph.childNodes(graph.entity(id2));
+ for (var j2 = 0; j2 < childNodes.length; j2++) {
+ var node = childNodes[j2];
+ var parents = graph.parentWays(node);
+ if (parents.length !== 2)
+ continue;
+ var moved = graph.entity(id2);
+ var unmoved = null;
+ for (var k = 0; k < parents.length; k++) {
+ var way = parents[k];
+ if (!cache.moving[way.id]) {
+ unmoved = way;
+ break;
+ }
+ }
+ if (!unmoved)
+ continue;
+ if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2)
+ continue;
+ if (moved.isArea() || unmoved.isArea())
+ continue;
+ cache.intersections.push({
+ nodeId: node.id,
+ movedId: moved.id,
+ unmovedId: unmoved.id,
+ movedIsEP: isEndpoint(moved, node.id),
+ unmovedIsEP: isEndpoint(unmoved, node.id)
+ });
+ }
+ }
+ }
+ if (!cache) {
+ cache = {};
+ }
+ if (!cache.ok) {
+ cache.moving = {};
+ cache.intersections = [];
+ cache.replacedVertex = {};
+ cache.startLoc = {};
+ cache.nodes = [];
+ cache.ways = [];
+ cacheEntities(moveIDs);
+ cacheIntersections(cache.ways);
+ cache.nodes = cache.nodes.filter(canMove);
+ cache.ok = true;
+ }
+ }
+ function replaceMovedVertex(nodeId, wayId, graph, delta) {
+ var way = graph.entity(wayId);
+ var moved = graph.entity(nodeId);
+ var movedIndex = way.nodes.indexOf(nodeId);
+ var len, prevIndex, nextIndex;
+ if (way.isClosed()) {
+ len = way.nodes.length - 1;
+ prevIndex = (movedIndex + len - 1) % len;
+ nextIndex = (movedIndex + len + 1) % len;
+ } else {
+ len = way.nodes.length;
+ prevIndex = movedIndex - 1;
+ nextIndex = movedIndex + 1;
+ }
+ var prev = graph.hasEntity(way.nodes[prevIndex]);
+ var next = graph.hasEntity(way.nodes[nextIndex]);
+ if (!prev || !next)
+ return graph;
+ var key = wayId + "_" + nodeId;
+ var orig = cache.replacedVertex[key];
+ if (!orig) {
+ orig = osmNode();
+ cache.replacedVertex[key] = orig;
+ cache.startLoc[orig.id] = cache.startLoc[nodeId];
+ }
+ var start2, end;
+ if (delta) {
+ start2 = projection2(cache.startLoc[nodeId]);
+ end = projection2.invert(geoVecAdd(start2, delta));
+ } else {
+ end = cache.startLoc[nodeId];
+ }
+ orig = orig.move(end);
+ var angle2 = Math.abs(geoAngle(orig, prev, projection2) - geoAngle(orig, next, projection2)) * 180 / Math.PI;
+ if (angle2 > 175 && angle2 < 185)
+ return graph;
+ var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection2);
+ var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection2);
+ var d1 = geoPathLength(p1);
+ var d2 = geoPathLength(p2);
+ var insertAt = d1 <= d2 ? movedIndex : nextIndex;
+ if (way.isClosed() && insertAt === 0)
+ insertAt = len;
+ way = way.addNode(orig.id, insertAt);
+ return graph.replace(orig).replace(way);
+ }
+ function removeDuplicateVertices(wayId, graph) {
+ var way = graph.entity(wayId);
+ var epsilon3 = 1e-6;
+ var prev, curr;
+ function isInteresting(node, graph2) {
+ return graph2.parentWays(node).length > 1 || graph2.parentRelations(node).length || node.hasInterestingTags();
+ }
+ for (var i2 = 0; i2 < way.nodes.length; i2++) {
+ curr = graph.entity(way.nodes[i2]);
+ if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon3)) {
+ if (!isInteresting(prev, graph)) {
+ way = way.removeNode(prev.id);
+ graph = graph.replace(way).remove(prev);
+ } else if (!isInteresting(curr, graph)) {
+ way = way.removeNode(curr.id);
+ graph = graph.replace(way).remove(curr);
+ }
+ }
+ prev = curr;
+ }
+ return graph;
+ }
+ function unZorroIntersection(intersection, graph) {
+ var vertex = graph.entity(intersection.nodeId);
+ var way1 = graph.entity(intersection.movedId);
+ var way2 = graph.entity(intersection.unmovedId);
+ var isEP1 = intersection.movedIsEP;
+ var isEP2 = intersection.unmovedIsEP;
+ if (isEP1 && isEP2)
+ return graph;
+ var nodes1 = graph.childNodes(way1).filter(function(n2) {
+ return n2 !== vertex;
+ });
+ var nodes2 = graph.childNodes(way2).filter(function(n2) {
+ return n2 !== vertex;
+ });
+ if (way1.isClosed() && way1.first() === vertex.id)
+ nodes1.push(nodes1[0]);
+ if (way2.isClosed() && way2.first() === vertex.id)
+ nodes2.push(nodes2[0]);
+ var edge1 = !isEP1 && geoChooseEdge(nodes1, projection2(vertex.loc), projection2);
+ var edge2 = !isEP2 && geoChooseEdge(nodes2, projection2(vertex.loc), projection2);
+ var loc;
+ if (!isEP1 && !isEP2) {
+ var epsilon3 = 1e-6, maxIter = 10;
+ for (var i2 = 0; i2 < maxIter; i2++) {
+ loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
+ edge1 = geoChooseEdge(nodes1, projection2(loc), projection2);
+ edge2 = geoChooseEdge(nodes2, projection2(loc), projection2);
+ if (Math.abs(edge1.distance - edge2.distance) < epsilon3)
+ break;
+ }
+ } else if (!isEP1) {
+ loc = edge1.loc;
+ } else {
+ loc = edge2.loc;
+ }
+ graph = graph.replace(vertex.move(loc));
+ if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
+ way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
+ graph = graph.replace(way1);
+ }
+ if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
+ way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
+ graph = graph.replace(way2);
+ }
+ return graph;
+ }
+ function cleanupIntersections(graph) {
+ for (var i2 = 0; i2 < cache.intersections.length; i2++) {
+ var obj = cache.intersections[i2];
+ graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
+ graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
+ graph = unZorroIntersection(obj, graph);
+ graph = removeDuplicateVertices(obj.movedId, graph);
+ graph = removeDuplicateVertices(obj.unmovedId, graph);
+ }
+ return graph;
+ }
+ function limitDelta(graph) {
+ function moveNode(loc) {
+ return geoVecAdd(projection2(loc), _delta);
+ }
+ for (var i2 = 0; i2 < cache.intersections.length; i2++) {
+ var obj = cache.intersections[i2];
+ if (obj.movedIsEP && obj.unmovedIsEP)
+ continue;
+ if (!obj.movedIsEP)
+ continue;
+ var node = graph.entity(obj.nodeId);
+ var start2 = projection2(node.loc);
+ var end = geoVecAdd(start2, _delta);
+ var movedNodes = graph.childNodes(graph.entity(obj.movedId));
+ var movedPath = movedNodes.map(function(n2) {
+ return moveNode(n2.loc);
+ });
+ var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
+ var unmovedPath = unmovedNodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ var hits = geoPathIntersections(movedPath, unmovedPath);
+ for (var j2 = 0; i2 < hits.length; i2++) {
+ if (geoVecEqual(hits[j2], end))
+ continue;
+ var edge = geoChooseEdge(unmovedNodes, end, projection2);
+ _delta = geoVecSubtract(projection2(edge.loc), start2);
+ }
+ }
+ }
+ var action = function(graph) {
+ if (_delta[0] === 0 && _delta[1] === 0)
+ return graph;
+ setupCache(graph);
+ if (cache.intersections.length) {
+ limitDelta(graph);
+ }
+ for (var i2 = 0; i2 < cache.nodes.length; i2++) {
+ var node = graph.entity(cache.nodes[i2]);
+ var start2 = projection2(node.loc);
+ var end = geoVecAdd(start2, _delta);
+ graph = graph.replace(node.move(projection2.invert(end)));
+ }
+ if (cache.intersections.length) {
+ graph = cleanupIntersections(graph);
+ }
+ return graph;
+ };
+ action.delta = function() {
+ return _delta;
+ };
+ return action;
+ }
+
+ // modules/actions/move_member.js
+ function actionMoveMember(relationId, fromIndex, toIndex) {
+ return function(graph) {
+ return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex));
+ };
+ }
+
+ // modules/actions/move_node.js
+ function actionMoveNode(nodeID, toLoc) {
+ var action = function(graph, t) {
+ if (t === null || !isFinite(t))
+ t = 1;
+ t = Math.min(Math.max(+t, 0), 1);
+ var node = graph.entity(nodeID);
+ return graph.replace(node.move(geoVecInterp(node.loc, toLoc, t)));
+ };
+ action.transitionable = true;
+ return action;
+ }
+
+ // modules/actions/noop.js
+ function actionNoop() {
+ return function(graph) {
+ return graph;
+ };
+ }
+
+ // modules/actions/orthogonalize.js
+ function actionOrthogonalize(wayID, projection2, vertexID, degThresh, ep) {
+ var epsilon3 = ep || 1e-4;
+ var threshold = degThresh || 13;
+ var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
+ var upperThreshold = Math.cos(threshold * Math.PI / 180);
+ var action = function(graph, t) {
+ if (t === null || !isFinite(t))
+ t = 1;
+ t = Math.min(Math.max(+t, 0), 1);
+ var way = graph.entity(wayID);
+ way = way.removeNode("");
+ if (way.tags.nonsquare) {
+ var tags = Object.assign({}, way.tags);
+ delete tags.nonsquare;
+ way = way.update({ tags });
+ }
+ graph = graph.replace(way);
+ var isClosed = way.isClosed();
+ var nodes = graph.childNodes(way).slice();
+ if (isClosed)
+ nodes.pop();
+ if (vertexID !== void 0) {
+ nodes = nodeSubset(nodes, vertexID, isClosed);
+ if (nodes.length !== 3)
+ return graph;
+ }
+ var nodeCount = {};
+ var points = [];
+ var corner = { i: 0, dotp: 1 };
+ var node, point, loc, score, motions, i2, j2;
+ for (i2 = 0; i2 < nodes.length; i2++) {
+ node = nodes[i2];
+ nodeCount[node.id] = (nodeCount[node.id] || 0) + 1;
+ points.push({ id: node.id, coord: projection2(node.loc) });
+ }
+ if (points.length === 3) {
+ for (i2 = 0; i2 < 1e3; i2++) {
+ motions = points.map(calcMotion);
+ points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]);
+ score = corner.dotp;
+ if (score < epsilon3) {
+ break;
+ }
+ }
+ node = graph.entity(nodes[corner.i].id);
+ loc = projection2.invert(points[corner.i].coord);
+ graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
+ } else {
+ var straights = [];
+ var simplified = [];
+ for (i2 = 0; i2 < points.length; i2++) {
+ point = points[i2];
+ var dotp = 0;
+ if (isClosed || i2 > 0 && i2 < points.length - 1) {
+ var a = points[(i2 - 1 + points.length) % points.length];
+ var b = points[(i2 + 1) % points.length];
+ dotp = Math.abs(geoOrthoNormalizedDotProduct(a.coord, b.coord, point.coord));
+ }
+ if (dotp > upperThreshold) {
+ straights.push(point);
+ } else {
+ simplified.push(point);
+ }
+ }
+ var bestPoints = clonePoints(simplified);
+ var originalPoints = clonePoints(simplified);
+ score = Infinity;
+ for (i2 = 0; i2 < 1e3; i2++) {
+ motions = simplified.map(calcMotion);
+ for (j2 = 0; j2 < motions.length; j2++) {
+ simplified[j2].coord = geoVecAdd(simplified[j2].coord, motions[j2]);
+ }
+ var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon3, threshold);
+ if (newScore < score) {
+ bestPoints = clonePoints(simplified);
+ score = newScore;
+ }
+ if (score < epsilon3) {
+ break;
+ }
+ }
+ var bestCoords = bestPoints.map(function(p) {
+ return p.coord;
+ });
+ if (isClosed)
+ bestCoords.push(bestCoords[0]);
+ for (i2 = 0; i2 < bestPoints.length; i2++) {
+ point = bestPoints[i2];
+ if (!geoVecEqual(originalPoints[i2].coord, point.coord)) {
+ node = graph.entity(point.id);
+ loc = projection2.invert(point.coord);
+ graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
+ }
+ }
+ for (i2 = 0; i2 < straights.length; i2++) {
+ point = straights[i2];
+ if (nodeCount[point.id] > 1)
+ continue;
+ node = graph.entity(point.id);
+ if (t === 1 && graph.parentWays(node).length === 1 && graph.parentRelations(node).length === 0 && !node.hasInterestingTags()) {
+ graph = actionDeleteNode(node.id)(graph);
+ } else {
+ var choice = geoVecProject(point.coord, bestCoords);
+ if (choice) {
+ loc = projection2.invert(choice.target);
+ graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
+ }
+ }
+ }
+ }
+ return graph;
+ function clonePoints(array2) {
+ return array2.map(function(p) {
+ return { id: p.id, coord: [p.coord[0], p.coord[1]] };
+ });
+ }
+ function calcMotion(point2, i3, array2) {
+ if (!isClosed && (i3 === 0 || i3 === array2.length - 1))
+ return [0, 0];
+ if (nodeCount[array2[i3].id] > 1)
+ return [0, 0];
+ var a2 = array2[(i3 - 1 + array2.length) % array2.length].coord;
+ var origin = point2.coord;
+ var b2 = array2[(i3 + 1) % array2.length].coord;
+ var p = geoVecSubtract(a2, origin);
+ var q = geoVecSubtract(b2, origin);
+ var scale = 2 * Math.min(geoVecLength(p), geoVecLength(q));
+ p = geoVecNormalize(p);
+ q = geoVecNormalize(q);
+ var dotp2 = p[0] * q[0] + p[1] * q[1];
+ var val = Math.abs(dotp2);
+ if (val < lowerThreshold) {
+ corner.i = i3;
+ corner.dotp = val;
+ var vec = geoVecNormalize(geoVecAdd(p, q));
+ return geoVecScale(vec, 0.1 * dotp2 * scale);
+ }
+ return [0, 0];
+ }
+ };
+ function nodeSubset(nodes, vertexID2, isClosed) {
+ var first = isClosed ? 0 : 1;
+ var last = isClosed ? nodes.length : nodes.length - 1;
+ for (var i2 = first; i2 < last; i2++) {
+ if (nodes[i2].id === vertexID2) {
+ return [
+ nodes[(i2 - 1 + nodes.length) % nodes.length],
+ nodes[i2],
+ nodes[(i2 + 1) % nodes.length]
+ ];
+ }
+ }
+ return [];
+ }
+ action.disabled = function(graph) {
+ var way = graph.entity(wayID);
+ way = way.removeNode("");
+ graph = graph.replace(way);
+ var isClosed = way.isClosed();
+ var nodes = graph.childNodes(way).slice();
+ if (isClosed)
+ nodes.pop();
+ var allowStraightAngles = false;
+ if (vertexID !== void 0) {
+ allowStraightAngles = true;
+ nodes = nodeSubset(nodes, vertexID, isClosed);
+ if (nodes.length !== 3)
+ return "end_vertex";
+ }
+ var coords = nodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon3, threshold, allowStraightAngles);
+ if (score === null) {
+ return "not_squarish";
+ } else if (score === 0) {
+ return "square_enough";
+ } else {
+ return false;
+ }
+ };
+ action.transitionable = true;
+ return action;
+ }
+
+ // modules/actions/restrict_turn.js
+ function actionRestrictTurn(turn, restrictionType, restrictionID) {
+ return function(graph) {
+ var fromWay = graph.entity(turn.from.way);
+ var toWay = graph.entity(turn.to.way);
+ var viaNode = turn.via.node && graph.entity(turn.via.node);
+ var viaWays = turn.via.ways && turn.via.ways.map(function(id2) {
+ return graph.entity(id2);
+ });
+ var members = [];
+ members.push({ id: fromWay.id, type: "way", role: "from" });
+ if (viaNode) {
+ members.push({ id: viaNode.id, type: "node", role: "via" });
+ } else if (viaWays) {
+ viaWays.forEach(function(viaWay) {
+ members.push({ id: viaWay.id, type: "way", role: "via" });
+ });
+ }
+ members.push({ id: toWay.id, type: "way", role: "to" });
+ return graph.replace(osmRelation({
+ id: restrictionID,
+ tags: {
+ type: "restriction",
+ restriction: restrictionType
+ },
+ members
+ }));
+ };
+ }
+
+ // modules/actions/revert.js
+ function actionRevert(id2) {
+ var action = function(graph) {
+ var entity = graph.hasEntity(id2), base = graph.base().entities[id2];
+ if (entity && !base) {
+ if (entity.type === "node") {
+ graph.parentWays(entity).forEach(function(parent) {
+ parent = parent.removeNode(id2);
+ graph = graph.replace(parent);
+ if (parent.isDegenerate()) {
+ graph = actionDeleteWay(parent.id)(graph);
+ }
+ });
+ }
+ graph.parentRelations(entity).forEach(function(parent) {
+ parent = parent.removeMembersWithID(id2);
+ graph = graph.replace(parent);
+ if (parent.isDegenerate()) {
+ graph = actionDeleteRelation(parent.id)(graph);
+ }
+ });
+ }
+ return graph.revert(id2);
+ };
+ return action;
+ }
+
+ // modules/actions/rotate.js
+ function actionRotate(rotateIds, pivot, angle2, projection2) {
+ var action = function(graph) {
+ return graph.update(function(graph2) {
+ utilGetAllNodes(rotateIds, graph2).forEach(function(node) {
+ var point = geoRotate([projection2(node.loc)], angle2, pivot)[0];
+ graph2 = graph2.replace(node.move(projection2.invert(point)));
+ });
+ });
+ };
+ return action;
+ }
+
+ // modules/actions/scale.js
+ function actionScale(ids, pivotLoc, scaleFactor, projection2) {
+ return function(graph) {
+ return graph.update(function(graph2) {
+ let point, radial;
+ utilGetAllNodes(ids, graph2).forEach(function(node) {
+ point = projection2(node.loc);
+ radial = [
+ point[0] - pivotLoc[0],
+ point[1] - pivotLoc[1]
+ ];
+ point = [
+ pivotLoc[0] + scaleFactor * radial[0],
+ pivotLoc[1] + scaleFactor * radial[1]
+ ];
+ graph2 = graph2.replace(node.move(projection2.invert(point)));
+ });
+ });
+ };
+ }
+
+ // modules/actions/straighten_nodes.js
+ function actionStraightenNodes(nodeIDs, projection2) {
+ function positionAlongWay(a, o, b) {
+ return geoVecDot(a, b, o) / geoVecDot(b, b, o);
+ }
+ function getEndpoints(points) {
+ var ssr = geoGetSmallestSurroundingRectangle(points);
+ var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2];
+ var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2];
+ var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2];
+ var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2];
+ var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2);
+ if (isLong) {
+ return [p1, q1];
+ }
+ return [p2, q2];
+ }
+ var action = function(graph, t) {
+ if (t === null || !isFinite(t))
+ t = 1;
+ t = Math.min(Math.max(+t, 0), 1);
+ var nodes = nodeIDs.map(function(id2) {
+ return graph.entity(id2);
+ });
+ var points = nodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ var endpoints = getEndpoints(points);
+ var startPoint = endpoints[0];
+ var endPoint = endpoints[1];
+ for (var i2 = 0; i2 < points.length; i2++) {
+ var node = nodes[i2];
+ var point = points[i2];
+ var u = positionAlongWay(point, startPoint, endPoint);
+ var point2 = geoVecInterp(startPoint, endPoint, u);
+ var loc2 = projection2.invert(point2);
+ graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
+ }
+ return graph;
+ };
+ action.disabled = function(graph) {
+ var nodes = nodeIDs.map(function(id2) {
+ return graph.entity(id2);
+ });
+ var points = nodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ var endpoints = getEndpoints(points);
+ var startPoint = endpoints[0];
+ var endPoint = endpoints[1];
+ var maxDistance = 0;
+ for (var i2 = 0; i2 < points.length; i2++) {
+ var point = points[i2];
+ var u = positionAlongWay(point, startPoint, endPoint);
+ var p = geoVecInterp(startPoint, endPoint, u);
+ var dist = geoVecLength(p, point);
+ if (!isNaN(dist) && dist > maxDistance) {
+ maxDistance = dist;
+ }
+ }
+ if (maxDistance < 1e-4) {
+ return "straight_enough";
+ }
+ };
+ action.transitionable = true;
+ return action;
+ }
+
+ // modules/actions/straighten_way.js
+ function actionStraightenWay(selectedIDs, projection2) {
+ function positionAlongWay(a, o, b) {
+ return geoVecDot(a, b, o) / geoVecDot(b, b, o);
+ }
+ function allNodes(graph) {
+ var nodes = [];
+ var startNodes = [];
+ var endNodes = [];
+ var remainingWays = [];
+ var selectedWays = selectedIDs.filter(function(w) {
+ return graph.entity(w).type === "way";
+ });
+ var selectedNodes = selectedIDs.filter(function(n2) {
+ return graph.entity(n2).type === "node";
+ });
+ for (var i2 = 0; i2 < selectedWays.length; i2++) {
+ var way = graph.entity(selectedWays[i2]);
+ nodes = way.nodes.slice(0);
+ remainingWays.push(nodes);
+ startNodes.push(nodes[0]);
+ endNodes.push(nodes[nodes.length - 1]);
+ }
+ startNodes = startNodes.filter(function(n2) {
+ return startNodes.indexOf(n2) === startNodes.lastIndexOf(n2);
+ });
+ endNodes = endNodes.filter(function(n2) {
+ return endNodes.indexOf(n2) === endNodes.lastIndexOf(n2);
+ });
+ var currNode = utilArrayDifference(startNodes, endNodes).concat(utilArrayDifference(endNodes, startNodes))[0];
+ var nextWay = [];
+ nodes = [];
+ var getNextWay = function(currNode2, remainingWays2) {
+ return remainingWays2.filter(function(way2) {
+ return way2[0] === currNode2 || way2[way2.length - 1] === currNode2;
+ })[0];
+ };
+ while (remainingWays.length) {
+ nextWay = getNextWay(currNode, remainingWays);
+ remainingWays = utilArrayDifference(remainingWays, [nextWay]);
+ if (nextWay[0] !== currNode) {
+ nextWay.reverse();
+ }
+ nodes = nodes.concat(nextWay);
+ currNode = nodes[nodes.length - 1];
+ }
+ if (selectedNodes.length === 2) {
+ var startNodeIdx = nodes.indexOf(selectedNodes[0]);
+ var endNodeIdx = nodes.indexOf(selectedNodes[1]);
+ var sortedStartEnd = [startNodeIdx, endNodeIdx];
+ sortedStartEnd.sort(function(a, b) {
+ return a - b;
+ });
+ nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1] + 1);
+ }
+ return nodes.map(function(n2) {
+ return graph.entity(n2);
+ });
+ }
+ function shouldKeepNode(node, graph) {
+ return graph.parentWays(node).length > 1 || graph.parentRelations(node).length || node.hasInterestingTags();
+ }
+ var action = function(graph, t) {
+ if (t === null || !isFinite(t))
+ t = 1;
+ t = Math.min(Math.max(+t, 0), 1);
+ var nodes = allNodes(graph);
+ var points = nodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ var startPoint = points[0];
+ var endPoint = points[points.length - 1];
+ var toDelete = [];
+ var i2;
+ for (i2 = 1; i2 < points.length - 1; i2++) {
+ var node = nodes[i2];
+ var point = points[i2];
+ if (t < 1 || shouldKeepNode(node, graph)) {
+ var u = positionAlongWay(point, startPoint, endPoint);
+ var p = geoVecInterp(startPoint, endPoint, u);
+ var loc2 = projection2.invert(p);
+ graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
+ } else {
+ if (toDelete.indexOf(node) === -1) {
+ toDelete.push(node);
+ }
+ }
+ }
+ for (i2 = 0; i2 < toDelete.length; i2++) {
+ graph = actionDeleteNode(toDelete[i2].id)(graph);
+ }
+ return graph;
+ };
+ action.disabled = function(graph) {
+ var nodes = allNodes(graph);
+ var points = nodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ var startPoint = points[0];
+ var endPoint = points[points.length - 1];
+ var threshold = 0.2 * geoVecLength(startPoint, endPoint);
+ var i2;
+ if (threshold === 0) {
+ return "too_bendy";
+ }
+ var maxDistance = 0;
+ for (i2 = 1; i2 < points.length - 1; i2++) {
+ var point = points[i2];
+ var u = positionAlongWay(point, startPoint, endPoint);
+ var p = geoVecInterp(startPoint, endPoint, u);
+ var dist = geoVecLength(p, point);
+ if (isNaN(dist) || dist > threshold) {
+ return "too_bendy";
+ } else if (dist > maxDistance) {
+ maxDistance = dist;
+ }
+ }
+ var keepingAllNodes = nodes.every(function(node, i3) {
+ return i3 === 0 || i3 === nodes.length - 1 || shouldKeepNode(node, graph);
+ });
+ if (maxDistance < 1e-4 && keepingAllNodes) {
+ return "straight_enough";
+ }
+ };
+ action.transitionable = true;
+ return action;
+ }
+
+ // modules/actions/unrestrict_turn.js
+ function actionUnrestrictTurn(turn) {
+ return function(graph) {
+ return actionDeleteRelation(turn.restrictionID)(graph);
+ };
+ }
+
+ // modules/actions/reflect.js
+ function actionReflect(reflectIds, projection2) {
+ var _useLongAxis = true;
+ var action = function(graph, t) {
+ if (t === null || !isFinite(t))
+ t = 1;
+ t = Math.min(Math.max(+t, 0), 1);
+ var nodes = utilGetAllNodes(reflectIds, graph);
+ var points = nodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ var ssr = geoGetSmallestSurroundingRectangle(points);
+ var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2];
+ var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2];
+ var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2];
+ var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2];
+ var p, q;
+ var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2);
+ if (_useLongAxis && isLong || !_useLongAxis && !isLong) {
+ p = p1;
+ q = q1;
+ } else {
+ p = p2;
+ q = q2;
+ }
+ var dx = q[0] - p[0];
+ var dy = q[1] - p[1];
+ var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
+ var b = 2 * dx * dy / (dx * dx + dy * dy);
+ for (var i2 = 0; i2 < nodes.length; i2++) {
+ var node = nodes[i2];
+ var c = projection2(node.loc);
+ var c2 = [
+ a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
+ b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
+ ];
+ var loc2 = projection2.invert(c2);
+ node = node.move(geoVecInterp(node.loc, loc2, t));
+ graph = graph.replace(node);
+ }
+ return graph;
+ };
+ action.useLongAxis = function(val) {
+ if (!arguments.length)
+ return _useLongAxis;
+ _useLongAxis = val;
+ return action;
+ };
+ action.transitionable = true;
+ return action;
+ }
+
+ // modules/actions/upgrade_tags.js
+ function actionUpgradeTags(entityId, oldTags, replaceTags) {
+ return function(graph) {
+ var entity = graph.entity(entityId);
+ var tags = Object.assign({}, entity.tags);
+ var transferValue;
+ var semiIndex;
+ for (var oldTagKey in oldTags) {
+ if (!(oldTagKey in tags))
+ continue;
+ if (oldTags[oldTagKey] === "*") {
+ transferValue = tags[oldTagKey];
+ delete tags[oldTagKey];
+ } else if (oldTags[oldTagKey] === tags[oldTagKey]) {
+ delete tags[oldTagKey];
+ } else {
+ var vals = tags[oldTagKey].split(";").filter(Boolean);
+ var oldIndex = vals.indexOf(oldTags[oldTagKey]);
+ if (vals.length === 1 || oldIndex === -1) {
+ delete tags[oldTagKey];
+ } else {
+ if (replaceTags && replaceTags[oldTagKey]) {
+ semiIndex = oldIndex;
+ }
+ vals.splice(oldIndex, 1);
+ tags[oldTagKey] = vals.join(";");
+ }
+ }
+ }
+ if (replaceTags) {
+ for (var replaceKey in replaceTags) {
+ var replaceValue = replaceTags[replaceKey];
+ if (replaceValue === "*") {
+ if (tags[replaceKey] && tags[replaceKey] !== "no") {
+ continue;
+ } else {
+ tags[replaceKey] = "yes";
+ }
+ } else if (replaceValue === "$1") {
+ tags[replaceKey] = transferValue;
+ } else {
+ if (tags[replaceKey] && oldTags[replaceKey] && semiIndex !== void 0) {
+ var existingVals = tags[replaceKey].split(";").filter(Boolean);
+ if (existingVals.indexOf(replaceValue) === -1) {
+ existingVals.splice(semiIndex, 0, replaceValue);
+ tags[replaceKey] = existingVals.join(";");
+ }
+ } else {
+ tags[replaceKey] = replaceValue;
+ }
+ }
+ }
+ }
+ return graph.replace(entity.update({ tags }));
+ };
+ }
+
+ // modules/behavior/edit.js
+ function behaviorEdit(context) {
+ function behavior() {
+ context.map().minzoom(context.minEditableZoom());
+ }
+ behavior.off = function() {
+ context.map().minzoom(0);
+ };
+ return behavior;
+ }
+
+ // modules/behavior/hover.js
+ function behaviorHover(context) {
+ var dispatch10 = dispatch_default("hover");
+ var _selection = select_default2(null);
+ var _newNodeId = null;
+ var _initialNodeID = null;
+ var _altDisables;
+ var _ignoreVertex;
+ var _targets = [];
+ var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ function keydown(d3_event) {
+ if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
+ _selection.selectAll(".hover").classed("hover-suppressed", true).classed("hover", false);
+ _selection.classed("hover-disabled", true);
+ dispatch10.call("hover", this, null);
+ }
+ }
+ function keyup(d3_event) {
+ if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
+ _selection.selectAll(".hover-suppressed").classed("hover-suppressed", false).classed("hover", true);
+ _selection.classed("hover-disabled", false);
+ dispatch10.call("hover", this, _targets);
+ }
+ }
+ function behavior(selection2) {
+ _selection = selection2;
+ _targets = [];
+ if (_initialNodeID) {
+ _newNodeId = _initialNodeID;
+ _initialNodeID = null;
+ } else {
+ _newNodeId = null;
+ }
+ _selection.on(_pointerPrefix + "over.hover", pointerover).on(_pointerPrefix + "out.hover", pointerout).on(_pointerPrefix + "down.hover", pointerover);
+ select_default2(window).on(_pointerPrefix + "up.hover pointercancel.hover", pointerout, true).on("keydown.hover", keydown).on("keyup.hover", keyup);
+ function eventTarget(d3_event) {
+ var datum2 = d3_event.target && d3_event.target.__data__;
+ if (typeof datum2 !== "object")
+ return null;
+ if (!(datum2 instanceof osmEntity) && datum2.properties && datum2.properties.entity instanceof osmEntity) {
+ return datum2.properties.entity;
+ }
+ return datum2;
+ }
+ function pointerover(d3_event) {
+ if (context.mode().id.indexOf("drag") === -1 && (!d3_event.pointerType || d3_event.pointerType === "mouse") && d3_event.buttons)
+ return;
+ var target = eventTarget(d3_event);
+ if (target && _targets.indexOf(target) === -1) {
+ _targets.push(target);
+ updateHover(d3_event, _targets);
+ }
+ }
+ function pointerout(d3_event) {
+ var target = eventTarget(d3_event);
+ var index = _targets.indexOf(target);
+ if (index !== -1) {
+ _targets.splice(index);
+ updateHover(d3_event, _targets);
+ }
+ }
+ function allowsVertex(d) {
+ return d.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d, context.graph());
+ }
+ function modeAllowsHover(target) {
+ var mode = context.mode();
+ if (mode.id === "add-point") {
+ return mode.preset.matchGeometry("vertex") || target.type !== "way" && target.geometry(context.graph()) !== "vertex";
+ }
+ return true;
+ }
+ function updateHover(d3_event, targets) {
+ _selection.selectAll(".hover").classed("hover", false);
+ _selection.selectAll(".hover-suppressed").classed("hover-suppressed", false);
+ var mode = context.mode();
+ if (!_newNodeId && (mode.id === "draw-line" || mode.id === "draw-area")) {
+ var node = targets.find(function(target) {
+ return target instanceof osmEntity && target.type === "node";
+ });
+ _newNodeId = node && node.id;
+ }
+ targets = targets.filter(function(datum3) {
+ if (datum3 instanceof osmEntity) {
+ return datum3.id !== _newNodeId && (datum3.type !== "node" || !_ignoreVertex || allowsVertex(datum3)) && modeAllowsHover(datum3);
+ }
+ return true;
+ });
+ var selector = "";
+ for (var i2 in targets) {
+ var datum2 = targets[i2];
+ if (datum2.__featurehash__) {
+ selector += ", .data" + datum2.__featurehash__;
+ } else if (datum2 instanceof QAItem) {
+ selector += ", ." + datum2.service + ".itemId-" + datum2.id;
+ } else if (datum2 instanceof osmNote) {
+ selector += ", .note-" + datum2.id;
+ } else if (datum2 instanceof osmEntity) {
+ selector += ", ." + datum2.id;
+ if (datum2.type === "relation") {
+ for (var j2 in datum2.members) {
+ selector += ", ." + datum2.members[j2].id;
+ }
+ }
+ }
+ }
+ var suppressed = _altDisables && d3_event && d3_event.altKey;
+ if (selector.trim().length) {
+ selector = selector.slice(1);
+ _selection.selectAll(selector).classed(suppressed ? "hover-suppressed" : "hover", true);
+ }
+ dispatch10.call("hover", this, !suppressed && targets);
+ }
+ }
+ behavior.off = function(selection2) {
+ selection2.selectAll(".hover").classed("hover", false);
+ selection2.selectAll(".hover-suppressed").classed("hover-suppressed", false);
+ selection2.classed("hover-disabled", false);
+ selection2.on(_pointerPrefix + "over.hover", null).on(_pointerPrefix + "out.hover", null).on(_pointerPrefix + "down.hover", null);
+ select_default2(window).on(_pointerPrefix + "up.hover pointercancel.hover", null, true).on("keydown.hover", null).on("keyup.hover", null);
+ };
+ behavior.altDisables = function(val) {
+ if (!arguments.length)
+ return _altDisables;
+ _altDisables = val;
+ return behavior;
+ };
+ behavior.ignoreVertex = function(val) {
+ if (!arguments.length)
+ return _ignoreVertex;
+ _ignoreVertex = val;
+ return behavior;
+ };
+ behavior.initialNodeID = function(nodeId) {
+ _initialNodeID = nodeId;
+ return behavior;
+ };
+ return utilRebind(behavior, dispatch10, "on");
+ }
+
+ // modules/behavior/draw.js
+ var _disableSpace = false;
+ var _lastSpace = null;
+ function behaviorDraw(context) {
+ var dispatch10 = dispatch_default("move", "down", "downcancel", "click", "clickWay", "clickNode", "undo", "cancel", "finish");
+ var keybinding = utilKeybinding("draw");
+ var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true).on("hover", context.ui().sidebar.hover);
+ var _edit = behaviorEdit(context);
+ var _closeTolerance = 4;
+ var _tolerance = 12;
+ var _mouseLeave = false;
+ var _lastMouse = null;
+ var _lastPointerUpEvent;
+ var _downPointer;
+ var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ function datum2(d3_event) {
+ var mode = context.mode();
+ var isNote = mode && mode.id.indexOf("note") !== -1;
+ if (d3_event.altKey || isNote)
+ return {};
+ var element;
+ if (d3_event.type === "keydown") {
+ element = _lastMouse && _lastMouse.target;
+ } else {
+ element = d3_event.target;
+ }
+ var d = element.__data__;
+ return d && d.properties && d.properties.target ? d : {};
+ }
+ function pointerdown(d3_event) {
+ if (_downPointer)
+ return;
+ var pointerLocGetter = utilFastMouse(this);
+ _downPointer = {
+ id: d3_event.pointerId || "mouse",
+ pointerLocGetter,
+ downTime: +new Date(),
+ downLoc: pointerLocGetter(d3_event)
+ };
+ dispatch10.call("down", this, d3_event, datum2(d3_event));
+ }
+ function pointerup(d3_event) {
+ if (!_downPointer || _downPointer.id !== (d3_event.pointerId || "mouse"))
+ return;
+ var downPointer = _downPointer;
+ _downPointer = null;
+ _lastPointerUpEvent = d3_event;
+ if (downPointer.isCancelled)
+ return;
+ var t2 = +new Date();
+ var p2 = downPointer.pointerLocGetter(d3_event);
+ var dist = geoVecLength(downPointer.downLoc, p2);
+ if (dist < _closeTolerance || dist < _tolerance && t2 - downPointer.downTime < 500) {
+ select_default2(window).on("click.draw-block", function() {
+ d3_event.stopPropagation();
+ }, true);
+ context.map().dblclickZoomEnable(false);
+ window.setTimeout(function() {
+ context.map().dblclickZoomEnable(true);
+ select_default2(window).on("click.draw-block", null);
+ }, 500);
+ click(d3_event, p2);
+ }
+ }
+ function pointermove(d3_event) {
+ if (_downPointer && _downPointer.id === (d3_event.pointerId || "mouse") && !_downPointer.isCancelled) {
+ var p2 = _downPointer.pointerLocGetter(d3_event);
+ var dist = geoVecLength(_downPointer.downLoc, p2);
+ if (dist >= _closeTolerance) {
+ _downPointer.isCancelled = true;
+ dispatch10.call("downcancel", this);
+ }
+ }
+ if (d3_event.pointerType && d3_event.pointerType !== "mouse" || d3_event.buttons || _downPointer)
+ return;
+ if (_lastPointerUpEvent && _lastPointerUpEvent.pointerType !== "mouse" && d3_event.timeStamp - _lastPointerUpEvent.timeStamp < 100)
+ return;
+ _lastMouse = d3_event;
+ dispatch10.call("move", this, d3_event, datum2(d3_event));
+ }
+ function pointercancel(d3_event) {
+ if (_downPointer && _downPointer.id === (d3_event.pointerId || "mouse")) {
+ if (!_downPointer.isCancelled) {
+ dispatch10.call("downcancel", this);
+ }
+ _downPointer = null;
+ }
+ }
+ function mouseenter() {
+ _mouseLeave = false;
+ }
+ function mouseleave() {
+ _mouseLeave = true;
+ }
+ function allowsVertex(d) {
+ return d.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d, context.graph());
+ }
+ function click(d3_event, loc) {
+ var d = datum2(d3_event);
+ var target = d && d.properties && d.properties.entity;
+ var mode = context.mode();
+ if (target && target.type === "node" && allowsVertex(target)) {
+ dispatch10.call("clickNode", this, target, d);
+ return;
+ } else if (target && target.type === "way" && (mode.id !== "add-point" || mode.preset.matchGeometry("vertex"))) {
+ var choice = geoChooseEdge(context.graph().childNodes(target), loc, context.projection, context.activeID());
+ if (choice) {
+ var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
+ dispatch10.call("clickWay", this, choice.loc, edge, d);
+ return;
+ }
+ } else if (mode.id !== "add-point" || mode.preset.matchGeometry("point")) {
+ var locLatLng = context.projection.invert(loc);
+ dispatch10.call("click", this, locLatLng, d);
+ }
+ }
+ function space(d3_event) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ var currSpace = context.map().mouse();
+ if (_disableSpace && _lastSpace) {
+ var dist = geoVecLength(_lastSpace, currSpace);
+ if (dist > _tolerance) {
+ _disableSpace = false;
+ }
+ }
+ if (_disableSpace || _mouseLeave || !_lastMouse)
+ return;
+ _lastSpace = currSpace;
+ _disableSpace = true;
+ select_default2(window).on("keyup.space-block", function() {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ _disableSpace = false;
+ select_default2(window).on("keyup.space-block", null);
+ });
+ var loc = context.map().mouse() || context.projection(context.map().center());
+ click(d3_event, loc);
+ }
+ function backspace(d3_event) {
+ d3_event.preventDefault();
+ dispatch10.call("undo");
+ }
+ function del(d3_event) {
+ d3_event.preventDefault();
+ dispatch10.call("cancel");
+ }
+ function ret(d3_event) {
+ d3_event.preventDefault();
+ dispatch10.call("finish");
+ }
+ function behavior(selection2) {
+ context.install(_hover);
+ context.install(_edit);
+ _downPointer = null;
+ keybinding.on("\u232B", backspace).on("\u2326", del).on("\u238B", ret).on("\u21A9", ret).on("space", space).on("\u2325space", space);
+ selection2.on("mouseenter.draw", mouseenter).on("mouseleave.draw", mouseleave).on(_pointerPrefix + "down.draw", pointerdown).on(_pointerPrefix + "move.draw", pointermove);
+ select_default2(window).on(_pointerPrefix + "up.draw", pointerup, true).on("pointercancel.draw", pointercancel, true);
+ select_default2(document).call(keybinding);
+ return behavior;
+ }
+ behavior.off = function(selection2) {
+ context.ui().sidebar.hover.cancel();
+ context.uninstall(_hover);
+ context.uninstall(_edit);
+ selection2.on("mouseenter.draw", null).on("mouseleave.draw", null).on(_pointerPrefix + "down.draw", null).on(_pointerPrefix + "move.draw", null);
+ select_default2(window).on(_pointerPrefix + "up.draw", null).on("pointercancel.draw", null);
+ select_default2(document).call(keybinding.unbind);
+ };
+ behavior.hover = function() {
+ return _hover;
+ };
+ return utilRebind(behavior, dispatch10, "on");
+ }
+
+ // modules/behavior/breathe.js
+ var import_fast_deep_equal2 = __toESM(require_fast_deep_equal());
+
+ // node_modules/d3-scale/src/init.js
+ function initRange(domain2, range3) {
+ switch (arguments.length) {
+ case 0:
+ break;
+ case 1:
+ this.range(domain2);
+ break;
+ default:
+ this.range(range3).domain(domain2);
+ break;
+ }
+ return this;
+ }
+
+ // node_modules/d3-scale/src/constant.js
+ function constants(x) {
+ return function() {
+ return x;
+ };
+ }
+
+ // node_modules/d3-scale/src/number.js
+ function number2(x) {
+ return +x;
+ }
+
+ // node_modules/d3-scale/src/continuous.js
+ var unit = [0, 1];
+ function identity3(x) {
+ return x;
+ }
+ function normalize(a, b) {
+ return (b -= a = +a) ? function(x) {
+ return (x - a) / b;
+ } : constants(isNaN(b) ? NaN : 0.5);
+ }
+ function clamper(a, b) {
+ var t;
+ if (a > b)
+ t = a, a = b, b = t;
+ return function(x) {
+ return Math.max(a, Math.min(b, x));
+ };
+ }
+ function bimap(domain2, range3, interpolate) {
+ var d0 = domain2[0], d1 = domain2[1], r0 = range3[0], r1 = range3[1];
+ if (d1 < d0)
+ d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
+ else
+ d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
+ return function(x) {
+ return r0(d0(x));
+ };
+ }
+ function polymap(domain2, range3, interpolate) {
+ var j2 = Math.min(domain2.length, range3.length) - 1, d = new Array(j2), r = new Array(j2), i2 = -1;
+ if (domain2[j2] < domain2[0]) {
+ domain2 = domain2.slice().reverse();
+ range3 = range3.slice().reverse();
+ }
+ while (++i2 < j2) {
+ d[i2] = normalize(domain2[i2], domain2[i2 + 1]);
+ r[i2] = interpolate(range3[i2], range3[i2 + 1]);
+ }
+ return function(x) {
+ var i3 = bisect_default(domain2, x, 1, j2) - 1;
+ return r[i3](d[i3](x));
+ };
+ }
+ function copy(source, target) {
+ return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());
+ }
+ function transformer2() {
+ var domain2 = unit, range3 = unit, interpolate = value_default, transform2, untransform, unknown, clamp3 = identity3, piecewise, output, input;
+ function rescale() {
+ var n2 = Math.min(domain2.length, range3.length);
+ if (clamp3 !== identity3)
+ clamp3 = clamper(domain2[0], domain2[n2 - 1]);
+ piecewise = n2 > 2 ? polymap : bimap;
+ output = input = null;
+ return scale;
+ }
+ function scale(x) {
+ return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain2.map(transform2), range3, interpolate)))(transform2(clamp3(x)));
+ }
+ scale.invert = function(y) {
+ return clamp3(untransform((input || (input = piecewise(range3, domain2.map(transform2), number_default)))(y)));
+ };
+ scale.domain = function(_) {
+ return arguments.length ? (domain2 = Array.from(_, number2), rescale()) : domain2.slice();
+ };
+ scale.range = function(_) {
+ return arguments.length ? (range3 = Array.from(_), rescale()) : range3.slice();
+ };
+ scale.rangeRound = function(_) {
+ return range3 = Array.from(_), interpolate = round_default, rescale();
+ };
+ scale.clamp = function(_) {
+ return arguments.length ? (clamp3 = _ ? true : identity3, rescale()) : clamp3 !== identity3;
+ };
+ scale.interpolate = function(_) {
+ return arguments.length ? (interpolate = _, rescale()) : interpolate;
+ };
+ scale.unknown = function(_) {
+ return arguments.length ? (unknown = _, scale) : unknown;
+ };
+ return function(t, u) {
+ transform2 = t, untransform = u;
+ return rescale();
+ };
+ }
+ function continuous() {
+ return transformer2()(identity3, identity3);
+ }
+
+ // node_modules/d3-format/src/formatDecimal.js
+ function formatDecimal_default(x) {
+ return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString("en").replace(/,/g, "") : x.toString(10);
+ }
+ function formatDecimalParts(x, p) {
+ if ((i2 = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0)
+ return null;
+ var i2, coefficient = x.slice(0, i2);
+ return [
+ coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
+ +x.slice(i2 + 1)
+ ];
+ }
+
+ // node_modules/d3-format/src/exponent.js
+ function exponent_default(x) {
+ return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;
+ }
+
+ // node_modules/d3-format/src/formatGroup.js
+ function formatGroup_default(grouping, thousands) {
+ return function(value, width) {
+ var i2 = value.length, t = [], j2 = 0, g = grouping[0], length = 0;
+ while (i2 > 0 && g > 0) {
+ if (length + g + 1 > width)
+ g = Math.max(1, width - length);
+ t.push(value.substring(i2 -= g, i2 + g));
+ if ((length += g + 1) > width)
+ break;
+ g = grouping[j2 = (j2 + 1) % grouping.length];
+ }
+ return t.reverse().join(thousands);
+ };
+ }
+
+ // node_modules/d3-format/src/formatNumerals.js
+ function formatNumerals_default(numerals) {
+ return function(value) {
+ return value.replace(/[0-9]/g, function(i2) {
+ return numerals[+i2];
+ });
+ };
+ }
+
+ // node_modules/d3-format/src/formatSpecifier.js
+ var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
+ function formatSpecifier(specifier) {
+ if (!(match = re.exec(specifier)))
+ throw new Error("invalid format: " + specifier);
+ var match;
+ return new FormatSpecifier({
+ fill: match[1],
+ align: match[2],
+ sign: match[3],
+ symbol: match[4],
+ zero: match[5],
+ width: match[6],
+ comma: match[7],
+ precision: match[8] && match[8].slice(1),
+ trim: match[9],
+ type: match[10]
+ });
+ }
+ formatSpecifier.prototype = FormatSpecifier.prototype;
+ function FormatSpecifier(specifier) {
+ this.fill = specifier.fill === void 0 ? " " : specifier.fill + "";
+ this.align = specifier.align === void 0 ? ">" : specifier.align + "";
+ this.sign = specifier.sign === void 0 ? "-" : specifier.sign + "";
+ this.symbol = specifier.symbol === void 0 ? "" : specifier.symbol + "";
+ this.zero = !!specifier.zero;
+ this.width = specifier.width === void 0 ? void 0 : +specifier.width;
+ this.comma = !!specifier.comma;
+ this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;
+ this.trim = !!specifier.trim;
+ this.type = specifier.type === void 0 ? "" : specifier.type + "";
+ }
+ FormatSpecifier.prototype.toString = function() {
+ return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width === void 0 ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision === void 0 ? "" : "." + Math.max(0, this.precision | 0)) + (this.trim ? "~" : "") + this.type;
+ };
+
+ // node_modules/d3-format/src/formatTrim.js
+ function formatTrim_default(s) {
+ out:
+ for (var n2 = s.length, i2 = 1, i0 = -1, i1; i2 < n2; ++i2) {
+ switch (s[i2]) {
+ case ".":
+ i0 = i1 = i2;
+ break;
+ case "0":
+ if (i0 === 0)
+ i0 = i2;
+ i1 = i2;
+ break;
+ default:
+ if (!+s[i2])
+ break out;
+ if (i0 > 0)
+ i0 = 0;
+ break;
+ }
+ }
+ return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
+ }
+
+ // node_modules/d3-format/src/formatPrefixAuto.js
+ var prefixExponent;
+ function formatPrefixAuto_default(x, p) {
+ var d = formatDecimalParts(x, p);
+ if (!d)
+ return x + "";
+ var coefficient = d[0], exponent = d[1], i2 = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n2 = coefficient.length;
+ return i2 === n2 ? coefficient : i2 > n2 ? coefficient + new Array(i2 - n2 + 1).join("0") : i2 > 0 ? coefficient.slice(0, i2) + "." + coefficient.slice(i2) : "0." + new Array(1 - i2).join("0") + formatDecimalParts(x, Math.max(0, p + i2 - 1))[0];
+ }
+
+ // node_modules/d3-format/src/formatRounded.js
+ function formatRounded_default(x, p) {
+ var d = formatDecimalParts(x, p);
+ if (!d)
+ return x + "";
+ var coefficient = d[0], exponent = d[1];
+ return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join("0");
+ }
+
+ // node_modules/d3-format/src/formatTypes.js
+ var formatTypes_default = {
+ "%": (x, p) => (x * 100).toFixed(p),
+ "b": (x) => Math.round(x).toString(2),
+ "c": (x) => x + "",
+ "d": formatDecimal_default,
+ "e": (x, p) => x.toExponential(p),
+ "f": (x, p) => x.toFixed(p),
+ "g": (x, p) => x.toPrecision(p),
+ "o": (x) => Math.round(x).toString(8),
+ "p": (x, p) => formatRounded_default(x * 100, p),
+ "r": formatRounded_default,
+ "s": formatPrefixAuto_default,
+ "X": (x) => Math.round(x).toString(16).toUpperCase(),
+ "x": (x) => Math.round(x).toString(16)
+ };
+
+ // node_modules/d3-format/src/identity.js
+ function identity_default3(x) {
+ return x;
+ }
+
+ // node_modules/d3-format/src/locale.js
+ var map = Array.prototype.map;
+ var prefixes = ["y", "z", "a", "f", "p", "n", "\xB5", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"];
+ function locale_default(locale2) {
+ var group = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity_default3 : formatGroup_default(map.call(locale2.grouping, Number), locale2.thousands + ""), currencyPrefix = locale2.currency === void 0 ? "" : locale2.currency[0] + "", currencySuffix = locale2.currency === void 0 ? "" : locale2.currency[1] + "", decimal = locale2.decimal === void 0 ? "." : locale2.decimal + "", numerals = locale2.numerals === void 0 ? identity_default3 : formatNumerals_default(map.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? "%" : locale2.percent + "", minus = locale2.minus === void 0 ? "\u2212" : locale2.minus + "", nan = locale2.nan === void 0 ? "NaN" : locale2.nan + "";
+ function newFormat(specifier) {
+ specifier = formatSpecifier(specifier);
+ var fill = specifier.fill, align = specifier.align, sign2 = specifier.sign, symbol = specifier.symbol, zero3 = specifier.zero, width = specifier.width, comma = specifier.comma, precision2 = specifier.precision, trim = specifier.trim, type3 = specifier.type;
+ if (type3 === "n")
+ comma = true, type3 = "g";
+ else if (!formatTypes_default[type3])
+ precision2 === void 0 && (precision2 = 12), trim = true, type3 = "g";
+ if (zero3 || fill === "0" && align === "=")
+ zero3 = true, fill = "0", align = "=";
+ var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type3) ? "0" + type3.toLowerCase() : "", suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type3) ? percent : "";
+ var formatType = formatTypes_default[type3], maybeSuffix = /[defgprs%]/.test(type3);
+ precision2 = precision2 === void 0 ? 6 : /[gprs]/.test(type3) ? Math.max(1, Math.min(21, precision2)) : Math.max(0, Math.min(20, precision2));
+ function format2(value) {
+ var valuePrefix = prefix, valueSuffix = suffix, i2, n2, c;
+ if (type3 === "c") {
+ valueSuffix = formatType(value) + valueSuffix;
+ value = "";
+ } else {
+ value = +value;
+ var valueNegative = value < 0 || 1 / value < 0;
+ value = isNaN(value) ? nan : formatType(Math.abs(value), precision2);
+ if (trim)
+ value = formatTrim_default(value);
+ if (valueNegative && +value === 0 && sign2 !== "+")
+ valueNegative = false;
+ valuePrefix = (valueNegative ? sign2 === "(" ? sign2 : minus : sign2 === "-" || sign2 === "(" ? "" : sign2) + valuePrefix;
+ valueSuffix = (type3 === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign2 === "(" ? ")" : "");
+ if (maybeSuffix) {
+ i2 = -1, n2 = value.length;
+ while (++i2 < n2) {
+ if (c = value.charCodeAt(i2), 48 > c || c > 57) {
+ valueSuffix = (c === 46 ? decimal + value.slice(i2 + 1) : value.slice(i2)) + valueSuffix;
+ value = value.slice(0, i2);
+ break;
+ }
+ }
+ }
+ }
+ if (comma && !zero3)
+ value = group(value, Infinity);
+ var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : "";
+ if (comma && zero3)
+ value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
+ switch (align) {
+ case "<":
+ value = valuePrefix + value + valueSuffix + padding;
+ break;
+ case "=":
+ value = valuePrefix + padding + value + valueSuffix;
+ break;
+ case "^":
+ value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
+ break;
+ default:
+ value = padding + valuePrefix + value + valueSuffix;
+ break;
+ }
+ return numerals(value);
+ }
+ format2.toString = function() {
+ return specifier + "";
+ };
+ return format2;
+ }
+ function formatPrefix2(specifier, value) {
+ var f2 = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];
+ return function(value2) {
+ return f2(k * value2) + prefix;
+ };
+ }
+ return {
+ format: newFormat,
+ formatPrefix: formatPrefix2
+ };
+ }
+
+ // node_modules/d3-format/src/defaultLocale.js
+ var locale;
+ var format;
+ var formatPrefix;
+ defaultLocale({
+ thousands: ",",
+ grouping: [3],
+ currency: ["$", ""]
+ });
+ function defaultLocale(definition) {
+ locale = locale_default(definition);
+ format = locale.format;
+ formatPrefix = locale.formatPrefix;
+ return locale;
+ }
+
+ // node_modules/d3-format/src/precisionFixed.js
+ function precisionFixed_default(step) {
+ return Math.max(0, -exponent_default(Math.abs(step)));
+ }
+
+ // node_modules/d3-format/src/precisionPrefix.js
+ function precisionPrefix_default(step, value) {
+ return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3 - exponent_default(Math.abs(step)));
+ }
+
+ // node_modules/d3-format/src/precisionRound.js
+ function precisionRound_default(step, max3) {
+ step = Math.abs(step), max3 = Math.abs(max3) - step;
+ return Math.max(0, exponent_default(max3) - exponent_default(step)) + 1;
+ }
+
+ // node_modules/d3-scale/src/tickFormat.js
+ function tickFormat(start2, stop, count, specifier) {
+ var step = tickStep(start2, stop, count), precision2;
+ specifier = formatSpecifier(specifier == null ? ",f" : specifier);
+ switch (specifier.type) {
+ case "s": {
+ var value = Math.max(Math.abs(start2), Math.abs(stop));
+ if (specifier.precision == null && !isNaN(precision2 = precisionPrefix_default(step, value)))
+ specifier.precision = precision2;
+ return formatPrefix(specifier, value);
+ }
+ case "":
+ case "e":
+ case "g":
+ case "p":
+ case "r": {
+ if (specifier.precision == null && !isNaN(precision2 = precisionRound_default(step, Math.max(Math.abs(start2), Math.abs(stop)))))
+ specifier.precision = precision2 - (specifier.type === "e");
+ break;
+ }
+ case "f":
+ case "%": {
+ if (specifier.precision == null && !isNaN(precision2 = precisionFixed_default(step)))
+ specifier.precision = precision2 - (specifier.type === "%") * 2;
+ break;
+ }
+ }
+ return format(specifier);
+ }
+
+ // node_modules/d3-scale/src/linear.js
+ function linearish(scale) {
+ var domain2 = scale.domain;
+ scale.ticks = function(count) {
+ var d = domain2();
+ return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
+ };
+ scale.tickFormat = function(count, specifier) {
+ var d = domain2();
+ return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
+ };
+ scale.nice = function(count) {
+ if (count == null)
+ count = 10;
+ var d = domain2();
+ var i0 = 0;
+ var i1 = d.length - 1;
+ var start2 = d[i0];
+ var stop = d[i1];
+ var prestep;
+ var step;
+ var maxIter = 10;
+ if (stop < start2) {
+ step = start2, start2 = stop, stop = step;
+ step = i0, i0 = i1, i1 = step;
+ }
+ while (maxIter-- > 0) {
+ step = tickIncrement(start2, stop, count);
+ if (step === prestep) {
+ d[i0] = start2;
+ d[i1] = stop;
+ return domain2(d);
+ } else if (step > 0) {
+ start2 = Math.floor(start2 / step) * step;
+ stop = Math.ceil(stop / step) * step;
+ } else if (step < 0) {
+ start2 = Math.ceil(start2 * step) / step;
+ stop = Math.floor(stop * step) / step;
+ } else {
+ break;
+ }
+ prestep = step;
+ }
+ return scale;
+ };
+ return scale;
+ }
+ function linear3() {
+ var scale = continuous();
+ scale.copy = function() {
+ return copy(scale, linear3());
+ };
+ initRange.apply(scale, arguments);
+ return linearish(scale);
+ }
+
+ // node_modules/d3-scale/src/quantize.js
+ function quantize() {
+ var x05 = 0, x12 = 1, n2 = 1, domain2 = [0.5], range3 = [0, 1], unknown;
+ function scale(x) {
+ return x != null && x <= x ? range3[bisect_default(domain2, x, 0, n2)] : unknown;
+ }
+ function rescale() {
+ var i2 = -1;
+ domain2 = new Array(n2);
+ while (++i2 < n2)
+ domain2[i2] = ((i2 + 1) * x12 - (i2 - n2) * x05) / (n2 + 1);
+ return scale;
+ }
+ scale.domain = function(_) {
+ return arguments.length ? ([x05, x12] = _, x05 = +x05, x12 = +x12, rescale()) : [x05, x12];
+ };
+ scale.range = function(_) {
+ return arguments.length ? (n2 = (range3 = Array.from(_)).length - 1, rescale()) : range3.slice();
+ };
+ scale.invertExtent = function(y) {
+ var i2 = range3.indexOf(y);
+ return i2 < 0 ? [NaN, NaN] : i2 < 1 ? [x05, domain2[0]] : i2 >= n2 ? [domain2[n2 - 1], x12] : [domain2[i2 - 1], domain2[i2]];
+ };
+ scale.unknown = function(_) {
+ return arguments.length ? (unknown = _, scale) : scale;
+ };
+ scale.thresholds = function() {
+ return domain2.slice();
+ };
+ scale.copy = function() {
+ return quantize().domain([x05, x12]).range(range3).unknown(unknown);
+ };
+ return initRange.apply(linearish(scale), arguments);
+ }
+
+ // modules/behavior/breathe.js
+ function behaviorBreathe() {
+ var duration = 800;
+ var steps = 4;
+ var selector = ".selected.shadow, .selected .shadow";
+ var _selected = select_default2(null);
+ var _classed = "";
+ var _params = {};
+ var _done = false;
+ var _timer;
+ function ratchetyInterpolator(a, b, steps2, units) {
+ a = parseFloat(a);
+ b = parseFloat(b);
+ var sample = quantize().domain([0, 1]).range(quantize_default(number_default(a, b), steps2));
+ return function(t) {
+ return String(sample(t)) + (units || "");
+ };
+ }
+ function reset(selection2) {
+ selection2.style("stroke-opacity", null).style("stroke-width", null).style("fill-opacity", null).style("r", null);
+ }
+ function setAnimationParams(transition2, fromTo) {
+ var toFrom = fromTo === "from" ? "to" : "from";
+ transition2.styleTween("stroke-opacity", function(d) {
+ return ratchetyInterpolator(_params[d.id][toFrom].opacity, _params[d.id][fromTo].opacity, steps);
+ }).styleTween("stroke-width", function(d) {
+ return ratchetyInterpolator(_params[d.id][toFrom].width, _params[d.id][fromTo].width, steps, "px");
+ }).styleTween("fill-opacity", function(d) {
+ return ratchetyInterpolator(_params[d.id][toFrom].opacity, _params[d.id][fromTo].opacity, steps);
+ }).styleTween("r", function(d) {
+ return ratchetyInterpolator(_params[d.id][toFrom].width, _params[d.id][fromTo].width, steps, "px");
+ });
+ }
+ function calcAnimationParams(selection2) {
+ selection2.call(reset).each(function(d) {
+ var s = select_default2(this);
+ var tag = s.node().tagName;
+ var p = { "from": {}, "to": {} };
+ var opacity;
+ var width;
+ if (tag === "circle") {
+ opacity = parseFloat(s.style("fill-opacity") || 0.5);
+ width = parseFloat(s.style("r") || 15.5);
+ } else {
+ opacity = parseFloat(s.style("stroke-opacity") || 0.7);
+ width = parseFloat(s.style("stroke-width") || 10);
+ }
+ p.tag = tag;
+ p.from.opacity = opacity * 0.6;
+ p.to.opacity = opacity * 1.25;
+ p.from.width = width * 0.7;
+ p.to.width = width * (tag === "circle" ? 1.5 : 1);
+ _params[d.id] = p;
+ });
+ }
+ function run(surface, fromTo) {
+ var toFrom = fromTo === "from" ? "to" : "from";
+ var currSelected = surface.selectAll(selector);
+ var currClassed = surface.attr("class");
+ if (_done || currSelected.empty()) {
+ _selected.call(reset);
+ _selected = select_default2(null);
+ return;
+ }
+ if (!(0, import_fast_deep_equal2.default)(currSelected.data(), _selected.data()) || currClassed !== _classed) {
+ _selected.call(reset);
+ _classed = currClassed;
+ _selected = currSelected.call(calcAnimationParams);
+ }
+ var didCallNextRun = false;
+ _selected.transition().duration(duration).call(setAnimationParams, fromTo).on("end", function() {
+ if (!didCallNextRun) {
+ surface.call(run, toFrom);
+ didCallNextRun = true;
+ }
+ if (!select_default2(this).classed("selected")) {
+ reset(select_default2(this));
+ }
+ });
+ }
+ function behavior(surface) {
+ _done = false;
+ _timer = timer(function() {
+ if (surface.selectAll(selector).empty()) {
+ return false;
+ }
+ surface.call(run, "from");
+ _timer.stop();
+ return true;
+ }, 20);
+ }
+ behavior.restartIfNeeded = function(surface) {
+ if (_selected.empty()) {
+ surface.call(run, "from");
+ if (_timer) {
+ _timer.stop();
+ }
+ }
+ };
+ behavior.off = function() {
+ _done = true;
+ if (_timer) {
+ _timer.stop();
+ }
+ _selected.interrupt().call(reset);
+ };
+ return behavior;
+ }
+
+ // modules/behavior/operation.js
+ function behaviorOperation(context) {
+ var _operation;
+ function keypress(d3_event) {
+ if (!context.map().withinEditableZoom())
+ return;
+ if (_operation.availableForKeypress && !_operation.availableForKeypress())
+ return;
+ d3_event.preventDefault();
+ var disabled = _operation.disabled();
+ if (disabled) {
+ context.ui().flash.duration(4e3).iconName("#iD-operation-" + _operation.id).iconClass("operation disabled").label(_operation.tooltip)();
+ } else {
+ context.ui().flash.duration(2e3).iconName("#iD-operation-" + _operation.id).iconClass("operation").label(_operation.annotation() || _operation.title)();
+ if (_operation.point)
+ _operation.point(null);
+ _operation();
+ }
+ }
+ function behavior() {
+ if (_operation && _operation.available()) {
+ context.keybinding().on(_operation.keys, keypress);
+ }
+ return behavior;
+ }
+ behavior.off = function() {
+ context.keybinding().off(_operation.keys);
+ };
+ behavior.which = function(_) {
+ if (!arguments.length)
+ return _operation;
+ _operation = _;
+ return behavior;
+ };
+ return behavior;
+ }
+
+ // modules/operations/circularize.js
+ function operationCircularize(context, selectedIDs) {
+ var _extent;
+ var _actions = selectedIDs.map(getAction).filter(Boolean);
+ var _amount = _actions.length === 1 ? "single" : "multiple";
+ var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function(n2) {
+ return n2.loc;
+ });
+ function getAction(entityID) {
+ var entity = context.entity(entityID);
+ if (entity.type !== "way" || new Set(entity.nodes).size <= 1)
+ return null;
+ if (!_extent) {
+ _extent = entity.extent(context.graph());
+ } else {
+ _extent = _extent.extend(entity.extent(context.graph()));
+ }
+ return actionCircularize(entityID, context.projection);
+ }
+ var operation = function() {
+ if (!_actions.length)
+ return;
+ var combinedAction = function(graph, t) {
+ _actions.forEach(function(action) {
+ if (!action.disabled(graph)) {
+ graph = action(graph, t);
+ }
+ });
+ return graph;
+ };
+ combinedAction.transitionable = true;
+ context.perform(combinedAction, operation.annotation());
+ window.setTimeout(function() {
+ context.validator().validate();
+ }, 300);
+ };
+ operation.available = function() {
+ return _actions.length && selectedIDs.length === _actions.length;
+ };
+ operation.disabled = function() {
+ if (!_actions.length)
+ return "";
+ var actionDisableds = _actions.map(function(action) {
+ return action.disabled(context.graph());
+ }).filter(Boolean);
+ if (actionDisableds.length === _actions.length) {
+ if (new Set(actionDisableds).size > 1) {
+ return "multiple_blockers";
+ }
+ return actionDisableds[0];
+ } else if (_extent.percentContainedIn(context.map().extent()) < 0.8) {
+ return "too_large";
+ } else if (someMissing()) {
+ return "not_downloaded";
+ } else if (selectedIDs.some(context.hasHiddenConnections)) {
+ return "connected_to_hidden";
+ }
+ return false;
+ function someMissing() {
+ if (context.inIntro())
+ return false;
+ var osm = context.connection();
+ if (osm) {
+ var missing = _coords.filter(function(loc) {
+ return !osm.isDataLoaded(loc);
+ });
+ if (missing.length) {
+ missing.forEach(function(loc) {
+ context.loadTileAtLoc(loc);
+ });
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+ operation.tooltip = function() {
+ var disable = operation.disabled();
+ return disable ? _t("operations.circularize." + disable + "." + _amount) : _t("operations.circularize.description." + _amount);
+ };
+ operation.annotation = function() {
+ return _t("operations.circularize.annotation.feature", { n: _actions.length });
+ };
+ operation.id = "circularize";
+ operation.keys = [_t("operations.circularize.key")];
+ operation.title = _t("operations.circularize.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/ui/cmd.js
+ var uiCmd = function(code) {
+ var detected = utilDetect();
+ if (detected.os === "mac") {
+ return code;
+ }
+ if (detected.os === "win") {
+ if (code === "\u2318\u21E7Z")
+ return "Ctrl+Y";
+ }
+ var result = "", replacements = {
+ "\u2318": "Ctrl",
+ "\u21E7": "Shift",
+ "\u2325": "Alt",
+ "\u232B": "Backspace",
+ "\u2326": "Delete"
+ };
+ for (var i2 = 0; i2 < code.length; i2++) {
+ if (code[i2] in replacements) {
+ result += replacements[code[i2]] + (i2 < code.length - 1 ? "+" : "");
+ } else {
+ result += code[i2];
+ }
+ }
+ return result;
+ };
+ uiCmd.display = function(code) {
+ if (code.length !== 1)
+ return code;
+ var detected = utilDetect();
+ var mac = detected.os === "mac";
+ var replacements = {
+ "\u2318": mac ? "\u2318 " + _t("shortcuts.key.cmd") : _t("shortcuts.key.ctrl"),
+ "\u21E7": mac ? "\u21E7 " + _t("shortcuts.key.shift") : _t("shortcuts.key.shift"),
+ "\u2325": mac ? "\u2325 " + _t("shortcuts.key.option") : _t("shortcuts.key.alt"),
+ "\u2303": mac ? "\u2303 " + _t("shortcuts.key.ctrl") : _t("shortcuts.key.ctrl"),
+ "\u232B": mac ? "\u232B " + _t("shortcuts.key.delete") : _t("shortcuts.key.backspace"),
+ "\u2326": mac ? "\u2326 " + _t("shortcuts.key.del") : _t("shortcuts.key.del"),
+ "\u2196": mac ? "\u2196 " + _t("shortcuts.key.pgup") : _t("shortcuts.key.pgup"),
+ "\u2198": mac ? "\u2198 " + _t("shortcuts.key.pgdn") : _t("shortcuts.key.pgdn"),
+ "\u21DE": mac ? "\u21DE " + _t("shortcuts.key.home") : _t("shortcuts.key.home"),
+ "\u21DF": mac ? "\u21DF " + _t("shortcuts.key.end") : _t("shortcuts.key.end"),
+ "\u21B5": mac ? "\u23CE " + _t("shortcuts.key.return") : _t("shortcuts.key.enter"),
+ "\u238B": mac ? "\u238B " + _t("shortcuts.key.esc") : _t("shortcuts.key.esc"),
+ "\u2630": mac ? "\u2630 " + _t("shortcuts.key.menu") : _t("shortcuts.key.menu")
+ };
+ return replacements[code] || code;
+ };
+
+ // modules/operations/delete.js
+ function operationDelete(context, selectedIDs) {
+ var multi = selectedIDs.length === 1 ? "single" : "multiple";
+ var action = actionDeleteMultiple(selectedIDs);
+ var nodes = utilGetAllNodes(selectedIDs, context.graph());
+ var coords = nodes.map(function(n2) {
+ return n2.loc;
+ });
+ var extent = utilTotalExtent(selectedIDs, context.graph());
+ var operation = function() {
+ var nextSelectedID;
+ var nextSelectedLoc;
+ if (selectedIDs.length === 1) {
+ var id2 = selectedIDs[0];
+ var entity = context.entity(id2);
+ var geometry = entity.geometry(context.graph());
+ var parents = context.graph().parentWays(entity);
+ var parent = parents[0];
+ if (geometry === "vertex") {
+ var nodes2 = parent.nodes;
+ var i2 = nodes2.indexOf(id2);
+ if (i2 === 0) {
+ i2++;
+ } else if (i2 === nodes2.length - 1) {
+ i2--;
+ } else {
+ var a = geoSphericalDistance(entity.loc, context.entity(nodes2[i2 - 1]).loc);
+ var b = geoSphericalDistance(entity.loc, context.entity(nodes2[i2 + 1]).loc);
+ i2 = a < b ? i2 - 1 : i2 + 1;
+ }
+ nextSelectedID = nodes2[i2];
+ nextSelectedLoc = context.entity(nextSelectedID).loc;
+ }
+ }
+ context.perform(action, operation.annotation());
+ context.validator().validate();
+ if (nextSelectedID && nextSelectedLoc) {
+ if (context.hasEntity(nextSelectedID)) {
+ context.enter(modeSelect(context, [nextSelectedID]).follow(true));
+ } else {
+ context.map().centerEase(nextSelectedLoc);
+ context.enter(modeBrowse(context));
+ }
+ } else {
+ context.enter(modeBrowse(context));
+ }
+ };
+ operation.available = function() {
+ return true;
+ };
+ operation.disabled = function() {
+ if (extent.percentContainedIn(context.map().extent()) < 0.8) {
+ return "too_large";
+ } else if (someMissing()) {
+ return "not_downloaded";
+ } else if (selectedIDs.some(context.hasHiddenConnections)) {
+ return "connected_to_hidden";
+ } else if (selectedIDs.some(protectedMember)) {
+ return "part_of_relation";
+ } else if (selectedIDs.some(incompleteRelation)) {
+ return "incomplete_relation";
+ } else if (selectedIDs.some(hasWikidataTag)) {
+ return "has_wikidata_tag";
+ }
+ return false;
+ function someMissing() {
+ if (context.inIntro())
+ return false;
+ var osm = context.connection();
+ if (osm) {
+ var missing = coords.filter(function(loc) {
+ return !osm.isDataLoaded(loc);
+ });
+ if (missing.length) {
+ missing.forEach(function(loc) {
+ context.loadTileAtLoc(loc);
+ });
+ return true;
+ }
+ }
+ return false;
+ }
+ function hasWikidataTag(id2) {
+ var entity = context.entity(id2);
+ return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
+ }
+ function incompleteRelation(id2) {
+ var entity = context.entity(id2);
+ return entity.type === "relation" && !entity.isComplete(context.graph());
+ }
+ function protectedMember(id2) {
+ var entity = context.entity(id2);
+ if (entity.type !== "way")
+ return false;
+ var parents = context.graph().parentRelations(entity);
+ for (var i2 = 0; i2 < parents.length; i2++) {
+ var parent = parents[i2];
+ var type3 = parent.tags.type;
+ var role = parent.memberById(id2).role || "outer";
+ if (type3 === "route" || type3 === "boundary" || type3 === "multipolygon" && role === "outer") {
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+ operation.tooltip = function() {
+ var disable = operation.disabled();
+ return disable ? _t("operations.delete." + disable + "." + multi) : _t("operations.delete.description." + multi);
+ };
+ operation.annotation = function() {
+ return selectedIDs.length === 1 ? _t("operations.delete.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.delete.annotation.feature", { n: selectedIDs.length });
+ };
+ operation.id = "delete";
+ operation.keys = [uiCmd("\u2318\u232B"), uiCmd("\u2318\u2326"), uiCmd("\u2326")];
+ operation.title = _t("operations.delete.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/operations/orthogonalize.js
+ function operationOrthogonalize(context, selectedIDs) {
+ var _extent;
+ var _type;
+ var _actions = selectedIDs.map(chooseAction).filter(Boolean);
+ var _amount = _actions.length === 1 ? "single" : "multiple";
+ var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function(n2) {
+ return n2.loc;
+ });
+ function chooseAction(entityID) {
+ var entity = context.entity(entityID);
+ var geometry = entity.geometry(context.graph());
+ if (!_extent) {
+ _extent = entity.extent(context.graph());
+ } else {
+ _extent = _extent.extend(entity.extent(context.graph()));
+ }
+ if (entity.type === "way" && new Set(entity.nodes).size > 2) {
+ if (_type && _type !== "feature")
+ return null;
+ _type = "feature";
+ return actionOrthogonalize(entityID, context.projection);
+ } else if (geometry === "vertex") {
+ if (_type && _type !== "corner")
+ return null;
+ _type = "corner";
+ var graph = context.graph();
+ var parents = graph.parentWays(entity);
+ if (parents.length === 1) {
+ var way = parents[0];
+ if (way.nodes.indexOf(entityID) !== -1) {
+ return actionOrthogonalize(way.id, context.projection, entityID);
+ }
+ }
+ }
+ return null;
+ }
+ var operation = function() {
+ if (!_actions.length)
+ return;
+ var combinedAction = function(graph, t) {
+ _actions.forEach(function(action) {
+ if (!action.disabled(graph)) {
+ graph = action(graph, t);
+ }
+ });
+ return graph;
+ };
+ combinedAction.transitionable = true;
+ context.perform(combinedAction, operation.annotation());
+ window.setTimeout(function() {
+ context.validator().validate();
+ }, 300);
+ };
+ operation.available = function() {
+ return _actions.length && selectedIDs.length === _actions.length;
+ };
+ operation.disabled = function() {
+ if (!_actions.length)
+ return "";
+ var actionDisableds = _actions.map(function(action) {
+ return action.disabled(context.graph());
+ }).filter(Boolean);
+ if (actionDisableds.length === _actions.length) {
+ if (new Set(actionDisableds).size > 1) {
+ return "multiple_blockers";
+ }
+ return actionDisableds[0];
+ } else if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
+ return "too_large";
+ } else if (someMissing()) {
+ return "not_downloaded";
+ } else if (selectedIDs.some(context.hasHiddenConnections)) {
+ return "connected_to_hidden";
+ }
+ return false;
+ function someMissing() {
+ if (context.inIntro())
+ return false;
+ var osm = context.connection();
+ if (osm) {
+ var missing = _coords.filter(function(loc) {
+ return !osm.isDataLoaded(loc);
+ });
+ if (missing.length) {
+ missing.forEach(function(loc) {
+ context.loadTileAtLoc(loc);
+ });
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+ operation.tooltip = function() {
+ var disable = operation.disabled();
+ return disable ? _t("operations.orthogonalize." + disable + "." + _amount) : _t("operations.orthogonalize.description." + _type + "." + _amount);
+ };
+ operation.annotation = function() {
+ return _t("operations.orthogonalize.annotation." + _type, { n: _actions.length });
+ };
+ operation.id = "orthogonalize";
+ operation.keys = [_t("operations.orthogonalize.key")];
+ operation.title = _t("operations.orthogonalize.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/operations/reflect.js
+ function operationReflectShort(context, selectedIDs) {
+ return operationReflect(context, selectedIDs, "short");
+ }
+ function operationReflectLong(context, selectedIDs) {
+ return operationReflect(context, selectedIDs, "long");
+ }
+ function operationReflect(context, selectedIDs, axis) {
+ axis = axis || "long";
+ var multi = selectedIDs.length === 1 ? "single" : "multiple";
+ var nodes = utilGetAllNodes(selectedIDs, context.graph());
+ var coords = nodes.map(function(n2) {
+ return n2.loc;
+ });
+ var extent = utilTotalExtent(selectedIDs, context.graph());
+ var operation = function() {
+ var action = actionReflect(selectedIDs, context.projection).useLongAxis(Boolean(axis === "long"));
+ context.perform(action, operation.annotation());
+ window.setTimeout(function() {
+ context.validator().validate();
+ }, 300);
+ };
+ operation.available = function() {
+ return nodes.length >= 3;
+ };
+ operation.disabled = function() {
+ if (extent.percentContainedIn(context.map().extent()) < 0.8) {
+ return "too_large";
+ } else if (someMissing()) {
+ return "not_downloaded";
+ } else if (selectedIDs.some(context.hasHiddenConnections)) {
+ return "connected_to_hidden";
+ } else if (selectedIDs.some(incompleteRelation)) {
+ return "incomplete_relation";
+ }
+ return false;
+ function someMissing() {
+ if (context.inIntro())
+ return false;
+ var osm = context.connection();
+ if (osm) {
+ var missing = coords.filter(function(loc) {
+ return !osm.isDataLoaded(loc);
+ });
+ if (missing.length) {
+ missing.forEach(function(loc) {
+ context.loadTileAtLoc(loc);
+ });
+ return true;
+ }
+ }
+ return false;
+ }
+ function incompleteRelation(id2) {
+ var entity = context.entity(id2);
+ return entity.type === "relation" && !entity.isComplete(context.graph());
+ }
+ };
+ operation.tooltip = function() {
+ var disable = operation.disabled();
+ return disable ? _t("operations.reflect." + disable + "." + multi) : _t("operations.reflect.description." + axis + "." + multi);
+ };
+ operation.annotation = function() {
+ return _t("operations.reflect.annotation." + axis + ".feature", { n: selectedIDs.length });
+ };
+ operation.id = "reflect-" + axis;
+ operation.keys = [_t("operations.reflect.key." + axis)];
+ operation.title = _t("operations.reflect.title." + axis);
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/operations/move.js
+ function operationMove(context, selectedIDs) {
+ var multi = selectedIDs.length === 1 ? "single" : "multiple";
+ var nodes = utilGetAllNodes(selectedIDs, context.graph());
+ var coords = nodes.map(function(n2) {
+ return n2.loc;
+ });
+ var extent = utilTotalExtent(selectedIDs, context.graph());
+ var operation = function() {
+ context.enter(modeMove(context, selectedIDs));
+ };
+ operation.available = function() {
+ return selectedIDs.length > 0;
+ };
+ operation.disabled = function() {
+ if (extent.percentContainedIn(context.map().extent()) < 0.8) {
+ return "too_large";
+ } else if (someMissing()) {
+ return "not_downloaded";
+ } else if (selectedIDs.some(context.hasHiddenConnections)) {
+ return "connected_to_hidden";
+ } else if (selectedIDs.some(incompleteRelation)) {
+ return "incomplete_relation";
+ }
+ return false;
+ function someMissing() {
+ if (context.inIntro())
+ return false;
+ var osm = context.connection();
+ if (osm) {
+ var missing = coords.filter(function(loc) {
+ return !osm.isDataLoaded(loc);
+ });
+ if (missing.length) {
+ missing.forEach(function(loc) {
+ context.loadTileAtLoc(loc);
+ });
+ return true;
+ }
+ }
+ return false;
+ }
+ function incompleteRelation(id2) {
+ var entity = context.entity(id2);
+ return entity.type === "relation" && !entity.isComplete(context.graph());
+ }
+ };
+ operation.tooltip = function() {
+ var disable = operation.disabled();
+ return disable ? _t("operations.move." + disable + "." + multi) : _t("operations.move.description." + multi);
+ };
+ operation.annotation = function() {
+ return selectedIDs.length === 1 ? _t("operations.move.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.move.annotation.feature", { n: selectedIDs.length });
+ };
+ operation.id = "move";
+ operation.keys = [_t("operations.move.key")];
+ operation.title = _t("operations.move.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ operation.mouseOnly = true;
+ return operation;
+ }
+
+ // modules/modes/rotate.js
+ function modeRotate(context, entityIDs) {
+ var _tolerancePx = 4;
+ var mode = {
+ id: "rotate",
+ button: "browse"
+ };
+ var keybinding = utilKeybinding("rotate");
+ var behaviors = [
+ behaviorEdit(context),
+ operationCircularize(context, entityIDs).behavior,
+ operationDelete(context, entityIDs).behavior,
+ operationMove(context, entityIDs).behavior,
+ operationOrthogonalize(context, entityIDs).behavior,
+ operationReflectLong(context, entityIDs).behavior,
+ operationReflectShort(context, entityIDs).behavior
+ ];
+ var annotation = entityIDs.length === 1 ? _t("operations.rotate.annotation." + context.graph().geometry(entityIDs[0])) : _t("operations.rotate.annotation.feature", { n: entityIDs.length });
+ var _prevGraph;
+ var _prevAngle;
+ var _prevTransform;
+ var _pivot;
+ var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ function doRotate(d3_event) {
+ var fn;
+ if (context.graph() !== _prevGraph) {
+ fn = context.perform;
+ } else {
+ fn = context.replace;
+ }
+ var projection2 = context.projection;
+ var currTransform = projection2.transform();
+ if (!_prevTransform || currTransform.k !== _prevTransform.k || currTransform.x !== _prevTransform.x || currTransform.y !== _prevTransform.y) {
+ var nodes = utilGetAllNodes(entityIDs, context.graph());
+ var points = nodes.map(function(n2) {
+ return projection2(n2.loc);
+ });
+ _pivot = getPivot(points);
+ _prevAngle = void 0;
+ }
+ var currMouse = context.map().mouse(d3_event);
+ var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
+ if (typeof _prevAngle === "undefined")
+ _prevAngle = currAngle;
+ var delta = currAngle - _prevAngle;
+ fn(actionRotate(entityIDs, _pivot, delta, projection2));
+ _prevTransform = currTransform;
+ _prevAngle = currAngle;
+ _prevGraph = context.graph();
+ }
+ function getPivot(points) {
+ var _pivot2;
+ if (points.length === 1) {
+ _pivot2 = points[0];
+ } else if (points.length === 2) {
+ _pivot2 = geoVecInterp(points[0], points[1], 0.5);
+ } else {
+ var polygonHull = hull_default(points);
+ if (polygonHull.length === 2) {
+ _pivot2 = geoVecInterp(points[0], points[1], 0.5);
+ } else {
+ _pivot2 = centroid_default2(hull_default(points));
+ }
+ }
+ return _pivot2;
+ }
+ function finish(d3_event) {
+ d3_event.stopPropagation();
+ context.replace(actionNoop(), annotation);
+ context.enter(modeSelect(context, entityIDs));
+ }
+ function cancel() {
+ if (_prevGraph)
+ context.pop();
+ context.enter(modeSelect(context, entityIDs));
+ }
+ function undone() {
+ context.enter(modeBrowse(context));
+ }
+ mode.enter = function() {
+ _prevGraph = null;
+ context.features().forceVisible(entityIDs);
+ behaviors.forEach(context.install);
+ var downEvent;
+ context.surface().on(_pointerPrefix + "down.modeRotate", function(d3_event) {
+ downEvent = d3_event;
+ });
+ select_default2(window).on(_pointerPrefix + "move.modeRotate", doRotate, true).on(_pointerPrefix + "up.modeRotate", function(d3_event) {
+ if (!downEvent)
+ return;
+ var mapNode = context.container().select(".main-map").node();
+ var pointGetter = utilFastMouse(mapNode);
+ var p1 = pointGetter(downEvent);
+ var p2 = pointGetter(d3_event);
+ var dist = geoVecLength(p1, p2);
+ if (dist <= _tolerancePx)
+ finish(d3_event);
+ downEvent = null;
+ }, true);
+ context.history().on("undone.modeRotate", undone);
+ keybinding.on("\u238B", cancel).on("\u21A9", finish);
+ select_default2(document).call(keybinding);
+ };
+ mode.exit = function() {
+ behaviors.forEach(context.uninstall);
+ context.surface().on(_pointerPrefix + "down.modeRotate", null);
+ select_default2(window).on(_pointerPrefix + "move.modeRotate", null, true).on(_pointerPrefix + "up.modeRotate", null, true);
+ context.history().on("undone.modeRotate", null);
+ select_default2(document).call(keybinding.unbind);
+ context.features().forceVisible([]);
+ };
+ mode.selectedIDs = function() {
+ if (!arguments.length)
+ return entityIDs;
+ return mode;
+ };
+ return mode;
+ }
+
+ // modules/operations/rotate.js
+ function operationRotate(context, selectedIDs) {
+ var multi = selectedIDs.length === 1 ? "single" : "multiple";
+ var nodes = utilGetAllNodes(selectedIDs, context.graph());
+ var coords = nodes.map(function(n2) {
+ return n2.loc;
+ });
+ var extent = utilTotalExtent(selectedIDs, context.graph());
+ var operation = function() {
+ context.enter(modeRotate(context, selectedIDs));
+ };
+ operation.available = function() {
+ return nodes.length >= 2;
+ };
+ operation.disabled = function() {
+ if (extent.percentContainedIn(context.map().extent()) < 0.8) {
+ return "too_large";
+ } else if (someMissing()) {
+ return "not_downloaded";
+ } else if (selectedIDs.some(context.hasHiddenConnections)) {
+ return "connected_to_hidden";
+ } else if (selectedIDs.some(incompleteRelation)) {
+ return "incomplete_relation";
+ }
+ return false;
+ function someMissing() {
+ if (context.inIntro())
+ return false;
+ var osm = context.connection();
+ if (osm) {
+ var missing = coords.filter(function(loc) {
+ return !osm.isDataLoaded(loc);
+ });
+ if (missing.length) {
+ missing.forEach(function(loc) {
+ context.loadTileAtLoc(loc);
+ });
+ return true;
+ }
+ }
+ return false;
+ }
+ function incompleteRelation(id2) {
+ var entity = context.entity(id2);
+ return entity.type === "relation" && !entity.isComplete(context.graph());
+ }
+ };
+ operation.tooltip = function() {
+ var disable = operation.disabled();
+ return disable ? _t("operations.rotate." + disable + "." + multi) : _t("operations.rotate.description." + multi);
+ };
+ operation.annotation = function() {
+ return selectedIDs.length === 1 ? _t("operations.rotate.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.rotate.annotation.feature", { n: selectedIDs.length });
+ };
+ operation.id = "rotate";
+ operation.keys = [_t("operations.rotate.key")];
+ operation.title = _t("operations.rotate.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ operation.mouseOnly = true;
+ return operation;
+ }
+
+ // modules/modes/move.js
+ function modeMove(context, entityIDs, baseGraph) {
+ var _tolerancePx = 4;
+ var mode = {
+ id: "move",
+ button: "browse"
+ };
+ var keybinding = utilKeybinding("move");
+ var behaviors = [
+ behaviorEdit(context),
+ operationCircularize(context, entityIDs).behavior,
+ operationDelete(context, entityIDs).behavior,
+ operationOrthogonalize(context, entityIDs).behavior,
+ operationReflectLong(context, entityIDs).behavior,
+ operationReflectShort(context, entityIDs).behavior,
+ operationRotate(context, entityIDs).behavior
+ ];
+ var annotation = entityIDs.length === 1 ? _t("operations.move.annotation." + context.graph().geometry(entityIDs[0])) : _t("operations.move.annotation.feature", { n: entityIDs.length });
+ var _prevGraph;
+ var _cache4;
+ var _origin;
+ var _nudgeInterval;
+ var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ function doMove(nudge) {
+ nudge = nudge || [0, 0];
+ var fn;
+ if (_prevGraph !== context.graph()) {
+ _cache4 = {};
+ _origin = context.map().mouseCoordinates();
+ fn = context.perform;
+ } else {
+ fn = context.overwrite;
+ }
+ var currMouse = context.map().mouse();
+ var origMouse = context.projection(_origin);
+ var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
+ fn(actionMove(entityIDs, delta, context.projection, _cache4));
+ _prevGraph = context.graph();
+ }
+ function startNudge(nudge) {
+ if (_nudgeInterval)
+ window.clearInterval(_nudgeInterval);
+ _nudgeInterval = window.setInterval(function() {
+ context.map().pan(nudge);
+ doMove(nudge);
+ }, 50);
+ }
+ function stopNudge() {
+ if (_nudgeInterval) {
+ window.clearInterval(_nudgeInterval);
+ _nudgeInterval = null;
+ }
+ }
+ function move() {
+ doMove();
+ var nudge = geoViewportEdge(context.map().mouse(), context.map().dimensions());
+ if (nudge) {
+ startNudge(nudge);
+ } else {
+ stopNudge();
+ }
+ }
+ function finish(d3_event) {
+ d3_event.stopPropagation();
+ context.replace(actionNoop(), annotation);
+ context.enter(modeSelect(context, entityIDs));
+ stopNudge();
+ }
+ function cancel() {
+ if (baseGraph) {
+ while (context.graph() !== baseGraph)
+ context.pop();
+ context.enter(modeBrowse(context));
+ } else {
+ if (_prevGraph)
+ context.pop();
+ context.enter(modeSelect(context, entityIDs));
+ }
+ stopNudge();
+ }
+ function undone() {
+ context.enter(modeBrowse(context));
+ }
+ mode.enter = function() {
+ _origin = context.map().mouseCoordinates();
+ _prevGraph = null;
+ _cache4 = {};
+ context.features().forceVisible(entityIDs);
+ behaviors.forEach(context.install);
+ var downEvent;
+ context.surface().on(_pointerPrefix + "down.modeMove", function(d3_event) {
+ downEvent = d3_event;
+ });
+ select_default2(window).on(_pointerPrefix + "move.modeMove", move, true).on(_pointerPrefix + "up.modeMove", function(d3_event) {
+ if (!downEvent)
+ return;
+ var mapNode = context.container().select(".main-map").node();
+ var pointGetter = utilFastMouse(mapNode);
+ var p1 = pointGetter(downEvent);
+ var p2 = pointGetter(d3_event);
+ var dist = geoVecLength(p1, p2);
+ if (dist <= _tolerancePx)
+ finish(d3_event);
+ downEvent = null;
+ }, true);
+ context.history().on("undone.modeMove", undone);
+ keybinding.on("\u238B", cancel).on("\u21A9", finish);
+ select_default2(document).call(keybinding);
+ };
+ mode.exit = function() {
+ stopNudge();
+ behaviors.forEach(function(behavior) {
+ context.uninstall(behavior);
+ });
+ context.surface().on(_pointerPrefix + "down.modeMove", null);
+ select_default2(window).on(_pointerPrefix + "move.modeMove", null, true).on(_pointerPrefix + "up.modeMove", null, true);
+ context.history().on("undone.modeMove", null);
+ select_default2(document).call(keybinding.unbind);
+ context.features().forceVisible([]);
+ };
+ mode.selectedIDs = function() {
+ if (!arguments.length)
+ return entityIDs;
+ return mode;
+ };
+ return mode;
+ }
+
+ // modules/behavior/paste.js
+ function behaviorPaste(context) {
+ function doPaste(d3_event) {
+ if (!context.map().withinEditableZoom())
+ return;
+ d3_event.preventDefault();
+ var baseGraph = context.graph();
+ var mouse = context.map().mouse();
+ var projection2 = context.projection;
+ var viewport = geoExtent(projection2.clipExtent()).polygon();
+ if (!geoPointInPolygon(mouse, viewport))
+ return;
+ var oldIDs = context.copyIDs();
+ if (!oldIDs.length)
+ return;
+ var extent = geoExtent();
+ var oldGraph = context.copyGraph();
+ var newIDs = [];
+ var action = actionCopyEntities(oldIDs, oldGraph);
+ context.perform(action);
+ var copies = action.copies();
+ var originals = /* @__PURE__ */ new Set();
+ Object.values(copies).forEach(function(entity) {
+ originals.add(entity.id);
+ });
+ for (var id2 in copies) {
+ var oldEntity = oldGraph.entity(id2);
+ var newEntity = copies[id2];
+ extent._extend(oldEntity.extent(oldGraph));
+ var parents = context.graph().parentWays(newEntity);
+ var parentCopied = parents.some(function(parent) {
+ return originals.has(parent.id);
+ });
+ if (!parentCopied) {
+ newIDs.push(newEntity.id);
+ }
+ }
+ var copyPoint = context.copyLonLat() && projection2(context.copyLonLat()) || projection2(extent.center());
+ var delta = geoVecSubtract(mouse, copyPoint);
+ context.perform(actionMove(newIDs, delta, projection2));
+ context.enter(modeMove(context, newIDs, baseGraph));
+ }
+ function behavior() {
+ context.keybinding().on(uiCmd("\u2318V"), doPaste);
+ return behavior;
+ }
+ behavior.off = function() {
+ context.keybinding().off(uiCmd("\u2318V"));
+ };
+ return behavior;
+ }
+
+ // modules/behavior/drag.js
+ function behaviorDrag() {
+ var dispatch10 = dispatch_default("start", "move", "end");
+ var _tolerancePx = 1;
+ var _penTolerancePx = 4;
+ var _origin = null;
+ var _selector = "";
+ var _targetNode;
+ var _targetEntity;
+ var _surface;
+ var _pointerId;
+ var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ var d3_event_userSelectProperty = utilPrefixCSSProperty("UserSelect");
+ var d3_event_userSelectSuppress = function() {
+ var selection2 = selection_default();
+ var select = selection2.style(d3_event_userSelectProperty);
+ selection2.style(d3_event_userSelectProperty, "none");
+ return function() {
+ selection2.style(d3_event_userSelectProperty, select);
+ };
+ };
+ function pointerdown(d3_event) {
+ if (_pointerId)
+ return;
+ _pointerId = d3_event.pointerId || "mouse";
+ _targetNode = this;
+ var pointerLocGetter = utilFastMouse(_surface || _targetNode.parentNode);
+ var offset;
+ var startOrigin = pointerLocGetter(d3_event);
+ var started = false;
+ var selectEnable = d3_event_userSelectSuppress();
+ select_default2(window).on(_pointerPrefix + "move.drag", pointermove).on(_pointerPrefix + "up.drag pointercancel.drag", pointerup, true);
+ if (_origin) {
+ offset = _origin.call(_targetNode, _targetEntity);
+ offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
+ } else {
+ offset = [0, 0];
+ }
+ d3_event.stopPropagation();
+ function pointermove(d3_event2) {
+ if (_pointerId !== (d3_event2.pointerId || "mouse"))
+ return;
+ var p = pointerLocGetter(d3_event2);
+ if (!started) {
+ var dist = geoVecLength(startOrigin, p);
+ var tolerance = d3_event2.pointerType === "pen" ? _penTolerancePx : _tolerancePx;
+ if (dist < tolerance)
+ return;
+ started = true;
+ dispatch10.call("start", this, d3_event2, _targetEntity);
+ } else {
+ startOrigin = p;
+ d3_event2.stopPropagation();
+ d3_event2.preventDefault();
+ var dx = p[0] - startOrigin[0];
+ var dy = p[1] - startOrigin[1];
+ dispatch10.call("move", this, d3_event2, _targetEntity, [p[0] + offset[0], p[1] + offset[1]], [dx, dy]);
+ }
+ }
+ function pointerup(d3_event2) {
+ if (_pointerId !== (d3_event2.pointerId || "mouse"))
+ return;
+ _pointerId = null;
+ if (started) {
+ dispatch10.call("end", this, d3_event2, _targetEntity);
+ d3_event2.preventDefault();
+ }
+ select_default2(window).on(_pointerPrefix + "move.drag", null).on(_pointerPrefix + "up.drag pointercancel.drag", null);
+ selectEnable();
+ }
+ }
+ function behavior(selection2) {
+ var matchesSelector = utilPrefixDOMProperty("matchesSelector");
+ var delegate = pointerdown;
+ if (_selector) {
+ delegate = function(d3_event) {
+ var root3 = this;
+ var target = d3_event.target;
+ for (; target && target !== root3; target = target.parentNode) {
+ var datum2 = target.__data__;
+ _targetEntity = datum2 instanceof osmNote ? datum2 : datum2 && datum2.properties && datum2.properties.entity;
+ if (_targetEntity && target[matchesSelector](_selector)) {
+ return pointerdown.call(target, d3_event);
+ }
+ }
+ };
+ }
+ selection2.on(_pointerPrefix + "down.drag" + _selector, delegate);
+ }
+ behavior.off = function(selection2) {
+ selection2.on(_pointerPrefix + "down.drag" + _selector, null);
+ };
+ behavior.selector = function(_) {
+ if (!arguments.length)
+ return _selector;
+ _selector = _;
+ return behavior;
+ };
+ behavior.origin = function(_) {
+ if (!arguments.length)
+ return _origin;
+ _origin = _;
+ return behavior;
+ };
+ behavior.cancel = function() {
+ select_default2(window).on(_pointerPrefix + "move.drag", null).on(_pointerPrefix + "up.drag pointercancel.drag", null);
+ return behavior;
+ };
+ behavior.targetNode = function(_) {
+ if (!arguments.length)
+ return _targetNode;
+ _targetNode = _;
+ return behavior;
+ };
+ behavior.targetEntity = function(_) {
+ if (!arguments.length)
+ return _targetEntity;
+ _targetEntity = _;
+ return behavior;
+ };
+ behavior.surface = function(_) {
+ if (!arguments.length)
+ return _surface;
+ _surface = _;
+ return behavior;
+ };
+ return utilRebind(behavior, dispatch10, "on");
+ }
+
+ // modules/modes/drag_node.js
+ function modeDragNode(context) {
+ var mode = {
+ id: "drag-node",
+ button: "browse"
+ };
+ var hover = behaviorHover(context).altDisables(true).on("hover", context.ui().sidebar.hover);
+ var edit2 = behaviorEdit(context);
+ var _nudgeInterval;
+ var _restoreSelectedIDs = [];
+ var _wasMidpoint = false;
+ var _isCancelled = false;
+ var _activeEntity;
+ var _startLoc;
+ var _lastLoc;
+ function startNudge(d3_event, entity, nudge) {
+ if (_nudgeInterval)
+ window.clearInterval(_nudgeInterval);
+ _nudgeInterval = window.setInterval(function() {
+ context.map().pan(nudge);
+ doMove(d3_event, entity, nudge);
+ }, 50);
+ }
+ function stopNudge() {
+ if (_nudgeInterval) {
+ window.clearInterval(_nudgeInterval);
+ _nudgeInterval = null;
+ }
+ }
+ function moveAnnotation(entity) {
+ return _t("operations.move.annotation." + entity.geometry(context.graph()));
+ }
+ function connectAnnotation(nodeEntity, targetEntity) {
+ var nodeGeometry = nodeEntity.geometry(context.graph());
+ var targetGeometry = targetEntity.geometry(context.graph());
+ if (nodeGeometry === "vertex" && targetGeometry === "vertex") {
+ var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
+ var targetParentWayIDs = context.graph().parentWays(targetEntity);
+ var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs);
+ if (sharedParentWays.length !== 0) {
+ if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
+ return _t("operations.connect.annotation.from_vertex.to_adjacent_vertex");
+ }
+ return _t("operations.connect.annotation.from_vertex.to_sibling_vertex");
+ }
+ }
+ return _t("operations.connect.annotation.from_" + nodeGeometry + ".to_" + targetGeometry);
+ }
+ function shouldSnapToNode(target) {
+ if (!_activeEntity)
+ return false;
+ return _activeEntity.geometry(context.graph()) !== "vertex" || (target.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(target, context.graph()));
+ }
+ function origin(entity) {
+ return context.projection(entity.loc);
+ }
+ function keydown(d3_event) {
+ if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
+ if (context.surface().classed("nope")) {
+ context.surface().classed("nope-suppressed", true);
+ }
+ context.surface().classed("nope", false).classed("nope-disabled", true);
+ }
+ }
+ function keyup(d3_event) {
+ if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
+ if (context.surface().classed("nope-suppressed")) {
+ context.surface().classed("nope", true);
+ }
+ context.surface().classed("nope-suppressed", false).classed("nope-disabled", false);
+ }
+ }
+ function start2(d3_event, entity) {
+ _wasMidpoint = entity.type === "midpoint";
+ var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
+ _isCancelled = !context.editable() || d3_event.shiftKey || hasHidden;
+ if (_isCancelled) {
+ if (hasHidden) {
+ context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t("modes.drag_node.connected_to_hidden"))();
+ }
+ return drag.cancel();
+ }
+ if (_wasMidpoint) {
+ var midpoint = entity;
+ entity = osmNode();
+ context.perform(actionAddMidpoint(midpoint, entity));
+ entity = context.entity(entity.id);
+ var vertex = context.surface().selectAll("." + entity.id);
+ drag.targetNode(vertex.node()).targetEntity(entity);
+ } else {
+ context.perform(actionNoop());
+ }
+ _activeEntity = entity;
+ _startLoc = entity.loc;
+ hover.ignoreVertex(entity.geometry(context.graph()) === "vertex");
+ context.surface().selectAll("." + _activeEntity.id).classed("active", true);
+ context.enter(mode);
+ }
+ function datum2(d3_event) {
+ if (!d3_event || d3_event.altKey) {
+ return {};
+ } else {
+ var d = d3_event.target.__data__;
+ return d && d.properties && d.properties.target ? d : {};
+ }
+ }
+ function doMove(d3_event, entity, nudge) {
+ nudge = nudge || [0, 0];
+ var currPoint = d3_event && d3_event.point || context.projection(_lastLoc);
+ var currMouse = geoVecSubtract(currPoint, nudge);
+ var loc = context.projection.invert(currMouse);
+ var target, edge;
+ if (!_nudgeInterval) {
+ var d = datum2(d3_event);
+ target = d && d.properties && d.properties.entity;
+ var targetLoc = target && target.loc;
+ var targetNodes = d && d.properties && d.properties.nodes;
+ if (targetLoc) {
+ if (shouldSnapToNode(target)) {
+ loc = targetLoc;
+ }
+ } else if (targetNodes) {
+ edge = geoChooseEdge(targetNodes, context.map().mouse(), context.projection, end.id);
+ if (edge) {
+ loc = edge.loc;
+ }
+ }
+ }
+ context.replace(actionMoveNode(entity.id, loc));
+ var isInvalid = false;
+ if (target) {
+ isInvalid = hasRelationConflict(entity, target, edge, context.graph());
+ }
+ if (!isInvalid) {
+ isInvalid = hasInvalidGeometry(entity, context.graph());
+ }
+ var nope = context.surface().classed("nope");
+ if (isInvalid === "relation" || isInvalid === "restriction") {
+ if (!nope) {
+ context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.html("operations.connect." + isInvalid, { relation: _mainPresetIndex.item("type/restriction").name() }))();
+ }
+ } else if (isInvalid) {
+ var errorID = isInvalid === "line" ? "lines" : "areas";
+ context.ui().flash.duration(3e3).iconName("#iD-icon-no").label(_t.html("self_intersection.error." + errorID))();
+ } else {
+ if (nope) {
+ context.ui().flash.duration(1).label("")();
+ }
+ }
+ var nopeDisabled = context.surface().classed("nope-disabled");
+ if (nopeDisabled) {
+ context.surface().classed("nope", false).classed("nope-suppressed", isInvalid);
+ } else {
+ context.surface().classed("nope", isInvalid).classed("nope-suppressed", false);
+ }
+ _lastLoc = loc;
+ }
+ function hasRelationConflict(entity, target, edge, graph) {
+ var testGraph = graph.update();
+ if (edge) {
+ var midpoint = osmNode();
+ var action = actionAddMidpoint({
+ loc: edge.loc,
+ edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
+ }, midpoint);
+ testGraph = action(testGraph);
+ target = midpoint;
+ }
+ var ids = [entity.id, target.id];
+ return actionConnect(ids).disabled(testGraph);
+ }
+ function hasInvalidGeometry(entity, graph) {
+ var parents = graph.parentWays(entity);
+ var i2, j2, k;
+ for (i2 = 0; i2 < parents.length; i2++) {
+ var parent = parents[i2];
+ var nodes = [];
+ var activeIndex = null;
+ var relations = graph.parentRelations(parent);
+ for (j2 = 0; j2 < relations.length; j2++) {
+ if (!relations[j2].isMultipolygon())
+ continue;
+ var rings = osmJoinWays(relations[j2].members, graph);
+ for (k = 0; k < rings.length; k++) {
+ nodes = rings[k].nodes;
+ if (nodes.find(function(n2) {
+ return n2.id === entity.id;
+ })) {
+ activeIndex = k;
+ if (geoHasSelfIntersections(nodes, entity.id)) {
+ return "multipolygonMember";
+ }
+ }
+ rings[k].coords = nodes.map(function(n2) {
+ return n2.loc;
+ });
+ }
+ for (k = 0; k < rings.length; k++) {
+ if (k === activeIndex)
+ continue;
+ if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
+ return "multipolygonRing";
+ }
+ }
+ }
+ if (activeIndex === null) {
+ nodes = parent.nodes.map(function(nodeID) {
+ return graph.entity(nodeID);
+ });
+ if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
+ return parent.geometry(graph);
+ }
+ }
+ }
+ return false;
+ }
+ function move(d3_event, entity, point) {
+ if (_isCancelled)
+ return;
+ d3_event.stopPropagation();
+ context.surface().classed("nope-disabled", d3_event.altKey);
+ _lastLoc = context.projection.invert(point);
+ doMove(d3_event, entity);
+ var nudge = geoViewportEdge(point, context.map().dimensions());
+ if (nudge) {
+ startNudge(d3_event, entity, nudge);
+ } else {
+ stopNudge();
+ }
+ }
+ function end(d3_event, entity) {
+ if (_isCancelled)
+ return;
+ var wasPoint = entity.geometry(context.graph()) === "point";
+ var d = datum2(d3_event);
+ var nope = d && d.properties && d.properties.nope || context.surface().classed("nope");
+ var target = d && d.properties && d.properties.entity;
+ if (nope) {
+ context.perform(_actionBounceBack(entity.id, _startLoc));
+ } else if (target && target.type === "way") {
+ var choice = geoChooseEdge(context.graph().childNodes(target), context.map().mouse(), context.projection, entity.id);
+ context.replace(actionAddMidpoint({
+ loc: choice.loc,
+ edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
+ }, entity), connectAnnotation(entity, target));
+ } else if (target && target.type === "node" && shouldSnapToNode(target)) {
+ context.replace(actionConnect([target.id, entity.id]), connectAnnotation(entity, target));
+ } else if (_wasMidpoint) {
+ context.replace(actionNoop(), _t("operations.add.annotation.vertex"));
+ } else {
+ context.replace(actionNoop(), moveAnnotation(entity));
+ }
+ if (wasPoint) {
+ context.enter(modeSelect(context, [entity.id]));
+ } else {
+ var reselection = _restoreSelectedIDs.filter(function(id2) {
+ return context.graph().hasEntity(id2);
+ });
+ if (reselection.length) {
+ context.enter(modeSelect(context, reselection));
+ } else {
+ context.enter(modeBrowse(context));
+ }
+ }
+ }
+ function _actionBounceBack(nodeID, toLoc) {
+ var moveNode = actionMoveNode(nodeID, toLoc);
+ var action = function(graph, t) {
+ if (t === 1)
+ context.pop();
+ return moveNode(graph, t);
+ };
+ action.transitionable = true;
+ return action;
+ }
+ function cancel() {
+ drag.cancel();
+ context.enter(modeBrowse(context));
+ }
+ var drag = behaviorDrag().selector(".layer-touch.points .target").surface(context.container().select(".main-map").node()).origin(origin).on("start", start2).on("move", move).on("end", end);
+ mode.enter = function() {
+ context.install(hover);
+ context.install(edit2);
+ select_default2(window).on("keydown.dragNode", keydown).on("keyup.dragNode", keyup);
+ context.history().on("undone.drag-node", cancel);
+ };
+ mode.exit = function() {
+ context.ui().sidebar.hover.cancel();
+ context.uninstall(hover);
+ context.uninstall(edit2);
+ select_default2(window).on("keydown.dragNode", null).on("keyup.dragNode", null);
+ context.history().on("undone.drag-node", null);
+ _activeEntity = null;
+ context.surface().classed("nope", false).classed("nope-suppressed", false).classed("nope-disabled", false).selectAll(".active").classed("active", false);
+ stopNudge();
+ };
+ mode.selectedIDs = function() {
+ if (!arguments.length)
+ return _activeEntity ? [_activeEntity.id] : [];
+ return mode;
+ };
+ mode.activeID = function() {
+ if (!arguments.length)
+ return _activeEntity && _activeEntity.id;
+ return mode;
+ };
+ mode.restoreSelectedIDs = function(_) {
+ if (!arguments.length)
+ return _restoreSelectedIDs;
+ _restoreSelectedIDs = _;
+ return mode;
+ };
+ mode.behavior = drag;
+ return mode;
+ }
+
+ // modules/services/keepRight.js
+ var import_rbush = __toESM(require_rbush_min());
+
+ // node_modules/d3-fetch/src/text.js
+ function responseText(response) {
+ if (!response.ok)
+ throw new Error(response.status + " " + response.statusText);
+ return response.text();
+ }
+ function text_default3(input, init2) {
+ return fetch(input, init2).then(responseText);
+ }
+
+ // node_modules/d3-fetch/src/json.js
+ function responseJson(response) {
+ if (!response.ok)
+ throw new Error(response.status + " " + response.statusText);
+ if (response.status === 204 || response.status === 205)
+ return;
+ return response.json();
+ }
+ function json_default(input, init2) {
+ return fetch(input, init2).then(responseJson);
+ }
+
+ // node_modules/d3-fetch/src/xml.js
+ function parser(type3) {
+ return (input, init2) => text_default3(input, init2).then((text2) => new DOMParser().parseFromString(text2, type3));
+ }
+ var xml_default = parser("application/xml");
+ var html = parser("text/html");
+ var svg = parser("image/svg+xml");
+
+ // modules/services/keepRight.js
+ var tiler = utilTiler();
+ var dispatch2 = dispatch_default("loaded");
+ var _tileZoom = 14;
+ var _krUrlRoot = "https://www.keepright.at";
+ var _krData = { errorTypes: {}, localizeStrings: {} };
+ var _cache;
+ var _krRuleset = [
+ 30,
+ 40,
+ 50,
+ 60,
+ 70,
+ 90,
+ 100,
+ 110,
+ 120,
+ 130,
+ 150,
+ 160,
+ 170,
+ 180,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 210,
+ 220,
+ 230,
+ 231,
+ 232,
+ 270,
+ 280,
+ 281,
+ 282,
+ 283,
+ 284,
+ 285,
+ 290,
+ 291,
+ 292,
+ 293,
+ 294,
+ 295,
+ 296,
+ 297,
+ 298,
+ 300,
+ 310,
+ 311,
+ 312,
+ 313,
+ 320,
+ 350,
+ 360,
+ 370,
+ 380,
+ 390,
+ 400,
+ 401,
+ 402,
+ 410,
+ 411,
+ 412,
+ 413
+ ];
+ function abortRequest(controller) {
+ if (controller) {
+ controller.abort();
+ }
+ }
+ function abortUnwantedRequests(cache, tiles) {
+ Object.keys(cache.inflightTile).forEach((k) => {
+ const wanted = tiles.find((tile) => k === tile.id);
+ if (!wanted) {
+ abortRequest(cache.inflightTile[k]);
+ delete cache.inflightTile[k];
+ }
+ });
+ }
+ function encodeIssueRtree(d) {
+ return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
+ }
+ function updateRtree(item, replace) {
+ _cache.rtree.remove(item, (a, b) => a.data.id === b.data.id);
+ if (replace) {
+ _cache.rtree.insert(item);
+ }
+ }
+ function tokenReplacements(d) {
+ if (!(d instanceof QAItem))
+ return;
+ const replacements = {};
+ const issueTemplate = _krData.errorTypes[d.whichType];
+ if (!issueTemplate) {
+ console.log("No Template: ", d.whichType);
+ console.log(" ", d.description);
+ return;
+ }
+ if (!issueTemplate.regex)
+ return;
+ const errorRegex = new RegExp(issueTemplate.regex, "i");
+ const errorMatch = errorRegex.exec(d.description);
+ if (!errorMatch) {
+ console.log("Unmatched: ", d.whichType);
+ console.log(" ", d.description);
+ console.log(" ", errorRegex);
+ return;
+ }
+ for (let i2 = 1; i2 < errorMatch.length; i2++) {
+ let capture = errorMatch[i2];
+ let idType;
+ idType = "IDs" in issueTemplate ? issueTemplate.IDs[i2 - 1] : "";
+ if (idType && capture) {
+ capture = parseError(capture, idType);
+ } else {
+ const compare = capture.toLowerCase();
+ if (_krData.localizeStrings[compare]) {
+ capture = _t("QA.keepRight.error_parts." + _krData.localizeStrings[compare]);
+ } else {
+ capture = unescape_default(capture);
+ }
+ }
+ replacements["var" + i2] = capture;
+ }
+ return replacements;
+ }
+ function parseError(capture, idType) {
+ const compare = capture.toLowerCase();
+ if (_krData.localizeStrings[compare]) {
+ capture = _t("QA.keepRight.error_parts." + _krData.localizeStrings[compare]);
+ }
+ switch (idType) {
+ case "this":
+ capture = linkErrorObject2(capture);
+ break;
+ case "url":
+ capture = linkURL(capture);
+ break;
+ case "n":
+ case "w":
+ case "r":
+ capture = linkEntity2(idType + capture);
+ break;
+ case "20":
+ capture = parse20(capture);
+ break;
+ case "211":
+ capture = parse211(capture);
+ break;
+ case "231":
+ capture = parse231(capture);
+ break;
+ case "294":
+ capture = parse294(capture);
+ break;
+ case "370":
+ capture = parse370(capture);
+ break;
+ }
+ return capture;
+ function linkErrorObject2(d) {
+ return { html: `<a class="error_object_link">${d}</a>` };
+ }
+ function linkEntity2(d) {
+ return { html: `<a class="error_entity_link">${d}</a>` };
+ }
+ function linkURL(d) {
+ return { html: `<a class="kr_external_link" target="_blank" href="${d}">${d}</a>` };
+ }
+ function parse211(capture2) {
+ let newList = [];
+ const items = capture2.split(", ");
+ items.forEach((item) => {
+ let id2 = linkEntity2("n" + item.slice(1));
+ newList.push(id2);
+ });
+ return newList.join(", ");
+ }
+ function parse231(capture2) {
+ let newList = [];
+ const items = capture2.split("),");
+ items.forEach((item) => {
+ const match = item.match(/\#(\d+)\((.+)\)?/);
+ if (match !== null && match.length > 2) {
+ newList.push(linkEntity2("w" + match[1]) + " " + _t("QA.keepRight.errorTypes.231.layer", { layer: match[2] }));
+ }
+ });
+ return newList.join(", ");
+ }
+ function parse294(capture2) {
+ let newList = [];
+ const items = capture2.split(",");
+ items.forEach((item) => {
+ item = item.split(" ");
+ const role = `"${item[0]}"`;
+ const idType2 = item[1].slice(0, 1);
+ let id2 = item[2].slice(1);
+ id2 = linkEntity2(idType2 + id2);
+ newList.push(`${role} ${item[1]} ${id2}`);
+ });
+ return newList.join(", ");
+ }
+ function parse370(capture2) {
+ if (!capture2)
+ return "";
+ const match = capture2.match(/\(including the name (\'.+\')\)/);
+ if (match && match.length) {
+ return _t("QA.keepRight.errorTypes.370.including_the_name", { name: match[1] });
+ }
+ return "";
+ }
+ function parse20(capture2) {
+ let newList = [];
+ const items = capture2.split(",");
+ items.forEach((item) => {
+ const id2 = linkEntity2("n" + item.slice(1));
+ newList.push(id2);
+ });
+ return newList.join(", ");
+ }
+ }
+ var keepRight_default = {
+ title: "keepRight",
+ init() {
+ _mainFileFetcher.get("keepRight").then((d) => _krData = d);
+ if (!_cache) {
+ this.reset();
+ }
+ this.event = utilRebind(this, dispatch2, "on");
+ },
+ reset() {
+ if (_cache) {
+ Object.values(_cache.inflightTile).forEach(abortRequest);
+ }
+ _cache = {
+ data: {},
+ loadedTile: {},
+ inflightTile: {},
+ inflightPost: {},
+ closed: {},
+ rtree: new import_rbush.default()
+ };
+ },
+ loadIssues(projection2) {
+ const options2 = {
+ format: "geojson",
+ ch: _krRuleset
+ };
+ const tiles = tiler.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection2);
+ abortUnwantedRequests(_cache, tiles);
+ tiles.forEach((tile) => {
+ if (_cache.loadedTile[tile.id] || _cache.inflightTile[tile.id])
+ return;
+ const [left, top, right, bottom] = tile.extent.rectangle();
+ const params = Object.assign({}, options2, { left, bottom, right, top });
+ const url = `${_krUrlRoot}/export.php?` + utilQsString(params);
+ const controller = new AbortController();
+ _cache.inflightTile[tile.id] = controller;
+ json_default(url, { signal: controller.signal }).then((data) => {
+ delete _cache.inflightTile[tile.id];
+ _cache.loadedTile[tile.id] = true;
+ if (!data || !data.features || !data.features.length) {
+ throw new Error("No Data");
+ }
+ data.features.forEach((feature3) => {
+ const {
+ properties: {
+ error_type: itemType,
+ error_id: id2,
+ comment = null,
+ object_id: objectId,
+ object_type: objectType,
+ schema,
+ title
+ }
+ } = feature3;
+ let {
+ geometry: { coordinates: loc },
+ properties: { description: description2 = "" }
+ } = feature3;
+ const issueTemplate = _krData.errorTypes[itemType];
+ const parentIssueType = (Math.floor(itemType / 10) * 10).toString();
+ const whichType = issueTemplate ? itemType : parentIssueType;
+ const whichTemplate = _krData.errorTypes[whichType];
+ switch (whichType) {
+ case "170":
+ description2 = `This feature has a FIXME tag: ${description2}`;
+ break;
+ case "292":
+ case "293":
+ description2 = description2.replace("A turn-", "This turn-");
+ break;
+ case "294":
+ case "295":
+ case "296":
+ case "297":
+ case "298":
+ description2 = `This turn-restriction~${description2}`;
+ break;
+ case "300":
+ description2 = "This highway is missing a maxspeed tag";
+ break;
+ case "411":
+ case "412":
+ case "413":
+ description2 = `This feature~${description2}`;
+ break;
+ }
+ let coincident = false;
+ do {
+ let delta = coincident ? [1e-5, 0] : [0, 1e-5];
+ loc = geoVecAdd(loc, delta);
+ let bbox = geoExtent(loc).bbox();
+ coincident = _cache.rtree.search(bbox).length;
+ } while (coincident);
+ let d = new QAItem(loc, this, itemType, id2, {
+ comment,
+ description: description2,
+ whichType,
+ parentIssueType,
+ severity: whichTemplate.severity || "error",
+ objectId,
+ objectType,
+ schema,
+ title
+ });
+ d.replacements = tokenReplacements(d);
+ _cache.data[id2] = d;
+ _cache.rtree.insert(encodeIssueRtree(d));
+ });
+ dispatch2.call("loaded");
+ }).catch(() => {
+ delete _cache.inflightTile[tile.id];
+ _cache.loadedTile[tile.id] = true;
+ });
+ });
+ },
+ postUpdate(d, callback) {
+ if (_cache.inflightPost[d.id]) {
+ return callback({ message: "Error update already inflight", status: -2 }, d);
+ }
+ const params = { schema: d.schema, id: d.id };
+ if (d.newStatus) {
+ params.st = d.newStatus;
+ }
+ if (d.newComment !== void 0) {
+ params.co = d.newComment;
+ }
+ const url = `${_krUrlRoot}/comment.php?` + utilQsString(params);
+ const controller = new AbortController();
+ _cache.inflightPost[d.id] = controller;
+ json_default(url, { signal: controller.signal }).finally(() => {
+ delete _cache.inflightPost[d.id];
+ if (d.newStatus === "ignore") {
+ this.removeItem(d);
+ } else if (d.newStatus === "ignore_t") {
+ this.removeItem(d);
+ _cache.closed[`${d.schema}:${d.id}`] = true;
+ } else {
+ d = this.replaceItem(d.update({
+ comment: d.newComment,
+ newComment: void 0,
+ newState: void 0
+ }));
+ }
+ if (callback)
+ callback(null, d);
+ });
+ },
+ getItems(projection2) {
+ const viewport = projection2.clipExtent();
+ const min3 = [viewport[0][0], viewport[1][1]];
+ const max3 = [viewport[1][0], viewport[0][1]];
+ const bbox = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
+ return _cache.rtree.search(bbox).map((d) => d.data);
+ },
+ getError(id2) {
+ return _cache.data[id2];
+ },
+ replaceItem(item) {
+ if (!(item instanceof QAItem) || !item.id)
+ return;
+ _cache.data[item.id] = item;
+ updateRtree(encodeIssueRtree(item), true);
+ return item;
+ },
+ removeItem(item) {
+ if (!(item instanceof QAItem) || !item.id)
+ return;
+ delete _cache.data[item.id];
+ updateRtree(encodeIssueRtree(item), false);
+ },
+ issueURL(item) {
+ return `${_krUrlRoot}/report_map.php?schema=${item.schema}&error=${item.id}`;
+ },
+ getClosedIDs() {
+ return Object.keys(_cache.closed).sort();
+ }
+ };
+
+ // modules/services/improveOSM.js
+ var import_rbush2 = __toESM(require_rbush_min());
+ var tiler2 = utilTiler();
+ var dispatch3 = dispatch_default("loaded");
+ var _tileZoom2 = 14;
+ var _impOsmUrls = {
+ ow: "https://grab.community.improve-osm.org/directionOfFlowService",
+ mr: "https://grab.community.improve-osm.org/missingGeoService",
+ tr: "https://grab.community.improve-osm.org/turnRestrictionService"
+ };
+ var _impOsmData = { icons: {} };
+ var _cache2;
+ function abortRequest2(i2) {
+ Object.values(i2).forEach((controller) => {
+ if (controller) {
+ controller.abort();
+ }
+ });
+ }
+ function abortUnwantedRequests2(cache, tiles) {
+ Object.keys(cache.inflightTile).forEach((k) => {
+ const wanted = tiles.find((tile) => k === tile.id);
+ if (!wanted) {
+ abortRequest2(cache.inflightTile[k]);
+ delete cache.inflightTile[k];
+ }
+ });
+ }
+ function encodeIssueRtree2(d) {
+ return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
+ }
+ function updateRtree2(item, replace) {
+ _cache2.rtree.remove(item, (a, b) => a.data.id === b.data.id);
+ if (replace) {
+ _cache2.rtree.insert(item);
+ }
+ }
+ function linkErrorObject(d) {
+ return { html: `<a class="error_object_link">${d}</a>` };
+ }
+ function linkEntity(d) {
+ return { html: `<a class="error_entity_link">${d}</a>` };
+ }
+ function pointAverage(points) {
+ if (points.length) {
+ const sum = points.reduce((acc, point) => geoVecAdd(acc, [point.lon, point.lat]), [0, 0]);
+ return geoVecScale(sum, 1 / points.length);
+ } else {
+ return [0, 0];
+ }
+ }
+ function relativeBearing(p1, p2) {
+ let angle2 = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
+ if (angle2 < 0) {
+ angle2 += 2 * Math.PI;
+ }
+ return angle2 * 180 / Math.PI;
+ }
+ function cardinalDirection(bearing) {
+ const dir = 45 * Math.round(bearing / 45);
+ const compass = {
+ 0: "north",
+ 45: "northeast",
+ 90: "east",
+ 135: "southeast",
+ 180: "south",
+ 225: "southwest",
+ 270: "west",
+ 315: "northwest",
+ 360: "north"
+ };
+ return _t(`QA.improveOSM.directions.${compass[dir]}`);
+ }
+ function preventCoincident(loc, bumpUp) {
+ let coincident = false;
+ do {
+ let delta = coincident ? [1e-5, 0] : bumpUp ? [0, 1e-5] : [0, 0];
+ loc = geoVecAdd(loc, delta);
+ let bbox = geoExtent(loc).bbox();
+ coincident = _cache2.rtree.search(bbox).length;
+ } while (coincident);
+ return loc;
+ }
+ var improveOSM_default = {
+ title: "improveOSM",
+ init() {
+ _mainFileFetcher.get("qa_data").then((d) => _impOsmData = d.improveOSM);
+ if (!_cache2) {
+ this.reset();
+ }
+ this.event = utilRebind(this, dispatch3, "on");
+ },
+ reset() {
+ if (_cache2) {
+ Object.values(_cache2.inflightTile).forEach(abortRequest2);
+ }
+ _cache2 = {
+ data: {},
+ loadedTile: {},
+ inflightTile: {},
+ inflightPost: {},
+ closed: {},
+ rtree: new import_rbush2.default()
+ };
+ },
+ loadIssues(projection2) {
+ const options2 = {
+ client: "iD",
+ status: "OPEN",
+ zoom: "19"
+ };
+ const tiles = tiler2.zoomExtent([_tileZoom2, _tileZoom2]).getTiles(projection2);
+ abortUnwantedRequests2(_cache2, tiles);
+ tiles.forEach((tile) => {
+ if (_cache2.loadedTile[tile.id] || _cache2.inflightTile[tile.id])
+ return;
+ const [east, north, west, south] = tile.extent.rectangle();
+ const params = Object.assign({}, options2, { east, south, west, north });
+ const requests = {};
+ Object.keys(_impOsmUrls).forEach((k) => {
+ const kParams = Object.assign({}, params, k === "mr" ? { type: "PARKING,ROAD,BOTH,PATH" } : { confidenceLevel: "C1" });
+ const url = `${_impOsmUrls[k]}/search?` + utilQsString(kParams);
+ const controller = new AbortController();
+ requests[k] = controller;
+ json_default(url, { signal: controller.signal }).then((data) => {
+ delete _cache2.inflightTile[tile.id][k];
+ if (!Object.keys(_cache2.inflightTile[tile.id]).length) {
+ delete _cache2.inflightTile[tile.id];
+ _cache2.loadedTile[tile.id] = true;
+ }
+ if (data.roadSegments) {
+ data.roadSegments.forEach((feature3) => {
+ const { points, wayId, fromNodeId, toNodeId } = feature3;
+ const itemId = `${wayId}${fromNodeId}${toNodeId}`;
+ let mid = points.length / 2;
+ let loc;
+ if (mid % 1 === 0) {
+ loc = pointAverage([points[mid - 1], points[mid]]);
+ } else {
+ mid = points[Math.floor(mid)];
+ loc = [mid.lon, mid.lat];
+ }
+ loc = preventCoincident(loc, false);
+ let d = new QAItem(loc, this, k, itemId, {
+ issueKey: k,
+ identifier: {
+ wayId,
+ fromNodeId,
+ toNodeId
+ },
+ objectId: wayId,
+ objectType: "way"
+ });
+ d.replacements = {
+ percentage: feature3.percentOfTrips,
+ num_trips: feature3.numberOfTrips,
+ highway: linkErrorObject(_t("QA.keepRight.error_parts.highway")),
+ from_node: linkEntity("n" + feature3.fromNodeId),
+ to_node: linkEntity("n" + feature3.toNodeId)
+ };
+ _cache2.data[d.id] = d;
+ _cache2.rtree.insert(encodeIssueRtree2(d));
+ });
+ }
+ if (data.tiles) {
+ data.tiles.forEach((feature3) => {
+ const { type: type3, x, y, numberOfTrips } = feature3;
+ const geoType = type3.toLowerCase();
+ const itemId = `${geoType}${x}${y}${numberOfTrips}`;
+ let loc = pointAverage(feature3.points);
+ loc = preventCoincident(loc, false);
+ let d = new QAItem(loc, this, `${k}-${geoType}`, itemId, {
+ issueKey: k,
+ identifier: { x, y }
+ });
+ d.replacements = {
+ num_trips: numberOfTrips,
+ geometry_type: _t(`QA.improveOSM.geometry_types.${geoType}`)
+ };
+ if (numberOfTrips === -1) {
+ d.desc = _t("QA.improveOSM.error_types.mr.description_alt", d.replacements);
+ }
+ _cache2.data[d.id] = d;
+ _cache2.rtree.insert(encodeIssueRtree2(d));
+ });
+ }
+ if (data.entities) {
+ data.entities.forEach((feature3) => {
+ const { point, id: id2, segments, numberOfPasses, turnType } = feature3;
+ const itemId = `${id2.replace(/[,:+#]/g, "_")}`;
+ const loc = preventCoincident([point.lon, point.lat], true);
+ const ids = id2.split(",");
+ const from_way = ids[0];
+ const via_node = ids[3];
+ const to_way = ids[2].split(":")[1];
+ let d = new QAItem(loc, this, k, itemId, {
+ issueKey: k,
+ identifier: id2,
+ objectId: via_node,
+ objectType: "node"
+ });
+ const [p1, p2] = segments[0].points;
+ const dir_of_travel = cardinalDirection(relativeBearing(p1, p2));
+ d.replacements = {
+ num_passed: numberOfPasses,
+ num_trips: segments[0].numberOfTrips,
+ turn_restriction: turnType.toLowerCase(),
+ from_way: linkEntity("w" + from_way),
+ to_way: linkEntity("w" + to_way),
+ travel_direction: dir_of_travel,
+ junction: linkErrorObject(_t("QA.keepRight.error_parts.this_node"))
+ };
+ _cache2.data[d.id] = d;
+ _cache2.rtree.insert(encodeIssueRtree2(d));
+ dispatch3.call("loaded");
+ });
+ }
+ }).catch(() => {
+ delete _cache2.inflightTile[tile.id][k];
+ if (!Object.keys(_cache2.inflightTile[tile.id]).length) {
+ delete _cache2.inflightTile[tile.id];
+ _cache2.loadedTile[tile.id] = true;
+ }
+ });
+ });
+ _cache2.inflightTile[tile.id] = requests;
+ });
+ },
+ getComments(item) {
+ if (item.comments) {
+ return Promise.resolve(item);
+ }
+ const key = item.issueKey;
+ let qParams = {};
+ if (key === "ow") {
+ qParams = item.identifier;
+ } else if (key === "mr") {
+ qParams.tileX = item.identifier.x;
+ qParams.tileY = item.identifier.y;
+ } else if (key === "tr") {
+ qParams.targetId = item.identifier;
+ }
+ const url = `${_impOsmUrls[key]}/retrieveComments?` + utilQsString(qParams);
+ const cacheComments = (data) => {
+ item.comments = data.comments ? data.comments.reverse() : [];
+ this.replaceItem(item);
+ };
+ return json_default(url).then(cacheComments).then(() => item);
+ },
+ postUpdate(d, callback) {
+ if (!osm_default.authenticated()) {
+ return callback({ message: "Not Authenticated", status: -3 }, d);
+ }
+ if (_cache2.inflightPost[d.id]) {
+ return callback({ message: "Error update already inflight", status: -2 }, d);
+ }
+ osm_default.userDetails(sendPayload.bind(this));
+ function sendPayload(err, user) {
+ if (err) {
+ return callback(err, d);
+ }
+ const key = d.issueKey;
+ const url = `${_impOsmUrls[key]}/comment`;
+ const payload = {
+ username: user.display_name,
+ targetIds: [d.identifier]
+ };
+ if (d.newStatus) {
+ payload.status = d.newStatus;
+ payload.text = "status changed";
+ }
+ if (d.newComment) {
+ payload.text = d.newComment;
+ }
+ const controller = new AbortController();
+ _cache2.inflightPost[d.id] = controller;
+ const options2 = {
+ method: "POST",
+ signal: controller.signal,
+ body: JSON.stringify(payload)
+ };
+ json_default(url, options2).then(() => {
+ delete _cache2.inflightPost[d.id];
+ if (!d.newStatus) {
+ const now3 = new Date();
+ let comments = d.comments ? d.comments : [];
+ comments.push({
+ username: payload.username,
+ text: payload.text,
+ timestamp: now3.getTime() / 1e3
+ });
+ this.replaceItem(d.update({
+ comments,
+ newComment: void 0
+ }));
+ } else {
+ this.removeItem(d);
+ if (d.newStatus === "SOLVED") {
+ if (!(d.issueKey in _cache2.closed)) {
+ _cache2.closed[d.issueKey] = 0;
+ }
+ _cache2.closed[d.issueKey] += 1;
+ }
+ }
+ if (callback)
+ callback(null, d);
+ }).catch((err2) => {
+ delete _cache2.inflightPost[d.id];
+ if (callback)
+ callback(err2.message);
+ });
+ }
+ },
+ getItems(projection2) {
+ const viewport = projection2.clipExtent();
+ const min3 = [viewport[0][0], viewport[1][1]];
+ const max3 = [viewport[1][0], viewport[0][1]];
+ const bbox = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
+ return _cache2.rtree.search(bbox).map((d) => d.data);
+ },
+ getError(id2) {
+ return _cache2.data[id2];
+ },
+ getIcon(itemType) {
+ return _impOsmData.icons[itemType];
+ },
+ replaceItem(issue) {
+ if (!(issue instanceof QAItem) || !issue.id)
+ return;
+ _cache2.data[issue.id] = issue;
+ updateRtree2(encodeIssueRtree2(issue), true);
+ return issue;
+ },
+ removeItem(issue) {
+ if (!(issue instanceof QAItem) || !issue.id)
+ return;
+ delete _cache2.data[issue.id];
+ updateRtree2(encodeIssueRtree2(issue), false);
+ },
+ getClosedCounts() {
+ return _cache2.closed;
+ }
+ };
+
+ // modules/services/osmose.js
+ var import_rbush3 = __toESM(require_rbush_min());
+
+ // node_modules/marked/lib/marked.esm.js
+ function getDefaults() {
+ return {
+ baseUrl: null,
+ breaks: false,
+ extensions: null,
+ gfm: true,
+ headerIds: true,
+ headerPrefix: "",
+ highlight: null,
+ langPrefix: "language-",
+ mangle: true,
+ pedantic: false,
+ renderer: null,
+ sanitize: false,
+ sanitizer: null,
+ silent: false,
+ smartLists: false,
+ smartypants: false,
+ tokenizer: null,
+ walkTokens: null,
+ xhtml: false
+ };
+ }
+ var defaults = getDefaults();
+ function changeDefaults(newDefaults) {
+ defaults = newDefaults;
+ }
+ var escapeTest = /[&<>"']/;
+ var escapeReplace = /[&<>"']/g;
+ var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
+ var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
+ var escapeReplacements = {
+ "&": "&",
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'"
+ };
+ var getEscapeReplacement = (ch) => escapeReplacements[ch];
+ function escape4(html2, encode) {
+ if (encode) {
+ if (escapeTest.test(html2)) {
+ return html2.replace(escapeReplace, getEscapeReplacement);
+ }
+ } else {
+ if (escapeTestNoEncode.test(html2)) {
+ return html2.replace(escapeReplaceNoEncode, getEscapeReplacement);
+ }
+ }
+ return html2;
+ }
+ var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
+ function unescape3(html2) {
+ return html2.replace(unescapeTest, (_, n2) => {
+ n2 = n2.toLowerCase();
+ if (n2 === "colon")
+ return ":";
+ if (n2.charAt(0) === "#") {
+ return n2.charAt(1) === "x" ? String.fromCharCode(parseInt(n2.substring(2), 16)) : String.fromCharCode(+n2.substring(1));
+ }
+ return "";
+ });
+ }
+ var caret = /(^|[^\[])\^/g;
+ function edit(regex, opt) {
+ regex = typeof regex === "string" ? regex : regex.source;
+ opt = opt || "";
+ const obj = {
+ replace: (name2, val) => {
+ val = val.source || val;
+ val = val.replace(caret, "$1");
+ regex = regex.replace(name2, val);
+ return obj;
+ },
+ getRegex: () => {
+ return new RegExp(regex, opt);
+ }
+ };
+ return obj;
+ }
+ var nonWordAndColonTest = /[^\w:]/g;
+ var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+ function cleanUrl(sanitize, base, href) {
+ if (sanitize) {
+ let prot;
+ try {
+ prot = decodeURIComponent(unescape3(href)).replace(nonWordAndColonTest, "").toLowerCase();
+ } catch (e) {
+ return null;
+ }
+ if (prot.indexOf("javascript:") === 0 || prot.indexOf("vbscript:") === 0 || prot.indexOf("data:") === 0) {
+ return null;
+ }
+ }
+ if (base && !originIndependentUrl.test(href)) {
+ href = resolveUrl(base, href);
+ }
+ try {
+ href = encodeURI(href).replace(/%25/g, "%");
+ } catch (e) {
+ return null;
+ }
+ return href;
+ }
+ var baseUrls = {};
+ var justDomain = /^[^:]+:\/*[^/]*$/;
+ var protocol = /^([^:]+:)[\s\S]*$/;
+ var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
+ function resolveUrl(base, href) {
+ if (!baseUrls[" " + base]) {
+ if (justDomain.test(base)) {
+ baseUrls[" " + base] = base + "/";
+ } else {
+ baseUrls[" " + base] = rtrim(base, "/", true);
+ }
+ }
+ base = baseUrls[" " + base];
+ const relativeBase = base.indexOf(":") === -1;
+ if (href.substring(0, 2) === "//") {
+ if (relativeBase) {
+ return href;
+ }
+ return base.replace(protocol, "$1") + href;
+ } else if (href.charAt(0) === "/") {
+ if (relativeBase) {
+ return href;
+ }
+ return base.replace(domain, "$1") + href;
+ } else {
+ return base + href;
+ }
+ }
+ var noopTest = { exec: function noopTest2() {
+ } };
+ function merge2(obj) {
+ let i2 = 1, target, key;
+ for (; i2 < arguments.length; i2++) {
+ target = arguments[i2];
+ for (key in target) {
+ if (Object.prototype.hasOwnProperty.call(target, key)) {
+ obj[key] = target[key];
+ }
+ }
+ }
+ return obj;
+ }
+ function splitCells(tableRow, count) {
+ const row = tableRow.replace(/\|/g, (match, offset, str2) => {
+ let escaped = false, curr = offset;
+ while (--curr >= 0 && str2[curr] === "\\")
+ escaped = !escaped;
+ if (escaped) {
+ return "|";
+ } else {
+ return " |";
+ }
+ }), cells = row.split(/ \|/);
+ let i2 = 0;
+ if (!cells[0].trim()) {
+ cells.shift();
+ }
+ if (cells.length > 0 && !cells[cells.length - 1].trim()) {
+ cells.pop();
+ }
+ if (cells.length > count) {
+ cells.splice(count);
+ } else {
+ while (cells.length < count)
+ cells.push("");
+ }
+ for (; i2 < cells.length; i2++) {
+ cells[i2] = cells[i2].trim().replace(/\\\|/g, "|");
+ }
+ return cells;
+ }
+ function rtrim(str2, c, invert) {
+ const l = str2.length;
+ if (l === 0) {
+ return "";
+ }
+ let suffLen = 0;
+ while (suffLen < l) {
+ const currChar = str2.charAt(l - suffLen - 1);
+ if (currChar === c && !invert) {
+ suffLen++;
+ } else if (currChar !== c && invert) {
+ suffLen++;
+ } else {
+ break;
+ }
+ }
+ return str2.slice(0, l - suffLen);
+ }
+ function findClosingBracket(str2, b) {
+ if (str2.indexOf(b[1]) === -1) {
+ return -1;
+ }
+ const l = str2.length;
+ let level = 0, i2 = 0;
+ for (; i2 < l; i2++) {
+ if (str2[i2] === "\\") {
+ i2++;
+ } else if (str2[i2] === b[0]) {
+ level++;
+ } else if (str2[i2] === b[1]) {
+ level--;
+ if (level < 0) {
+ return i2;
+ }
+ }
+ }
+ return -1;
+ }
+ function checkSanitizeDeprecation(opt) {
+ if (opt && opt.sanitize && !opt.silent) {
+ console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options");
+ }
+ }
+ function repeatString(pattern, count) {
+ if (count < 1) {
+ return "";
+ }
+ let result = "";
+ while (count > 1) {
+ if (count & 1) {
+ result += pattern;
+ }
+ count >>= 1;
+ pattern += pattern;
+ }
+ return result + pattern;
+ }
+ function outputLink(cap, link2, raw, lexer2) {
+ const href = link2.href;
+ const title = link2.title ? escape4(link2.title) : null;
+ const text2 = cap[1].replace(/\\([\[\]])/g, "$1");
+ if (cap[0].charAt(0) !== "!") {
+ lexer2.state.inLink = true;
+ const token = {
+ type: "link",
+ raw,
+ href,
+ title,
+ text: text2,
+ tokens: lexer2.inlineTokens(text2, [])
+ };
+ lexer2.state.inLink = false;
+ return token;
+ }
+ return {
+ type: "image",
+ raw,
+ href,
+ title,
+ text: escape4(text2)
+ };
+ }
+ function indentCodeCompensation(raw, text2) {
+ const matchIndentToCode = raw.match(/^(\s+)(?:```)/);
+ if (matchIndentToCode === null) {
+ return text2;
+ }
+ const indentToCode = matchIndentToCode[1];
+ return text2.split("\n").map((node) => {
+ const matchIndentInNode = node.match(/^\s+/);
+ if (matchIndentInNode === null) {
+ return node;
+ }
+ const [indentInNode] = matchIndentInNode;
+ if (indentInNode.length >= indentToCode.length) {
+ return node.slice(indentToCode.length);
+ }
+ return node;
+ }).join("\n");
+ }
+ var Tokenizer = class {
+ constructor(options2) {
+ this.options = options2 || defaults;
+ }
+ space(src) {
+ const cap = this.rules.block.newline.exec(src);
+ if (cap && cap[0].length > 0) {
+ return {
+ type: "space",
+ raw: cap[0]
+ };
+ }
+ }
+ code(src) {
+ const cap = this.rules.block.code.exec(src);
+ if (cap) {
+ const text2 = cap[0].replace(/^ {1,4}/gm, "");
+ return {
+ type: "code",
+ raw: cap[0],
+ codeBlockStyle: "indented",
+ text: !this.options.pedantic ? rtrim(text2, "\n") : text2
+ };
+ }
+ }
+ fences(src) {
+ const cap = this.rules.block.fences.exec(src);
+ if (cap) {
+ const raw = cap[0];
+ const text2 = indentCodeCompensation(raw, cap[3] || "");
+ return {
+ type: "code",
+ raw,
+ lang: cap[2] ? cap[2].trim() : cap[2],
+ text: text2
+ };
+ }
+ }
+ heading(src) {
+ const cap = this.rules.block.heading.exec(src);
+ if (cap) {
+ let text2 = cap[2].trim();
+ if (/#$/.test(text2)) {
+ const trimmed = rtrim(text2, "#");
+ if (this.options.pedantic) {
+ text2 = trimmed.trim();
+ } else if (!trimmed || / $/.test(trimmed)) {
+ text2 = trimmed.trim();
+ }
+ }
+ const token = {
+ type: "heading",
+ raw: cap[0],
+ depth: cap[1].length,
+ text: text2,
+ tokens: []
+ };
+ this.lexer.inline(token.text, token.tokens);
+ return token;
+ }
+ }
+ hr(src) {
+ const cap = this.rules.block.hr.exec(src);
+ if (cap) {
+ return {
+ type: "hr",
+ raw: cap[0]
+ };
+ }
+ }
+ blockquote(src) {
+ const cap = this.rules.block.blockquote.exec(src);
+ if (cap) {
+ const text2 = cap[0].replace(/^ *>[ \t]?/gm, "");
+ return {
+ type: "blockquote",
+ raw: cap[0],
+ tokens: this.lexer.blockTokens(text2, []),
+ text: text2
+ };
+ }
+ }
+ list(src) {
+ let cap = this.rules.block.list.exec(src);
+ if (cap) {
+ let raw, istask, ischecked, indent2, i2, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly;
+ let bull = cap[1].trim();
+ const isordered = bull.length > 1;
+ const list = {
+ type: "list",
+ raw: "",
+ ordered: isordered,
+ start: isordered ? +bull.slice(0, -1) : "",
+ loose: false,
+ items: []
+ };
+ bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
+ if (this.options.pedantic) {
+ bull = isordered ? bull : "[*+-]";
+ }
+ const itemRegex = new RegExp(`^( {0,3}${bull})((?:[ ][^\\n]*)?(?:\\n|$))`);
+ while (src) {
+ endEarly = false;
+ if (!(cap = itemRegex.exec(src))) {
+ break;
+ }
+ if (this.rules.block.hr.test(src)) {
+ break;
+ }
+ raw = cap[0];
+ src = src.substring(raw.length);
+ line = cap[2].split("\n", 1)[0];
+ nextLine = src.split("\n", 1)[0];
+ if (this.options.pedantic) {
+ indent2 = 2;
+ itemContents = line.trimLeft();
+ } else {
+ indent2 = cap[2].search(/[^ ]/);
+ indent2 = indent2 > 4 ? 1 : indent2;
+ itemContents = line.slice(indent2);
+ indent2 += cap[1].length;
+ }
+ blankLine = false;
+ if (!line && /^ *$/.test(nextLine)) {
+ raw += nextLine + "\n";
+ src = src.substring(nextLine.length + 1);
+ endEarly = true;
+ }
+ if (!endEarly) {
+ const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?: [^\\n]*)?(?:\\n|$))`);
+ const hrRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`);
+ const fencesBeginRegex = new RegExp(`^( {0,${Math.min(3, indent2 - 1)}})(\`\`\`|~~~)`);
+ while (src) {
+ rawLine = src.split("\n", 1)[0];
+ line = rawLine;
+ if (this.options.pedantic) {
+ line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, " ");
+ }
+ if (fencesBeginRegex.test(line)) {
+ break;
+ }
+ if (this.rules.block.heading.test(line)) {
+ break;
+ }
+ if (nextBulletRegex.test(line)) {
+ break;
+ }
+ if (hrRegex.test(src)) {
+ break;
+ }
+ if (line.search(/[^ ]/) >= indent2 || !line.trim()) {
+ itemContents += "\n" + line.slice(indent2);
+ } else if (!blankLine) {
+ itemContents += "\n" + line;
+ } else {
+ break;
+ }
+ if (!blankLine && !line.trim()) {
+ blankLine = true;
+ }
+ raw += rawLine + "\n";
+ src = src.substring(rawLine.length + 1);
+ }
+ }
+ if (!list.loose) {
+ if (endsWithBlankLine) {
+ list.loose = true;
+ } else if (/\n *\n *$/.test(raw)) {
+ endsWithBlankLine = true;
+ }
+ }
+ if (this.options.gfm) {
+ istask = /^\[[ xX]\] /.exec(itemContents);
+ if (istask) {
+ ischecked = istask[0] !== "[ ] ";
+ itemContents = itemContents.replace(/^\[[ xX]\] +/, "");
+ }
+ }
+ list.items.push({
+ type: "list_item",
+ raw,
+ task: !!istask,
+ checked: ischecked,
+ loose: false,
+ text: itemContents
+ });
+ list.raw += raw;
+ }
+ list.items[list.items.length - 1].raw = raw.trimRight();
+ list.items[list.items.length - 1].text = itemContents.trimRight();
+ list.raw = list.raw.trimRight();
+ const l = list.items.length;
+ for (i2 = 0; i2 < l; i2++) {
+ this.lexer.state.top = false;
+ list.items[i2].tokens = this.lexer.blockTokens(list.items[i2].text, []);
+ const spacers = list.items[i2].tokens.filter((t) => t.type === "space");
+ const hasMultipleLineBreaks = spacers.every((t) => {
+ const chars = t.raw.split("");
+ let lineBreaks = 0;
+ for (const char of chars) {
+ if (char === "\n") {
+ lineBreaks += 1;
+ }
+ if (lineBreaks > 1) {
+ return true;
+ }
+ }
+ return false;
+ });
+ if (!list.loose && spacers.length && hasMultipleLineBreaks) {
+ list.loose = true;
+ list.items[i2].loose = true;
+ }
+ }
+ return list;
+ }
+ }
+ html(src) {
+ const cap = this.rules.block.html.exec(src);
+ if (cap) {
+ const token = {
+ type: "html",
+ raw: cap[0],
+ pre: !this.options.sanitizer && (cap[1] === "pre" || cap[1] === "script" || cap[1] === "style"),
+ text: cap[0]
+ };
+ if (this.options.sanitize) {
+ token.type = "paragraph";
+ token.text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]);
+ token.tokens = [];
+ this.lexer.inline(token.text, token.tokens);
+ }
+ return token;
+ }
+ }
+ def(src) {
+ const cap = this.rules.block.def.exec(src);
+ if (cap) {
+ if (cap[3])
+ cap[3] = cap[3].substring(1, cap[3].length - 1);
+ const tag = cap[1].toLowerCase().replace(/\s+/g, " ");
+ return {
+ type: "def",
+ tag,
+ raw: cap[0],
+ href: cap[2],
+ title: cap[3]
+ };
+ }
+ }
+ table(src) {
+ const cap = this.rules.block.table.exec(src);
+ if (cap) {
+ const item = {
+ type: "table",
+ header: splitCells(cap[1]).map((c) => {
+ return { text: c };
+ }),
+ align: cap[2].replace(/^ *|\| *$/g, "").split(/ *\| */),
+ rows: cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, "").split("\n") : []
+ };
+ if (item.header.length === item.align.length) {
+ item.raw = cap[0];
+ let l = item.align.length;
+ let i2, j2, k, row;
+ for (i2 = 0; i2 < l; i2++) {
+ if (/^ *-+: *$/.test(item.align[i2])) {
+ item.align[i2] = "right";
+ } else if (/^ *:-+: *$/.test(item.align[i2])) {
+ item.align[i2] = "center";
+ } else if (/^ *:-+ *$/.test(item.align[i2])) {
+ item.align[i2] = "left";
+ } else {
+ item.align[i2] = null;
+ }
+ }
+ l = item.rows.length;
+ for (i2 = 0; i2 < l; i2++) {
+ item.rows[i2] = splitCells(item.rows[i2], item.header.length).map((c) => {
+ return { text: c };
+ });
+ }
+ l = item.header.length;
+ for (j2 = 0; j2 < l; j2++) {
+ item.header[j2].tokens = [];
+ this.lexer.inline(item.header[j2].text, item.header[j2].tokens);
+ }
+ l = item.rows.length;
+ for (j2 = 0; j2 < l; j2++) {
+ row = item.rows[j2];
+ for (k = 0; k < row.length; k++) {
+ row[k].tokens = [];
+ this.lexer.inline(row[k].text, row[k].tokens);
+ }
+ }
+ return item;
+ }
+ }
+ }
+ lheading(src) {
+ const cap = this.rules.block.lheading.exec(src);
+ if (cap) {
+ const token = {
+ type: "heading",
+ raw: cap[0],
+ depth: cap[2].charAt(0) === "=" ? 1 : 2,
+ text: cap[1],
+ tokens: []
+ };
+ this.lexer.inline(token.text, token.tokens);
+ return token;
+ }
+ }
+ paragraph(src) {
+ const cap = this.rules.block.paragraph.exec(src);
+ if (cap) {
+ const token = {
+ type: "paragraph",
+ raw: cap[0],
+ text: cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1],
+ tokens: []
+ };
+ this.lexer.inline(token.text, token.tokens);
+ return token;
+ }
+ }
+ text(src) {
+ const cap = this.rules.block.text.exec(src);
+ if (cap) {
+ const token = {
+ type: "text",
+ raw: cap[0],
+ text: cap[0],
+ tokens: []
+ };
+ this.lexer.inline(token.text, token.tokens);
+ return token;
+ }
+ }
+ escape(src) {
+ const cap = this.rules.inline.escape.exec(src);
+ if (cap) {
+ return {
+ type: "escape",
+ raw: cap[0],
+ text: escape4(cap[1])
+ };
+ }
+ }
+ tag(src) {
+ const cap = this.rules.inline.tag.exec(src);
+ if (cap) {
+ if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {
+ this.lexer.state.inLink = true;
+ } else if (this.lexer.state.inLink && /^<\/a>/i.test(cap[0])) {
+ this.lexer.state.inLink = false;
+ }
+ if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
+ this.lexer.state.inRawBlock = true;
+ } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
+ this.lexer.state.inRawBlock = false;
+ }
+ return {
+ type: this.options.sanitize ? "text" : "html",
+ raw: cap[0],
+ inLink: this.lexer.state.inLink,
+ inRawBlock: this.lexer.state.inRawBlock,
+ text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]) : cap[0]
+ };
+ }
+ }
+ link(src) {
+ const cap = this.rules.inline.link.exec(src);
+ if (cap) {
+ const trimmedUrl = cap[2].trim();
+ if (!this.options.pedantic && /^</.test(trimmedUrl)) {
+ if (!/>$/.test(trimmedUrl)) {
+ return;
+ }
+ const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\");
+ if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
+ return;
+ }
+ } else {
+ const lastParenIndex = findClosingBracket(cap[2], "()");
+ if (lastParenIndex > -1) {
+ const start2 = cap[0].indexOf("!") === 0 ? 5 : 4;
+ const linkLen = start2 + cap[1].length + lastParenIndex;
+ cap[2] = cap[2].substring(0, lastParenIndex);
+ cap[0] = cap[0].substring(0, linkLen).trim();
+ cap[3] = "";
+ }
+ }
+ let href = cap[2];
+ let title = "";
+ if (this.options.pedantic) {
+ const link2 = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
+ if (link2) {
+ href = link2[1];
+ title = link2[3];
+ }
+ } else {
+ title = cap[3] ? cap[3].slice(1, -1) : "";
+ }
+ href = href.trim();
+ if (/^</.test(href)) {
+ if (this.options.pedantic && !/>$/.test(trimmedUrl)) {
+ href = href.slice(1);
+ } else {
+ href = href.slice(1, -1);
+ }
+ }
+ return outputLink(cap, {
+ href: href ? href.replace(this.rules.inline._escapes, "$1") : href,
+ title: title ? title.replace(this.rules.inline._escapes, "$1") : title
+ }, cap[0], this.lexer);
+ }
+ }
+ reflink(src, links) {
+ let cap;
+ if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {
+ let link2 = (cap[2] || cap[1]).replace(/\s+/g, " ");
+ link2 = links[link2.toLowerCase()];
+ if (!link2 || !link2.href) {
+ const text2 = cap[0].charAt(0);
+ return {
+ type: "text",
+ raw: text2,
+ text: text2
+ };
+ }
+ return outputLink(cap, link2, cap[0], this.lexer);
+ }
+ }
+ emStrong(src, maskedSrc, prevChar = "") {
+ let match = this.rules.inline.emStrong.lDelim.exec(src);
+ if (!match)
+ return;
+ if (match[3] && prevChar.match(/[\p{L}\p{N}]/u))
+ return;
+ const nextChar = match[1] || match[2] || "";
+ if (!nextChar || nextChar && (prevChar === "" || this.rules.inline.punctuation.exec(prevChar))) {
+ const lLength = match[0].length - 1;
+ let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;
+ const endReg = match[0][0] === "*" ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
+ endReg.lastIndex = 0;
+ maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
+ while ((match = endReg.exec(maskedSrc)) != null) {
+ rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
+ if (!rDelim)
+ continue;
+ rLength = rDelim.length;
+ if (match[3] || match[4]) {
+ delimTotal += rLength;
+ continue;
+ } else if (match[5] || match[6]) {
+ if (lLength % 3 && !((lLength + rLength) % 3)) {
+ midDelimTotal += rLength;
+ continue;
+ }
+ }
+ delimTotal -= rLength;
+ if (delimTotal > 0)
+ continue;
+ rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
+ if (Math.min(lLength, rLength) % 2) {
+ const text3 = src.slice(1, lLength + match.index + rLength);
+ return {
+ type: "em",
+ raw: src.slice(0, lLength + match.index + rLength + 1),
+ text: text3,
+ tokens: this.lexer.inlineTokens(text3, [])
+ };
+ }
+ const text2 = src.slice(2, lLength + match.index + rLength - 1);
+ return {
+ type: "strong",
+ raw: src.slice(0, lLength + match.index + rLength + 1),
+ text: text2,
+ tokens: this.lexer.inlineTokens(text2, [])
+ };
+ }
+ }
+ }
+ codespan(src) {
+ const cap = this.rules.inline.code.exec(src);
+ if (cap) {
+ let text2 = cap[2].replace(/\n/g, " ");
+ const hasNonSpaceChars = /[^ ]/.test(text2);
+ const hasSpaceCharsOnBothEnds = /^ /.test(text2) && / $/.test(text2);
+ if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
+ text2 = text2.substring(1, text2.length - 1);
+ }
+ text2 = escape4(text2, true);
+ return {
+ type: "codespan",
+ raw: cap[0],
+ text: text2
+ };
+ }
+ }
+ br(src) {
+ const cap = this.rules.inline.br.exec(src);
+ if (cap) {
+ return {
+ type: "br",
+ raw: cap[0]
+ };
+ }
+ }
+ del(src) {
+ const cap = this.rules.inline.del.exec(src);
+ if (cap) {
+ return {
+ type: "del",
+ raw: cap[0],
+ text: cap[2],
+ tokens: this.lexer.inlineTokens(cap[2], [])
+ };
+ }
+ }
+ autolink(src, mangle2) {
+ const cap = this.rules.inline.autolink.exec(src);
+ if (cap) {
+ let text2, href;
+ if (cap[2] === "@") {
+ text2 = escape4(this.options.mangle ? mangle2(cap[1]) : cap[1]);
+ href = "mailto:" + text2;
+ } else {
+ text2 = escape4(cap[1]);
+ href = text2;
+ }
+ return {
+ type: "link",
+ raw: cap[0],
+ text: text2,
+ href,
+ tokens: [
+ {
+ type: "text",
+ raw: text2,
+ text: text2
+ }
+ ]
+ };
+ }
+ }
+ url(src, mangle2) {
+ let cap;
+ if (cap = this.rules.inline.url.exec(src)) {
+ let text2, href;
+ if (cap[2] === "@") {
+ text2 = escape4(this.options.mangle ? mangle2(cap[0]) : cap[0]);
+ href = "mailto:" + text2;
+ } else {
+ let prevCapZero;
+ do {
+ prevCapZero = cap[0];
+ cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];
+ } while (prevCapZero !== cap[0]);
+ text2 = escape4(cap[0]);
+ if (cap[1] === "www.") {
+ href = "http://" + text2;
+ } else {
+ href = text2;
+ }
+ }
+ return {
+ type: "link",
+ raw: cap[0],
+ text: text2,
+ href,
+ tokens: [
+ {
+ type: "text",
+ raw: text2,
+ text: text2
+ }
+ ]
+ };
+ }
+ }
+ inlineText(src, smartypants2) {
+ const cap = this.rules.inline.text.exec(src);
+ if (cap) {
+ let text2;
+ if (this.lexer.state.inRawBlock) {
+ text2 = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]) : cap[0];
+ } else {
+ text2 = escape4(this.options.smartypants ? smartypants2(cap[0]) : cap[0]);
+ }
+ return {
+ type: "text",
+ raw: cap[0],
+ text: text2
+ };
+ }
+ }
+ };
+ var block = {
+ newline: /^(?: *(?:\n|$))+/,
+ code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
+ fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/,
+ hr: /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,
+ heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
+ blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
+ list: /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,
+ html: "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",
+ def: /^ {0,3}\[(label)\]: *(?:\n *)?<?([^\s>]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,
+ table: noopTest,
+ lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
+ _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,
+ text: /^[^\n]+/
+ };
+ block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/;
+ block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
+ block.def = edit(block.def).replace("label", block._label).replace("title", block._title).getRegex();
+ block.bullet = /(?:[*+-]|\d{1,9}[.)])/;
+ block.listItemStart = edit(/^( *)(bull) */).replace("bull", block.bullet).getRegex();
+ block.list = edit(block.list).replace(/bull/g, block.bullet).replace("hr", "\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def", "\\n+(?=" + block.def.source + ")").getRegex();
+ block._tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul";
+ block._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/;
+ block.html = edit(block.html, "i").replace("comment", block._comment).replace("tag", block._tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
+ block.paragraph = edit(block._paragraph).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex();
+ block.blockquote = edit(block.blockquote).replace("paragraph", block.paragraph).getRegex();
+ block.normal = merge2({}, block);
+ block.gfm = merge2({}, block.normal, {
+ table: "^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"
+ });
+ block.gfm.table = edit(block.gfm.table).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex();
+ block.gfm.paragraph = edit(block._paragraph).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("table", block.gfm.table).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex();
+ block.pedantic = merge2({}, block.normal, {
+ html: edit(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", block._comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),
+ def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
+ heading: /^(#{1,6})(.*)(?:\n+|$)/,
+ fences: noopTest,
+ paragraph: edit(block.normal._paragraph).replace("hr", block.hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", block.lheading).replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").getRegex()
+ });
+ var inline = {
+ escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
+ autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
+ url: noopTest,
+ tag: "^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",
+ link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
+ reflink: /^!?\[(label)\]\[(ref)\]/,
+ nolink: /^!?\[(ref)\](?:\[\])?/,
+ reflinkSearch: "reflink|nolink(?!\\()",
+ emStrong: {
+ lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,
+ rDelimAst: /^[^_*]*?\_\_[^_*]*?\*[^_*]*?(?=\_\_)|[^*]+(?=[^*])|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,
+ rDelimUnd: /^[^_*]*?\*\*[^_*]*?\_[^_*]*?(?=\*\*)|[^_]+(?=[^_])|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/
+ },
+ code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
+ br: /^( {2,}|\\)\n(?!\s*$)/,
+ del: noopTest,
+ text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,
+ punctuation: /^([\spunctuation])/
+ };
+ inline._punctuation = "!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~";
+ inline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex();
+ inline.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g;
+ inline.escapedEmSt = /\\\*|\\_/g;
+ inline._comment = edit(block._comment).replace("(?:-->|$)", "-->").getRegex();
+ inline.emStrong.lDelim = edit(inline.emStrong.lDelim).replace(/punct/g, inline._punctuation).getRegex();
+ inline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, "g").replace(/punct/g, inline._punctuation).getRegex();
+ inline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, "g").replace(/punct/g, inline._punctuation).getRegex();
+ inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
+ inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
+ 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])?)+(?![-_])/;
+ inline.autolink = edit(inline.autolink).replace("scheme", inline._scheme).replace("email", inline._email).getRegex();
+ inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
+ inline.tag = edit(inline.tag).replace("comment", inline._comment).replace("attribute", inline._attribute).getRegex();
+ inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
+ inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;
+ inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
+ inline.link = edit(inline.link).replace("label", inline._label).replace("href", inline._href).replace("title", inline._title).getRegex();
+ inline.reflink = edit(inline.reflink).replace("label", inline._label).replace("ref", block._label).getRegex();
+ inline.nolink = edit(inline.nolink).replace("ref", block._label).getRegex();
+ inline.reflinkSearch = edit(inline.reflinkSearch, "g").replace("reflink", inline.reflink).replace("nolink", inline.nolink).getRegex();
+ inline.normal = merge2({}, inline);
+ inline.pedantic = merge2({}, inline.normal, {
+ strong: {
+ start: /^__|\*\*/,
+ middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+ endAst: /\*\*(?!\*)/g,
+ endUnd: /__(?!_)/g
+ },
+ em: {
+ start: /^_|\*/,
+ middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,
+ endAst: /\*(?!\*)/g,
+ endUnd: /_(?!_)/g
+ },
+ link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", inline._label).getRegex(),
+ reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", inline._label).getRegex()
+ });
+ inline.gfm = merge2({}, inline.normal, {
+ escape: edit(inline.escape).replace("])", "~|])").getRegex(),
+ _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
+ url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
+ _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
+ del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
+ text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
+ });
+ inline.gfm.url = edit(inline.gfm.url, "i").replace("email", inline.gfm._extended_email).getRegex();
+ inline.breaks = merge2({}, inline.gfm, {
+ br: edit(inline.br).replace("{2,}", "*").getRegex(),
+ text: edit(inline.gfm.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
+ });
+ function smartypants(text2) {
+ return text2.replace(/---/g, "\u2014").replace(/--/g, "\u2013").replace(/(^|[-\u2014/(\[{"\s])'/g, "$1\u2018").replace(/'/g, "\u2019").replace(/(^|[-\u2014/(\[{\u2018\s])"/g, "$1\u201C").replace(/"/g, "\u201D").replace(/\.{3}/g, "\u2026");
+ }
+ function mangle(text2) {
+ let out = "", i2, ch;
+ const l = text2.length;
+ for (i2 = 0; i2 < l; i2++) {
+ ch = text2.charCodeAt(i2);
+ if (Math.random() > 0.5) {
+ ch = "x" + ch.toString(16);
+ }
+ out += "&#" + ch + ";";
+ }
+ return out;
+ }
+ var Lexer = class {
+ constructor(options2) {
+ this.tokens = [];
+ this.tokens.links = /* @__PURE__ */ Object.create(null);
+ this.options = options2 || defaults;
+ this.options.tokenizer = this.options.tokenizer || new Tokenizer();
+ this.tokenizer = this.options.tokenizer;
+ this.tokenizer.options = this.options;
+ this.tokenizer.lexer = this;
+ this.inlineQueue = [];
+ this.state = {
+ inLink: false,
+ inRawBlock: false,
+ top: true
+ };
+ const rules = {
+ block: block.normal,
+ inline: inline.normal
+ };
+ if (this.options.pedantic) {
+ rules.block = block.pedantic;
+ rules.inline = inline.pedantic;
+ } else if (this.options.gfm) {
+ rules.block = block.gfm;
+ if (this.options.breaks) {
+ rules.inline = inline.breaks;
+ } else {
+ rules.inline = inline.gfm;
+ }
+ }
+ this.tokenizer.rules = rules;
+ }
+ static get rules() {
+ return {
+ block,
+ inline
+ };
+ }
+ static lex(src, options2) {
+ const lexer2 = new Lexer(options2);
+ return lexer2.lex(src);
+ }
+ static lexInline(src, options2) {
+ const lexer2 = new Lexer(options2);
+ return lexer2.inlineTokens(src);
+ }
+ lex(src) {
+ src = src.replace(/\r\n|\r/g, "\n");
+ this.blockTokens(src, this.tokens);
+ let next;
+ while (next = this.inlineQueue.shift()) {
+ this.inlineTokens(next.src, next.tokens);
+ }
+ return this.tokens;
+ }
+ blockTokens(src, tokens = []) {
+ if (this.options.pedantic) {
+ src = src.replace(/\t/g, " ").replace(/^ +$/gm, "");
+ } else {
+ src = src.replace(/^( *)(\t+)/gm, (_, leading, tabs) => {
+ return leading + " ".repeat(tabs.length);
+ });
+ }
+ let token, lastToken, cutSrc, lastParagraphClipped;
+ while (src) {
+ if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some((extTokenizer) => {
+ if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ return true;
+ }
+ return false;
+ })) {
+ continue;
+ }
+ if (token = this.tokenizer.space(src)) {
+ src = src.substring(token.raw.length);
+ if (token.raw.length === 1 && tokens.length > 0) {
+ tokens[tokens.length - 1].raw += "\n";
+ } else {
+ tokens.push(token);
+ }
+ continue;
+ }
+ if (token = this.tokenizer.code(src)) {
+ src = src.substring(token.raw.length);
+ lastToken = tokens[tokens.length - 1];
+ if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) {
+ lastToken.raw += "\n" + token.raw;
+ lastToken.text += "\n" + token.text;
+ this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
+ } else {
+ tokens.push(token);
+ }
+ continue;
+ }
+ if (token = this.tokenizer.fences(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.heading(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.hr(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.blockquote(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.list(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.html(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.def(src)) {
+ src = src.substring(token.raw.length);
+ lastToken = tokens[tokens.length - 1];
+ if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) {
+ lastToken.raw += "\n" + token.raw;
+ lastToken.text += "\n" + token.raw;
+ this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
+ } else if (!this.tokens.links[token.tag]) {
+ this.tokens.links[token.tag] = {
+ href: token.href,
+ title: token.title
+ };
+ }
+ continue;
+ }
+ if (token = this.tokenizer.table(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.lheading(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ cutSrc = src;
+ if (this.options.extensions && this.options.extensions.startBlock) {
+ let startIndex = Infinity;
+ const tempSrc = src.slice(1);
+ let tempStart;
+ this.options.extensions.startBlock.forEach(function(getStartIndex) {
+ tempStart = getStartIndex.call({ lexer: this }, tempSrc);
+ if (typeof tempStart === "number" && tempStart >= 0) {
+ startIndex = Math.min(startIndex, tempStart);
+ }
+ });
+ if (startIndex < Infinity && startIndex >= 0) {
+ cutSrc = src.substring(0, startIndex + 1);
+ }
+ }
+ if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
+ lastToken = tokens[tokens.length - 1];
+ if (lastParagraphClipped && lastToken.type === "paragraph") {
+ lastToken.raw += "\n" + token.raw;
+ lastToken.text += "\n" + token.text;
+ this.inlineQueue.pop();
+ this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
+ } else {
+ tokens.push(token);
+ }
+ lastParagraphClipped = cutSrc.length !== src.length;
+ src = src.substring(token.raw.length);
+ continue;
+ }
+ if (token = this.tokenizer.text(src)) {
+ src = src.substring(token.raw.length);
+ lastToken = tokens[tokens.length - 1];
+ if (lastToken && lastToken.type === "text") {
+ lastToken.raw += "\n" + token.raw;
+ lastToken.text += "\n" + token.text;
+ this.inlineQueue.pop();
+ this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
+ } else {
+ tokens.push(token);
+ }
+ continue;
+ }
+ if (src) {
+ const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
+ if (this.options.silent) {
+ console.error(errMsg);
+ break;
+ } else {
+ throw new Error(errMsg);
+ }
+ }
+ }
+ this.state.top = true;
+ return tokens;
+ }
+ inline(src, tokens) {
+ this.inlineQueue.push({ src, tokens });
+ }
+ inlineTokens(src, tokens = []) {
+ let token, lastToken, cutSrc;
+ let maskedSrc = src;
+ let match;
+ let keepPrevChar, prevChar;
+ if (this.tokens.links) {
+ const links = Object.keys(this.tokens.links);
+ if (links.length > 0) {
+ while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
+ if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) {
+ maskedSrc = maskedSrc.slice(0, match.index) + "[" + repeatString("a", match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
+ }
+ }
+ }
+ }
+ while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
+ maskedSrc = maskedSrc.slice(0, match.index) + "[" + repeatString("a", match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
+ }
+ while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {
+ maskedSrc = maskedSrc.slice(0, match.index) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);
+ }
+ while (src) {
+ if (!keepPrevChar) {
+ prevChar = "";
+ }
+ keepPrevChar = false;
+ if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some((extTokenizer) => {
+ if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ return true;
+ }
+ return false;
+ })) {
+ continue;
+ }
+ if (token = this.tokenizer.escape(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.tag(src)) {
+ src = src.substring(token.raw.length);
+ lastToken = tokens[tokens.length - 1];
+ if (lastToken && token.type === "text" && lastToken.type === "text") {
+ lastToken.raw += token.raw;
+ lastToken.text += token.text;
+ } else {
+ tokens.push(token);
+ }
+ continue;
+ }
+ if (token = this.tokenizer.link(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.reflink(src, this.tokens.links)) {
+ src = src.substring(token.raw.length);
+ lastToken = tokens[tokens.length - 1];
+ if (lastToken && token.type === "text" && lastToken.type === "text") {
+ lastToken.raw += token.raw;
+ lastToken.text += token.text;
+ } else {
+ tokens.push(token);
+ }
+ continue;
+ }
+ if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.codespan(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.br(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.del(src)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (token = this.tokenizer.autolink(src, mangle)) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {
+ src = src.substring(token.raw.length);
+ tokens.push(token);
+ continue;
+ }
+ cutSrc = src;
+ if (this.options.extensions && this.options.extensions.startInline) {
+ let startIndex = Infinity;
+ const tempSrc = src.slice(1);
+ let tempStart;
+ this.options.extensions.startInline.forEach(function(getStartIndex) {
+ tempStart = getStartIndex.call({ lexer: this }, tempSrc);
+ if (typeof tempStart === "number" && tempStart >= 0) {
+ startIndex = Math.min(startIndex, tempStart);
+ }
+ });
+ if (startIndex < Infinity && startIndex >= 0) {
+ cutSrc = src.substring(0, startIndex + 1);
+ }
+ }
+ if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {
+ src = src.substring(token.raw.length);
+ if (token.raw.slice(-1) !== "_") {
+ prevChar = token.raw.slice(-1);
+ }
+ keepPrevChar = true;
+ lastToken = tokens[tokens.length - 1];
+ if (lastToken && lastToken.type === "text") {
+ lastToken.raw += token.raw;
+ lastToken.text += token.text;
+ } else {
+ tokens.push(token);
+ }
+ continue;
+ }
+ if (src) {
+ const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
+ if (this.options.silent) {
+ console.error(errMsg);
+ break;
+ } else {
+ throw new Error(errMsg);
+ }
+ }
+ }
+ return tokens;
+ }
+ };
+ var Renderer = class {
+ constructor(options2) {
+ this.options = options2 || defaults;
+ }
+ code(code, infostring, escaped) {
+ const lang = (infostring || "").match(/\S*/)[0];
+ if (this.options.highlight) {
+ const out = this.options.highlight(code, lang);
+ if (out != null && out !== code) {
+ escaped = true;
+ code = out;
+ }
+ }
+ code = code.replace(/\n$/, "") + "\n";
+ if (!lang) {
+ return "<pre><code>" + (escaped ? code : escape4(code, true)) + "</code></pre>\n";
+ }
+ return '<pre><code class="' + this.options.langPrefix + escape4(lang, true) + '">' + (escaped ? code : escape4(code, true)) + "</code></pre>\n";
+ }
+ blockquote(quote2) {
+ return `<blockquote>
+${quote2}</blockquote>
+`;
+ }
+ html(html2) {
+ return html2;
+ }
+ heading(text2, level, raw, slugger) {
+ if (this.options.headerIds) {
+ const id2 = this.options.headerPrefix + slugger.slug(raw);
+ return `<h${level} id="${id2}">${text2}</h${level}>
+`;
+ }
+ return `<h${level}>${text2}</h${level}>
+`;
+ }
+ hr() {
+ return this.options.xhtml ? "<hr/>\n" : "<hr>\n";
+ }
+ list(body, ordered, start2) {
+ const type3 = ordered ? "ol" : "ul", startatt = ordered && start2 !== 1 ? ' start="' + start2 + '"' : "";
+ return "<" + type3 + startatt + ">\n" + body + "</" + type3 + ">\n";
+ }
+ listitem(text2) {
+ return `<li>${text2}</li>
+`;
+ }
+ checkbox(checked) {
+ return "<input " + (checked ? 'checked="" ' : "") + 'disabled="" type="checkbox"' + (this.options.xhtml ? " /" : "") + "> ";
+ }
+ paragraph(text2) {
+ return `<p>${text2}</p>
+`;
+ }
+ table(header, body) {
+ if (body)
+ body = `<tbody>${body}</tbody>`;
+ return "<table>\n<thead>\n" + header + "</thead>\n" + body + "</table>\n";
+ }
+ tablerow(content) {
+ return `<tr>
+${content}</tr>
+`;
+ }
+ tablecell(content, flags) {
+ const type3 = flags.header ? "th" : "td";
+ const tag = flags.align ? `<${type3} align="${flags.align}">` : `<${type3}>`;
+ return tag + content + `</${type3}>
+`;
+ }
+ strong(text2) {
+ return `<strong>${text2}</strong>`;
+ }
+ em(text2) {
+ return `<em>${text2}</em>`;
+ }
+ codespan(text2) {
+ return `<code>${text2}</code>`;
+ }
+ br() {
+ return this.options.xhtml ? "<br/>" : "<br>";
+ }
+ del(text2) {
+ return `<del>${text2}</del>`;
+ }
+ link(href, title, text2) {
+ href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
+ if (href === null) {
+ return text2;
+ }
+ let out = '<a href="' + escape4(href) + '"';
+ if (title) {
+ out += ' title="' + title + '"';
+ }
+ out += ">" + text2 + "</a>";
+ return out;
+ }
+ image(href, title, text2) {
+ href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
+ if (href === null) {
+ return text2;
+ }
+ let out = `<img src="${href}" alt="${text2}"`;
+ if (title) {
+ out += ` title="${title}"`;
+ }
+ out += this.options.xhtml ? "/>" : ">";
+ return out;
+ }
+ text(text2) {
+ return text2;
+ }
+ };
+ var TextRenderer = class {
+ strong(text2) {
+ return text2;
+ }
+ em(text2) {
+ return text2;
+ }
+ codespan(text2) {
+ return text2;
+ }
+ del(text2) {
+ return text2;
+ }
+ html(text2) {
+ return text2;
+ }
+ text(text2) {
+ return text2;
+ }
+ link(href, title, text2) {
+ return "" + text2;
+ }
+ image(href, title, text2) {
+ return "" + text2;
+ }
+ br() {
+ return "";
+ }
+ };
+ var Slugger = class {
+ constructor() {
+ this.seen = {};
+ }
+ serialize(value) {
+ return value.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig, "").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, "").replace(/\s/g, "-");
+ }
+ getNextSafeSlug(originalSlug, isDryRun) {
+ let slug = originalSlug;
+ let occurenceAccumulator = 0;
+ if (this.seen.hasOwnProperty(slug)) {
+ occurenceAccumulator = this.seen[originalSlug];
+ do {
+ occurenceAccumulator++;
+ slug = originalSlug + "-" + occurenceAccumulator;
+ } while (this.seen.hasOwnProperty(slug));
+ }
+ if (!isDryRun) {
+ this.seen[originalSlug] = occurenceAccumulator;
+ this.seen[slug] = 0;
+ }
+ return slug;
+ }
+ slug(value, options2 = {}) {
+ const slug = this.serialize(value);
+ return this.getNextSafeSlug(slug, options2.dryrun);
+ }
+ };
+ var Parser = class {
+ constructor(options2) {
+ this.options = options2 || defaults;
+ this.options.renderer = this.options.renderer || new Renderer();
+ this.renderer = this.options.renderer;
+ this.renderer.options = this.options;
+ this.textRenderer = new TextRenderer();
+ this.slugger = new Slugger();
+ }
+ static parse(tokens, options2) {
+ const parser3 = new Parser(options2);
+ return parser3.parse(tokens);
+ }
+ static parseInline(tokens, options2) {
+ const parser3 = new Parser(options2);
+ return parser3.parseInline(tokens);
+ }
+ parse(tokens, top = true) {
+ let out = "", i2, j2, k, l2, l3, row, cell, header, body, token, ordered, start2, loose, itemBody, item, checked, task, checkbox, ret;
+ const l = tokens.length;
+ for (i2 = 0; i2 < l; i2++) {
+ token = tokens[i2];
+ if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
+ ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
+ if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(token.type)) {
+ out += ret || "";
+ continue;
+ }
+ }
+ switch (token.type) {
+ case "space": {
+ continue;
+ }
+ case "hr": {
+ out += this.renderer.hr();
+ continue;
+ }
+ case "heading": {
+ out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape3(this.parseInline(token.tokens, this.textRenderer)), this.slugger);
+ continue;
+ }
+ case "code": {
+ out += this.renderer.code(token.text, token.lang, token.escaped);
+ continue;
+ }
+ case "table": {
+ header = "";
+ cell = "";
+ l2 = token.header.length;
+ for (j2 = 0; j2 < l2; j2++) {
+ cell += this.renderer.tablecell(this.parseInline(token.header[j2].tokens), { header: true, align: token.align[j2] });
+ }
+ header += this.renderer.tablerow(cell);
+ body = "";
+ l2 = token.rows.length;
+ for (j2 = 0; j2 < l2; j2++) {
+ row = token.rows[j2];
+ cell = "";
+ l3 = row.length;
+ for (k = 0; k < l3; k++) {
+ cell += this.renderer.tablecell(this.parseInline(row[k].tokens), { header: false, align: token.align[k] });
+ }
+ body += this.renderer.tablerow(cell);
+ }
+ out += this.renderer.table(header, body);
+ continue;
+ }
+ case "blockquote": {
+ body = this.parse(token.tokens);
+ out += this.renderer.blockquote(body);
+ continue;
+ }
+ case "list": {
+ ordered = token.ordered;
+ start2 = token.start;
+ loose = token.loose;
+ l2 = token.items.length;
+ body = "";
+ for (j2 = 0; j2 < l2; j2++) {
+ item = token.items[j2];
+ checked = item.checked;
+ task = item.task;
+ itemBody = "";
+ if (item.task) {
+ checkbox = this.renderer.checkbox(checked);
+ if (loose) {
+ if (item.tokens.length > 0 && item.tokens[0].type === "paragraph") {
+ item.tokens[0].text = checkbox + " " + item.tokens[0].text;
+ if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") {
+ item.tokens[0].tokens[0].text = checkbox + " " + item.tokens[0].tokens[0].text;
+ }
+ } else {
+ item.tokens.unshift({
+ type: "text",
+ text: checkbox
+ });
+ }
+ } else {
+ itemBody += checkbox;
+ }
+ }
+ itemBody += this.parse(item.tokens, loose);
+ body += this.renderer.listitem(itemBody, task, checked);
+ }
+ out += this.renderer.list(body, ordered, start2);
+ continue;
+ }
+ case "html": {
+ out += this.renderer.html(token.text);
+ continue;
+ }
+ case "paragraph": {
+ out += this.renderer.paragraph(this.parseInline(token.tokens));
+ continue;
+ }
+ case "text": {
+ body = token.tokens ? this.parseInline(token.tokens) : token.text;
+ while (i2 + 1 < l && tokens[i2 + 1].type === "text") {
+ token = tokens[++i2];
+ body += "\n" + (token.tokens ? this.parseInline(token.tokens) : token.text);
+ }
+ out += top ? this.renderer.paragraph(body) : body;
+ continue;
+ }
+ default: {
+ const errMsg = 'Token with "' + token.type + '" type was not found.';
+ if (this.options.silent) {
+ console.error(errMsg);
+ return;
+ } else {
+ throw new Error(errMsg);
+ }
+ }
+ }
+ }
+ return out;
+ }
+ parseInline(tokens, renderer) {
+ renderer = renderer || this.renderer;
+ let out = "", i2, token, ret;
+ const l = tokens.length;
+ for (i2 = 0; i2 < l; i2++) {
+ token = tokens[i2];
+ if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
+ ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
+ if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(token.type)) {
+ out += ret || "";
+ continue;
+ }
+ }
+ switch (token.type) {
+ case "escape": {
+ out += renderer.text(token.text);
+ break;
+ }
+ case "html": {
+ out += renderer.html(token.text);
+ break;
+ }
+ case "link": {
+ out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));
+ break;
+ }
+ case "image": {
+ out += renderer.image(token.href, token.title, token.text);
+ break;
+ }
+ case "strong": {
+ out += renderer.strong(this.parseInline(token.tokens, renderer));
+ break;
+ }
+ case "em": {
+ out += renderer.em(this.parseInline(token.tokens, renderer));
+ break;
+ }
+ case "codespan": {
+ out += renderer.codespan(token.text);
+ break;
+ }
+ case "br": {
+ out += renderer.br();
+ break;
+ }
+ case "del": {
+ out += renderer.del(this.parseInline(token.tokens, renderer));
+ break;
+ }
+ case "text": {
+ out += renderer.text(token.text);
+ break;
+ }
+ default: {
+ const errMsg = 'Token with "' + token.type + '" type was not found.';
+ if (this.options.silent) {
+ console.error(errMsg);
+ return;
+ } else {
+ throw new Error(errMsg);
+ }
+ }
+ }
+ }
+ return out;
+ }
+ };
+ function marked(src, opt, callback) {
+ if (typeof src === "undefined" || src === null) {
+ throw new Error("marked(): input parameter is undefined or null");
+ }
+ if (typeof src !== "string") {
+ throw new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected");
+ }
+ if (typeof opt === "function") {
+ callback = opt;
+ opt = null;
+ }
+ opt = merge2({}, marked.defaults, opt || {});
+ checkSanitizeDeprecation(opt);
+ if (callback) {
+ const highlight = opt.highlight;
+ let tokens;
+ try {
+ tokens = Lexer.lex(src, opt);
+ } catch (e) {
+ return callback(e);
+ }
+ const done = function(err) {
+ let out;
+ if (!err) {
+ try {
+ if (opt.walkTokens) {
+ marked.walkTokens(tokens, opt.walkTokens);
+ }
+ out = Parser.parse(tokens, opt);
+ } catch (e) {
+ err = e;
+ }
+ }
+ opt.highlight = highlight;
+ return err ? callback(err) : callback(null, out);
+ };
+ if (!highlight || highlight.length < 3) {
+ return done();
+ }
+ delete opt.highlight;
+ if (!tokens.length)
+ return done();
+ let pending = 0;
+ marked.walkTokens(tokens, function(token) {
+ if (token.type === "code") {
+ pending++;
+ setTimeout(() => {
+ highlight(token.text, token.lang, function(err, code) {
+ if (err) {
+ return done(err);
+ }
+ if (code != null && code !== token.text) {
+ token.text = code;
+ token.escaped = true;
+ }
+ pending--;
+ if (pending === 0) {
+ done();
+ }
+ });
+ }, 0);
+ }
+ });
+ if (pending === 0) {
+ done();
+ }
+ return;
+ }
+ try {
+ const tokens = Lexer.lex(src, opt);
+ if (opt.walkTokens) {
+ marked.walkTokens(tokens, opt.walkTokens);
+ }
+ return Parser.parse(tokens, opt);
+ } catch (e) {
+ e.message += "\nPlease report this to https://github.com/markedjs/marked.";
+ if (opt.silent) {
+ return "<p>An error occurred:</p><pre>" + escape4(e.message + "", true) + "</pre>";
+ }
+ throw e;
+ }
+ }
+ marked.options = marked.setOptions = function(opt) {
+ merge2(marked.defaults, opt);
+ changeDefaults(marked.defaults);
+ return marked;
+ };
+ marked.getDefaults = getDefaults;
+ marked.defaults = defaults;
+ marked.use = function(...args) {
+ const opts = merge2({}, ...args);
+ const extensions = marked.defaults.extensions || { renderers: {}, childTokens: {} };
+ let hasExtensions;
+ args.forEach((pack) => {
+ if (pack.extensions) {
+ hasExtensions = true;
+ pack.extensions.forEach((ext) => {
+ if (!ext.name) {
+ throw new Error("extension name required");
+ }
+ if (ext.renderer) {
+ const prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null;
+ if (prevRenderer) {
+ extensions.renderers[ext.name] = function(...args2) {
+ let ret = ext.renderer.apply(this, args2);
+ if (ret === false) {
+ ret = prevRenderer.apply(this, args2);
+ }
+ return ret;
+ };
+ } else {
+ extensions.renderers[ext.name] = ext.renderer;
+ }
+ }
+ if (ext.tokenizer) {
+ if (!ext.level || ext.level !== "block" && ext.level !== "inline") {
+ throw new Error("extension level must be 'block' or 'inline'");
+ }
+ if (extensions[ext.level]) {
+ extensions[ext.level].unshift(ext.tokenizer);
+ } else {
+ extensions[ext.level] = [ext.tokenizer];
+ }
+ if (ext.start) {
+ if (ext.level === "block") {
+ if (extensions.startBlock) {
+ extensions.startBlock.push(ext.start);
+ } else {
+ extensions.startBlock = [ext.start];
+ }
+ } else if (ext.level === "inline") {
+ if (extensions.startInline) {
+ extensions.startInline.push(ext.start);
+ } else {
+ extensions.startInline = [ext.start];
+ }
+ }
+ }
+ }
+ if (ext.childTokens) {
+ extensions.childTokens[ext.name] = ext.childTokens;
+ }
+ });
+ }
+ if (pack.renderer) {
+ const renderer = marked.defaults.renderer || new Renderer();
+ for (const prop in pack.renderer) {
+ const prevRenderer = renderer[prop];
+ renderer[prop] = (...args2) => {
+ let ret = pack.renderer[prop].apply(renderer, args2);
+ if (ret === false) {
+ ret = prevRenderer.apply(renderer, args2);
+ }
+ return ret;
+ };
+ }
+ opts.renderer = renderer;
+ }
+ if (pack.tokenizer) {
+ const tokenizer = marked.defaults.tokenizer || new Tokenizer();
+ for (const prop in pack.tokenizer) {
+ const prevTokenizer = tokenizer[prop];
+ tokenizer[prop] = (...args2) => {
+ let ret = pack.tokenizer[prop].apply(tokenizer, args2);
+ if (ret === false) {
+ ret = prevTokenizer.apply(tokenizer, args2);
+ }
+ return ret;
+ };
+ }
+ opts.tokenizer = tokenizer;
+ }
+ if (pack.walkTokens) {
+ const walkTokens2 = marked.defaults.walkTokens;
+ opts.walkTokens = function(token) {
+ pack.walkTokens.call(this, token);
+ if (walkTokens2) {
+ walkTokens2.call(this, token);
+ }
+ };
+ }
+ if (hasExtensions) {
+ opts.extensions = extensions;
+ }
+ marked.setOptions(opts);
+ });
+ };
+ marked.walkTokens = function(tokens, callback) {
+ for (const token of tokens) {
+ callback.call(marked, token);
+ switch (token.type) {
+ case "table": {
+ for (const cell of token.header) {
+ marked.walkTokens(cell.tokens, callback);
+ }
+ for (const row of token.rows) {
+ for (const cell of row) {
+ marked.walkTokens(cell.tokens, callback);
+ }
+ }
+ break;
+ }
+ case "list": {
+ marked.walkTokens(token.items, callback);
+ break;
+ }
+ default: {
+ if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) {
+ marked.defaults.extensions.childTokens[token.type].forEach(function(childTokens) {
+ marked.walkTokens(token[childTokens], callback);
+ });
+ } else if (token.tokens) {
+ marked.walkTokens(token.tokens, callback);
+ }
+ }
+ }
+ }
+ };
+ marked.parseInline = function(src, opt) {
+ if (typeof src === "undefined" || src === null) {
+ throw new Error("marked.parseInline(): input parameter is undefined or null");
+ }
+ if (typeof src !== "string") {
+ throw new Error("marked.parseInline(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected");
+ }
+ opt = merge2({}, marked.defaults, opt || {});
+ checkSanitizeDeprecation(opt);
+ try {
+ const tokens = Lexer.lexInline(src, opt);
+ if (opt.walkTokens) {
+ marked.walkTokens(tokens, opt.walkTokens);
+ }
+ return Parser.parseInline(tokens, opt);
+ } catch (e) {
+ e.message += "\nPlease report this to https://github.com/markedjs/marked.";
+ if (opt.silent) {
+ return "<p>An error occurred:</p><pre>" + escape4(e.message + "", true) + "</pre>";
+ }
+ throw e;
+ }
+ };
+ marked.Parser = Parser;
+ marked.parser = Parser.parse;
+ marked.Renderer = Renderer;
+ marked.TextRenderer = TextRenderer;
+ marked.Lexer = Lexer;
+ marked.lexer = Lexer.lex;
+ marked.Tokenizer = Tokenizer;
+ marked.Slugger = Slugger;
+ marked.parse = marked;
+ var options = marked.options;
+ var setOptions = marked.setOptions;
+ var use = marked.use;
+ var walkTokens = marked.walkTokens;
+ var parseInline = marked.parseInline;
+ var parser2 = Parser.parse;
+ var lexer = Lexer.lex;
+
+ // modules/services/osmose.js
+ var tiler3 = utilTiler();
+ var dispatch4 = dispatch_default("loaded");
+ var _tileZoom3 = 14;
+ var _osmoseUrlRoot = "https://osmose.openstreetmap.fr/api/0.3";
+ var _osmoseData = { icons: {}, items: [] };
+ var _cache3;
+ function abortRequest3(controller) {
+ if (controller) {
+ controller.abort();
+ }
+ }
+ function abortUnwantedRequests3(cache, tiles) {
+ Object.keys(cache.inflightTile).forEach((k) => {
+ let wanted = tiles.find((tile) => k === tile.id);
+ if (!wanted) {
+ abortRequest3(cache.inflightTile[k]);
+ delete cache.inflightTile[k];
+ }
+ });
+ }
+ function encodeIssueRtree3(d) {
+ return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
+ }
+ function updateRtree3(item, replace) {
+ _cache3.rtree.remove(item, (a, b) => a.data.id === b.data.id);
+ if (replace) {
+ _cache3.rtree.insert(item);
+ }
+ }
+ function preventCoincident2(loc) {
+ let coincident = false;
+ do {
+ let delta = coincident ? [1e-5, 0] : [0, 1e-5];
+ loc = geoVecAdd(loc, delta);
+ let bbox = geoExtent(loc).bbox();
+ coincident = _cache3.rtree.search(bbox).length;
+ } while (coincident);
+ return loc;
+ }
+ var osmose_default = {
+ title: "osmose",
+ init() {
+ _mainFileFetcher.get("qa_data").then((d) => {
+ _osmoseData = d.osmose;
+ _osmoseData.items = Object.keys(d.osmose.icons).map((s) => s.split("-")[0]).reduce((unique, item) => unique.indexOf(item) !== -1 ? unique : [...unique, item], []);
+ });
+ if (!_cache3) {
+ this.reset();
+ }
+ this.event = utilRebind(this, dispatch4, "on");
+ },
+ reset() {
+ let _strings = {};
+ let _colors = {};
+ if (_cache3) {
+ Object.values(_cache3.inflightTile).forEach(abortRequest3);
+ _strings = _cache3.strings;
+ _colors = _cache3.colors;
+ }
+ _cache3 = {
+ data: {},
+ loadedTile: {},
+ inflightTile: {},
+ inflightPost: {},
+ closed: {},
+ rtree: new import_rbush3.default(),
+ strings: _strings,
+ colors: _colors
+ };
+ },
+ loadIssues(projection2) {
+ let params = {
+ item: _osmoseData.items
+ };
+ let tiles = tiler3.zoomExtent([_tileZoom3, _tileZoom3]).getTiles(projection2);
+ abortUnwantedRequests3(_cache3, tiles);
+ tiles.forEach((tile) => {
+ if (_cache3.loadedTile[tile.id] || _cache3.inflightTile[tile.id])
+ return;
+ let [x, y, z] = tile.xyz;
+ let url = `${_osmoseUrlRoot}/issues/${z}/${x}/${y}.json?` + utilQsString(params);
+ let controller = new AbortController();
+ _cache3.inflightTile[tile.id] = controller;
+ json_default(url, { signal: controller.signal }).then((data) => {
+ delete _cache3.inflightTile[tile.id];
+ _cache3.loadedTile[tile.id] = true;
+ if (data.features) {
+ data.features.forEach((issue) => {
+ const { item, class: cl, uuid: id2 } = issue.properties;
+ const itemType = `${item}-${cl}`;
+ if (itemType in _osmoseData.icons) {
+ let loc = issue.geometry.coordinates;
+ loc = preventCoincident2(loc);
+ let d = new QAItem(loc, this, itemType, id2, { item });
+ if (item === 8300 || item === 8360) {
+ d.elems = [];
+ }
+ _cache3.data[d.id] = d;
+ _cache3.rtree.insert(encodeIssueRtree3(d));
+ }
+ });
+ }
+ dispatch4.call("loaded");
+ }).catch(() => {
+ delete _cache3.inflightTile[tile.id];
+ _cache3.loadedTile[tile.id] = true;
+ });
+ });
+ },
+ loadIssueDetail(issue) {
+ if (issue.elems !== void 0) {
+ return Promise.resolve(issue);
+ }
+ const url = `${_osmoseUrlRoot}/issue/${issue.id}?langs=${_mainLocalizer.localeCode()}`;
+ const cacheDetails = (data) => {
+ issue.elems = data.elems.map((e) => e.type.substring(0, 1) + e.id);
+ issue.detail = data.subtitle ? marked(data.subtitle.auto) : "";
+ this.replaceItem(issue);
+ };
+ return json_default(url).then(cacheDetails).then(() => issue);
+ },
+ loadStrings(locale2 = _mainLocalizer.localeCode()) {
+ const items = Object.keys(_osmoseData.icons);
+ if (locale2 in _cache3.strings && Object.keys(_cache3.strings[locale2]).length === items.length) {
+ return Promise.resolve(_cache3.strings[locale2]);
+ }
+ if (!(locale2 in _cache3.strings)) {
+ _cache3.strings[locale2] = {};
+ }
+ const allRequests = items.map((itemType) => {
+ if (itemType in _cache3.strings[locale2])
+ return null;
+ const cacheData = (data) => {
+ const [cat = { items: [] }] = data.categories;
+ const [item2 = { class: [] }] = cat.items;
+ const [cl2 = null] = item2.class;
+ if (!cl2) {
+ console.log(`Osmose strings request (${itemType}) had unexpected data`);
+ return;
+ }
+ const { item: itemInt, color: color2 } = item2;
+ if (/^#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/.test(color2)) {
+ _cache3.colors[itemInt] = color2;
+ }
+ const { title, detail, fix, trap } = cl2;
+ let issueStrings = {};
+ if (title)
+ issueStrings.title = title.auto;
+ if (detail)
+ issueStrings.detail = marked(detail.auto);
+ if (trap)
+ issueStrings.trap = marked(trap.auto);
+ if (fix)
+ issueStrings.fix = marked(fix.auto);
+ _cache3.strings[locale2][itemType] = issueStrings;
+ };
+ const [item, cl] = itemType.split("-");
+ const url = `${_osmoseUrlRoot}/items/${item}/class/${cl}?langs=${locale2}`;
+ return json_default(url).then(cacheData);
+ }).filter(Boolean);
+ return Promise.all(allRequests).then(() => _cache3.strings[locale2]);
+ },
+ getStrings(itemType, locale2 = _mainLocalizer.localeCode()) {
+ return locale2 in _cache3.strings ? _cache3.strings[locale2][itemType] : {};
+ },
+ getColor(itemType) {
+ return itemType in _cache3.colors ? _cache3.colors[itemType] : "#FFFFFF";
+ },
+ postUpdate(issue, callback) {
+ if (_cache3.inflightPost[issue.id]) {
+ return callback({ message: "Issue update already inflight", status: -2 }, issue);
+ }
+ const url = `${_osmoseUrlRoot}/issue/${issue.id}/${issue.newStatus}`;
+ const controller = new AbortController();
+ const after = () => {
+ delete _cache3.inflightPost[issue.id];
+ this.removeItem(issue);
+ if (issue.newStatus === "done") {
+ if (!(issue.item in _cache3.closed)) {
+ _cache3.closed[issue.item] = 0;
+ }
+ _cache3.closed[issue.item] += 1;
+ }
+ if (callback)
+ callback(null, issue);
+ };
+ _cache3.inflightPost[issue.id] = controller;
+ fetch(url, { signal: controller.signal }).then(after).catch((err) => {
+ delete _cache3.inflightPost[issue.id];
+ if (callback)
+ callback(err.message);
+ });
+ },
+ getItems(projection2) {
+ const viewport = projection2.clipExtent();
+ const min3 = [viewport[0][0], viewport[1][1]];
+ const max3 = [viewport[1][0], viewport[0][1]];
+ const bbox = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
+ return _cache3.rtree.search(bbox).map((d) => d.data);
+ },
+ getError(id2) {
+ return _cache3.data[id2];
+ },
+ getIcon(itemType) {
+ return _osmoseData.icons[itemType];
+ },
+ replaceItem(item) {
+ if (!(item instanceof QAItem) || !item.id)
+ return;
+ _cache3.data[item.id] = item;
+ updateRtree3(encodeIssueRtree3(item), true);
+ return item;
+ },
+ removeItem(item) {
+ if (!(item instanceof QAItem) || !item.id)
+ return;
+ delete _cache3.data[item.id];
+ updateRtree3(encodeIssueRtree3(item), false);
+ },
+ getClosedCounts() {
+ return _cache3.closed;
+ },
+ itemURL(item) {
+ return `https://osmose.openstreetmap.fr/en/error/${item.id}`;
+ }
+ };
+
+ // modules/services/mapillary.js
+ var import_pbf = __toESM(require_pbf());
+ var import_rbush4 = __toESM(require_rbush_min());
+ var import_vector_tile = __toESM(require_vector_tile());
+ var accessToken = "MLY|4100327730013843|5bb78b81720791946a9a7b956c57b7cf";
+ var apiUrl = "https://graph.mapillary.com/";
+ var baseTileUrl = "https://tiles.mapillary.com/maps/vtp";
+ var mapFeatureTileUrl = `${baseTileUrl}/mly_map_feature_point/2/{z}/{x}/{y}?access_token=${accessToken}`;
+ var tileUrl = `${baseTileUrl}/mly1_public/2/{z}/{x}/{y}?access_token=${accessToken}`;
+ var trafficSignTileUrl = `${baseTileUrl}/mly_map_feature_traffic_sign/2/{z}/{x}/{y}?access_token=${accessToken}`;
+ var viewercss = "mapillary-js/mapillary.css";
+ var viewerjs = "mapillary-js/mapillary.js";
+ var minZoom = 14;
+ var dispatch5 = dispatch_default("change", "loadedImages", "loadedSigns", "loadedMapFeatures", "bearingChanged", "imageChanged");
+ var _loadViewerPromise;
+ var _mlyActiveImage;
+ var _mlyCache;
+ var _mlyFallback = false;
+ var _mlyHighlightedDetection;
+ var _mlyShowFeatureDetections = false;
+ var _mlyShowSignDetections = false;
+ var _mlyViewer;
+ var _mlyViewerFilter = ["all"];
+ function loadTiles(which, url, maxZoom2, projection2) {
+ const tiler8 = utilTiler().zoomExtent([minZoom, maxZoom2]).skipNullIsland(true);
+ const tiles = tiler8.getTiles(projection2);
+ tiles.forEach(function(tile) {
+ loadTile(which, url, tile);
+ });
+ }
+ function loadTile(which, url, tile) {
+ const cache = _mlyCache.requests;
+ const tileId = `${tile.id}-${which}`;
+ if (cache.loaded[tileId] || cache.inflight[tileId])
+ return;
+ const controller = new AbortController();
+ cache.inflight[tileId] = controller;
+ const requestUrl = url.replace("{x}", tile.xyz[0]).replace("{y}", tile.xyz[1]).replace("{z}", tile.xyz[2]);
+ fetch(requestUrl, { signal: controller.signal }).then(function(response) {
+ if (!response.ok) {
+ throw new Error(response.status + " " + response.statusText);
+ }
+ cache.loaded[tileId] = true;
+ delete cache.inflight[tileId];
+ return response.arrayBuffer();
+ }).then(function(data) {
+ if (!data) {
+ throw new Error("No Data");
+ }
+ loadTileDataToCache(data, tile, which);
+ if (which === "images") {
+ dispatch5.call("loadedImages");
+ } else if (which === "signs") {
+ dispatch5.call("loadedSigns");
+ } else if (which === "points") {
+ dispatch5.call("loadedMapFeatures");
+ }
+ }).catch(function() {
+ cache.loaded[tileId] = true;
+ delete cache.inflight[tileId];
+ });
+ }
+ function loadTileDataToCache(data, tile, which) {
+ const vectorTile = new import_vector_tile.VectorTile(new import_pbf.default(data));
+ let features2, cache, layer, i2, feature3, loc, d;
+ if (vectorTile.layers.hasOwnProperty("image")) {
+ features2 = [];
+ cache = _mlyCache.images;
+ layer = vectorTile.layers.image;
+ for (i2 = 0; i2 < layer.length; i2++) {
+ feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
+ loc = feature3.geometry.coordinates;
+ d = {
+ loc,
+ captured_at: feature3.properties.captured_at,
+ ca: feature3.properties.compass_angle,
+ id: feature3.properties.id,
+ is_pano: feature3.properties.is_pano,
+ sequence_id: feature3.properties.sequence_id
+ };
+ cache.forImageId[d.id] = d;
+ features2.push({
+ minX: loc[0],
+ minY: loc[1],
+ maxX: loc[0],
+ maxY: loc[1],
+ data: d
+ });
+ }
+ if (cache.rtree) {
+ cache.rtree.load(features2);
+ }
+ }
+ if (vectorTile.layers.hasOwnProperty("sequence")) {
+ features2 = [];
+ cache = _mlyCache.sequences;
+ layer = vectorTile.layers.sequence;
+ for (i2 = 0; i2 < layer.length; i2++) {
+ feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
+ if (cache.lineString[feature3.properties.id]) {
+ cache.lineString[feature3.properties.id].push(feature3);
+ } else {
+ cache.lineString[feature3.properties.id] = [feature3];
+ }
+ }
+ }
+ if (vectorTile.layers.hasOwnProperty("point")) {
+ features2 = [];
+ cache = _mlyCache[which];
+ layer = vectorTile.layers.point;
+ for (i2 = 0; i2 < layer.length; i2++) {
+ feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
+ loc = feature3.geometry.coordinates;
+ d = {
+ loc,
+ id: feature3.properties.id,
+ first_seen_at: feature3.properties.first_seen_at,
+ last_seen_at: feature3.properties.last_seen_at,
+ value: feature3.properties.value
+ };
+ features2.push({
+ minX: loc[0],
+ minY: loc[1],
+ maxX: loc[0],
+ maxY: loc[1],
+ data: d
+ });
+ }
+ if (cache.rtree) {
+ cache.rtree.load(features2);
+ }
+ }
+ if (vectorTile.layers.hasOwnProperty("traffic_sign")) {
+ features2 = [];
+ cache = _mlyCache[which];
+ layer = vectorTile.layers.traffic_sign;
+ for (i2 = 0; i2 < layer.length; i2++) {
+ feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
+ loc = feature3.geometry.coordinates;
+ d = {
+ loc,
+ id: feature3.properties.id,
+ first_seen_at: feature3.properties.first_seen_at,
+ last_seen_at: feature3.properties.last_seen_at,
+ value: feature3.properties.value
+ };
+ features2.push({
+ minX: loc[0],
+ minY: loc[1],
+ maxX: loc[0],
+ maxY: loc[1],
+ data: d
+ });
+ }
+ if (cache.rtree) {
+ cache.rtree.load(features2);
+ }
+ }
+ }
+ function loadData(url) {
+ return fetch(url).then(function(response) {
+ if (!response.ok) {
+ throw new Error(response.status + " " + response.statusText);
+ }
+ return response.json();
+ }).then(function(result) {
+ if (!result) {
+ return [];
+ }
+ return result.data || [];
+ });
+ }
+ function partitionViewport(projection2) {
+ const z = geoScaleToZoom(projection2.scale());
+ const z2 = Math.ceil(z * 2) / 2 + 2.5;
+ const tiler8 = utilTiler().zoomExtent([z2, z2]);
+ return tiler8.getTiles(projection2).map(function(tile) {
+ return tile.extent;
+ });
+ }
+ function searchLimited(limit, projection2, rtree) {
+ limit = limit || 5;
+ return partitionViewport(projection2).reduce(function(result, extent) {
+ const found = rtree.search(extent.bbox()).slice(0, limit).map(function(d) {
+ return d.data;
+ });
+ return found.length ? result.concat(found) : result;
+ }, []);
+ }
+ var mapillary_default = {
+ init: function() {
+ if (!_mlyCache) {
+ this.reset();
+ }
+ this.event = utilRebind(this, dispatch5, "on");
+ },
+ reset: function() {
+ if (_mlyCache) {
+ Object.values(_mlyCache.requests.inflight).forEach(function(request3) {
+ request3.abort();
+ });
+ }
+ _mlyCache = {
+ images: { rtree: new import_rbush4.default(), forImageId: {} },
+ image_detections: { forImageId: {} },
+ signs: { rtree: new import_rbush4.default() },
+ points: { rtree: new import_rbush4.default() },
+ sequences: { rtree: new import_rbush4.default(), lineString: {} },
+ requests: { loaded: {}, inflight: {} }
+ };
+ _mlyActiveImage = null;
+ },
+ images: function(projection2) {
+ const limit = 5;
+ return searchLimited(limit, projection2, _mlyCache.images.rtree);
+ },
+ signs: function(projection2) {
+ const limit = 5;
+ return searchLimited(limit, projection2, _mlyCache.signs.rtree);
+ },
+ mapFeatures: function(projection2) {
+ const limit = 5;
+ return searchLimited(limit, projection2, _mlyCache.points.rtree);
+ },
+ cachedImage: function(imageId) {
+ return _mlyCache.images.forImageId[imageId];
+ },
+ sequences: function(projection2) {
+ const viewport = projection2.clipExtent();
+ const min3 = [viewport[0][0], viewport[1][1]];
+ const max3 = [viewport[1][0], viewport[0][1]];
+ const bbox = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
+ const sequenceIds = {};
+ let lineStrings = [];
+ _mlyCache.images.rtree.search(bbox).forEach(function(d) {
+ if (d.data.sequence_id) {
+ sequenceIds[d.data.sequence_id] = true;
+ }
+ });
+ Object.keys(sequenceIds).forEach(function(sequenceId) {
+ if (_mlyCache.sequences.lineString[sequenceId]) {
+ lineStrings = lineStrings.concat(_mlyCache.sequences.lineString[sequenceId]);
+ }
+ });
+ return lineStrings;
+ },
+ loadImages: function(projection2) {
+ loadTiles("images", tileUrl, 14, projection2);
+ },
+ loadSigns: function(projection2) {
+ loadTiles("signs", trafficSignTileUrl, 14, projection2);
+ },
+ loadMapFeatures: function(projection2) {
+ loadTiles("points", mapFeatureTileUrl, 14, projection2);
+ },
+ ensureViewerLoaded: function(context) {
+ if (_loadViewerPromise)
+ return _loadViewerPromise;
+ const wrap2 = context.container().select(".photoviewer").selectAll(".mly-wrapper").data([0]);
+ wrap2.enter().append("div").attr("id", "ideditor-mly").attr("class", "photo-wrapper mly-wrapper").classed("hide", true);
+ const that = this;
+ _loadViewerPromise = new Promise((resolve, reject) => {
+ let loadedCount = 0;
+ function loaded() {
+ loadedCount += 1;
+ if (loadedCount === 2)
+ resolve();
+ }
+ const head = select_default2("head");
+ head.selectAll("#ideditor-mapillary-viewercss").data([0]).enter().append("link").attr("id", "ideditor-mapillary-viewercss").attr("rel", "stylesheet").attr("crossorigin", "anonymous").attr("href", context.asset(viewercss)).on("load.serviceMapillary", loaded).on("error.serviceMapillary", function() {
+ reject();
+ });
+ head.selectAll("#ideditor-mapillary-viewerjs").data([0]).enter().append("script").attr("id", "ideditor-mapillary-viewerjs").attr("crossorigin", "anonymous").attr("src", context.asset(viewerjs)).on("load.serviceMapillary", loaded).on("error.serviceMapillary", function() {
+ reject();
+ });
+ }).catch(function() {
+ _loadViewerPromise = null;
+ }).then(function() {
+ that.initViewer(context);
+ });
+ return _loadViewerPromise;
+ },
+ loadSignResources: function(context) {
+ context.ui().svgDefs.addSprites(["mapillary-sprite"], false);
+ return this;
+ },
+ loadObjectResources: function(context) {
+ context.ui().svgDefs.addSprites(["mapillary-object-sprite"], false);
+ return this;
+ },
+ resetTags: function() {
+ if (_mlyViewer && !_mlyFallback) {
+ _mlyViewer.getComponent("tag").removeAll();
+ }
+ },
+ showFeatureDetections: function(value) {
+ _mlyShowFeatureDetections = value;
+ if (!_mlyShowFeatureDetections && !_mlyShowSignDetections) {
+ this.resetTags();
+ }
+ },
+ showSignDetections: function(value) {
+ _mlyShowSignDetections = value;
+ if (!_mlyShowFeatureDetections && !_mlyShowSignDetections) {
+ this.resetTags();
+ }
+ },
+ filterViewer: function(context) {
+ const showsPano = context.photos().showsPanoramic();
+ const showsFlat = context.photos().showsFlat();
+ const fromDate = context.photos().fromDate();
+ const toDate = context.photos().toDate();
+ const filter2 = ["all"];
+ if (!showsPano)
+ filter2.push(["!=", "cameraType", "spherical"]);
+ if (!showsFlat && showsPano)
+ filter2.push(["==", "pano", true]);
+ if (fromDate) {
+ filter2.push([">=", "capturedAt", new Date(fromDate).getTime()]);
+ }
+ if (toDate) {
+ filter2.push([">=", "capturedAt", new Date(toDate).getTime()]);
+ }
+ if (_mlyViewer) {
+ _mlyViewer.setFilter(filter2);
+ }
+ _mlyViewerFilter = filter2;
+ return filter2;
+ },
+ showViewer: function(context) {
+ const wrap2 = context.container().select(".photoviewer").classed("hide", false);
+ const isHidden = wrap2.selectAll(".photo-wrapper.mly-wrapper.hide").size();
+ if (isHidden && _mlyViewer) {
+ wrap2.selectAll(".photo-wrapper:not(.mly-wrapper)").classed("hide", true);
+ wrap2.selectAll(".photo-wrapper.mly-wrapper").classed("hide", false);
+ _mlyViewer.resize();
+ }
+ return this;
+ },
+ hideViewer: function(context) {
+ _mlyActiveImage = null;
+ if (!_mlyFallback && _mlyViewer) {
+ _mlyViewer.getComponent("sequence").stop();
+ }
+ const viewer = context.container().select(".photoviewer");
+ if (!viewer.empty())
+ viewer.datum(null);
+ viewer.classed("hide", true).selectAll(".photo-wrapper").classed("hide", true);
+ this.updateUrlImage(null);
+ dispatch5.call("imageChanged");
+ dispatch5.call("loadedMapFeatures");
+ dispatch5.call("loadedSigns");
+ return this.setStyles(context, null);
+ },
+ updateUrlImage: function(imageId) {
+ if (!window.mocha) {
+ const hash = utilStringQs(window.location.hash);
+ if (imageId) {
+ hash.photo = "mapillary/" + imageId;
+ } else {
+ delete hash.photo;
+ }
+ window.location.replace("#" + utilQsString(hash, true));
+ }
+ },
+ highlightDetection: function(detection) {
+ if (detection) {
+ _mlyHighlightedDetection = detection.id;
+ }
+ return this;
+ },
+ initViewer: function(context) {
+ const that = this;
+ if (!window.mapillary)
+ return;
+ const opts = {
+ accessToken,
+ component: {
+ cover: false,
+ keyboard: false,
+ tag: true
+ },
+ container: "ideditor-mly"
+ };
+ if (!mapillary.isSupported() && mapillary.isFallbackSupported()) {
+ _mlyFallback = true;
+ opts.component = {
+ cover: false,
+ direction: false,
+ imagePlane: false,
+ keyboard: false,
+ mouse: false,
+ sequence: false,
+ tag: false,
+ image: true,
+ navigation: true
+ };
+ }
+ _mlyViewer = new mapillary.Viewer(opts);
+ _mlyViewer.on("image", imageChanged);
+ _mlyViewer.on("bearing", bearingChanged);
+ if (_mlyViewerFilter) {
+ _mlyViewer.setFilter(_mlyViewerFilter);
+ }
+ context.ui().photoviewer.on("resize.mapillary", function() {
+ if (_mlyViewer)
+ _mlyViewer.resize();
+ });
+ function imageChanged(node) {
+ that.resetTags();
+ const image = node.image;
+ that.setActiveImage(image);
+ that.setStyles(context, null);
+ const loc = [image.originalLngLat.lng, image.originalLngLat.lat];
+ context.map().centerEase(loc);
+ that.updateUrlImage(image.id);
+ if (_mlyShowFeatureDetections || _mlyShowSignDetections) {
+ that.updateDetections(image.id, `${apiUrl}/${image.id}/detections?access_token=${accessToken}&fields=id,image,geometry,value`);
+ }
+ dispatch5.call("imageChanged");
+ }
+ function bearingChanged(e) {
+ dispatch5.call("bearingChanged", void 0, e);
+ }
+ },
+ selectImage: function(context, imageId) {
+ if (_mlyViewer && imageId) {
+ _mlyViewer.moveTo(imageId).catch(function(e) {
+ console.error("mly3", e);
+ });
+ }
+ return this;
+ },
+ getActiveImage: function() {
+ return _mlyActiveImage;
+ },
+ getDetections: function(id2) {
+ return loadData(`${apiUrl}/${id2}/detections?access_token=${accessToken}&fields=id,value,image`);
+ },
+ setActiveImage: function(image) {
+ if (image) {
+ _mlyActiveImage = {
+ ca: image.originalCompassAngle,
+ id: image.id,
+ loc: [image.originalLngLat.lng, image.originalLngLat.lat],
+ is_pano: image.cameraType === "spherical",
+ sequence_id: image.sequenceId
+ };
+ } else {
+ _mlyActiveImage = null;
+ }
+ },
+ setStyles: function(context, hovered) {
+ const hoveredImageId = hovered && hovered.id;
+ const hoveredSequenceId = hovered && hovered.sequence_id;
+ const selectedSequenceId = _mlyActiveImage && _mlyActiveImage.sequence_id;
+ context.container().selectAll(".layer-mapillary .viewfield-group").classed("highlighted", function(d) {
+ return d.sequence_id === selectedSequenceId || d.id === hoveredImageId;
+ }).classed("hovered", function(d) {
+ return d.id === hoveredImageId;
+ });
+ context.container().selectAll(".layer-mapillary .sequence").classed("highlighted", function(d) {
+ return d.properties.id === hoveredSequenceId;
+ }).classed("currentView", function(d) {
+ return d.properties.id === selectedSequenceId;
+ });
+ return this;
+ },
+ updateDetections: function(imageId, url) {
+ if (!_mlyViewer || _mlyFallback)
+ return;
+ if (!imageId)
+ return;
+ const cache = _mlyCache.image_detections;
+ if (cache.forImageId[imageId]) {
+ showDetections(_mlyCache.image_detections.forImageId[imageId]);
+ } else {
+ loadData(url).then((detections) => {
+ detections.forEach(function(detection) {
+ if (!cache.forImageId[imageId]) {
+ cache.forImageId[imageId] = [];
+ }
+ cache.forImageId[imageId].push({
+ geometry: detection.geometry,
+ id: detection.id,
+ image_id: imageId,
+ value: detection.value
+ });
+ });
+ showDetections(_mlyCache.image_detections.forImageId[imageId] || []);
+ });
+ }
+ function showDetections(detections) {
+ const tagComponent = _mlyViewer.getComponent("tag");
+ detections.forEach(function(data) {
+ const tag = makeTag(data);
+ if (tag) {
+ tagComponent.add([tag]);
+ }
+ });
+ }
+ function makeTag(data) {
+ const valueParts = data.value.split("--");
+ if (!valueParts.length)
+ return;
+ let tag;
+ let text2;
+ let color2 = 16777215;
+ if (_mlyHighlightedDetection === data.id) {
+ color2 = 16776960;
+ text2 = valueParts[1];
+ if (text2 === "flat" || text2 === "discrete" || text2 === "sign") {
+ text2 = valueParts[2];
+ }
+ text2 = text2.replace(/-/g, " ");
+ text2 = text2.charAt(0).toUpperCase() + text2.slice(1);
+ _mlyHighlightedDetection = null;
+ }
+ var decodedGeometry = window.atob(data.geometry);
+ var uintArray = new Uint8Array(decodedGeometry.length);
+ for (var i2 = 0; i2 < decodedGeometry.length; i2++) {
+ uintArray[i2] = decodedGeometry.charCodeAt(i2);
+ }
+ const tile = new import_vector_tile.VectorTile(new import_pbf.default(uintArray.buffer));
+ const layer = tile.layers["mpy-or"];
+ const geometries = layer.feature(0).loadGeometry();
+ const polygon2 = geometries.map((ring) => ring.map((point) => [point.x / layer.extent, point.y / layer.extent]));
+ tag = new mapillary.OutlineTag(data.id, new mapillary.PolygonGeometry(polygon2[0]), {
+ text: text2,
+ textColor: color2,
+ lineColor: color2,
+ lineWidth: 2,
+ fillColor: color2,
+ fillOpacity: 0.3
+ });
+ return tag;
+ }
+ },
+ cache: function() {
+ return _mlyCache;
+ }
+ };
+
+ // modules/core/validation/models.js
+ function validationIssue(attrs) {
+ this.type = attrs.type;
+ this.subtype = attrs.subtype;
+ this.severity = attrs.severity;
+ this.message = attrs.message;
+ this.reference = attrs.reference;
+ this.entityIds = attrs.entityIds;
+ this.loc = attrs.loc;
+ this.data = attrs.data;
+ this.dynamicFixes = attrs.dynamicFixes;
+ this.hash = attrs.hash;
+ this.id = generateID.apply(this);
+ this.key = generateKey.apply(this);
+ this.autoFix = null;
+ function generateID() {
+ var parts = [this.type];
+ if (this.hash) {
+ parts.push(this.hash);
+ }
+ if (this.subtype) {
+ parts.push(this.subtype);
+ }
+ if (this.entityIds) {
+ var entityKeys = this.entityIds.slice().sort();
+ parts.push.apply(parts, entityKeys);
+ }
+ return parts.join(":");
+ }
+ function generateKey() {
+ return this.id + ":" + Date.now().toString();
+ }
+ this.extent = function(resolver) {
+ if (this.loc) {
+ return geoExtent(this.loc);
+ }
+ if (this.entityIds && this.entityIds.length) {
+ return this.entityIds.reduce(function(extent, entityId) {
+ return extent.extend(resolver.entity(entityId).extent(resolver));
+ }, geoExtent());
+ }
+ return null;
+ };
+ this.fixes = function(context) {
+ var fixes = this.dynamicFixes ? this.dynamicFixes(context) : [];
+ var issue = this;
+ if (issue.severity === "warning") {
+ fixes.push(new validationIssueFix({
+ title: _t.html("issues.fix.ignore_issue.title"),
+ icon: "iD-icon-close",
+ onClick: function() {
+ context.validator().ignoreIssue(this.issue.id);
+ }
+ }));
+ }
+ fixes.forEach(function(fix) {
+ fix.id = fix.title;
+ fix.issue = issue;
+ if (fix.autoArgs) {
+ issue.autoFix = fix;
+ }
+ });
+ return fixes;
+ };
+ }
+ function validationIssueFix(attrs) {
+ this.title = attrs.title;
+ this.onClick = attrs.onClick;
+ this.disabledReason = attrs.disabledReason;
+ this.icon = attrs.icon;
+ this.entityIds = attrs.entityIds || [];
+ this.autoArgs = attrs.autoArgs;
+ this.issue = null;
+ }
+
+ // modules/services/maprules.js
+ var buildRuleChecks = function() {
+ return {
+ equals: function(equals) {
+ return function(tags) {
+ return Object.keys(equals).every(function(k) {
+ return equals[k] === tags[k];
+ });
+ };
+ },
+ notEquals: function(notEquals) {
+ return function(tags) {
+ return Object.keys(notEquals).some(function(k) {
+ return notEquals[k] !== tags[k];
+ });
+ };
+ },
+ absence: function(absence) {
+ return function(tags) {
+ return Object.keys(tags).indexOf(absence) === -1;
+ };
+ },
+ presence: function(presence) {
+ return function(tags) {
+ return Object.keys(tags).indexOf(presence) > -1;
+ };
+ },
+ greaterThan: function(greaterThan) {
+ var key = Object.keys(greaterThan)[0];
+ var value = greaterThan[key];
+ return function(tags) {
+ return tags[key] > value;
+ };
+ },
+ greaterThanEqual: function(greaterThanEqual) {
+ var key = Object.keys(greaterThanEqual)[0];
+ var value = greaterThanEqual[key];
+ return function(tags) {
+ return tags[key] >= value;
+ };
+ },
+ lessThan: function(lessThan) {
+ var key = Object.keys(lessThan)[0];
+ var value = lessThan[key];
+ return function(tags) {
+ return tags[key] < value;
+ };
+ },
+ lessThanEqual: function(lessThanEqual) {
+ var key = Object.keys(lessThanEqual)[0];
+ var value = lessThanEqual[key];
+ return function(tags) {
+ return tags[key] <= value;
+ };
+ },
+ positiveRegex: function(positiveRegex) {
+ var tagKey = Object.keys(positiveRegex)[0];
+ var expression = positiveRegex[tagKey].join("|");
+ var regex = new RegExp(expression);
+ return function(tags) {
+ return regex.test(tags[tagKey]);
+ };
+ },
+ negativeRegex: function(negativeRegex) {
+ var tagKey = Object.keys(negativeRegex)[0];
+ var expression = negativeRegex[tagKey].join("|");
+ var regex = new RegExp(expression);
+ return function(tags) {
+ return !regex.test(tags[tagKey]);
+ };
+ }
+ };
+ };
+ var buildLineKeys = function() {
+ return {
+ highway: {
+ rest_area: true,
+ services: true
+ },
+ railway: {
+ roundhouse: true,
+ station: true,
+ traverser: true,
+ turntable: true,
+ wash: true
+ }
+ };
+ };
+ var maprules_default = {
+ init: function() {
+ this._ruleChecks = buildRuleChecks();
+ this._validationRules = [];
+ this._areaKeys = osmAreaKeys;
+ this._lineKeys = buildLineKeys();
+ },
+ filterRuleChecks: function(selector) {
+ var _ruleChecks = this._ruleChecks;
+ return Object.keys(selector).reduce(function(rules, key) {
+ if (["geometry", "error", "warning"].indexOf(key) === -1) {
+ rules.push(_ruleChecks[key](selector[key]));
+ }
+ return rules;
+ }, []);
+ },
+ buildTagMap: function(selector) {
+ var getRegexValues = function(regexes) {
+ return regexes.map(function(regex) {
+ return regex.replace(/\$|\^/g, "");
+ });
+ };
+ var tagMap = Object.keys(selector).reduce(function(expectedTags, key) {
+ var values;
+ var isRegex = /regex/gi.test(key);
+ var isEqual = /equals/gi.test(key);
+ if (isRegex || isEqual) {
+ Object.keys(selector[key]).forEach(function(selectorKey) {
+ values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
+ if (expectedTags.hasOwnProperty(selectorKey)) {
+ values = values.concat(expectedTags[selectorKey]);
+ }
+ expectedTags[selectorKey] = values;
+ });
+ } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
+ var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
+ values = [selector[key][tagKey]];
+ if (expectedTags.hasOwnProperty(tagKey)) {
+ values = values.concat(expectedTags[tagKey]);
+ }
+ expectedTags[tagKey] = values;
+ }
+ return expectedTags;
+ }, {});
+ return tagMap;
+ },
+ inferGeometry: function(tagMap) {
+ var _lineKeys = this._lineKeys;
+ var _areaKeys = this._areaKeys;
+ var keyValueDoesNotImplyArea = function(key2) {
+ return utilArrayIntersection(tagMap[key2], Object.keys(_areaKeys[key2])).length > 0;
+ };
+ var keyValueImpliesLine = function(key2) {
+ return utilArrayIntersection(tagMap[key2], Object.keys(_lineKeys[key2])).length > 0;
+ };
+ if (tagMap.hasOwnProperty("area")) {
+ if (tagMap.area.indexOf("yes") > -1) {
+ return "area";
+ }
+ if (tagMap.area.indexOf("no") > -1) {
+ return "line";
+ }
+ }
+ for (var key in tagMap) {
+ if (key in _areaKeys && !keyValueDoesNotImplyArea(key)) {
+ return "area";
+ }
+ if (key in _lineKeys && keyValueImpliesLine(key)) {
+ return "area";
+ }
+ }
+ return "line";
+ },
+ addRule: function(selector) {
+ var rule = {
+ checks: this.filterRuleChecks(selector),
+ matches: function(entity) {
+ return this.checks.every(function(check) {
+ return check(entity.tags);
+ });
+ },
+ inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
+ geometryMatches: function(entity, graph) {
+ if (entity.type === "node" || entity.type === "relation") {
+ return selector.geometry === entity.type;
+ } else if (entity.type === "way") {
+ return this.inferredGeometry === entity.geometry(graph);
+ }
+ },
+ findIssues: function(entity, graph, issues) {
+ if (this.geometryMatches(entity, graph) && this.matches(entity)) {
+ var severity = Object.keys(selector).indexOf("error") > -1 ? "error" : "warning";
+ var message = selector[severity];
+ issues.push(new validationIssue({
+ type: "maprules",
+ severity,
+ message: function() {
+ return message;
+ },
+ entityIds: [entity.id]
+ }));
+ }
+ }
+ };
+ this._validationRules.push(rule);
+ },
+ clearRules: function() {
+ this._validationRules = [];
+ },
+ validationRules: function() {
+ return this._validationRules;
+ },
+ ruleChecks: function() {
+ return this._ruleChecks;
+ }
+ };
+
+ // modules/services/nominatim.js
+ var import_rbush5 = __toESM(require_rbush_min());
+ var apibase = "https://nominatim.openstreetmap.org/";
+ var _inflight = {};
+ var _nominatimCache;
+ var nominatim_default = {
+ init: function() {
+ _inflight = {};
+ _nominatimCache = new import_rbush5.default();
+ },
+ reset: function() {
+ Object.values(_inflight).forEach(function(controller) {
+ controller.abort();
+ });
+ _inflight = {};
+ _nominatimCache = new import_rbush5.default();
+ },
+ countryCode: function(location, callback) {
+ this.reverse(location, function(err, result) {
+ if (err) {
+ return callback(err);
+ } else if (result.address) {
+ return callback(null, result.address.country_code);
+ } else {
+ return callback("Unable to geocode", null);
+ }
+ });
+ },
+ reverse: function(loc, callback) {
+ var cached = _nominatimCache.search({ minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] });
+ if (cached.length > 0) {
+ if (callback)
+ callback(null, cached[0].data);
+ return;
+ }
+ var params = { zoom: 13, format: "json", addressdetails: 1, lat: loc[1], lon: loc[0] };
+ var url = apibase + "reverse?" + utilQsString(params);
+ if (_inflight[url])
+ return;
+ var controller = new AbortController();
+ _inflight[url] = controller;
+ json_default(url, { signal: controller.signal }).then(function(result) {
+ delete _inflight[url];
+ if (result && result.error) {
+ throw new Error(result.error);
+ }
+ var extent = geoExtent(loc).padByMeters(200);
+ _nominatimCache.insert(Object.assign(extent.bbox(), { data: result }));
+ if (callback)
+ callback(null, result);
+ }).catch(function(err) {
+ delete _inflight[url];
+ if (err.name === "AbortError")
+ return;
+ if (callback)
+ callback(err.message);
+ });
+ },
+ search: function(val, callback) {
+ var searchVal = encodeURIComponent(val);
+ var url = apibase + "search/" + searchVal + "?limit=10&format=json";
+ if (_inflight[url])
+ return;
+ var controller = new AbortController();
+ _inflight[url] = controller;
+ json_default(url, { signal: controller.signal }).then(function(result) {
+ delete _inflight[url];
+ if (result && result.error) {
+ throw new Error(result.error);
+ }
+ if (callback)
+ callback(null, result);
+ }).catch(function(err) {
+ delete _inflight[url];
+ if (err.name === "AbortError")
+ return;
+ if (callback)
+ callback(err.message);
+ });
+ }
+ };
+
+ // node_modules/name-suggestion-index/lib/matcher.js
+ var import_which_polygon3 = __toESM(require_which_polygon(), 1);
+
+ // node_modules/name-suggestion-index/lib/simplify.js
+ var import_diacritics2 = __toESM(require_diacritics(), 1);
+ function simplify(str2) {
+ if (typeof str2 !== "string")
+ return "";
+ return import_diacritics2.default.remove(str2.replace(/&/g, "and").replace(/İ/ig, "i").replace(/[\s\-=_!"#%'*{},.\/:;?\(\)\[\]@\\$\^*+<>«»~`’\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2000-\u206f\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00-\u2e7f\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\ufeff\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g, "").toLowerCase());
+ }
+
+ // node_modules/name-suggestion-index/config/matchGroups.json
+ var matchGroups = {
+ adult_gaming_centre: [
+ "amenity/casino",
+ "amenity/gambling",
+ "leisure/adult_gaming_centre"
+ ],
+ beauty: [
+ "shop/beauty",
+ "shop/hairdresser_supply"
+ ],
+ bed: [
+ "shop/bed",
+ "shop/furniture"
+ ],
+ beverages: [
+ "shop/alcohol",
+ "shop/beer",
+ "shop/beverages",
+ "shop/kiosk",
+ "shop/wine"
+ ],
+ camping: [
+ "tourism/camp_site",
+ "tourism/caravan_site"
+ ],
+ car_parts: [
+ "shop/car_parts",
+ "shop/car_repair",
+ "shop/tires",
+ "shop/tyres"
+ ],
+ clinic: [
+ "amenity/clinic",
+ "amenity/doctors",
+ "healthcare/clinic",
+ "healthcare/laboratory",
+ "healthcare/physiotherapist",
+ "healthcare/sample_collection",
+ "healthcare/dialysis"
+ ],
+ convenience: [
+ "shop/beauty",
+ "shop/chemist",
+ "shop/convenience",
+ "shop/cosmetics",
+ "shop/grocery",
+ "shop/kiosk",
+ "shop/newsagent",
+ "shop/perfumery"
+ ],
+ coworking: [
+ "amenity/coworking_space",
+ "office/coworking",
+ "office/coworking_space"
+ ],
+ dentist: [
+ "amenity/dentist",
+ "amenity/doctors",
+ "healthcare/dentist"
+ ],
+ electronics: [
+ "office/telecommunication",
+ "shop/computer",
+ "shop/electronics",
+ "shop/hifi",
+ "shop/kiosk",
+ "shop/mobile",
+ "shop/mobile_phone",
+ "shop/telecommunication"
+ ],
+ fabric: [
+ "shop/fabric",
+ "shop/haberdashery",
+ "shop/sewing"
+ ],
+ fashion: [
+ "shop/accessories",
+ "shop/bag",
+ "shop/boutique",
+ "shop/clothes",
+ "shop/department_store",
+ "shop/fashion",
+ "shop/fashion_accessories",
+ "shop/sports",
+ "shop/shoes"
+ ],
+ financial: [
+ "amenity/bank",
+ "office/accountant",
+ "office/financial",
+ "office/financial_advisor",
+ "office/tax_advisor",
+ "shop/tax"
+ ],
+ fitness: [
+ "leisure/fitness_centre",
+ "leisure/fitness_center",
+ "leisure/sports_centre",
+ "leisure/sports_center"
+ ],
+ food: [
+ "amenity/bar",
+ "amenity/cafe",
+ "amenity/fast_food",
+ "amenity/ice_cream",
+ "amenity/pub",
+ "amenity/restaurant",
+ "shop/bakery",
+ "shop/candy",
+ "shop/chocolate",
+ "shop/coffee",
+ "shop/confectionary",
+ "shop/confectionery",
+ "shop/food",
+ "shop/kiosk",
+ "shop/ice_cream",
+ "shop/pastry",
+ "shop/tea"
+ ],
+ fuel: [
+ "amenity/fuel",
+ "shop/gas",
+ "shop/convenience;gas",
+ "shop/gas;convenience"
+ ],
+ gift: [
+ "shop/gift",
+ "shop/card",
+ "shop/cards",
+ "shop/kiosk",
+ "shop/stationery"
+ ],
+ hardware: [
+ "shop/bathroom_furnishing",
+ "shop/carpet",
+ "shop/diy",
+ "shop/doityourself",
+ "shop/doors",
+ "shop/electrical",
+ "shop/flooring",
+ "shop/hardware",
+ "shop/hardware_store",
+ "shop/power_tools",
+ "shop/tool_hire",
+ "shop/tools",
+ "shop/trade"
+ ],
+ health_food: [
+ "shop/health",
+ "shop/health_food",
+ "shop/herbalist",
+ "shop/nutrition_supplements"
+ ],
+ hobby: [
+ "shop/electronics",
+ "shop/hobby",
+ "shop/books",
+ "shop/games",
+ "shop/collector",
+ "shop/toys",
+ "shop/model",
+ "shop/video_games",
+ "shop/anime"
+ ],
+ hospital: [
+ "amenity/doctors",
+ "amenity/hospital",
+ "healthcare/hospital"
+ ],
+ houseware: [
+ "shop/houseware",
+ "shop/interior_decoration"
+ ],
+ lifeboat_station: [
+ "amenity/lifeboat_station",
+ "emergency/lifeboat_station",
+ "emergency/marine_rescue"
+ ],
+ lodging: [
+ "tourism/hotel",
+ "tourism/motel"
+ ],
+ money_transfer: [
+ "amenity/money_transfer",
+ "shop/money_transfer"
+ ],
+ office_supplies: [
+ "shop/office_supplies",
+ "shop/stationary",
+ "shop/stationery"
+ ],
+ outdoor: [
+ "shop/clothes",
+ "shop/outdoor",
+ "shop/sports"
+ ],
+ parcel_locker: [
+ "amenity/parcel_locker",
+ "amenity/vending_machine"
+ ],
+ pharmacy: [
+ "amenity/doctors",
+ "amenity/pharmacy",
+ "healthcare/pharmacy"
+ ],
+ playground: [
+ "amenity/theme_park",
+ "leisure/amusement_arcade",
+ "leisure/playground"
+ ],
+ rental: [
+ "amenity/bicycle_rental",
+ "amenity/boat_rental",
+ "amenity/car_rental",
+ "amenity/truck_rental",
+ "amenity/vehicle_rental",
+ "shop/kiosk",
+ "shop/rental"
+ ],
+ school: [
+ "amenity/childcare",
+ "amenity/college",
+ "amenity/kindergarten",
+ "amenity/language_school",
+ "amenity/prep_school",
+ "amenity/school",
+ "amenity/university"
+ ],
+ storage: [
+ "shop/storage_units",
+ "shop/storage_rental"
+ ],
+ substation: [
+ "power/station",
+ "power/substation",
+ "power/sub_station"
+ ],
+ supermarket: [
+ "shop/food",
+ "shop/frozen_food",
+ "shop/greengrocer",
+ "shop/grocery",
+ "shop/supermarket",
+ "shop/wholesale"
+ ],
+ variety_store: [
+ "shop/variety_store",
+ "shop/discount",
+ "shop/convenience"
+ ],
+ vending: [
+ "amenity/vending_machine",
+ "shop/kiosk",
+ "shop/vending_machine"
+ ],
+ weight_loss: [
+ "amenity/clinic",
+ "amenity/doctors",
+ "amenity/weight_clinic",
+ "healthcare/counselling",
+ "leisure/fitness_centre",
+ "office/therapist",
+ "shop/beauty",
+ "shop/diet",
+ "shop/food",
+ "shop/health_food",
+ "shop/herbalist",
+ "shop/nutrition",
+ "shop/nutrition_supplements",
+ "shop/weight_loss"
+ ],
+ wholesale: [
+ "shop/wholesale",
+ "shop/supermarket",
+ "shop/department_store"
+ ]
+ };
+ var matchGroups_default = {
+ matchGroups
+ };
+
+ // node_modules/name-suggestion-index/config/genericWords.json
+ var genericWords = [
+ "^(barn|bazaa?r|bench|bou?tique|building|casa|church)$",
+ "^(baseball|basketball|football|soccer|softball|tennis(halle)?)\\s?(field|court)?$",
+ "^(club|green|out|ware)\\s?house$",
+ "^(driveway|el \xE1rbol|fountain|generic|golf|government|graveyard)$",
+ "^(fixme|n\\s?\\/?\\s?a|name|no\\s?name|none|null|temporary|test|unknown)$",
+ "^(hofladen|librairie|magazine?|maison)$",
+ "^(mobile home|skate)?\\s?park$",
+ "^(obuwie|pond|pool|sale|shops?|sklep|stores?)$",
+ "^\\?+$",
+ "^private$",
+ "^tattoo( studio)?$",
+ "^windmill$",
+ "^\u0446\u0435\u0440\u043A\u043E\u0432\u043D\u0430\u044F( \u043B\u0430\u0432\u043A\u0430)?$"
+ ];
+ var genericWords_default = {
+ genericWords
+ };
+
+ // node_modules/name-suggestion-index/config/trees.json
+ var trees = {
+ brands: {
+ emoji: "\u{1F354}",
+ mainTag: "brand:wikidata",
+ sourceTags: ["brand", "name"],
+ nameTags: {
+ primary: "^(name|name:\\w+)$",
+ alternate: "^(brand|brand:\\w+|operator|operator:\\w+|\\w+_name|\\w+_name:\\w+)$"
+ }
+ },
+ flags: {
+ emoji: "\u{1F6A9}",
+ mainTag: "flag:wikidata",
+ nameTags: {
+ primary: "^(flag:name|flag:name:\\w+)$",
+ alternate: "^(country|country:\\w+|flag|flag:\\w+|subject|subject:\\w+)$"
+ }
+ },
+ operators: {
+ emoji: "\u{1F4BC}",
+ mainTag: "operator:wikidata",
+ sourceTags: ["operator"],
+ nameTags: {
+ primary: "^(name|name:\\w+|operator|operator:\\w+)$",
+ alternate: "^(brand|brand:\\w+|\\w+_name|\\w+_name:\\w+)$"
+ }
+ },
+ transit: {
+ emoji: "\u{1F687}",
+ mainTag: "network:wikidata",
+ sourceTags: ["network"],
+ nameTags: {
+ primary: "^network$",
+ alternate: "^(operator|operator:\\w+|network:\\w+|\\w+_name|\\w+_name:\\w+)$"
+ }
+ }
+ };
+ var trees_default = {
+ trees
+ };
+
+ // node_modules/name-suggestion-index/lib/matcher.js
+ var matchGroups2 = matchGroups_default.matchGroups;
+ var trees2 = trees_default.trees;
+ var Matcher = class {
+ constructor() {
+ this.matchIndex = void 0;
+ this.genericWords = /* @__PURE__ */ new Map();
+ (genericWords_default.genericWords || []).forEach((s) => this.genericWords.set(s, new RegExp(s, "i")));
+ this.itemLocation = void 0;
+ this.locationSets = void 0;
+ this.locationIndex = void 0;
+ this.warnings = [];
+ }
+ buildMatchIndex(data) {
+ const that = this;
+ if (that.matchIndex)
+ return;
+ that.matchIndex = /* @__PURE__ */ new Map();
+ const seenTree = /* @__PURE__ */ new Map();
+ Object.keys(data).forEach((tkv) => {
+ const category = data[tkv];
+ const parts = tkv.split("/", 3);
+ const t = parts[0];
+ const k = parts[1];
+ const v = parts[2];
+ const thiskv = `${k}/${v}`;
+ const tree = trees2[t];
+ let branch = that.matchIndex.get(thiskv);
+ if (!branch) {
+ branch = {
+ primary: /* @__PURE__ */ new Map(),
+ alternate: /* @__PURE__ */ new Map(),
+ excludeGeneric: /* @__PURE__ */ new Map(),
+ excludeNamed: /* @__PURE__ */ new Map()
+ };
+ that.matchIndex.set(thiskv, branch);
+ }
+ const properties = category.properties || {};
+ const exclude = properties.exclude || {};
+ (exclude.generic || []).forEach((s) => branch.excludeGeneric.set(s, new RegExp(s, "i")));
+ (exclude.named || []).forEach((s) => branch.excludeNamed.set(s, new RegExp(s, "i")));
+ const excludeRegexes = [...branch.excludeGeneric.values(), ...branch.excludeNamed.values()];
+ let items = category.items;
+ if (!Array.isArray(items) || !items.length)
+ return;
+ const primaryName = new RegExp(tree.nameTags.primary, "i");
+ const alternateName = new RegExp(tree.nameTags.alternate, "i");
+ const notName = /:(colou?r|type|forward|backward|left|right|etymology|pronunciation|wikipedia)$/i;
+ const skipGenericKV = skipGenericKVMatches(t, k, v);
+ const genericKV = /* @__PURE__ */ new Set([`${k}/yes`, `building/yes`]);
+ const matchGroupKV = /* @__PURE__ */ new Set();
+ Object.values(matchGroups2).forEach((matchGroup) => {
+ const inGroup = matchGroup.some((otherkv) => otherkv === thiskv);
+ if (!inGroup)
+ return;
+ matchGroup.forEach((otherkv) => {
+ if (otherkv === thiskv)
+ return;
+ matchGroupKV.add(otherkv);
+ const otherk = otherkv.split("/", 2)[0];
+ genericKV.add(`${otherk}/yes`);
+ });
+ });
+ items.forEach((item) => {
+ if (!item.id)
+ return;
+ if (Array.isArray(item.matchTags) && item.matchTags.length) {
+ item.matchTags = item.matchTags.filter((matchTag) => !matchGroupKV.has(matchTag) && !genericKV.has(matchTag));
+ if (!item.matchTags.length)
+ delete item.matchTags;
+ }
+ let kvTags = [`${thiskv}`].concat(item.matchTags || []);
+ if (!skipGenericKV) {
+ kvTags = kvTags.concat(Array.from(genericKV));
+ }
+ Object.keys(item.tags).forEach((osmkey) => {
+ if (notName.test(osmkey))
+ return;
+ const osmvalue = item.tags[osmkey];
+ if (!osmvalue || excludeRegexes.some((regex) => regex.test(osmvalue)))
+ return;
+ if (primaryName.test(osmkey)) {
+ kvTags.forEach((kv) => insertName("primary", t, kv, simplify(osmvalue), item.id));
+ } else if (alternateName.test(osmkey)) {
+ kvTags.forEach((kv) => insertName("alternate", t, kv, simplify(osmvalue), item.id));
+ }
+ });
+ let keepMatchNames = /* @__PURE__ */ new Set();
+ (item.matchNames || []).forEach((matchName) => {
+ const nsimple = simplify(matchName);
+ kvTags.forEach((kv) => {
+ const branch2 = that.matchIndex.get(kv);
+ const primaryLeaf = branch2 && branch2.primary.get(nsimple);
+ const alternateLeaf = branch2 && branch2.alternate.get(nsimple);
+ const inPrimary = primaryLeaf && primaryLeaf.has(item.id);
+ const inAlternate = alternateLeaf && alternateLeaf.has(item.id);
+ if (!inPrimary && !inAlternate) {
+ insertName("alternate", t, kv, nsimple, item.id);
+ keepMatchNames.add(matchName);
+ }
+ });
+ });
+ if (keepMatchNames.size) {
+ item.matchNames = Array.from(keepMatchNames);
+ } else {
+ delete item.matchNames;
+ }
+ });
+ });
+ function insertName(which, t, kv, nsimple, itemID) {
+ if (!nsimple) {
+ that.warnings.push(`Warning: skipping empty ${which} name for item ${t}/${kv}: ${itemID}`);
+ return;
+ }
+ let branch = that.matchIndex.get(kv);
+ if (!branch) {
+ branch = {
+ primary: /* @__PURE__ */ new Map(),
+ alternate: /* @__PURE__ */ new Map(),
+ excludeGeneric: /* @__PURE__ */ new Map(),
+ excludeNamed: /* @__PURE__ */ new Map()
+ };
+ that.matchIndex.set(kv, branch);
+ }
+ let leaf = branch[which].get(nsimple);
+ if (!leaf) {
+ leaf = /* @__PURE__ */ new Set();
+ branch[which].set(nsimple, leaf);
+ }
+ leaf.add(itemID);
+ if (!/yes$/.test(kv)) {
+ const kvnsimple = `${kv}/${nsimple}`;
+ const existing = seenTree.get(kvnsimple);
+ if (existing && existing !== t) {
+ const items = Array.from(leaf);
+ that.warnings.push(`Duplicate cache key "${kvnsimple}" in trees "${t}" and "${existing}", check items: ${items}`);
+ return;
+ }
+ seenTree.set(kvnsimple, t);
+ }
+ }
+ function skipGenericKVMatches(t, k, v) {
+ return t === "flags" || t === "transit" || k === "landuse" || v === "atm" || v === "bicycle_parking" || v === "car_sharing" || v === "caravan_site" || v === "charging_station" || v === "dog_park" || v === "parking" || v === "phone" || v === "playground" || v === "post_box" || v === "public_bookcase" || v === "recycling" || v === "vending_machine";
+ }
+ }
+ buildLocationIndex(data, loco) {
+ const that = this;
+ if (that.locationIndex)
+ return;
+ that.itemLocation = /* @__PURE__ */ new Map();
+ that.locationSets = /* @__PURE__ */ new Map();
+ Object.keys(data).forEach((tkv) => {
+ const items = data[tkv].items;
+ if (!Array.isArray(items) || !items.length)
+ return;
+ items.forEach((item) => {
+ if (that.itemLocation.has(item.id))
+ return;
+ let resolved;
+ try {
+ resolved = loco.resolveLocationSet(item.locationSet);
+ } catch (err) {
+ console.warn(`buildLocationIndex: ${err.message}`);
+ }
+ if (!resolved || !resolved.id)
+ return;
+ that.itemLocation.set(item.id, resolved.id);
+ if (that.locationSets.has(resolved.id))
+ return;
+ let feature3 = _cloneDeep2(resolved.feature);
+ feature3.id = resolved.id;
+ feature3.properties.id = resolved.id;
+ if (!feature3.geometry.coordinates.length || !feature3.properties.area) {
+ console.warn(`buildLocationIndex: locationSet ${resolved.id} for ${item.id} resolves to an empty feature:`);
+ console.warn(JSON.stringify(feature3));
+ return;
+ }
+ that.locationSets.set(resolved.id, feature3);
+ });
+ });
+ that.locationIndex = (0, import_which_polygon3.default)({ type: "FeatureCollection", features: [...that.locationSets.values()] });
+ function _cloneDeep2(obj) {
+ return JSON.parse(JSON.stringify(obj));
+ }
+ }
+ match(k, v, n2, loc) {
+ const that = this;
+ if (!that.matchIndex) {
+ throw new Error("match: matchIndex not built.");
+ }
+ let matchLocations;
+ if (Array.isArray(loc) && that.locationIndex) {
+ matchLocations = that.locationIndex([loc[0], loc[1], loc[0], loc[1]], true);
+ }
+ const nsimple = simplify(n2);
+ let seen = /* @__PURE__ */ new Set();
+ let results = [];
+ gatherResults("primary");
+ gatherResults("alternate");
+ if (results.length)
+ return results;
+ gatherResults("exclude");
+ return results.length ? results : null;
+ function gatherResults(which) {
+ const kv = `${k}/${v}`;
+ let didMatch = tryMatch(which, kv);
+ if (didMatch)
+ return;
+ for (let mg in matchGroups2) {
+ const matchGroup = matchGroups2[mg];
+ const inGroup = matchGroup.some((otherkv) => otherkv === kv);
+ if (!inGroup)
+ continue;
+ for (let i2 = 0; i2 < matchGroup.length; i2++) {
+ const otherkv = matchGroup[i2];
+ if (otherkv === kv)
+ continue;
+ didMatch = tryMatch(which, otherkv);
+ if (didMatch)
+ return;
+ }
+ }
+ if (which === "exclude") {
+ const regex = [...that.genericWords.values()].find((regex2) => regex2.test(n2));
+ if (regex) {
+ results.push({ match: "excludeGeneric", pattern: String(regex) });
+ return;
+ }
+ }
+ }
+ function tryMatch(which, kv) {
+ const branch = that.matchIndex.get(kv);
+ if (!branch)
+ return;
+ if (which === "exclude") {
+ let regex = [...branch.excludeNamed.values()].find((regex2) => regex2.test(n2));
+ if (regex) {
+ results.push({ match: "excludeNamed", pattern: String(regex), kv });
+ return;
+ }
+ regex = [...branch.excludeGeneric.values()].find((regex2) => regex2.test(n2));
+ if (regex) {
+ results.push({ match: "excludeGeneric", pattern: String(regex), kv });
+ return;
+ }
+ return;
+ }
+ const leaf = branch[which].get(nsimple);
+ if (!leaf || !leaf.size)
+ return;
+ let hits = Array.from(leaf).map((itemID) => {
+ let area = Infinity;
+ if (that.itemLocation && that.locationSets) {
+ const location = that.locationSets.get(that.itemLocation.get(itemID));
+ area = location && location.properties.area || Infinity;
+ }
+ return { match: which, itemID, area, kv, nsimple };
+ });
+ let sortFn = byAreaDescending;
+ if (matchLocations) {
+ hits = hits.filter(isValidLocation);
+ sortFn = byAreaAscending;
+ }
+ if (!hits.length)
+ return;
+ hits.sort(sortFn).forEach((hit) => {
+ if (seen.has(hit.itemID))
+ return;
+ seen.add(hit.itemID);
+ results.push(hit);
+ });
+ return true;
+ function isValidLocation(hit) {
+ if (!that.itemLocation)
+ return true;
+ return matchLocations.find((props) => props.id === that.itemLocation.get(hit.itemID));
+ }
+ function byAreaAscending(hitA, hitB) {
+ return hitA.area - hitB.area;
+ }
+ function byAreaDescending(hitA, hitB) {
+ return hitB.area - hitA.area;
+ }
+ }
+ }
+ getWarnings() {
+ return this.warnings;
+ }
+ };
+
+ // modules/services/nsi.js
+ var import_vparse2 = __toESM(require_vparse());
+
+ // modules/core/difference.js
+ var import_fast_deep_equal3 = __toESM(require_fast_deep_equal());
+ function coreDifference(base, head) {
+ var _changes = {};
+ var _didChange = {};
+ var _diff = {};
+ function checkEntityID(id2) {
+ var h = head.entities[id2];
+ var b = base.entities[id2];
+ if (h === b)
+ return;
+ if (_changes[id2])
+ return;
+ if (!h && b) {
+ _changes[id2] = { base: b, head: h };
+ _didChange.deletion = true;
+ return;
+ }
+ if (h && !b) {
+ _changes[id2] = { base: b, head: h };
+ _didChange.addition = true;
+ return;
+ }
+ if (h && b) {
+ if (h.members && b.members && !(0, import_fast_deep_equal3.default)(h.members, b.members)) {
+ _changes[id2] = { base: b, head: h };
+ _didChange.geometry = true;
+ _didChange.properties = true;
+ return;
+ }
+ if (h.loc && b.loc && !geoVecEqual(h.loc, b.loc)) {
+ _changes[id2] = { base: b, head: h };
+ _didChange.geometry = true;
+ }
+ if (h.nodes && b.nodes && !(0, import_fast_deep_equal3.default)(h.nodes, b.nodes)) {
+ _changes[id2] = { base: b, head: h };
+ _didChange.geometry = true;
+ }
+ if (h.tags && b.tags && !(0, import_fast_deep_equal3.default)(h.tags, b.tags)) {
+ _changes[id2] = { base: b, head: h };
+ _didChange.properties = true;
+ }
+ }
+ }
+ function load() {
+ var ids = utilArrayUniq(Object.keys(head.entities).concat(Object.keys(base.entities)));
+ for (var i2 = 0; i2 < ids.length; i2++) {
+ checkEntityID(ids[i2]);
+ }
+ }
+ load();
+ _diff.length = function length() {
+ return Object.keys(_changes).length;
+ };
+ _diff.changes = function changes() {
+ return _changes;
+ };
+ _diff.didChange = _didChange;
+ _diff.extantIDs = function extantIDs(includeRelMembers) {
+ var result = /* @__PURE__ */ new Set();
+ Object.keys(_changes).forEach(function(id2) {
+ if (_changes[id2].head) {
+ result.add(id2);
+ }
+ var h = _changes[id2].head;
+ var b = _changes[id2].base;
+ var entity = h || b;
+ if (includeRelMembers && entity.type === "relation") {
+ var mh = h ? h.members.map(function(m) {
+ return m.id;
+ }) : [];
+ var mb = b ? b.members.map(function(m) {
+ return m.id;
+ }) : [];
+ utilArrayUnion(mh, mb).forEach(function(memberID) {
+ if (head.hasEntity(memberID)) {
+ result.add(memberID);
+ }
+ });
+ }
+ });
+ return Array.from(result);
+ };
+ _diff.modified = function modified() {
+ var result = [];
+ Object.values(_changes).forEach(function(change) {
+ if (change.base && change.head) {
+ result.push(change.head);
+ }
+ });
+ return result;
+ };
+ _diff.created = function created() {
+ var result = [];
+ Object.values(_changes).forEach(function(change) {
+ if (!change.base && change.head) {
+ result.push(change.head);
+ }
+ });
+ return result;
+ };
+ _diff.deleted = function deleted() {
+ var result = [];
+ Object.values(_changes).forEach(function(change) {
+ if (change.base && !change.head) {
+ result.push(change.base);
+ }
+ });
+ return result;
+ };
+ _diff.summary = function summary() {
+ var relevant = {};
+ var keys = Object.keys(_changes);
+ for (var i2 = 0; i2 < keys.length; i2++) {
+ var change = _changes[keys[i2]];
+ if (change.head && change.head.geometry(head) !== "vertex") {
+ addEntity(change.head, head, change.base ? "modified" : "created");
+ } else if (change.base && change.base.geometry(base) !== "vertex") {
+ addEntity(change.base, base, "deleted");
+ } else if (change.base && change.head) {
+ var moved = !(0, import_fast_deep_equal3.default)(change.base.loc, change.head.loc);
+ var retagged = !(0, import_fast_deep_equal3.default)(change.base.tags, change.head.tags);
+ if (moved) {
+ addParents(change.head);
+ }
+ if (retagged || moved && change.head.hasInterestingTags()) {
+ addEntity(change.head, head, "modified");
+ }
+ } else if (change.head && change.head.hasInterestingTags()) {
+ addEntity(change.head, head, "created");
+ } else if (change.base && change.base.hasInterestingTags()) {
+ addEntity(change.base, base, "deleted");
+ }
+ }
+ return Object.values(relevant);
+ function addEntity(entity, graph, changeType) {
+ relevant[entity.id] = {
+ entity,
+ graph,
+ changeType
+ };
+ }
+ function addParents(entity) {
+ var parents = head.parentWays(entity);
+ for (var j2 = parents.length - 1; j2 >= 0; j2--) {
+ var parent = parents[j2];
+ if (!(parent.id in relevant)) {
+ addEntity(parent, head, "modified");
+ }
+ }
+ }
+ };
+ _diff.complete = function complete(extent) {
+ var result = {};
+ var id2, change;
+ for (id2 in _changes) {
+ change = _changes[id2];
+ var h = change.head;
+ var b = change.base;
+ var entity = h || b;
+ var i2;
+ if (extent && (!h || !h.intersects(extent, head)) && (!b || !b.intersects(extent, base))) {
+ continue;
+ }
+ result[id2] = h;
+ if (entity.type === "way") {
+ var nh = h ? h.nodes : [];
+ var nb = b ? b.nodes : [];
+ var diff;
+ diff = utilArrayDifference(nh, nb);
+ for (i2 = 0; i2 < diff.length; i2++) {
+ result[diff[i2]] = head.hasEntity(diff[i2]);
+ }
+ diff = utilArrayDifference(nb, nh);
+ for (i2 = 0; i2 < diff.length; i2++) {
+ result[diff[i2]] = head.hasEntity(diff[i2]);
+ }
+ }
+ if (entity.type === "relation" && entity.isMultipolygon()) {
+ var mh = h ? h.members.map(function(m) {
+ return m.id;
+ }) : [];
+ var mb = b ? b.members.map(function(m) {
+ return m.id;
+ }) : [];
+ var ids = utilArrayUnion(mh, mb);
+ for (i2 = 0; i2 < ids.length; i2++) {
+ var member = head.hasEntity(ids[i2]);
+ if (!member)
+ continue;
+ if (extent && !member.intersects(extent, head))
+ continue;
+ result[ids[i2]] = member;
+ }
+ }
+ addParents(head.parentWays(entity), result);
+ addParents(head.parentRelations(entity), result);
+ }
+ return result;
+ function addParents(parents, result2) {
+ for (var i3 = 0; i3 < parents.length; i3++) {
+ var parent = parents[i3];
+ if (parent.id in result2)
+ continue;
+ result2[parent.id] = parent;
+ addParents(head.parentRelations(parent), result2);
+ }
+ }
+ };
+ return _diff;
+ }
+
+ // modules/core/tree.js
+ var import_rbush6 = __toESM(require_rbush_min());
+ function coreTree(head) {
+ var _rtree = new import_rbush6.default();
+ var _bboxes = {};
+ var _segmentsRTree = new import_rbush6.default();
+ var _segmentsBBoxes = {};
+ var _segmentsByWayId = {};
+ var tree = {};
+ function entityBBox(entity) {
+ var bbox = entity.extent(head).bbox();
+ bbox.id = entity.id;
+ _bboxes[entity.id] = bbox;
+ return bbox;
+ }
+ function segmentBBox(segment) {
+ var extent = segment.extent(head);
+ if (!extent)
+ return null;
+ var bbox = extent.bbox();
+ bbox.segment = segment;
+ _segmentsBBoxes[segment.id] = bbox;
+ return bbox;
+ }
+ function removeEntity(entity) {
+ _rtree.remove(_bboxes[entity.id]);
+ delete _bboxes[entity.id];
+ if (_segmentsByWayId[entity.id]) {
+ _segmentsByWayId[entity.id].forEach(function(segment) {
+ _segmentsRTree.remove(_segmentsBBoxes[segment.id]);
+ delete _segmentsBBoxes[segment.id];
+ });
+ delete _segmentsByWayId[entity.id];
+ }
+ }
+ function loadEntities(entities) {
+ _rtree.load(entities.map(entityBBox));
+ var segments = [];
+ entities.forEach(function(entity) {
+ if (entity.segments) {
+ var entitySegments = entity.segments(head);
+ _segmentsByWayId[entity.id] = entitySegments;
+ segments = segments.concat(entitySegments);
+ }
+ });
+ if (segments.length)
+ _segmentsRTree.load(segments.map(segmentBBox).filter(Boolean));
+ }
+ function updateParents(entity, insertions, memo) {
+ head.parentWays(entity).forEach(function(way) {
+ if (_bboxes[way.id]) {
+ removeEntity(way);
+ insertions[way.id] = way;
+ }
+ updateParents(way, insertions, memo);
+ });
+ head.parentRelations(entity).forEach(function(relation) {
+ if (memo[entity.id])
+ return;
+ memo[entity.id] = true;
+ if (_bboxes[relation.id]) {
+ removeEntity(relation);
+ insertions[relation.id] = relation;
+ }
+ updateParents(relation, insertions, memo);
+ });
+ }
+ tree.rebase = function(entities, force) {
+ var insertions = {};
+ for (var i2 = 0; i2 < entities.length; i2++) {
+ var entity = entities[i2];
+ if (!entity.visible)
+ continue;
+ if (head.entities.hasOwnProperty(entity.id) || _bboxes[entity.id]) {
+ if (!force) {
+ continue;
+ } else if (_bboxes[entity.id]) {
+ removeEntity(entity);
+ }
+ }
+ insertions[entity.id] = entity;
+ updateParents(entity, insertions, {});
+ }
+ loadEntities(Object.values(insertions));
+ return tree;
+ };
+ function updateToGraph(graph) {
+ if (graph === head)
+ return;
+ var diff = coreDifference(head, graph);
+ head = graph;
+ var changed = diff.didChange;
+ if (!changed.addition && !changed.deletion && !changed.geometry)
+ return;
+ var insertions = {};
+ if (changed.deletion) {
+ diff.deleted().forEach(function(entity) {
+ removeEntity(entity);
+ });
+ }
+ if (changed.geometry) {
+ diff.modified().forEach(function(entity) {
+ removeEntity(entity);
+ insertions[entity.id] = entity;
+ updateParents(entity, insertions, {});
+ });
+ }
+ if (changed.addition) {
+ diff.created().forEach(function(entity) {
+ insertions[entity.id] = entity;
+ });
+ }
+ loadEntities(Object.values(insertions));
+ }
+ tree.intersects = function(extent, graph) {
+ updateToGraph(graph);
+ return _rtree.search(extent.bbox()).map(function(bbox) {
+ return graph.entity(bbox.id);
+ });
+ };
+ tree.waySegments = function(extent, graph) {
+ updateToGraph(graph);
+ return _segmentsRTree.search(extent.bbox()).map(function(bbox) {
+ return bbox.segment;
+ });
+ };
+ return tree;
+ }
+
+ // modules/svg/icon.js
+ function svgIcon(name2, svgklass, useklass) {
+ return function drawIcon(selection2) {
+ selection2.selectAll("svg.icon" + (svgklass ? "." + svgklass.split(" ")[0] : "")).data([0]).enter().append("svg").attr("class", "icon " + (svgklass || "")).append("use").attr("xlink:href", name2).attr("class", useklass);
+ };
+ }
+
+ // modules/ui/modal.js
+ function uiModal(selection2, blocking) {
+ let keybinding = utilKeybinding("modal");
+ let previous = selection2.select("div.modal");
+ let animate = previous.empty();
+ previous.transition().duration(200).style("opacity", 0).remove();
+ let shaded = selection2.append("div").attr("class", "shaded").style("opacity", 0);
+ shaded.close = () => {
+ shaded.transition().duration(200).style("opacity", 0).remove();
+ modal.transition().duration(200).style("top", "0px");
+ select_default2(document).call(keybinding.unbind);
+ };
+ let modal = shaded.append("div").attr("class", "modal fillL");
+ modal.append("input").attr("class", "keytrap keytrap-first").on("focus.keytrap", moveFocusToLast);
+ if (!blocking) {
+ shaded.on("click.remove-modal", (d3_event) => {
+ if (d3_event.target === this) {
+ shaded.close();
+ }
+ });
+ modal.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", shaded.close).call(svgIcon("#iD-icon-close"));
+ keybinding.on("\u232B", shaded.close).on("\u238B", shaded.close);
+ select_default2(document).call(keybinding);
+ }
+ modal.append("div").attr("class", "content");
+ modal.append("input").attr("class", "keytrap keytrap-last").on("focus.keytrap", moveFocusToFirst);
+ if (animate) {
+ shaded.transition().style("opacity", 1);
+ } else {
+ shaded.style("opacity", 1);
+ }
+ return shaded;
+ function moveFocusToFirst() {
+ let node = modal.select("a, button, input:not(.keytrap), select, textarea").node();
+ if (node) {
+ node.focus();
+ } else {
+ select_default2(this).node().blur();
+ }
+ }
+ function moveFocusToLast() {
+ let nodes = modal.selectAll("a, button, input:not(.keytrap), select, textarea").nodes();
+ if (nodes.length) {
+ nodes[nodes.length - 1].focus();
+ } else {
+ select_default2(this).node().blur();
+ }
+ }
+ }
+
+ // modules/ui/loading.js
+ function uiLoading(context) {
+ let _modalSelection = select_default2(null);
+ let _message = "";
+ let _blocking = false;
+ let loading = (selection2) => {
+ _modalSelection = uiModal(selection2, _blocking);
+ let loadertext = _modalSelection.select(".content").classed("loading-modal", true).append("div").attr("class", "modal-section fillL");
+ loadertext.append("img").attr("class", "loader").attr("src", context.imagePath("loader-white.gif"));
+ loadertext.append("h3").html(_message);
+ _modalSelection.select("button.close").attr("class", "hide");
+ return loading;
+ };
+ loading.message = function(val) {
+ if (!arguments.length)
+ return _message;
+ _message = val;
+ return loading;
+ };
+ loading.blocking = function(val) {
+ if (!arguments.length)
+ return _blocking;
+ _blocking = val;
+ return loading;
+ };
+ loading.close = () => {
+ _modalSelection.remove();
+ };
+ loading.isShown = () => {
+ return _modalSelection && !_modalSelection.empty() && _modalSelection.node().parentNode;
+ };
+ return loading;
+ }
+
+ // modules/core/history.js
+ function coreHistory(context) {
+ var dispatch10 = dispatch_default("reset", "change", "merge", "restore", "undone", "redone", "storage_error");
+ var lock = utilSessionMutex("lock");
+ var _hasUnresolvedRestorableChanges = lock.lock() && !!corePreferences(getKey("saved_history"));
+ var duration = 150;
+ var _imageryUsed = [];
+ var _photoOverlaysUsed = [];
+ var _checkpoints = {};
+ var _pausedGraph;
+ var _stack;
+ var _index;
+ var _tree;
+ function _act(actions, t) {
+ actions = Array.prototype.slice.call(actions);
+ var annotation;
+ if (typeof actions[actions.length - 1] !== "function") {
+ annotation = actions.pop();
+ }
+ var graph = _stack[_index].graph;
+ for (var i2 = 0; i2 < actions.length; i2++) {
+ graph = actions[i2](graph, t);
+ }
+ return {
+ graph,
+ annotation,
+ imageryUsed: _imageryUsed,
+ photoOverlaysUsed: _photoOverlaysUsed,
+ transform: context.projection.transform(),
+ selectedIDs: context.selectedIDs()
+ };
+ }
+ function _perform(args, t) {
+ var previous = _stack[_index].graph;
+ _stack = _stack.slice(0, _index + 1);
+ var actionResult = _act(args, t);
+ _stack.push(actionResult);
+ _index++;
+ return change(previous);
+ }
+ function _replace(args, t) {
+ var previous = _stack[_index].graph;
+ var actionResult = _act(args, t);
+ _stack[_index] = actionResult;
+ return change(previous);
+ }
+ function _overwrite(args, t) {
+ var previous = _stack[_index].graph;
+ if (_index > 0) {
+ _index--;
+ _stack.pop();
+ }
+ _stack = _stack.slice(0, _index + 1);
+ var actionResult = _act(args, t);
+ _stack.push(actionResult);
+ _index++;
+ return change(previous);
+ }
+ function change(previous) {
+ var difference = coreDifference(previous, history.graph());
+ if (!_pausedGraph) {
+ dispatch10.call("change", this, difference);
+ }
+ return difference;
+ }
+ function getKey(n2) {
+ return "iD_" + window.location.origin + "_" + n2;
+ }
+ var history = {
+ graph: function() {
+ return _stack[_index].graph;
+ },
+ tree: function() {
+ return _tree;
+ },
+ base: function() {
+ return _stack[0].graph;
+ },
+ merge: function(entities) {
+ var stack = _stack.map(function(state) {
+ return state.graph;
+ });
+ _stack[0].graph.rebase(entities, stack, false);
+ _tree.rebase(entities, false);
+ dispatch10.call("merge", this, entities);
+ },
+ perform: function() {
+ select_default2(document).interrupt("history.perform");
+ var transitionable = false;
+ var action0 = arguments[0];
+ if (arguments.length === 1 || arguments.length === 2 && typeof arguments[1] !== "function") {
+ transitionable = !!action0.transitionable;
+ }
+ if (transitionable) {
+ var origArguments = arguments;
+ select_default2(document).transition("history.perform").duration(duration).ease(linear2).tween("history.tween", function() {
+ return function(t) {
+ if (t < 1)
+ _overwrite([action0], t);
+ };
+ }).on("start", function() {
+ _perform([action0], 0);
+ }).on("end interrupt", function() {
+ _overwrite(origArguments, 1);
+ });
+ } else {
+ return _perform(arguments);
+ }
+ },
+ replace: function() {
+ select_default2(document).interrupt("history.perform");
+ return _replace(arguments, 1);
+ },
+ overwrite: function() {
+ select_default2(document).interrupt("history.perform");
+ return _overwrite(arguments, 1);
+ },
+ pop: function(n2) {
+ select_default2(document).interrupt("history.perform");
+ var previous = _stack[_index].graph;
+ if (isNaN(+n2) || +n2 < 0) {
+ n2 = 1;
+ }
+ while (n2-- > 0 && _index > 0) {
+ _index--;
+ _stack.pop();
+ }
+ return change(previous);
+ },
+ undo: function() {
+ select_default2(document).interrupt("history.perform");
+ var previousStack = _stack[_index];
+ var previous = previousStack.graph;
+ while (_index > 0) {
+ _index--;
+ if (_stack[_index].annotation)
+ break;
+ }
+ dispatch10.call("undone", this, _stack[_index], previousStack);
+ return change(previous);
+ },
+ redo: function() {
+ select_default2(document).interrupt("history.perform");
+ var previousStack = _stack[_index];
+ var previous = previousStack.graph;
+ var tryIndex = _index;
+ while (tryIndex < _stack.length - 1) {
+ tryIndex++;
+ if (_stack[tryIndex].annotation) {
+ _index = tryIndex;
+ dispatch10.call("redone", this, _stack[_index], previousStack);
+ break;
+ }
+ }
+ return change(previous);
+ },
+ pauseChangeDispatch: function() {
+ if (!_pausedGraph) {
+ _pausedGraph = _stack[_index].graph;
+ }
+ },
+ resumeChangeDispatch: function() {
+ if (_pausedGraph) {
+ var previous = _pausedGraph;
+ _pausedGraph = null;
+ return change(previous);
+ }
+ },
+ undoAnnotation: function() {
+ var i2 = _index;
+ while (i2 >= 0) {
+ if (_stack[i2].annotation)
+ return _stack[i2].annotation;
+ i2--;
+ }
+ },
+ redoAnnotation: function() {
+ var i2 = _index + 1;
+ while (i2 <= _stack.length - 1) {
+ if (_stack[i2].annotation)
+ return _stack[i2].annotation;
+ i2++;
+ }
+ },
+ intersects: function(extent) {
+ return _tree.intersects(extent, _stack[_index].graph);
+ },
+ difference: function() {
+ var base = _stack[0].graph;
+ var head = _stack[_index].graph;
+ return coreDifference(base, head);
+ },
+ changes: function(action) {
+ var base = _stack[0].graph;
+ var head = _stack[_index].graph;
+ if (action) {
+ head = action(head);
+ }
+ var difference = coreDifference(base, head);
+ return {
+ modified: difference.modified(),
+ created: difference.created(),
+ deleted: difference.deleted()
+ };
+ },
+ hasChanges: function() {
+ return this.difference().length() > 0;
+ },
+ imageryUsed: function(sources) {
+ if (sources) {
+ _imageryUsed = sources;
+ return history;
+ } else {
+ var s = /* @__PURE__ */ new Set();
+ _stack.slice(1, _index + 1).forEach(function(state) {
+ state.imageryUsed.forEach(function(source) {
+ if (source !== "Custom") {
+ s.add(source);
+ }
+ });
+ });
+ return Array.from(s);
+ }
+ },
+ photoOverlaysUsed: function(sources) {
+ if (sources) {
+ _photoOverlaysUsed = sources;
+ return history;
+ } else {
+ var s = /* @__PURE__ */ new Set();
+ _stack.slice(1, _index + 1).forEach(function(state) {
+ if (state.photoOverlaysUsed && Array.isArray(state.photoOverlaysUsed)) {
+ state.photoOverlaysUsed.forEach(function(photoOverlay) {
+ s.add(photoOverlay);
+ });
+ }
+ });
+ return Array.from(s);
+ }
+ },
+ checkpoint: function(key) {
+ _checkpoints[key] = {
+ stack: _stack,
+ index: _index
+ };
+ return history;
+ },
+ reset: function(key) {
+ if (key !== void 0 && _checkpoints.hasOwnProperty(key)) {
+ _stack = _checkpoints[key].stack;
+ _index = _checkpoints[key].index;
+ } else {
+ _stack = [{ graph: coreGraph() }];
+ _index = 0;
+ _tree = coreTree(_stack[0].graph);
+ _checkpoints = {};
+ }
+ dispatch10.call("reset");
+ dispatch10.call("change");
+ return history;
+ },
+ toIntroGraph: function() {
+ var nextID = { n: 0, r: 0, w: 0 };
+ var permIDs = {};
+ var graph = this.graph();
+ var baseEntities = {};
+ Object.values(graph.base().entities).forEach(function(entity) {
+ var copy2 = copyIntroEntity(entity);
+ baseEntities[copy2.id] = copy2;
+ });
+ Object.keys(graph.entities).forEach(function(id2) {
+ var entity = graph.entities[id2];
+ if (entity) {
+ var copy2 = copyIntroEntity(entity);
+ baseEntities[copy2.id] = copy2;
+ } else {
+ delete baseEntities[id2];
+ }
+ });
+ Object.values(baseEntities).forEach(function(entity) {
+ if (Array.isArray(entity.nodes)) {
+ entity.nodes = entity.nodes.map(function(node) {
+ return permIDs[node] || node;
+ });
+ }
+ if (Array.isArray(entity.members)) {
+ entity.members = entity.members.map(function(member) {
+ member.id = permIDs[member.id] || member.id;
+ return member;
+ });
+ }
+ });
+ return JSON.stringify({ dataIntroGraph: baseEntities });
+ function copyIntroEntity(source) {
+ var copy2 = utilObjectOmit(source, ["type", "user", "v", "version", "visible"]);
+ if (copy2.tags && !Object.keys(copy2.tags)) {
+ delete copy2.tags;
+ }
+ if (Array.isArray(copy2.loc)) {
+ copy2.loc[0] = +copy2.loc[0].toFixed(6);
+ copy2.loc[1] = +copy2.loc[1].toFixed(6);
+ }
+ var match = source.id.match(/([nrw])-\d*/);
+ if (match !== null) {
+ var nrw = match[1];
+ var permID;
+ do {
+ permID = nrw + ++nextID[nrw];
+ } while (baseEntities.hasOwnProperty(permID));
+ copy2.id = permIDs[source.id] = permID;
+ }
+ return copy2;
+ }
+ },
+ toJSON: function() {
+ if (!this.hasChanges())
+ return;
+ var allEntities = {};
+ var baseEntities = {};
+ var base = _stack[0];
+ var s = _stack.map(function(i2) {
+ var modified = [];
+ var deleted = [];
+ Object.keys(i2.graph.entities).forEach(function(id2) {
+ var entity = i2.graph.entities[id2];
+ if (entity) {
+ var key = osmEntity.key(entity);
+ allEntities[key] = entity;
+ modified.push(key);
+ } else {
+ deleted.push(id2);
+ }
+ if (id2 in base.graph.entities) {
+ baseEntities[id2] = base.graph.entities[id2];
+ }
+ if (entity && entity.nodes) {
+ entity.nodes.forEach(function(nodeID) {
+ if (nodeID in base.graph.entities) {
+ baseEntities[nodeID] = base.graph.entities[nodeID];
+ }
+ });
+ }
+ var baseParents = base.graph._parentWays[id2];
+ if (baseParents) {
+ baseParents.forEach(function(parentID) {
+ if (parentID in base.graph.entities) {
+ baseEntities[parentID] = base.graph.entities[parentID];
+ }
+ });
+ }
+ });
+ var x = {};
+ if (modified.length)
+ x.modified = modified;
+ if (deleted.length)
+ x.deleted = deleted;
+ if (i2.imageryUsed)
+ x.imageryUsed = i2.imageryUsed;
+ if (i2.photoOverlaysUsed)
+ x.photoOverlaysUsed = i2.photoOverlaysUsed;
+ if (i2.annotation)
+ x.annotation = i2.annotation;
+ if (i2.transform)
+ x.transform = i2.transform;
+ if (i2.selectedIDs)
+ x.selectedIDs = i2.selectedIDs;
+ return x;
+ });
+ return JSON.stringify({
+ version: 3,
+ entities: Object.values(allEntities),
+ baseEntities: Object.values(baseEntities),
+ stack: s,
+ nextIDs: osmEntity.id.next,
+ index: _index,
+ timestamp: new Date().getTime()
+ });
+ },
+ fromJSON: function(json, loadChildNodes) {
+ var h = JSON.parse(json);
+ var loadComplete = true;
+ osmEntity.id.next = h.nextIDs;
+ _index = h.index;
+ if (h.version === 2 || h.version === 3) {
+ var allEntities = {};
+ h.entities.forEach(function(entity) {
+ allEntities[osmEntity.key(entity)] = osmEntity(entity);
+ });
+ if (h.version === 3) {
+ var baseEntities = h.baseEntities.map(function(d) {
+ return osmEntity(d);
+ });
+ var stack = _stack.map(function(state) {
+ return state.graph;
+ });
+ _stack[0].graph.rebase(baseEntities, stack, true);
+ _tree.rebase(baseEntities, true);
+ if (loadChildNodes) {
+ var osm = context.connection();
+ var baseWays = baseEntities.filter(function(e) {
+ return e.type === "way";
+ });
+ var nodeIDs = baseWays.reduce(function(acc, way) {
+ return utilArrayUnion(acc, way.nodes);
+ }, []);
+ var missing = nodeIDs.filter(function(n2) {
+ return !_stack[0].graph.hasEntity(n2);
+ });
+ if (missing.length && osm) {
+ loadComplete = false;
+ context.map().redrawEnable(false);
+ var loading = uiLoading(context).blocking(true);
+ context.container().call(loading);
+ var childNodesLoaded = function(err, result) {
+ if (!err) {
+ var visibleGroups = utilArrayGroupBy(result.data, "visible");
+ var visibles = visibleGroups.true || [];
+ var invisibles = visibleGroups.false || [];
+ if (visibles.length) {
+ var visibleIDs = visibles.map(function(entity) {
+ return entity.id;
+ });
+ var stack2 = _stack.map(function(state) {
+ return state.graph;
+ });
+ missing = utilArrayDifference(missing, visibleIDs);
+ _stack[0].graph.rebase(visibles, stack2, true);
+ _tree.rebase(visibles, true);
+ }
+ invisibles.forEach(function(entity) {
+ osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
+ });
+ }
+ if (err || !missing.length) {
+ loading.close();
+ context.map().redrawEnable(true);
+ dispatch10.call("change");
+ dispatch10.call("restore", this);
+ }
+ };
+ osm.loadMultiple(missing, childNodesLoaded);
+ }
+ }
+ }
+ _stack = h.stack.map(function(d) {
+ var entities = {}, entity;
+ if (d.modified) {
+ d.modified.forEach(function(key) {
+ entity = allEntities[key];
+ entities[entity.id] = entity;
+ });
+ }
+ if (d.deleted) {
+ d.deleted.forEach(function(id2) {
+ entities[id2] = void 0;
+ });
+ }
+ return {
+ graph: coreGraph(_stack[0].graph).load(entities),
+ annotation: d.annotation,
+ imageryUsed: d.imageryUsed,
+ photoOverlaysUsed: d.photoOverlaysUsed,
+ transform: d.transform,
+ selectedIDs: d.selectedIDs
+ };
+ });
+ } else {
+ _stack = h.stack.map(function(d) {
+ var entities = {};
+ for (var i2 in d.entities) {
+ var entity = d.entities[i2];
+ entities[i2] = entity === "undefined" ? void 0 : osmEntity(entity);
+ }
+ d.graph = coreGraph(_stack[0].graph).load(entities);
+ return d;
+ });
+ }
+ var transform2 = _stack[_index].transform;
+ if (transform2) {
+ context.map().transformEase(transform2, 0);
+ }
+ if (loadComplete) {
+ dispatch10.call("change");
+ dispatch10.call("restore", this);
+ }
+ return history;
+ },
+ lock: function() {
+ return lock.lock();
+ },
+ unlock: function() {
+ lock.unlock();
+ },
+ save: function() {
+ if (lock.locked() && !_hasUnresolvedRestorableChanges) {
+ const success = corePreferences(getKey("saved_history"), history.toJSON() || null);
+ if (!success)
+ dispatch10.call("storage_error");
+ }
+ return history;
+ },
+ clearSaved: function() {
+ context.debouncedSave.cancel();
+ if (lock.locked()) {
+ _hasUnresolvedRestorableChanges = false;
+ corePreferences(getKey("saved_history"), null);
+ corePreferences("comment", null);
+ corePreferences("hashtags", null);
+ corePreferences("source", null);
+ }
+ return history;
+ },
+ savedHistoryJSON: function() {
+ return corePreferences(getKey("saved_history"));
+ },
+ hasRestorableChanges: function() {
+ return _hasUnresolvedRestorableChanges;
+ },
+ restore: function() {
+ if (lock.locked()) {
+ _hasUnresolvedRestorableChanges = false;
+ var json = this.savedHistoryJSON();
+ if (json)
+ history.fromJSON(json, true);
+ }
+ },
+ _getKey: getKey
+ };
+ history.reset();
+ return utilRebind(history, dispatch10, "on");
+ }
+
+ // modules/validations/index.js
+ var validations_exports = {};
+ __export(validations_exports, {
+ validationAlmostJunction: () => validationAlmostJunction,
+ validationCloseNodes: () => validationCloseNodes,
+ validationCrossingWays: () => validationCrossingWays,
+ validationDisconnectedWay: () => validationDisconnectedWay,
+ validationFormatting: () => validationFormatting,
+ validationHelpRequest: () => validationHelpRequest,
+ validationImpossibleOneway: () => validationImpossibleOneway,
+ validationIncompatibleSource: () => validationIncompatibleSource,
+ validationMaprules: () => validationMaprules,
+ validationMismatchedGeometry: () => validationMismatchedGeometry,
+ validationMissingRole: () => validationMissingRole,
+ validationMissingTag: () => validationMissingTag,
+ validationOutdatedTags: () => validationOutdatedTags,
+ validationPrivateData: () => validationPrivateData,
+ validationSuspiciousName: () => validationSuspiciousName,
+ validationUnsquareWay: () => validationUnsquareWay
+ });
+
+ // modules/validations/almost_junction.js
+ function validationAlmostJunction(context) {
+ const type3 = "almost_junction";
+ const EXTEND_TH_METERS = 5;
+ const WELD_TH_METERS = 0.75;
+ const CLOSE_NODE_TH = EXTEND_TH_METERS - WELD_TH_METERS;
+ const SIG_ANGLE_TH = Math.atan(WELD_TH_METERS / EXTEND_TH_METERS);
+ function isHighway(entity) {
+ return entity.type === "way" && osmRoutableHighwayTagValues[entity.tags.highway];
+ }
+ function isTaggedAsNotContinuing(node) {
+ return node.tags.noexit === "yes" || node.tags.amenity === "parking_entrance" || node.tags.entrance && node.tags.entrance !== "no";
+ }
+ const validation = function checkAlmostJunction(entity, graph) {
+ if (!isHighway(entity))
+ return [];
+ if (entity.isDegenerate())
+ return [];
+ const tree = context.history().tree();
+ const extendableNodeInfos = findConnectableEndNodesByExtension(entity);
+ let issues = [];
+ extendableNodeInfos.forEach((extendableNodeInfo) => {
+ issues.push(new validationIssue({
+ type: type3,
+ subtype: "highway-highway",
+ severity: "warning",
+ message: function(context2) {
+ const entity1 = context2.hasEntity(this.entityIds[0]);
+ if (this.entityIds[0] === this.entityIds[2]) {
+ return entity1 ? _t.html("issues.almost_junction.self.message", {
+ feature: utilDisplayLabel(entity1, context2.graph())
+ }) : "";
+ } else {
+ const entity2 = context2.hasEntity(this.entityIds[2]);
+ return entity1 && entity2 ? _t.html("issues.almost_junction.message", {
+ feature: utilDisplayLabel(entity1, context2.graph()),
+ feature2: utilDisplayLabel(entity2, context2.graph())
+ }) : "";
+ }
+ },
+ reference: showReference,
+ entityIds: [
+ entity.id,
+ extendableNodeInfo.node.id,
+ extendableNodeInfo.wid
+ ],
+ loc: extendableNodeInfo.node.loc,
+ hash: JSON.stringify(extendableNodeInfo.node.loc),
+ data: {
+ midId: extendableNodeInfo.mid.id,
+ edge: extendableNodeInfo.edge,
+ cross_loc: extendableNodeInfo.cross_loc
+ },
+ dynamicFixes: makeFixes
+ }));
+ });
+ return issues;
+ function makeFixes(context2) {
+ let fixes = [new validationIssueFix({
+ icon: "iD-icon-abutment",
+ title: _t.html("issues.fix.connect_features.title"),
+ onClick: function(context3) {
+ const annotation = _t("issues.fix.connect_almost_junction.annotation");
+ const [, endNodeId, crossWayId] = this.issue.entityIds;
+ const midNode = context3.entity(this.issue.data.midId);
+ const endNode = context3.entity(endNodeId);
+ const crossWay = context3.entity(crossWayId);
+ const nearEndNodes = findNearbyEndNodes(endNode, crossWay);
+ if (nearEndNodes.length > 0) {
+ const collinear = findSmallJoinAngle(midNode, endNode, nearEndNodes);
+ if (collinear) {
+ context3.perform(actionMergeNodes([collinear.id, endNode.id], collinear.loc), annotation);
+ return;
+ }
+ }
+ const targetEdge = this.issue.data.edge;
+ const crossLoc = this.issue.data.cross_loc;
+ const edgeNodes = [context3.entity(targetEdge[0]), context3.entity(targetEdge[1])];
+ const closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
+ if (closestNodeInfo.distance < WELD_TH_METERS) {
+ context3.perform(actionMergeNodes([closestNodeInfo.node.id, endNode.id], closestNodeInfo.node.loc), annotation);
+ } else {
+ context3.perform(actionAddMidpoint({ loc: crossLoc, edge: targetEdge }, endNode), annotation);
+ }
+ }
+ })];
+ const node = context2.hasEntity(this.entityIds[1]);
+ if (node && !node.hasInterestingTags()) {
+ fixes.push(new validationIssueFix({
+ icon: "maki-barrier",
+ title: _t.html("issues.fix.tag_as_disconnected.title"),
+ onClick: function(context3) {
+ const nodeID = this.issue.entityIds[1];
+ const tags = Object.assign({}, context3.entity(nodeID).tags);
+ tags.noexit = "yes";
+ context3.perform(actionChangeTags(nodeID, tags), _t("issues.fix.tag_as_disconnected.annotation"));
+ }
+ }));
+ }
+ return fixes;
+ }
+ function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.almost_junction.highway-highway.reference"));
+ }
+ function isExtendableCandidate(node, way) {
+ const osm = services.osm;
+ if (osm && !osm.isDataLoaded(node.loc)) {
+ return false;
+ }
+ if (isTaggedAsNotContinuing(node) || graph.parentWays(node).length !== 1) {
+ return false;
+ }
+ let occurrences = 0;
+ for (const index in way.nodes) {
+ if (way.nodes[index] === node.id) {
+ occurrences += 1;
+ if (occurrences > 1) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+ function findConnectableEndNodesByExtension(way) {
+ let results = [];
+ if (way.isClosed())
+ return results;
+ let testNodes;
+ const indices = [0, way.nodes.length - 1];
+ indices.forEach((nodeIndex) => {
+ const nodeID = way.nodes[nodeIndex];
+ const node = graph.entity(nodeID);
+ if (!isExtendableCandidate(node, way))
+ return;
+ const connectionInfo = canConnectByExtend(way, nodeIndex);
+ if (!connectionInfo)
+ return;
+ testNodes = graph.childNodes(way).slice();
+ testNodes[nodeIndex] = testNodes[nodeIndex].move(connectionInfo.cross_loc);
+ if (geoHasSelfIntersections(testNodes, nodeID))
+ return;
+ results.push(connectionInfo);
+ });
+ return results;
+ }
+ function findNearbyEndNodes(node, way) {
+ return [
+ way.nodes[0],
+ way.nodes[way.nodes.length - 1]
+ ].map((d) => graph.entity(d)).filter((d) => {
+ return d.id !== node.id && geoSphericalDistance(node.loc, d.loc) <= CLOSE_NODE_TH;
+ });
+ }
+ function findSmallJoinAngle(midNode, tipNode, endNodes) {
+ let joinTo;
+ let minAngle = Infinity;
+ endNodes.forEach((endNode) => {
+ const a1 = geoAngle(midNode, tipNode, context.projection) + Math.PI;
+ const a2 = geoAngle(midNode, endNode, context.projection) + Math.PI;
+ const diff = Math.max(a1, a2) - Math.min(a1, a2);
+ if (diff < minAngle) {
+ joinTo = endNode;
+ minAngle = diff;
+ }
+ });
+ if (minAngle <= SIG_ANGLE_TH)
+ return joinTo;
+ return null;
+ }
+ function hasTag(tags, key) {
+ return tags[key] !== void 0 && tags[key] !== "no";
+ }
+ function canConnectWays(way, way2) {
+ if (way.id === way2.id)
+ return true;
+ if ((hasTag(way.tags, "bridge") || hasTag(way2.tags, "bridge")) && !(hasTag(way.tags, "bridge") && hasTag(way2.tags, "bridge")))
+ return false;
+ if ((hasTag(way.tags, "tunnel") || hasTag(way2.tags, "tunnel")) && !(hasTag(way.tags, "tunnel") && hasTag(way2.tags, "tunnel")))
+ return false;
+ const layer1 = way.tags.layer || "0", layer2 = way2.tags.layer || "0";
+ if (layer1 !== layer2)
+ return false;
+ const level1 = way.tags.level || "0", level2 = way2.tags.level || "0";
+ if (level1 !== level2)
+ return false;
+ return true;
+ }
+ function canConnectByExtend(way, endNodeIdx) {
+ const tipNid = way.nodes[endNodeIdx];
+ const midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];
+ const tipNode = graph.entity(tipNid);
+ const midNode = graph.entity(midNid);
+ const lon = tipNode.loc[0];
+ const lat = tipNode.loc[1];
+ const lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
+ const lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
+ const queryExtent = geoExtent([
+ [lon - lon_range, lat - lat_range],
+ [lon + lon_range, lat + lat_range]
+ ]);
+ const edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
+ const t = EXTEND_TH_METERS / edgeLen + 1;
+ const extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
+ const segmentInfos = tree.waySegments(queryExtent, graph);
+ for (let i2 = 0; i2 < segmentInfos.length; i2++) {
+ let segmentInfo = segmentInfos[i2];
+ let way2 = graph.entity(segmentInfo.wayId);
+ if (!isHighway(way2))
+ continue;
+ if (!canConnectWays(way, way2))
+ continue;
+ let nAid = segmentInfo.nodes[0], nBid = segmentInfo.nodes[1];
+ if (nAid === tipNid || nBid === tipNid)
+ continue;
+ let nA = graph.entity(nAid), nB = graph.entity(nBid);
+ let crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
+ if (crossLoc) {
+ return {
+ mid: midNode,
+ node: tipNode,
+ wid: way2.id,
+ edge: [nA.id, nB.id],
+ cross_loc: crossLoc
+ };
+ }
+ }
+ return null;
+ }
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/close_nodes.js
+ function validationCloseNodes(context) {
+ var type3 = "close_nodes";
+ var pointThresholdMeters = 0.2;
+ var validation = function(entity, graph) {
+ if (entity.type === "node") {
+ return getIssuesForNode(entity);
+ } else if (entity.type === "way") {
+ return getIssuesForWay(entity);
+ }
+ return [];
+ function getIssuesForNode(node) {
+ var parentWays = graph.parentWays(node);
+ if (parentWays.length) {
+ return getIssuesForVertex(node, parentWays);
+ } else {
+ return getIssuesForDetachedPoint(node);
+ }
+ }
+ function wayTypeFor(way) {
+ if (way.tags.boundary && way.tags.boundary !== "no")
+ return "boundary";
+ if (way.tags.indoor && way.tags.indoor !== "no")
+ return "indoor";
+ if (way.tags.building && way.tags.building !== "no" || way.tags["building:part"] && way.tags["building:part"] !== "no")
+ return "building";
+ if (osmPathHighwayTagValues[way.tags.highway])
+ return "path";
+ var parentRelations = graph.parentRelations(way);
+ for (var i2 in parentRelations) {
+ var relation = parentRelations[i2];
+ if (relation.tags.type === "boundary")
+ return "boundary";
+ if (relation.isMultipolygon()) {
+ if (relation.tags.indoor && relation.tags.indoor !== "no")
+ return "indoor";
+ if (relation.tags.building && relation.tags.building !== "no" || relation.tags["building:part"] && relation.tags["building:part"] !== "no")
+ return "building";
+ }
+ }
+ return "other";
+ }
+ function shouldCheckWay(way) {
+ if (way.nodes.length <= 2 || way.isClosed() && way.nodes.length <= 4)
+ return false;
+ var bbox = way.extent(graph).bbox();
+ var hypotenuseMeters = geoSphericalDistance([bbox.minX, bbox.minY], [bbox.maxX, bbox.maxY]);
+ if (hypotenuseMeters < 1.5)
+ return false;
+ return true;
+ }
+ function getIssuesForWay(way) {
+ if (!shouldCheckWay(way))
+ return [];
+ var issues = [], nodes = graph.childNodes(way);
+ for (var i2 = 0; i2 < nodes.length - 1; i2++) {
+ var node1 = nodes[i2];
+ var node2 = nodes[i2 + 1];
+ var issue = getWayIssueIfAny(node1, node2, way);
+ if (issue)
+ issues.push(issue);
+ }
+ return issues;
+ }
+ function getIssuesForVertex(node, parentWays) {
+ var issues = [];
+ function checkForCloseness(node1, node2, way) {
+ var issue = getWayIssueIfAny(node1, node2, way);
+ if (issue)
+ issues.push(issue);
+ }
+ for (var i2 = 0; i2 < parentWays.length; i2++) {
+ var parentWay = parentWays[i2];
+ if (!shouldCheckWay(parentWay))
+ continue;
+ var lastIndex = parentWay.nodes.length - 1;
+ for (var j2 = 0; j2 < parentWay.nodes.length; j2++) {
+ if (j2 !== 0) {
+ if (parentWay.nodes[j2 - 1] === node.id) {
+ checkForCloseness(node, graph.entity(parentWay.nodes[j2]), parentWay);
+ }
+ }
+ if (j2 !== lastIndex) {
+ if (parentWay.nodes[j2 + 1] === node.id) {
+ checkForCloseness(graph.entity(parentWay.nodes[j2]), node, parentWay);
+ }
+ }
+ }
+ }
+ return issues;
+ }
+ function thresholdMetersForWay(way) {
+ if (!shouldCheckWay(way))
+ return 0;
+ var wayType = wayTypeFor(way);
+ if (wayType === "boundary")
+ return 0;
+ if (wayType === "indoor")
+ return 0.01;
+ if (wayType === "building")
+ return 0.05;
+ if (wayType === "path")
+ return 0.1;
+ return 0.2;
+ }
+ function getIssuesForDetachedPoint(node) {
+ var issues = [];
+ var lon = node.loc[0];
+ var lat = node.loc[1];
+ var lon_range = geoMetersToLon(pointThresholdMeters, lat) / 2;
+ var lat_range = geoMetersToLat(pointThresholdMeters) / 2;
+ var queryExtent = geoExtent([
+ [lon - lon_range, lat - lat_range],
+ [lon + lon_range, lat + lat_range]
+ ]);
+ var intersected = context.history().tree().intersects(queryExtent, graph);
+ for (var j2 = 0; j2 < intersected.length; j2++) {
+ var nearby = intersected[j2];
+ if (nearby.id === node.id)
+ continue;
+ if (nearby.type !== "node" || nearby.geometry(graph) !== "point")
+ continue;
+ if (nearby.loc === node.loc || geoSphericalDistance(node.loc, nearby.loc) < pointThresholdMeters) {
+ var zAxisKeys = { layer: true, level: true, "addr:housenumber": true, "addr:unit": true };
+ var zAxisDifferentiates = false;
+ for (var key in zAxisKeys) {
+ var nodeValue = node.tags[key] || "0";
+ var nearbyValue = nearby.tags[key] || "0";
+ if (nodeValue !== nearbyValue) {
+ zAxisDifferentiates = true;
+ break;
+ }
+ }
+ if (zAxisDifferentiates)
+ continue;
+ issues.push(new validationIssue({
+ type: type3,
+ subtype: "detached",
+ severity: "warning",
+ message: function(context2) {
+ var entity2 = context2.hasEntity(this.entityIds[0]), entity22 = context2.hasEntity(this.entityIds[1]);
+ return entity2 && entity22 ? _t.html("issues.close_nodes.detached.message", {
+ feature: utilDisplayLabel(entity2, context2.graph()),
+ feature2: utilDisplayLabel(entity22, context2.graph())
+ }) : "";
+ },
+ reference: showReference,
+ entityIds: [node.id, nearby.id],
+ dynamicFixes: function() {
+ return [
+ new validationIssueFix({
+ icon: "iD-operation-disconnect",
+ title: _t.html("issues.fix.move_points_apart.title")
+ }),
+ new validationIssueFix({
+ icon: "iD-icon-layers",
+ title: _t.html("issues.fix.use_different_layers_or_levels.title")
+ })
+ ];
+ }
+ }));
+ }
+ }
+ return issues;
+ function showReference(selection2) {
+ var referenceText = _t("issues.close_nodes.detached.reference");
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").html(referenceText);
+ }
+ }
+ function getWayIssueIfAny(node1, node2, way) {
+ if (node1.id === node2.id || node1.hasInterestingTags() && node2.hasInterestingTags()) {
+ return null;
+ }
+ if (node1.loc !== node2.loc) {
+ var parentWays1 = graph.parentWays(node1);
+ var parentWays2 = new Set(graph.parentWays(node2));
+ var sharedWays = parentWays1.filter(function(parentWay) {
+ return parentWays2.has(parentWay);
+ });
+ var thresholds = sharedWays.map(function(parentWay) {
+ return thresholdMetersForWay(parentWay);
+ });
+ var threshold = Math.min(...thresholds);
+ var distance = geoSphericalDistance(node1.loc, node2.loc);
+ if (distance > threshold)
+ return null;
+ }
+ return new validationIssue({
+ type: type3,
+ subtype: "vertices",
+ severity: "warning",
+ message: function(context2) {
+ var entity2 = context2.hasEntity(this.entityIds[0]);
+ return entity2 ? _t.html("issues.close_nodes.message", { way: utilDisplayLabel(entity2, context2.graph()) }) : "";
+ },
+ reference: showReference,
+ entityIds: [way.id, node1.id, node2.id],
+ loc: node1.loc,
+ dynamicFixes: function() {
+ return [
+ new validationIssueFix({
+ icon: "iD-icon-plus",
+ title: _t.html("issues.fix.merge_points.title"),
+ onClick: function(context2) {
+ var entityIds = this.issue.entityIds;
+ var action = actionMergeNodes([entityIds[1], entityIds[2]]);
+ context2.perform(action, _t("issues.fix.merge_close_vertices.annotation"));
+ }
+ }),
+ new validationIssueFix({
+ icon: "iD-operation-disconnect",
+ title: _t.html("issues.fix.move_points_apart.title")
+ })
+ ];
+ }
+ });
+ function showReference(selection2) {
+ var referenceText = _t("issues.close_nodes.reference");
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").html(referenceText);
+ }
+ }
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/crossing_ways.js
+ function validationCrossingWays(context) {
+ var type3 = "crossing_ways";
+ function getFeatureWithFeatureTypeTagsForWay(way, graph) {
+ if (getFeatureType(way, graph) === null) {
+ var parentRels = graph.parentRelations(way);
+ for (var i2 = 0; i2 < parentRels.length; i2++) {
+ var rel = parentRels[i2];
+ if (getFeatureType(rel, graph) !== null) {
+ return rel;
+ }
+ }
+ }
+ return way;
+ }
+ function hasTag(tags, key) {
+ return tags[key] !== void 0 && tags[key] !== "no";
+ }
+ function taggedAsIndoor(tags) {
+ return hasTag(tags, "indoor") || hasTag(tags, "level") || tags.highway === "corridor";
+ }
+ function allowsBridge(featureType) {
+ return featureType === "highway" || featureType === "railway" || featureType === "waterway";
+ }
+ function allowsTunnel(featureType) {
+ return featureType === "highway" || featureType === "railway" || featureType === "waterway";
+ }
+ var ignoredBuildings = {
+ demolished: true,
+ dismantled: true,
+ proposed: true,
+ razed: true
+ };
+ function getFeatureType(entity, graph) {
+ var geometry = entity.geometry(graph);
+ if (geometry !== "line" && geometry !== "area")
+ return null;
+ var tags = entity.tags;
+ if (hasTag(tags, "building") && !ignoredBuildings[tags.building])
+ return "building";
+ if (hasTag(tags, "highway") && osmRoutableHighwayTagValues[tags.highway])
+ return "highway";
+ if (geometry !== "line")
+ return null;
+ if (hasTag(tags, "railway") && osmRailwayTrackTagValues[tags.railway])
+ return "railway";
+ if (hasTag(tags, "waterway") && osmFlowingWaterwayTagValues[tags.waterway])
+ return "waterway";
+ return null;
+ }
+ function isLegitCrossing(tags1, featureType1, tags2, featureType2) {
+ var level1 = tags1.level || "0";
+ var level2 = tags2.level || "0";
+ if (taggedAsIndoor(tags1) && taggedAsIndoor(tags2) && level1 !== level2) {
+ return true;
+ }
+ var layer1 = tags1.layer || "0";
+ var layer2 = tags2.layer || "0";
+ if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
+ if (hasTag(tags1, "bridge") && !hasTag(tags2, "bridge"))
+ return true;
+ if (!hasTag(tags1, "bridge") && hasTag(tags2, "bridge"))
+ return true;
+ if (hasTag(tags1, "bridge") && hasTag(tags2, "bridge") && layer1 !== layer2)
+ return true;
+ } else if (allowsBridge(featureType1) && hasTag(tags1, "bridge"))
+ return true;
+ else if (allowsBridge(featureType2) && hasTag(tags2, "bridge"))
+ return true;
+ if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
+ if (hasTag(tags1, "tunnel") && !hasTag(tags2, "tunnel"))
+ return true;
+ if (!hasTag(tags1, "tunnel") && hasTag(tags2, "tunnel"))
+ return true;
+ if (hasTag(tags1, "tunnel") && hasTag(tags2, "tunnel") && layer1 !== layer2)
+ return true;
+ } else if (allowsTunnel(featureType1) && hasTag(tags1, "tunnel"))
+ return true;
+ else if (allowsTunnel(featureType2) && hasTag(tags2, "tunnel"))
+ return true;
+ if (featureType1 === "waterway" && featureType2 === "highway" && tags2.man_made === "pier")
+ return true;
+ if (featureType2 === "waterway" && featureType1 === "highway" && tags1.man_made === "pier")
+ return true;
+ if (featureType1 === "building" || featureType2 === "building" || taggedAsIndoor(tags1) || taggedAsIndoor(tags2)) {
+ if (layer1 !== layer2)
+ return true;
+ }
+ return false;
+ }
+ var highwaysDisallowingFords = {
+ motorway: true,
+ motorway_link: true,
+ trunk: true,
+ trunk_link: true,
+ primary: true,
+ primary_link: true,
+ secondary: true,
+ secondary_link: true
+ };
+ var nonCrossingHighways = { track: true };
+ function tagsForConnectionNodeIfAllowed(entity1, entity2, graph) {
+ var featureType1 = getFeatureType(entity1, graph);
+ var featureType2 = getFeatureType(entity2, graph);
+ var geometry1 = entity1.geometry(graph);
+ var geometry2 = entity2.geometry(graph);
+ var bothLines = geometry1 === "line" && geometry2 === "line";
+ if (featureType1 === featureType2) {
+ if (featureType1 === "highway") {
+ var entity1IsPath = osmPathHighwayTagValues[entity1.tags.highway];
+ var entity2IsPath = osmPathHighwayTagValues[entity2.tags.highway];
+ if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
+ var roadFeature = entity1IsPath ? entity2 : entity1;
+ if (nonCrossingHighways[roadFeature.tags.highway]) {
+ return {};
+ }
+ var pathFeature = entity1IsPath ? entity1 : entity2;
+ if (["marked", "unmarked"].indexOf(pathFeature.tags.crossing) !== -1) {
+ return bothLines ? { highway: "crossing", crossing: pathFeature.tags.crossing } : {};
+ }
+ return bothLines ? { highway: "crossing" } : {};
+ }
+ return {};
+ }
+ if (featureType1 === "waterway")
+ return {};
+ if (featureType1 === "railway")
+ return {};
+ } else {
+ var featureTypes = [featureType1, featureType2];
+ if (featureTypes.indexOf("highway") !== -1) {
+ if (featureTypes.indexOf("railway") !== -1) {
+ if (!bothLines)
+ return {};
+ var isTram = entity1.tags.railway === "tram" || entity2.tags.railway === "tram";
+ if (osmPathHighwayTagValues[entity1.tags.highway] || osmPathHighwayTagValues[entity2.tags.highway]) {
+ if (isTram)
+ return { railway: "tram_crossing" };
+ return { railway: "crossing" };
+ } else {
+ if (isTram)
+ return { railway: "tram_level_crossing" };
+ return { railway: "level_crossing" };
+ }
+ }
+ if (featureTypes.indexOf("waterway") !== -1) {
+ if (hasTag(entity1.tags, "tunnel") && hasTag(entity2.tags, "tunnel"))
+ return null;
+ if (hasTag(entity1.tags, "bridge") && hasTag(entity2.tags, "bridge"))
+ return null;
+ if (highwaysDisallowingFords[entity1.tags.highway] || highwaysDisallowingFords[entity2.tags.highway]) {
+ return null;
+ }
+ return bothLines ? { ford: "yes" } : {};
+ }
+ }
+ }
+ return null;
+ }
+ function findCrossingsByWay(way1, graph, tree) {
+ var edgeCrossInfos = [];
+ if (way1.type !== "way")
+ return edgeCrossInfos;
+ var taggedFeature1 = getFeatureWithFeatureTypeTagsForWay(way1, graph);
+ var way1FeatureType = getFeatureType(taggedFeature1, graph);
+ if (way1FeatureType === null)
+ return edgeCrossInfos;
+ var checkedSingleCrossingWays = {};
+ var i2, j2;
+ var extent;
+ var n1, n2, nA, nB, nAId, nBId;
+ var segment1, segment2;
+ var oneOnly;
+ var segmentInfos, segment2Info, way2, taggedFeature2, way2FeatureType;
+ var way1Nodes = graph.childNodes(way1);
+ var comparedWays = {};
+ for (i2 = 0; i2 < way1Nodes.length - 1; i2++) {
+ n1 = way1Nodes[i2];
+ n2 = way1Nodes[i2 + 1];
+ extent = geoExtent([
+ [
+ Math.min(n1.loc[0], n2.loc[0]),
+ Math.min(n1.loc[1], n2.loc[1])
+ ],
+ [
+ Math.max(n1.loc[0], n2.loc[0]),
+ Math.max(n1.loc[1], n2.loc[1])
+ ]
+ ]);
+ segmentInfos = tree.waySegments(extent, graph);
+ for (j2 = 0; j2 < segmentInfos.length; j2++) {
+ segment2Info = segmentInfos[j2];
+ if (segment2Info.wayId === way1.id)
+ continue;
+ if (checkedSingleCrossingWays[segment2Info.wayId])
+ continue;
+ comparedWays[segment2Info.wayId] = true;
+ way2 = graph.hasEntity(segment2Info.wayId);
+ if (!way2)
+ continue;
+ taggedFeature2 = getFeatureWithFeatureTypeTagsForWay(way2, graph);
+ way2FeatureType = getFeatureType(taggedFeature2, graph);
+ if (way2FeatureType === null || isLegitCrossing(taggedFeature1.tags, way1FeatureType, taggedFeature2.tags, way2FeatureType)) {
+ continue;
+ }
+ oneOnly = way1FeatureType === "building" || way2FeatureType === "building";
+ nAId = segment2Info.nodes[0];
+ nBId = segment2Info.nodes[1];
+ if (nAId === n1.id || nAId === n2.id || nBId === n1.id || nBId === n2.id) {
+ continue;
+ }
+ nA = graph.hasEntity(nAId);
+ if (!nA)
+ continue;
+ nB = graph.hasEntity(nBId);
+ if (!nB)
+ continue;
+ segment1 = [n1.loc, n2.loc];
+ segment2 = [nA.loc, nB.loc];
+ var point = geoLineIntersection(segment1, segment2);
+ if (point) {
+ edgeCrossInfos.push({
+ wayInfos: [
+ {
+ way: way1,
+ featureType: way1FeatureType,
+ edge: [n1.id, n2.id]
+ },
+ {
+ way: way2,
+ featureType: way2FeatureType,
+ edge: [nA.id, nB.id]
+ }
+ ],
+ crossPoint: point
+ });
+ if (oneOnly) {
+ checkedSingleCrossingWays[way2.id] = true;
+ break;
+ }
+ }
+ }
+ }
+ return edgeCrossInfos;
+ }
+ function waysToCheck(entity, graph) {
+ var featureType = getFeatureType(entity, graph);
+ if (!featureType)
+ return [];
+ if (entity.type === "way") {
+ return [entity];
+ } else if (entity.type === "relation") {
+ return entity.members.reduce(function(array2, member) {
+ if (member.type === "way" && (!member.role || member.role === "outer" || member.role === "inner")) {
+ var entity2 = graph.hasEntity(member.id);
+ if (entity2 && array2.indexOf(entity2) === -1) {
+ array2.push(entity2);
+ }
+ }
+ return array2;
+ }, []);
+ }
+ return [];
+ }
+ var validation = function checkCrossingWays(entity, graph) {
+ var tree = context.history().tree();
+ var ways = waysToCheck(entity, graph);
+ var issues = [];
+ var wayIndex, crossingIndex, crossings;
+ for (wayIndex in ways) {
+ crossings = findCrossingsByWay(ways[wayIndex], graph, tree);
+ for (crossingIndex in crossings) {
+ issues.push(createIssue(crossings[crossingIndex], graph));
+ }
+ }
+ return issues;
+ };
+ function createIssue(crossing, graph) {
+ crossing.wayInfos.sort(function(way1Info, way2Info) {
+ var type1 = way1Info.featureType;
+ var type22 = way2Info.featureType;
+ if (type1 === type22) {
+ return utilDisplayLabel(way1Info.way, graph) > utilDisplayLabel(way2Info.way, graph);
+ } else if (type1 === "waterway") {
+ return true;
+ } else if (type22 === "waterway") {
+ return false;
+ }
+ return type1 < type22;
+ });
+ var entities = crossing.wayInfos.map(function(wayInfo) {
+ return getFeatureWithFeatureTypeTagsForWay(wayInfo.way, graph);
+ });
+ var edges = [crossing.wayInfos[0].edge, crossing.wayInfos[1].edge];
+ var featureTypes = [crossing.wayInfos[0].featureType, crossing.wayInfos[1].featureType];
+ var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1], graph);
+ var featureType1 = crossing.wayInfos[0].featureType;
+ var featureType2 = crossing.wayInfos[1].featureType;
+ var isCrossingIndoors = taggedAsIndoor(entities[0].tags) && taggedAsIndoor(entities[1].tags);
+ var isCrossingTunnels = allowsTunnel(featureType1) && hasTag(entities[0].tags, "tunnel") && allowsTunnel(featureType2) && hasTag(entities[1].tags, "tunnel");
+ var isCrossingBridges = allowsBridge(featureType1) && hasTag(entities[0].tags, "bridge") && allowsBridge(featureType2) && hasTag(entities[1].tags, "bridge");
+ var subtype = [featureType1, featureType2].sort().join("-");
+ var crossingTypeID = subtype;
+ if (isCrossingIndoors) {
+ crossingTypeID = "indoor-indoor";
+ } else if (isCrossingTunnels) {
+ crossingTypeID = "tunnel-tunnel";
+ } else if (isCrossingBridges) {
+ crossingTypeID = "bridge-bridge";
+ }
+ if (connectionTags && (isCrossingIndoors || isCrossingTunnels || isCrossingBridges)) {
+ crossingTypeID += "_connectable";
+ }
+ var uniqueID = crossing.crossPoint[0].toFixed(4) + "," + crossing.crossPoint[1].toFixed(4);
+ return new validationIssue({
+ type: type3,
+ subtype,
+ severity: "warning",
+ message: function(context2) {
+ var graph2 = context2.graph();
+ var entity1 = graph2.hasEntity(this.entityIds[0]), entity2 = graph2.hasEntity(this.entityIds[1]);
+ return entity1 && entity2 ? _t.html("issues.crossing_ways.message", {
+ feature: utilDisplayLabel(entity1, graph2),
+ feature2: utilDisplayLabel(entity2, graph2)
+ }) : "";
+ },
+ reference: showReference,
+ entityIds: entities.map(function(entity) {
+ return entity.id;
+ }),
+ data: {
+ edges,
+ featureTypes,
+ connectionTags
+ },
+ hash: uniqueID,
+ loc: crossing.crossPoint,
+ dynamicFixes: function(context2) {
+ var mode = context2.mode();
+ if (!mode || mode.id !== "select" || mode.selectedIDs().length !== 1)
+ return [];
+ var selectedIndex = this.entityIds[0] === mode.selectedIDs()[0] ? 0 : 1;
+ var selectedFeatureType = this.data.featureTypes[selectedIndex];
+ var otherFeatureType = this.data.featureTypes[selectedIndex === 0 ? 1 : 0];
+ var fixes = [];
+ if (connectionTags) {
+ fixes.push(makeConnectWaysFix(this.data.connectionTags));
+ }
+ if (isCrossingIndoors) {
+ fixes.push(new validationIssueFix({
+ icon: "iD-icon-layers",
+ title: _t.html("issues.fix.use_different_levels.title")
+ }));
+ } else if (isCrossingTunnels || isCrossingBridges || featureType1 === "building" || featureType2 === "building") {
+ fixes.push(makeChangeLayerFix("higher"));
+ fixes.push(makeChangeLayerFix("lower"));
+ } else if (context2.graph().geometry(this.entityIds[0]) === "line" && context2.graph().geometry(this.entityIds[1]) === "line") {
+ if (allowsBridge(selectedFeatureType) && selectedFeatureType !== "waterway") {
+ fixes.push(makeAddBridgeOrTunnelFix("add_a_bridge", "temaki-bridge", "bridge"));
+ }
+ var skipTunnelFix = otherFeatureType === "waterway" && selectedFeatureType !== "waterway";
+ if (allowsTunnel(selectedFeatureType) && !skipTunnelFix) {
+ fixes.push(makeAddBridgeOrTunnelFix("add_a_tunnel", "temaki-tunnel", "tunnel"));
+ }
+ }
+ fixes.push(new validationIssueFix({
+ icon: "iD-operation-move",
+ title: _t.html("issues.fix.reposition_features.title")
+ }));
+ return fixes;
+ }
+ });
+ function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.crossing_ways." + crossingTypeID + ".reference"));
+ }
+ }
+ function makeAddBridgeOrTunnelFix(fixTitleID, iconName, bridgeOrTunnel) {
+ return new validationIssueFix({
+ icon: iconName,
+ title: _t.html("issues.fix." + fixTitleID + ".title"),
+ onClick: function(context2) {
+ var mode = context2.mode();
+ if (!mode || mode.id !== "select")
+ return;
+ var selectedIDs = mode.selectedIDs();
+ if (selectedIDs.length !== 1)
+ return;
+ var selectedWayID = selectedIDs[0];
+ if (!context2.hasEntity(selectedWayID))
+ return;
+ var resultWayIDs = [selectedWayID];
+ var edge, crossedEdge, crossedWayID;
+ if (this.issue.entityIds[0] === selectedWayID) {
+ edge = this.issue.data.edges[0];
+ crossedEdge = this.issue.data.edges[1];
+ crossedWayID = this.issue.entityIds[1];
+ } else {
+ edge = this.issue.data.edges[1];
+ crossedEdge = this.issue.data.edges[0];
+ crossedWayID = this.issue.entityIds[0];
+ }
+ var crossingLoc = this.issue.loc;
+ var projection2 = context2.projection;
+ var action = function actionAddStructure(graph) {
+ var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
+ var crossedWay = graph.hasEntity(crossedWayID);
+ var structLengthMeters = crossedWay && crossedWay.tags.width && parseFloat(crossedWay.tags.width);
+ if (!structLengthMeters) {
+ structLengthMeters = crossedWay && crossedWay.impliedLineWidthMeters();
+ }
+ if (structLengthMeters) {
+ if (getFeatureType(crossedWay, graph) === "railway") {
+ structLengthMeters *= 2;
+ }
+ } else {
+ structLengthMeters = 8;
+ }
+ var a1 = geoAngle(edgeNodes[0], edgeNodes[1], projection2) + Math.PI;
+ var a2 = geoAngle(graph.entity(crossedEdge[0]), graph.entity(crossedEdge[1]), projection2) + Math.PI;
+ var crossingAngle = Math.max(a1, a2) - Math.min(a1, a2);
+ if (crossingAngle > Math.PI)
+ crossingAngle -= Math.PI;
+ structLengthMeters = structLengthMeters / 2 / Math.sin(crossingAngle) * 2;
+ structLengthMeters += 4;
+ structLengthMeters = Math.min(Math.max(structLengthMeters, 4), 50);
+ function geomToProj(geoPoint) {
+ return [
+ geoLonToMeters(geoPoint[0], geoPoint[1]),
+ geoLatToMeters(geoPoint[1])
+ ];
+ }
+ function projToGeom(projPoint) {
+ var lat = geoMetersToLat(projPoint[1]);
+ return [
+ geoMetersToLon(projPoint[0], lat),
+ lat
+ ];
+ }
+ var projEdgeNode1 = geomToProj(edgeNodes[0].loc);
+ var projEdgeNode2 = geomToProj(edgeNodes[1].loc);
+ var projectedAngle = geoVecAngle(projEdgeNode1, projEdgeNode2);
+ var projectedCrossingLoc = geomToProj(crossingLoc);
+ var linearToSphericalMetersRatio = geoVecLength(projEdgeNode1, projEdgeNode2) / geoSphericalDistance(edgeNodes[0].loc, edgeNodes[1].loc);
+ function locSphericalDistanceFromCrossingLoc(angle2, distanceMeters) {
+ var lengthSphericalMeters = distanceMeters * linearToSphericalMetersRatio;
+ return projToGeom([
+ projectedCrossingLoc[0] + Math.cos(angle2) * lengthSphericalMeters,
+ projectedCrossingLoc[1] + Math.sin(angle2) * lengthSphericalMeters
+ ]);
+ }
+ var endpointLocGetter1 = function(lengthMeters) {
+ return locSphericalDistanceFromCrossingLoc(projectedAngle, lengthMeters);
+ };
+ var endpointLocGetter2 = function(lengthMeters) {
+ return locSphericalDistanceFromCrossingLoc(projectedAngle + Math.PI, lengthMeters);
+ };
+ var minEdgeLengthMeters = 0.55;
+ function determineEndpoint(edge2, endNode, locGetter) {
+ var newNode;
+ var idealLengthMeters = structLengthMeters / 2;
+ var crossingToEdgeEndDistance = geoSphericalDistance(crossingLoc, endNode.loc);
+ if (crossingToEdgeEndDistance - idealLengthMeters > minEdgeLengthMeters) {
+ var idealNodeLoc = locGetter(idealLengthMeters);
+ newNode = osmNode();
+ graph = actionAddMidpoint({ loc: idealNodeLoc, edge: edge2 }, newNode)(graph);
+ } else {
+ var edgeCount = 0;
+ endNode.parentIntersectionWays(graph).forEach(function(way) {
+ way.nodes.forEach(function(nodeID) {
+ if (nodeID === endNode.id) {
+ if (endNode.id === way.first() && endNode.id !== way.last() || endNode.id === way.last() && endNode.id !== way.first()) {
+ edgeCount += 1;
+ } else {
+ edgeCount += 2;
+ }
+ }
+ });
+ });
+ if (edgeCount >= 3) {
+ var insetLength = crossingToEdgeEndDistance - minEdgeLengthMeters;
+ if (insetLength > minEdgeLengthMeters) {
+ var insetNodeLoc = locGetter(insetLength);
+ newNode = osmNode();
+ graph = actionAddMidpoint({ loc: insetNodeLoc, edge: edge2 }, newNode)(graph);
+ }
+ }
+ }
+ if (!newNode)
+ newNode = endNode;
+ var splitAction = actionSplit([newNode.id]).limitWays(resultWayIDs);
+ graph = splitAction(graph);
+ if (splitAction.getCreatedWayIDs().length) {
+ resultWayIDs.push(splitAction.getCreatedWayIDs()[0]);
+ }
+ return newNode;
+ }
+ var structEndNode1 = determineEndpoint(edge, edgeNodes[1], endpointLocGetter1);
+ var structEndNode2 = determineEndpoint([edgeNodes[0].id, structEndNode1.id], edgeNodes[0], endpointLocGetter2);
+ var structureWay = resultWayIDs.map(function(id2) {
+ return graph.entity(id2);
+ }).find(function(way) {
+ return way.nodes.indexOf(structEndNode1.id) !== -1 && way.nodes.indexOf(structEndNode2.id) !== -1;
+ });
+ var tags = Object.assign({}, structureWay.tags);
+ if (bridgeOrTunnel === "bridge") {
+ tags.bridge = "yes";
+ tags.layer = "1";
+ } else {
+ var tunnelValue = "yes";
+ if (getFeatureType(structureWay, graph) === "waterway") {
+ tunnelValue = "culvert";
+ }
+ tags.tunnel = tunnelValue;
+ tags.layer = "-1";
+ }
+ graph = actionChangeTags(structureWay.id, tags)(graph);
+ return graph;
+ };
+ context2.perform(action, _t("issues.fix." + fixTitleID + ".annotation"));
+ context2.enter(modeSelect(context2, resultWayIDs));
+ }
+ });
+ }
+ function makeConnectWaysFix(connectionTags) {
+ var fixTitleID = "connect_features";
+ if (connectionTags.ford) {
+ fixTitleID = "connect_using_ford";
+ }
+ return new validationIssueFix({
+ icon: "iD-icon-crossing",
+ title: _t.html("issues.fix." + fixTitleID + ".title"),
+ onClick: function(context2) {
+ var loc = this.issue.loc;
+ var connectionTags2 = this.issue.data.connectionTags;
+ var edges = this.issue.data.edges;
+ context2.perform(function actionConnectCrossingWays(graph) {
+ var node = osmNode({ loc, tags: connectionTags2 });
+ graph = graph.replace(node);
+ var nodesToMerge = [node.id];
+ var mergeThresholdInMeters = 0.75;
+ edges.forEach(function(edge) {
+ var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
+ var nearby = geoSphericalClosestNode(edgeNodes, loc);
+ if ((!nearby.node.hasInterestingTags() || nearby.node.isCrossing()) && nearby.distance < mergeThresholdInMeters) {
+ nodesToMerge.push(nearby.node.id);
+ } else {
+ graph = actionAddMidpoint({ loc, edge }, node)(graph);
+ }
+ });
+ if (nodesToMerge.length > 1) {
+ graph = actionMergeNodes(nodesToMerge, loc)(graph);
+ }
+ return graph;
+ }, _t("issues.fix.connect_crossing_features.annotation"));
+ }
+ });
+ }
+ function makeChangeLayerFix(higherOrLower) {
+ return new validationIssueFix({
+ icon: "iD-icon-" + (higherOrLower === "higher" ? "up" : "down"),
+ title: _t.html("issues.fix.tag_this_as_" + higherOrLower + ".title"),
+ onClick: function(context2) {
+ var mode = context2.mode();
+ if (!mode || mode.id !== "select")
+ return;
+ var selectedIDs = mode.selectedIDs();
+ if (selectedIDs.length !== 1)
+ return;
+ var selectedID = selectedIDs[0];
+ if (!this.issue.entityIds.some(function(entityId) {
+ return entityId === selectedID;
+ }))
+ return;
+ var entity = context2.hasEntity(selectedID);
+ if (!entity)
+ return;
+ var tags = Object.assign({}, entity.tags);
+ var layer = tags.layer && Number(tags.layer);
+ if (layer && !isNaN(layer)) {
+ if (higherOrLower === "higher") {
+ layer += 1;
+ } else {
+ layer -= 1;
+ }
+ } else {
+ if (higherOrLower === "higher") {
+ layer = 1;
+ } else {
+ layer = -1;
+ }
+ }
+ tags.layer = layer.toString();
+ context2.perform(actionChangeTags(entity.id, tags), _t("operations.change_tags.annotation"));
+ }
+ });
+ }
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/behavior/draw_way.js
+ function behaviorDrawWay(context, wayID, mode, startGraph) {
+ const keybinding = utilKeybinding("drawWay");
+ var dispatch10 = dispatch_default("rejectedSelfIntersection");
+ var behavior = behaviorDraw(context);
+ var _nodeIndex;
+ var _origWay;
+ var _wayGeometry;
+ var _headNodeID;
+ var _annotation;
+ var _pointerHasMoved = false;
+ var _drawNode;
+ var _didResolveTempEdit = false;
+ function createDrawNode(loc) {
+ _drawNode = osmNode({ loc });
+ context.pauseChangeDispatch();
+ context.replace(function actionAddDrawNode(graph) {
+ var way = graph.entity(wayID);
+ return graph.replace(_drawNode).replace(way.addNode(_drawNode.id, _nodeIndex));
+ }, _annotation);
+ context.resumeChangeDispatch();
+ setActiveElements();
+ }
+ function removeDrawNode() {
+ context.pauseChangeDispatch();
+ context.replace(function actionDeleteDrawNode(graph) {
+ var way = graph.entity(wayID);
+ return graph.replace(way.removeNode(_drawNode.id)).remove(_drawNode);
+ }, _annotation);
+ _drawNode = void 0;
+ context.resumeChangeDispatch();
+ }
+ function keydown(d3_event) {
+ if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
+ if (context.surface().classed("nope")) {
+ context.surface().classed("nope-suppressed", true);
+ }
+ context.surface().classed("nope", false).classed("nope-disabled", true);
+ }
+ }
+ function keyup(d3_event) {
+ if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
+ if (context.surface().classed("nope-suppressed")) {
+ context.surface().classed("nope", true);
+ }
+ context.surface().classed("nope-suppressed", false).classed("nope-disabled", false);
+ }
+ }
+ function allowsVertex(d) {
+ return d.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d, context.graph());
+ }
+ function move(d3_event, datum2) {
+ var loc = context.map().mouseCoordinates();
+ if (!_drawNode)
+ createDrawNode(loc);
+ context.surface().classed("nope-disabled", d3_event.altKey);
+ var targetLoc = datum2 && datum2.properties && datum2.properties.entity && allowsVertex(datum2.properties.entity) && datum2.properties.entity.loc;
+ var targetNodes = datum2 && datum2.properties && datum2.properties.nodes;
+ if (targetLoc) {
+ loc = targetLoc;
+ } else if (targetNodes) {
+ var choice = geoChooseEdge(targetNodes, context.map().mouse(), context.projection, _drawNode.id);
+ if (choice) {
+ loc = choice.loc;
+ }
+ }
+ context.replace(actionMoveNode(_drawNode.id, loc), _annotation);
+ _drawNode = context.entity(_drawNode.id);
+ checkGeometry(true);
+ }
+ function checkGeometry(includeDrawNode) {
+ var nopeDisabled = context.surface().classed("nope-disabled");
+ var isInvalid = isInvalidGeometry(includeDrawNode);
+ if (nopeDisabled) {
+ context.surface().classed("nope", false).classed("nope-suppressed", isInvalid);
+ } else {
+ context.surface().classed("nope", isInvalid).classed("nope-suppressed", false);
+ }
+ }
+ function isInvalidGeometry(includeDrawNode) {
+ var testNode = _drawNode;
+ var parentWay = context.graph().entity(wayID);
+ var nodes = context.graph().childNodes(parentWay).slice();
+ if (includeDrawNode) {
+ if (parentWay.isClosed()) {
+ nodes.pop();
+ }
+ } else {
+ if (parentWay.isClosed()) {
+ if (nodes.length < 3)
+ return false;
+ if (_drawNode)
+ nodes.splice(-2, 1);
+ testNode = nodes[nodes.length - 2];
+ } else {
+ return false;
+ }
+ }
+ return testNode && geoHasSelfIntersections(nodes, testNode.id);
+ }
+ function undone() {
+ _didResolveTempEdit = true;
+ context.pauseChangeDispatch();
+ var nextMode;
+ if (context.graph() === startGraph) {
+ nextMode = modeSelect(context, [wayID]);
+ } else {
+ context.pop(1);
+ nextMode = mode;
+ }
+ context.perform(actionNoop());
+ context.pop(1);
+ context.resumeChangeDispatch();
+ context.enter(nextMode);
+ }
+ function setActiveElements() {
+ if (!_drawNode)
+ return;
+ context.surface().selectAll("." + _drawNode.id).classed("active", true);
+ }
+ function resetToStartGraph() {
+ while (context.graph() !== startGraph) {
+ context.pop();
+ }
+ }
+ var drawWay = function(surface) {
+ _drawNode = void 0;
+ _didResolveTempEdit = false;
+ _origWay = context.entity(wayID);
+ if (typeof _nodeIndex === "number") {
+ _headNodeID = _origWay.nodes[_nodeIndex];
+ } else if (_origWay.isClosed()) {
+ _headNodeID = _origWay.nodes[_origWay.nodes.length - 2];
+ } else {
+ _headNodeID = _origWay.nodes[_origWay.nodes.length - 1];
+ }
+ _wayGeometry = _origWay.geometry(context.graph());
+ _annotation = _t((_origWay.nodes.length === (_origWay.isClosed() ? 2 : 1) ? "operations.start.annotation." : "operations.continue.annotation.") + _wayGeometry);
+ _pointerHasMoved = false;
+ context.pauseChangeDispatch();
+ context.perform(actionNoop(), _annotation);
+ context.resumeChangeDispatch();
+ behavior.hover().initialNodeID(_headNodeID);
+ behavior.on("move", function() {
+ _pointerHasMoved = true;
+ move.apply(this, arguments);
+ }).on("down", function() {
+ move.apply(this, arguments);
+ }).on("downcancel", function() {
+ if (_drawNode)
+ removeDrawNode();
+ }).on("click", drawWay.add).on("clickWay", drawWay.addWay).on("clickNode", drawWay.addNode).on("undo", context.undo).on("cancel", drawWay.cancel).on("finish", drawWay.finish);
+ select_default2(window).on("keydown.drawWay", keydown).on("keyup.drawWay", keyup);
+ context.map().dblclickZoomEnable(false).on("drawn.draw", setActiveElements);
+ setActiveElements();
+ surface.call(behavior);
+ context.history().on("undone.draw", undone);
+ };
+ drawWay.off = function(surface) {
+ if (!_didResolveTempEdit) {
+ context.pauseChangeDispatch();
+ resetToStartGraph();
+ context.resumeChangeDispatch();
+ }
+ _drawNode = void 0;
+ _nodeIndex = void 0;
+ context.map().on("drawn.draw", null);
+ surface.call(behavior.off).selectAll(".active").classed("active", false);
+ surface.classed("nope", false).classed("nope-suppressed", false).classed("nope-disabled", false);
+ select_default2(window).on("keydown.drawWay", null).on("keyup.drawWay", null);
+ context.history().on("undone.draw", null);
+ };
+ function attemptAdd(d, loc, doAdd) {
+ if (_drawNode) {
+ context.replace(actionMoveNode(_drawNode.id, loc), _annotation);
+ _drawNode = context.entity(_drawNode.id);
+ } else {
+ createDrawNode(loc);
+ }
+ checkGeometry(true);
+ if (d && d.properties && d.properties.nope || context.surface().classed("nope")) {
+ if (!_pointerHasMoved) {
+ removeDrawNode();
+ }
+ dispatch10.call("rejectedSelfIntersection", this);
+ return;
+ }
+ context.pauseChangeDispatch();
+ doAdd();
+ _didResolveTempEdit = true;
+ context.resumeChangeDispatch();
+ context.enter(mode);
+ }
+ drawWay.add = function(loc, d) {
+ attemptAdd(d, loc, function() {
+ });
+ };
+ drawWay.addWay = function(loc, edge, d) {
+ attemptAdd(d, loc, function() {
+ context.replace(actionAddMidpoint({ loc, edge }, _drawNode), _annotation);
+ });
+ };
+ drawWay.addNode = function(node, d) {
+ if (node.id === _headNodeID || _origWay.isClosed() && node.id === _origWay.first()) {
+ drawWay.finish();
+ return;
+ }
+ attemptAdd(d, node.loc, function() {
+ context.replace(function actionReplaceDrawNode(graph) {
+ graph = graph.replace(graph.entity(wayID).removeNode(_drawNode.id)).remove(_drawNode);
+ return graph.replace(graph.entity(wayID).addNode(node.id, _nodeIndex));
+ }, _annotation);
+ });
+ };
+ function getFeatureType(ways) {
+ if (ways.every((way) => way.isClosed()))
+ return "area";
+ if (ways.every((way) => !way.isClosed()))
+ return "line";
+ return "generic";
+ }
+ function followMode() {
+ if (_didResolveTempEdit)
+ return;
+ try {
+ const isDrawingArea = _origWay.nodes[0] === _origWay.nodes.slice(-1)[0];
+ const [secondLastNodeId, lastNodeId] = _origWay.nodes.slice(isDrawingArea ? -3 : -2);
+ const historyGraph = context.history().graph();
+ if (!lastNodeId || !secondLastNodeId || !historyGraph.hasEntity(lastNodeId) || !historyGraph.hasEntity(secondLastNodeId)) {
+ context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.html("operations.follow.error.needs_more_initial_nodes"))();
+ return;
+ }
+ const lastNodesParents = historyGraph.parentWays(historyGraph.entity(lastNodeId)).filter((w) => w.id !== wayID);
+ const secondLastNodesParents = historyGraph.parentWays(historyGraph.entity(secondLastNodeId)).filter((w) => w.id !== wayID);
+ const featureType = getFeatureType(lastNodesParents);
+ if (lastNodesParents.length !== 1 || secondLastNodesParents.length === 0) {
+ context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.html(`operations.follow.error.intersection_of_multiple_ways.${featureType}`))();
+ return;
+ }
+ if (!secondLastNodesParents.some((n2) => n2.id === lastNodesParents[0].id)) {
+ context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.html(`operations.follow.error.intersection_of_different_ways.${featureType}`))();
+ return;
+ }
+ const way = lastNodesParents[0];
+ const indexOfLast = way.nodes.indexOf(lastNodeId);
+ const indexOfSecondLast = way.nodes.indexOf(secondLastNodeId);
+ const isDescendingPastZero = indexOfLast === way.nodes.length - 2 && indexOfSecondLast === 0;
+ let nextNodeIndex = indexOfLast + (indexOfLast > indexOfSecondLast && !isDescendingPastZero ? 1 : -1);
+ if (nextNodeIndex === -1)
+ nextNodeIndex = indexOfSecondLast === 1 ? way.nodes.length - 2 : 1;
+ const nextNode = historyGraph.entity(way.nodes[nextNodeIndex]);
+ drawWay.addNode(nextNode, {
+ geometry: { type: "Point", coordinates: nextNode.loc },
+ id: nextNode.id,
+ properties: { target: true, entity: nextNode }
+ });
+ } catch (ex) {
+ context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.html("operations.follow.error.unknown"))();
+ }
+ }
+ keybinding.on(_t("operations.follow.key"), followMode);
+ select_default2(document).call(keybinding);
+ drawWay.finish = function() {
+ checkGeometry(false);
+ if (context.surface().classed("nope")) {
+ dispatch10.call("rejectedSelfIntersection", this);
+ return;
+ }
+ context.pauseChangeDispatch();
+ context.pop(1);
+ _didResolveTempEdit = true;
+ context.resumeChangeDispatch();
+ var way = context.hasEntity(wayID);
+ if (!way || way.isDegenerate()) {
+ drawWay.cancel();
+ return;
+ }
+ window.setTimeout(function() {
+ context.map().dblclickZoomEnable(true);
+ }, 1e3);
+ var isNewFeature = !mode.isContinuing;
+ context.enter(modeSelect(context, [wayID]).newFeature(isNewFeature));
+ };
+ drawWay.cancel = function() {
+ context.pauseChangeDispatch();
+ resetToStartGraph();
+ context.resumeChangeDispatch();
+ window.setTimeout(function() {
+ context.map().dblclickZoomEnable(true);
+ }, 1e3);
+ context.surface().classed("nope", false).classed("nope-disabled", false).classed("nope-suppressed", false);
+ context.enter(modeBrowse(context));
+ };
+ drawWay.nodeIndex = function(val) {
+ if (!arguments.length)
+ return _nodeIndex;
+ _nodeIndex = val;
+ return drawWay;
+ };
+ drawWay.activeID = function() {
+ if (!arguments.length)
+ return _drawNode && _drawNode.id;
+ return drawWay;
+ };
+ return utilRebind(drawWay, dispatch10, "on");
+ }
+
+ // modules/modes/draw_line.js
+ function modeDrawLine(context, wayID, startGraph, button, affix, continuing) {
+ var mode = {
+ button,
+ id: "draw-line"
+ };
+ var behavior = behaviorDrawWay(context, wayID, mode, startGraph).on("rejectedSelfIntersection.modeDrawLine", function() {
+ context.ui().flash.iconName("#iD-icon-no").label(_t.html("self_intersection.error.lines"))();
+ });
+ mode.wayID = wayID;
+ mode.isContinuing = continuing;
+ mode.enter = function() {
+ behavior.nodeIndex(affix === "prefix" ? 0 : void 0);
+ context.install(behavior);
+ };
+ mode.exit = function() {
+ context.uninstall(behavior);
+ };
+ mode.selectedIDs = function() {
+ return [wayID];
+ };
+ mode.activeID = function() {
+ return behavior && behavior.activeID() || [];
+ };
+ return mode;
+ }
+
+ // modules/validations/disconnected_way.js
+ function validationDisconnectedWay() {
+ var type3 = "disconnected_way";
+ function isTaggedAsHighway(entity) {
+ return osmRoutableHighwayTagValues[entity.tags.highway];
+ }
+ var validation = function checkDisconnectedWay(entity, graph) {
+ var routingIslandWays = routingIslandForEntity(entity);
+ if (!routingIslandWays)
+ return [];
+ return [new validationIssue({
+ type: type3,
+ subtype: "highway",
+ severity: "warning",
+ message: function(context) {
+ var entity2 = this.entityIds.length && context.hasEntity(this.entityIds[0]);
+ var label = entity2 && utilDisplayLabel(entity2, context.graph());
+ return _t.html("issues.disconnected_way.routable.message", { count: this.entityIds.length, highway: label });
+ },
+ reference: showReference,
+ entityIds: Array.from(routingIslandWays).map(function(way) {
+ return way.id;
+ }),
+ dynamicFixes: makeFixes
+ })];
+ function makeFixes(context) {
+ var fixes = [];
+ var singleEntity = this.entityIds.length === 1 && context.hasEntity(this.entityIds[0]);
+ if (singleEntity) {
+ if (singleEntity.type === "way" && !singleEntity.isClosed()) {
+ var textDirection = _mainLocalizer.textDirection();
+ var startFix = makeContinueDrawingFixIfAllowed(textDirection, singleEntity.first(), "start");
+ if (startFix)
+ fixes.push(startFix);
+ var endFix = makeContinueDrawingFixIfAllowed(textDirection, singleEntity.last(), "end");
+ if (endFix)
+ fixes.push(endFix);
+ }
+ if (!fixes.length) {
+ fixes.push(new validationIssueFix({
+ title: _t.html("issues.fix.connect_feature.title")
+ }));
+ }
+ fixes.push(new validationIssueFix({
+ icon: "iD-operation-delete",
+ title: _t.html("issues.fix.delete_feature.title"),
+ entityIds: [singleEntity.id],
+ onClick: function(context2) {
+ var id2 = this.issue.entityIds[0];
+ var operation = operationDelete(context2, [id2]);
+ if (!operation.disabled()) {
+ operation();
+ }
+ }
+ }));
+ } else {
+ fixes.push(new validationIssueFix({
+ title: _t.html("issues.fix.connect_features.title")
+ }));
+ }
+ return fixes;
+ }
+ function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.disconnected_way.routable.reference"));
+ }
+ function routingIslandForEntity(entity2) {
+ var routingIsland = /* @__PURE__ */ new Set();
+ var waysToCheck = [];
+ function queueParentWays(node) {
+ graph.parentWays(node).forEach(function(parentWay) {
+ if (!routingIsland.has(parentWay) && isRoutableWay(parentWay, false)) {
+ routingIsland.add(parentWay);
+ waysToCheck.push(parentWay);
+ }
+ });
+ }
+ if (entity2.type === "way" && isRoutableWay(entity2, true)) {
+ routingIsland.add(entity2);
+ waysToCheck.push(entity2);
+ } else if (entity2.type === "node" && isRoutableNode(entity2)) {
+ routingIsland.add(entity2);
+ queueParentWays(entity2);
+ } else {
+ return null;
+ }
+ while (waysToCheck.length) {
+ var wayToCheck = waysToCheck.pop();
+ var childNodes = graph.childNodes(wayToCheck);
+ for (var i2 in childNodes) {
+ var vertex = childNodes[i2];
+ if (isConnectedVertex(vertex)) {
+ return null;
+ }
+ if (isRoutableNode(vertex)) {
+ routingIsland.add(vertex);
+ }
+ queueParentWays(vertex);
+ }
+ }
+ return routingIsland;
+ }
+ function isConnectedVertex(vertex) {
+ var osm = services.osm;
+ if (osm && !osm.isDataLoaded(vertex.loc))
+ return true;
+ if (vertex.tags.entrance && vertex.tags.entrance !== "no")
+ return true;
+ if (vertex.tags.amenity === "parking_entrance")
+ return true;
+ return false;
+ }
+ function isRoutableNode(node) {
+ if (node.tags.highway === "elevator")
+ return true;
+ return false;
+ }
+ function isRoutableWay(way, ignoreInnerWays) {
+ if (isTaggedAsHighway(way) || way.tags.route === "ferry")
+ return true;
+ return graph.parentRelations(way).some(function(parentRelation) {
+ if (parentRelation.tags.type === "route" && parentRelation.tags.route === "ferry")
+ return true;
+ if (parentRelation.isMultipolygon() && isTaggedAsHighway(parentRelation) && (!ignoreInnerWays || parentRelation.memberById(way.id).role !== "inner"))
+ return true;
+ return false;
+ });
+ }
+ function makeContinueDrawingFixIfAllowed(textDirection, vertexID, whichEnd) {
+ var vertex = graph.hasEntity(vertexID);
+ if (!vertex || vertex.tags.noexit === "yes")
+ return null;
+ var useLeftContinue = whichEnd === "start" && textDirection === "ltr" || whichEnd === "end" && textDirection === "rtl";
+ return new validationIssueFix({
+ icon: "iD-operation-continue" + (useLeftContinue ? "-left" : ""),
+ title: _t.html("issues.fix.continue_from_" + whichEnd + ".title"),
+ entityIds: [vertexID],
+ onClick: function(context) {
+ var wayId = this.issue.entityIds[0];
+ var way = context.hasEntity(wayId);
+ var vertexId = this.entityIds[0];
+ var vertex2 = context.hasEntity(vertexId);
+ if (!way || !vertex2)
+ return;
+ var map2 = context.map();
+ if (!context.editable() || !map2.trimmedExtent().contains(vertex2.loc)) {
+ map2.zoomToEase(vertex2);
+ }
+ context.enter(modeDrawLine(context, wayId, context.graph(), "line", way.affix(vertexId), true));
+ }
+ });
+ }
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/invalid_format.js
+ function validationFormatting() {
+ var type3 = "invalid_format";
+ var validation = function(entity) {
+ var issues = [];
+ function isValidEmail(email) {
+ var valid_email = /^[^\(\)\\,":;<>@\[\]]+@[^\(\)\\,":;<>@\[\]\.]+(?:\.[a-z0-9-]+)*$/i;
+ return !email || valid_email.test(email);
+ }
+ function showReferenceEmail(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.invalid_format.email.reference"));
+ }
+ if (entity.tags.email) {
+ var emails = entity.tags.email.split(";").map(function(s) {
+ return s.trim();
+ }).filter(function(x) {
+ return !isValidEmail(x);
+ });
+ if (emails.length) {
+ issues.push(new validationIssue({
+ type: type3,
+ subtype: "email",
+ severity: "warning",
+ message: function(context) {
+ var entity2 = context.hasEntity(this.entityIds[0]);
+ return entity2 ? _t.html("issues.invalid_format.email.message" + this.data, { feature: utilDisplayLabel(entity2, context.graph()), email: emails.join(", ") }) : "";
+ },
+ reference: showReferenceEmail,
+ entityIds: [entity.id],
+ hash: emails.join(),
+ data: emails.length > 1 ? "_multi" : ""
+ }));
+ }
+ }
+ return issues;
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/help_request.js
+ function validationHelpRequest(context) {
+ var type3 = "help_request";
+ var validation = function checkFixmeTag(entity) {
+ if (!entity.tags.fixme)
+ return [];
+ if (entity.version === void 0)
+ return [];
+ if (entity.v !== void 0) {
+ var baseEntity = context.history().base().hasEntity(entity.id);
+ if (!baseEntity || !baseEntity.tags.fixme)
+ return [];
+ }
+ return [new validationIssue({
+ type: type3,
+ subtype: "fixme_tag",
+ severity: "warning",
+ message: function(context2) {
+ var entity2 = context2.hasEntity(this.entityIds[0]);
+ return entity2 ? _t.html("issues.fixme_tag.message", {
+ feature: utilDisplayLabel(entity2, context2.graph(), true)
+ }) : "";
+ },
+ dynamicFixes: function() {
+ return [
+ new validationIssueFix({
+ title: _t.html("issues.fix.address_the_concern.title")
+ })
+ ];
+ },
+ reference: showReference,
+ entityIds: [entity.id]
+ })];
+ function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.fixme_tag.reference"));
+ }
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/impossible_oneway.js
+ function validationImpossibleOneway() {
+ var type3 = "impossible_oneway";
+ var validation = function checkImpossibleOneway(entity, graph) {
+ if (entity.type !== "way" || entity.geometry(graph) !== "line")
+ return [];
+ if (entity.isClosed())
+ return [];
+ if (!typeForWay(entity))
+ return [];
+ if (!isOneway(entity))
+ return [];
+ var firstIssues = issuesForNode(entity, entity.first());
+ var lastIssues = issuesForNode(entity, entity.last());
+ return firstIssues.concat(lastIssues);
+ function typeForWay(way) {
+ if (way.geometry(graph) !== "line")
+ return null;
+ if (osmRoutableHighwayTagValues[way.tags.highway])
+ return "highway";
+ if (osmFlowingWaterwayTagValues[way.tags.waterway])
+ return "waterway";
+ return null;
+ }
+ function isOneway(way) {
+ if (way.tags.oneway === "yes")
+ return true;
+ if (way.tags.oneway)
+ return false;
+ for (var key in way.tags) {
+ if (osmOneWayTags[key] && osmOneWayTags[key][way.tags[key]]) {
+ return true;
+ }
+ }
+ return false;
+ }
+ function nodeOccursMoreThanOnce(way, nodeID) {
+ var occurrences = 0;
+ for (var index in way.nodes) {
+ if (way.nodes[index] === nodeID) {
+ occurrences += 1;
+ if (occurrences > 1)
+ return true;
+ }
+ }
+ return false;
+ }
+ function isConnectedViaOtherTypes(way, node) {
+ var wayType = typeForWay(way);
+ if (wayType === "highway") {
+ if (node.tags.entrance && node.tags.entrance !== "no")
+ return true;
+ if (node.tags.amenity === "parking_entrance")
+ return true;
+ } else if (wayType === "waterway") {
+ if (node.id === way.first()) {
+ if (node.tags.natural === "spring")
+ return true;
+ } else {
+ if (node.tags.manhole === "drain")
+ return true;
+ }
+ }
+ return graph.parentWays(node).some(function(parentWay) {
+ if (parentWay.id === way.id)
+ return false;
+ if (wayType === "highway") {
+ if (parentWay.geometry(graph) === "area" && osmRoutableHighwayTagValues[parentWay.tags.highway])
+ return true;
+ if (parentWay.tags.route === "ferry")
+ return true;
+ return graph.parentRelations(parentWay).some(function(parentRelation) {
+ if (parentRelation.tags.type === "route" && parentRelation.tags.route === "ferry")
+ return true;
+ return parentRelation.isMultipolygon() && osmRoutableHighwayTagValues[parentRelation.tags.highway];
+ });
+ } else if (wayType === "waterway") {
+ if (parentWay.tags.natural === "water" || parentWay.tags.natural === "coastline")
+ return true;
+ }
+ return false;
+ });
+ }
+ function issuesForNode(way, nodeID) {
+ var isFirst = nodeID === way.first();
+ var wayType = typeForWay(way);
+ if (nodeOccursMoreThanOnce(way, nodeID))
+ return [];
+ var osm = services.osm;
+ if (!osm)
+ return [];
+ var node = graph.hasEntity(nodeID);
+ if (!node || !osm.isDataLoaded(node.loc))
+ return [];
+ if (isConnectedViaOtherTypes(way, node))
+ return [];
+ var attachedWaysOfSameType = graph.parentWays(node).filter(function(parentWay) {
+ if (parentWay.id === way.id)
+ return false;
+ return typeForWay(parentWay) === wayType;
+ });
+ if (wayType === "waterway" && attachedWaysOfSameType.length === 0)
+ return [];
+ var attachedOneways = attachedWaysOfSameType.filter(function(attachedWay) {
+ return isOneway(attachedWay);
+ });
+ if (attachedOneways.length < attachedWaysOfSameType.length)
+ return [];
+ if (attachedOneways.length) {
+ var connectedEndpointsOkay = attachedOneways.some(function(attachedOneway) {
+ if ((isFirst ? attachedOneway.first() : attachedOneway.last()) !== nodeID)
+ return true;
+ if (nodeOccursMoreThanOnce(attachedOneway, nodeID))
+ return true;
+ return false;
+ });
+ if (connectedEndpointsOkay)
+ return [];
+ }
+ var placement = isFirst ? "start" : "end", messageID = wayType + ".", referenceID = wayType + ".";
+ if (wayType === "waterway") {
+ messageID += "connected." + placement;
+ referenceID += "connected";
+ } else {
+ messageID += placement;
+ referenceID += placement;
+ }
+ return [new validationIssue({
+ type: type3,
+ subtype: wayType,
+ severity: "warning",
+ message: function(context) {
+ var entity2 = context.hasEntity(this.entityIds[0]);
+ return entity2 ? _t.html("issues.impossible_oneway." + messageID + ".message", {
+ feature: utilDisplayLabel(entity2, context.graph())
+ }) : "";
+ },
+ reference: getReference(referenceID),
+ entityIds: [way.id, node.id],
+ dynamicFixes: function() {
+ var fixes = [];
+ if (attachedOneways.length) {
+ fixes.push(new validationIssueFix({
+ icon: "iD-operation-reverse",
+ title: _t.html("issues.fix.reverse_feature.title"),
+ entityIds: [way.id],
+ onClick: function(context) {
+ var id2 = this.issue.entityIds[0];
+ context.perform(actionReverse(id2), _t("operations.reverse.annotation.line", { n: 1 }));
+ }
+ }));
+ }
+ if (node.tags.noexit !== "yes") {
+ var textDirection = _mainLocalizer.textDirection();
+ var useLeftContinue = isFirst && textDirection === "ltr" || !isFirst && textDirection === "rtl";
+ fixes.push(new validationIssueFix({
+ icon: "iD-operation-continue" + (useLeftContinue ? "-left" : ""),
+ title: _t.html("issues.fix.continue_from_" + (isFirst ? "start" : "end") + ".title"),
+ onClick: function(context) {
+ var entityID = this.issue.entityIds[0];
+ var vertexID = this.issue.entityIds[1];
+ var way2 = context.entity(entityID);
+ var vertex = context.entity(vertexID);
+ continueDrawing(way2, vertex, context);
+ }
+ }));
+ }
+ return fixes;
+ },
+ loc: node.loc
+ })];
+ function getReference(referenceID2) {
+ return function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.impossible_oneway." + referenceID2 + ".reference"));
+ };
+ }
+ }
+ };
+ function continueDrawing(way, vertex, context) {
+ var map2 = context.map();
+ if (!context.editable() || !map2.trimmedExtent().contains(vertex.loc)) {
+ map2.zoomToEase(vertex);
+ }
+ context.enter(modeDrawLine(context, way.id, context.graph(), "line", way.affix(vertex.id), true));
+ }
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/incompatible_source.js
+ function validationIncompatibleSource() {
+ const type3 = "incompatible_source";
+ const incompatibleRules = [
+ {
+ id: "amap",
+ regex: /(^amap$|^amap\.com|autonavi|mapabc|高德)/i
+ },
+ {
+ id: "baidu",
+ regex: /(baidu|mapbar|百度)/i
+ },
+ {
+ id: "google",
+ regex: /google/i,
+ exceptRegex: /((books|drive)\.google|google\s?(books|drive|plus))|(esri\/Google_Africa_Buildings)/i
+ }
+ ];
+ const validation = function checkIncompatibleSource(entity) {
+ const entitySources = entity.tags && entity.tags.source && entity.tags.source.split(";");
+ if (!entitySources)
+ return [];
+ const entityID = entity.id;
+ return entitySources.map((source) => {
+ const matchRule = incompatibleRules.find((rule) => {
+ if (!rule.regex.test(source))
+ return false;
+ if (rule.exceptRegex && rule.exceptRegex.test(source))
+ return false;
+ return true;
+ });
+ if (!matchRule)
+ return null;
+ return new validationIssue({
+ type: type3,
+ severity: "warning",
+ message: (context) => {
+ const entity2 = context.hasEntity(entityID);
+ return entity2 ? _t.html("issues.incompatible_source.feature.message", {
+ feature: utilDisplayLabel(entity2, context.graph(), true),
+ value: source
+ }) : "";
+ },
+ reference: getReference(matchRule.id),
+ entityIds: [entityID],
+ hash: source,
+ dynamicFixes: () => {
+ return [
+ new validationIssueFix({ title: _t.html("issues.fix.remove_proprietary_data.title") })
+ ];
+ }
+ });
+ }).filter(Boolean);
+ function getReference(id2) {
+ return function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append(`issues.incompatible_source.reference.${id2}`));
+ };
+ }
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/maprules.js
+ function validationMaprules() {
+ var type3 = "maprules";
+ var validation = function checkMaprules(entity, graph) {
+ if (!services.maprules)
+ return [];
+ var rules = services.maprules.validationRules();
+ var issues = [];
+ for (var i2 = 0; i2 < rules.length; i2++) {
+ var rule = rules[i2];
+ rule.findIssues(entity, graph, issues);
+ }
+ return issues;
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/mismatched_geometry.js
+ var import_fast_deep_equal4 = __toESM(require_fast_deep_equal());
+ function validationMismatchedGeometry() {
+ var type3 = "mismatched_geometry";
+ function tagSuggestingLineIsArea(entity) {
+ if (entity.type !== "way" || entity.isClosed())
+ return null;
+ var tagSuggestingArea = entity.tagSuggestingArea();
+ if (!tagSuggestingArea) {
+ return null;
+ }
+ var asLine = _mainPresetIndex.matchTags(tagSuggestingArea, "line");
+ var asArea = _mainPresetIndex.matchTags(tagSuggestingArea, "area");
+ if (asLine && asArea && asLine === asArea) {
+ return null;
+ }
+ return tagSuggestingArea;
+ }
+ function makeConnectEndpointsFixOnClick(way, graph) {
+ if (way.nodes.length < 3)
+ return null;
+ var nodes = graph.childNodes(way), testNodes;
+ var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length - 1].loc);
+ if (firstToLastDistanceMeters < 0.75) {
+ testNodes = nodes.slice();
+ testNodes.pop();
+ testNodes.push(testNodes[0]);
+ if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
+ return function(context) {
+ var way2 = context.entity(this.issue.entityIds[0]);
+ context.perform(actionMergeNodes([way2.nodes[0], way2.nodes[way2.nodes.length - 1]], nodes[0].loc), _t("issues.fix.connect_endpoints.annotation"));
+ };
+ }
+ }
+ testNodes = nodes.slice();
+ testNodes.push(testNodes[0]);
+ if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
+ return function(context) {
+ var wayId = this.issue.entityIds[0];
+ var way2 = context.entity(wayId);
+ var nodeId = way2.nodes[0];
+ var index = way2.nodes.length;
+ context.perform(actionAddVertex(wayId, nodeId, index), _t("issues.fix.connect_endpoints.annotation"));
+ };
+ }
+ }
+ function lineTaggedAsAreaIssue(entity) {
+ var tagSuggestingArea = tagSuggestingLineIsArea(entity);
+ if (!tagSuggestingArea)
+ return null;
+ return new validationIssue({
+ type: type3,
+ subtype: "area_as_line",
+ severity: "warning",
+ message: function(context) {
+ var entity2 = context.hasEntity(this.entityIds[0]);
+ return entity2 ? _t.html("issues.tag_suggests_area.message", {
+ feature: utilDisplayLabel(entity2, "area", true),
+ tag: utilTagText({ tags: tagSuggestingArea })
+ }) : "";
+ },
+ reference: showReference,
+ entityIds: [entity.id],
+ hash: JSON.stringify(tagSuggestingArea),
+ dynamicFixes: function(context) {
+ var fixes = [];
+ var entity2 = context.entity(this.entityIds[0]);
+ var connectEndsOnClick = makeConnectEndpointsFixOnClick(entity2, context.graph());
+ fixes.push(new validationIssueFix({
+ title: _t.html("issues.fix.connect_endpoints.title"),
+ onClick: connectEndsOnClick
+ }));
+ fixes.push(new validationIssueFix({
+ icon: "iD-operation-delete",
+ title: _t.html("issues.fix.remove_tag.title"),
+ onClick: function(context2) {
+ var entityId = this.issue.entityIds[0];
+ var entity3 = context2.entity(entityId);
+ var tags = Object.assign({}, entity3.tags);
+ for (var key in tagSuggestingArea) {
+ delete tags[key];
+ }
+ context2.perform(actionChangeTags(entityId, tags), _t("issues.fix.remove_tag.annotation"));
+ }
+ }));
+ return fixes;
+ }
+ });
+ function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.tag_suggests_area.reference"));
+ }
+ }
+ function vertexPointIssue(entity, graph) {
+ if (entity.type !== "node")
+ return null;
+ if (Object.keys(entity.tags).length === 0)
+ return null;
+ if (entity.isOnAddressLine(graph))
+ return null;
+ var geometry = entity.geometry(graph);
+ var allowedGeometries = osmNodeGeometriesForTags(entity.tags);
+ if (geometry === "point" && !allowedGeometries.point && allowedGeometries.vertex) {
+ return new validationIssue({
+ type: type3,
+ subtype: "vertex_as_point",
+ severity: "warning",
+ message: function(context) {
+ var entity2 = context.hasEntity(this.entityIds[0]);
+ return entity2 ? _t.html("issues.vertex_as_point.message", {
+ feature: utilDisplayLabel(entity2, "vertex", true)
+ }) : "";
+ },
+ reference: function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.vertex_as_point.reference"));
+ },
+ entityIds: [entity.id]
+ });
+ } else if (geometry === "vertex" && !allowedGeometries.vertex && allowedGeometries.point) {
+ return new validationIssue({
+ type: type3,
+ subtype: "point_as_vertex",
+ severity: "warning",
+ message: function(context) {
+ var entity2 = context.hasEntity(this.entityIds[0]);
+ return entity2 ? _t.html("issues.point_as_vertex.message", {
+ feature: utilDisplayLabel(entity2, "point", true)
+ }) : "";
+ },
+ reference: function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.point_as_vertex.reference"));
+ },
+ entityIds: [entity.id],
+ dynamicFixes: extractPointDynamicFixes
+ });
+ }
+ return null;
+ }
+ function otherMismatchIssue(entity, graph) {
+ if (!entity.hasInterestingTags())
+ return null;
+ if (entity.type !== "node" && entity.type !== "way")
+ return null;
+ if (entity.type === "node" && entity.isOnAddressLine(graph))
+ return null;
+ var sourceGeom = entity.geometry(graph);
+ var targetGeoms = entity.type === "way" ? ["point", "vertex"] : ["line", "area"];
+ if (sourceGeom === "area")
+ targetGeoms.unshift("line");
+ var asSource = _mainPresetIndex.match(entity, graph);
+ var targetGeom = targetGeoms.find((nodeGeom) => {
+ var asTarget = _mainPresetIndex.matchTags(entity.tags, nodeGeom);
+ if (!asSource || !asTarget || asSource === asTarget || (0, import_fast_deep_equal4.default)(asSource.tags, asTarget.tags))
+ return false;
+ if (asTarget.isFallback())
+ return false;
+ var primaryKey = Object.keys(asTarget.tags)[0];
+ if (primaryKey === "building")
+ return false;
+ if (asTarget.tags[primaryKey] === "*")
+ return false;
+ return asSource.isFallback() || asSource.tags[primaryKey] === "*";
+ });
+ if (!targetGeom)
+ return null;
+ var subtype = targetGeom + "_as_" + sourceGeom;
+ if (targetGeom === "vertex")
+ targetGeom = "point";
+ if (sourceGeom === "vertex")
+ sourceGeom = "point";
+ var referenceId = targetGeom + "_as_" + sourceGeom;
+ var dynamicFixes;
+ if (targetGeom === "point") {
+ dynamicFixes = extractPointDynamicFixes;
+ } else if (sourceGeom === "area" && targetGeom === "line") {
+ dynamicFixes = lineToAreaDynamicFixes;
+ }
+ return new validationIssue({
+ type: type3,
+ subtype,
+ severity: "warning",
+ message: function(context) {
+ var entity2 = context.hasEntity(this.entityIds[0]);
+ return entity2 ? _t.html("issues." + referenceId + ".message", {
+ feature: utilDisplayLabel(entity2, targetGeom, true)
+ }) : "";
+ },
+ reference: function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.mismatched_geometry.reference"));
+ },
+ entityIds: [entity.id],
+ dynamicFixes
+ });
+ }
+ function lineToAreaDynamicFixes(context) {
+ var convertOnClick;
+ var entityId = this.entityIds[0];
+ var entity = context.entity(entityId);
+ var tags = Object.assign({}, entity.tags);
+ delete tags.area;
+ if (!osmTagSuggestingArea(tags)) {
+ convertOnClick = function(context2) {
+ var entityId2 = this.issue.entityIds[0];
+ var entity2 = context2.entity(entityId2);
+ var tags2 = Object.assign({}, entity2.tags);
+ if (tags2.area) {
+ delete tags2.area;
+ }
+ context2.perform(actionChangeTags(entityId2, tags2), _t("issues.fix.convert_to_line.annotation"));
+ };
+ }
+ return [
+ new validationIssueFix({
+ icon: "iD-icon-line",
+ title: _t.html("issues.fix.convert_to_line.title"),
+ onClick: convertOnClick
+ })
+ ];
+ }
+ function extractPointDynamicFixes(context) {
+ var entityId = this.entityIds[0];
+ var extractOnClick = null;
+ if (!context.hasHiddenConnections(entityId)) {
+ extractOnClick = function(context2) {
+ var entityId2 = this.issue.entityIds[0];
+ var action = actionExtract(entityId2, context2.projection);
+ context2.perform(action, _t("operations.extract.annotation", { n: 1 }));
+ context2.enter(modeSelect(context2, [action.getExtractedNodeID()]));
+ };
+ }
+ return [
+ new validationIssueFix({
+ icon: "iD-operation-extract",
+ title: _t.html("issues.fix.extract_point.title"),
+ onClick: extractOnClick
+ })
+ ];
+ }
+ function unclosedMultipolygonPartIssues(entity, graph) {
+ if (entity.type !== "relation" || !entity.isMultipolygon() || entity.isDegenerate() || !entity.isComplete(graph))
+ return [];
+ var sequences = osmJoinWays(entity.members, graph);
+ var issues = [];
+ for (var i2 in sequences) {
+ var sequence = sequences[i2];
+ if (!sequence.nodes)
+ continue;
+ var firstNode = sequence.nodes[0];
+ var lastNode = sequence.nodes[sequence.nodes.length - 1];
+ if (firstNode === lastNode)
+ continue;
+ var issue = new validationIssue({
+ type: type3,
+ subtype: "unclosed_multipolygon_part",
+ severity: "warning",
+ message: function(context) {
+ var entity2 = context.hasEntity(this.entityIds[0]);
+ return entity2 ? _t.html("issues.unclosed_multipolygon_part.message", {
+ feature: utilDisplayLabel(entity2, context.graph(), true)
+ }) : "";
+ },
+ reference: showReference,
+ loc: sequence.nodes[0].loc,
+ entityIds: [entity.id],
+ hash: sequence.map(function(way) {
+ return way.id;
+ }).join()
+ });
+ issues.push(issue);
+ }
+ return issues;
+ function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.unclosed_multipolygon_part.reference"));
+ }
+ }
+ var validation = function checkMismatchedGeometry(entity, graph) {
+ var vertexPoint = vertexPointIssue(entity, graph);
+ if (vertexPoint)
+ return [vertexPoint];
+ var lineAsArea = lineTaggedAsAreaIssue(entity);
+ if (lineAsArea)
+ return [lineAsArea];
+ var mismatch = otherMismatchIssue(entity, graph);
+ if (mismatch)
+ return [mismatch];
+ return unclosedMultipolygonPartIssues(entity, graph);
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/missing_role.js
+ function validationMissingRole() {
+ var type3 = "missing_role";
+ var validation = function checkMissingRole(entity, graph) {
+ var issues = [];
+ if (entity.type === "way") {
+ graph.parentRelations(entity).forEach(function(relation) {
+ if (!relation.isMultipolygon())
+ return;
+ var member = relation.memberById(entity.id);
+ if (member && isMissingRole(member)) {
+ issues.push(makeIssue(entity, relation, member));
+ }
+ });
+ } else if (entity.type === "relation" && entity.isMultipolygon()) {
+ entity.indexedMembers().forEach(function(member) {
+ var way = graph.hasEntity(member.id);
+ if (way && isMissingRole(member)) {
+ issues.push(makeIssue(way, entity, member));
+ }
+ });
+ }
+ return issues;
+ };
+ function isMissingRole(member) {
+ return !member.role || !member.role.trim().length;
+ }
+ function makeIssue(way, relation, member) {
+ return new validationIssue({
+ type: type3,
+ severity: "warning",
+ message: function(context) {
+ var member2 = context.hasEntity(this.entityIds[1]), relation2 = context.hasEntity(this.entityIds[0]);
+ return member2 && relation2 ? _t.html("issues.missing_role.message", {
+ member: utilDisplayLabel(member2, context.graph()),
+ relation: utilDisplayLabel(relation2, context.graph())
+ }) : "";
+ },
+ reference: showReference,
+ entityIds: [relation.id, way.id],
+ data: {
+ member
+ },
+ hash: member.index.toString(),
+ dynamicFixes: function() {
+ return [
+ makeAddRoleFix("inner"),
+ makeAddRoleFix("outer"),
+ new validationIssueFix({
+ icon: "iD-operation-delete",
+ title: _t.html("issues.fix.remove_from_relation.title"),
+ onClick: function(context) {
+ context.perform(actionDeleteMember(this.issue.entityIds[0], this.issue.data.member.index), _t("operations.delete_member.annotation", {
+ n: 1
+ }));
+ }
+ })
+ ];
+ }
+ });
+ function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.missing_role.multipolygon.reference"));
+ }
+ }
+ function makeAddRoleFix(role) {
+ return new validationIssueFix({
+ title: _t.html("issues.fix.set_as_" + role + ".title"),
+ onClick: function(context) {
+ var oldMember = this.issue.data.member;
+ var member = { id: this.issue.entityIds[1], type: oldMember.type, role };
+ context.perform(actionChangeMember(this.issue.entityIds[0], member, oldMember.index), _t("operations.change_role.annotation", {
+ n: 1
+ }));
+ }
+ });
+ }
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/missing_tag.js
+ function validationMissingTag(context) {
+ var type3 = "missing_tag";
+ function hasDescriptiveTags(entity, graph) {
+ var onlyAttributeKeys = ["description", "name", "note", "start_date"];
+ var entityDescriptiveKeys = Object.keys(entity.tags).filter(function(k) {
+ if (k === "area" || !osmIsInterestingTag(k))
+ return false;
+ return !onlyAttributeKeys.some(function(attributeKey) {
+ return k === attributeKey || k.indexOf(attributeKey + ":") === 0;
+ });
+ });
+ if (entity.type === "relation" && entityDescriptiveKeys.length === 1 && entity.tags.type === "multipolygon") {
+ return osmOldMultipolygonOuterMemberOfRelation(entity, graph);
+ }
+ return entityDescriptiveKeys.length > 0;
+ }
+ function isUnknownRoad(entity) {
+ return entity.type === "way" && entity.tags.highway === "road";
+ }
+ function isUntypedRelation(entity) {
+ return entity.type === "relation" && !entity.tags.type;
+ }
+ var validation = function checkMissingTag(entity, graph) {
+ var subtype;
+ var osm = context.connection();
+ var isUnloadedNode = entity.type === "node" && osm && !osm.isDataLoaded(entity.loc);
+ if (!isUnloadedNode && entity.geometry(graph) !== "vertex" && !entity.hasParentRelations(graph)) {
+ if (Object.keys(entity.tags).length === 0) {
+ subtype = "any";
+ } else if (!hasDescriptiveTags(entity, graph)) {
+ subtype = "descriptive";
+ } else if (isUntypedRelation(entity)) {
+ subtype = "relation_type";
+ }
+ }
+ if (!subtype && isUnknownRoad(entity)) {
+ subtype = "highway_classification";
+ }
+ if (!subtype)
+ return [];
+ var messageID = subtype === "highway_classification" ? "unknown_road" : "missing_tag." + subtype;
+ var referenceID = subtype === "highway_classification" ? "unknown_road" : "missing_tag";
+ var canDelete = entity.version === void 0 || entity.v !== void 0;
+ var severity = canDelete && subtype !== "highway_classification" ? "error" : "warning";
+ return [new validationIssue({
+ type: type3,
+ subtype,
+ severity,
+ message: function(context2) {
+ var entity2 = context2.hasEntity(this.entityIds[0]);
+ return entity2 ? _t.html("issues." + messageID + ".message", {
+ feature: utilDisplayLabel(entity2, context2.graph())
+ }) : "";
+ },
+ reference: showReference,
+ entityIds: [entity.id],
+ dynamicFixes: function(context2) {
+ var fixes = [];
+ var selectFixType = subtype === "highway_classification" ? "select_road_type" : "select_preset";
+ fixes.push(new validationIssueFix({
+ icon: "iD-icon-search",
+ title: _t.html("issues.fix." + selectFixType + ".title"),
+ onClick: function(context3) {
+ context3.ui().sidebar.showPresetList();
+ }
+ }));
+ var deleteOnClick;
+ var id2 = this.entityIds[0];
+ var operation = operationDelete(context2, [id2]);
+ var disabledReasonID = operation.disabled();
+ if (!disabledReasonID) {
+ deleteOnClick = function(context3) {
+ var id3 = this.issue.entityIds[0];
+ var operation2 = operationDelete(context3, [id3]);
+ if (!operation2.disabled()) {
+ operation2();
+ }
+ };
+ }
+ fixes.push(new validationIssueFix({
+ icon: "iD-operation-delete",
+ title: _t.html("issues.fix.delete_feature.title"),
+ disabledReason: disabledReasonID ? _t("operations.delete." + disabledReasonID + ".single") : void 0,
+ onClick: deleteOnClick
+ }));
+ return fixes;
+ }
+ })];
+ function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues." + referenceID + ".reference"));
+ }
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/outdated_tags.js
+ function validationOutdatedTags() {
+ const type3 = "outdated_tags";
+ let _waitingForDeprecated = true;
+ let _dataDeprecated;
+ _mainFileFetcher.get("deprecated").then((d) => _dataDeprecated = d).catch(() => {
+ }).finally(() => _waitingForDeprecated = false);
+ function oldTagIssues(entity, graph) {
+ const oldTags = Object.assign({}, entity.tags);
+ let preset = _mainPresetIndex.match(entity, graph);
+ let subtype = "deprecated_tags";
+ if (!preset)
+ return [];
+ if (!entity.hasInterestingTags())
+ return [];
+ if (preset.replacement) {
+ const newPreset = _mainPresetIndex.item(preset.replacement);
+ graph = actionChangePreset(entity.id, preset, newPreset, true)(graph);
+ entity = graph.entity(entity.id);
+ preset = newPreset;
+ }
+ if (_dataDeprecated) {
+ const deprecatedTags = entity.deprecatedTags(_dataDeprecated);
+ if (deprecatedTags.length) {
+ deprecatedTags.forEach((tag) => {
+ graph = actionUpgradeTags(entity.id, tag.old, tag.replace)(graph);
+ });
+ entity = graph.entity(entity.id);
+ }
+ }
+ let newTags = Object.assign({}, entity.tags);
+ if (preset.tags !== preset.addTags) {
+ Object.keys(preset.addTags).forEach((k) => {
+ if (!newTags[k]) {
+ if (preset.addTags[k] === "*") {
+ newTags[k] = "yes";
+ } else {
+ newTags[k] = preset.addTags[k];
+ }
+ }
+ });
+ }
+ const nsi = services.nsi;
+ let waitingForNsi = false;
+ let nsiResult;
+ if (nsi) {
+ waitingForNsi = nsi.status() === "loading";
+ if (!waitingForNsi) {
+ const loc = entity.extent(graph).center();
+ nsiResult = nsi.upgradeTags(newTags, loc);
+ if (nsiResult) {
+ newTags = nsiResult.newTags;
+ subtype = "noncanonical_brand";
+ }
+ }
+ }
+ let issues = [];
+ issues.provisional = _waitingForDeprecated || waitingForNsi;
+ const tagDiff = utilTagDiff(oldTags, newTags);
+ if (!tagDiff.length)
+ return issues;
+ const isOnlyAddingTags = tagDiff.every((d) => d.type === "+");
+ let prefix = "";
+ if (nsiResult) {
+ prefix = "noncanonical_brand.";
+ } else if (subtype === "deprecated_tags" && isOnlyAddingTags) {
+ subtype = "incomplete_tags";
+ prefix = "incomplete.";
+ }
+ let autoArgs = subtype !== "noncanonical_brand" ? [doUpgrade, _t("issues.fix.upgrade_tags.annotation")] : null;
+ issues.push(new validationIssue({
+ type: type3,
+ subtype,
+ severity: "warning",
+ message: showMessage,
+ reference: showReference,
+ entityIds: [entity.id],
+ hash: utilHashcode(JSON.stringify(tagDiff)),
+ dynamicFixes: () => {
+ let fixes = [
+ new validationIssueFix({
+ autoArgs,
+ title: _t.html("issues.fix.upgrade_tags.title"),
+ onClick: (context) => {
+ context.perform(doUpgrade, _t("issues.fix.upgrade_tags.annotation"));
+ }
+ })
+ ];
+ const item = nsiResult && nsiResult.matched;
+ if (item) {
+ fixes.push(new validationIssueFix({
+ title: _t.html("issues.fix.tag_as_not.title", { name: item.displayName }),
+ onClick: (context) => {
+ context.perform(addNotTag, _t("issues.fix.tag_as_not.annotation"));
+ }
+ }));
+ }
+ return fixes;
+ }
+ }));
+ return issues;
+ function doUpgrade(graph2) {
+ const currEntity = graph2.hasEntity(entity.id);
+ if (!currEntity)
+ return graph2;
+ let newTags2 = Object.assign({}, currEntity.tags);
+ tagDiff.forEach((diff) => {
+ if (diff.type === "-") {
+ delete newTags2[diff.key];
+ } else if (diff.type === "+") {
+ newTags2[diff.key] = diff.newVal;
+ }
+ });
+ return actionChangeTags(currEntity.id, newTags2)(graph2);
+ }
+ function addNotTag(graph2) {
+ const currEntity = graph2.hasEntity(entity.id);
+ if (!currEntity)
+ return graph2;
+ const item = nsiResult && nsiResult.matched;
+ if (!item)
+ return graph2;
+ let newTags2 = Object.assign({}, currEntity.tags);
+ const wd = item.mainTag;
+ const notwd = `not:${wd}`;
+ const qid = item.tags[wd];
+ newTags2[notwd] = qid;
+ if (newTags2[wd] === qid) {
+ const wp = item.mainTag.replace("wikidata", "wikipedia");
+ delete newTags2[wd];
+ delete newTags2[wp];
+ }
+ return actionChangeTags(currEntity.id, newTags2)(graph2);
+ }
+ function showMessage(context) {
+ const currEntity = context.hasEntity(entity.id);
+ if (!currEntity)
+ return "";
+ let messageID = `issues.outdated_tags.${prefix}message`;
+ if (subtype === "noncanonical_brand" && isOnlyAddingTags) {
+ messageID += "_incomplete";
+ }
+ return _t.html(messageID, {
+ feature: utilDisplayLabel(currEntity, context.graph(), true)
+ });
+ }
+ function showReference(selection2) {
+ let enter = selection2.selectAll(".issue-reference").data([0]).enter();
+ enter.append("div").attr("class", "issue-reference").call(_t.append(`issues.outdated_tags.${prefix}reference`));
+ enter.append("strong").call(_t.append("issues.suggested"));
+ enter.append("table").attr("class", "tagDiff-table").selectAll(".tagDiff-row").data(tagDiff).enter().append("tr").attr("class", "tagDiff-row").append("td").attr("class", (d) => {
+ let klass = d.type === "+" ? "add" : "remove";
+ return `tagDiff-cell tagDiff-cell-${klass}`;
+ }).html((d) => d.display);
+ }
+ }
+ function oldMultipolygonIssues(entity, graph) {
+ let multipolygon, outerWay;
+ if (entity.type === "relation") {
+ outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
+ multipolygon = entity;
+ } else if (entity.type === "way") {
+ multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
+ outerWay = entity;
+ } else {
+ return [];
+ }
+ if (!multipolygon || !outerWay)
+ return [];
+ return [new validationIssue({
+ type: type3,
+ subtype: "old_multipolygon",
+ severity: "warning",
+ message: showMessage,
+ reference: showReference,
+ entityIds: [outerWay.id, multipolygon.id],
+ dynamicFixes: () => {
+ return [
+ new validationIssueFix({
+ autoArgs: [doUpgrade, _t("issues.fix.move_tags.annotation")],
+ title: _t.html("issues.fix.move_tags.title"),
+ onClick: (context) => {
+ context.perform(doUpgrade, _t("issues.fix.move_tags.annotation"));
+ }
+ })
+ ];
+ }
+ })];
+ function doUpgrade(graph2) {
+ let currMultipolygon = graph2.hasEntity(multipolygon.id);
+ let currOuterWay = graph2.hasEntity(outerWay.id);
+ if (!currMultipolygon || !currOuterWay)
+ return graph2;
+ currMultipolygon = currMultipolygon.mergeTags(currOuterWay.tags);
+ graph2 = graph2.replace(currMultipolygon);
+ return actionChangeTags(currOuterWay.id, {})(graph2);
+ }
+ function showMessage(context) {
+ let currMultipolygon = context.hasEntity(multipolygon.id);
+ if (!currMultipolygon)
+ return "";
+ return _t.html("issues.old_multipolygon.message", { multipolygon: utilDisplayLabel(currMultipolygon, context.graph(), true) });
+ }
+ function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.old_multipolygon.reference"));
+ }
+ }
+ let validation = function checkOutdatedTags(entity, graph) {
+ let issues = oldMultipolygonIssues(entity, graph);
+ if (!issues.length)
+ issues = oldTagIssues(entity, graph);
+ return issues;
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/private_data.js
+ function validationPrivateData() {
+ var type3 = "private_data";
+ var privateBuildingValues = {
+ detached: true,
+ farm: true,
+ house: true,
+ houseboat: true,
+ residential: true,
+ semidetached_house: true,
+ static_caravan: true
+ };
+ var publicKeys = {
+ amenity: true,
+ craft: true,
+ historic: true,
+ leisure: true,
+ office: true,
+ shop: true,
+ tourism: true
+ };
+ var personalTags = {
+ "contact:email": true,
+ "contact:fax": true,
+ "contact:phone": true,
+ email: true,
+ fax: true,
+ phone: true
+ };
+ var validation = function checkPrivateData(entity) {
+ var tags = entity.tags;
+ if (!tags.building || !privateBuildingValues[tags.building])
+ return [];
+ var keepTags = {};
+ for (var k in tags) {
+ if (publicKeys[k])
+ return [];
+ if (!personalTags[k]) {
+ keepTags[k] = tags[k];
+ }
+ }
+ var tagDiff = utilTagDiff(tags, keepTags);
+ if (!tagDiff.length)
+ return [];
+ var fixID = tagDiff.length === 1 ? "remove_tag" : "remove_tags";
+ return [new validationIssue({
+ type: type3,
+ severity: "warning",
+ message: showMessage,
+ reference: showReference,
+ entityIds: [entity.id],
+ dynamicFixes: function() {
+ return [
+ new validationIssueFix({
+ icon: "iD-operation-delete",
+ title: _t.html("issues.fix." + fixID + ".title"),
+ onClick: function(context) {
+ context.perform(doUpgrade, _t("issues.fix.upgrade_tags.annotation"));
+ }
+ })
+ ];
+ }
+ })];
+ function doUpgrade(graph) {
+ var currEntity = graph.hasEntity(entity.id);
+ if (!currEntity)
+ return graph;
+ var newTags = Object.assign({}, currEntity.tags);
+ tagDiff.forEach(function(diff) {
+ if (diff.type === "-") {
+ delete newTags[diff.key];
+ } else if (diff.type === "+") {
+ newTags[diff.key] = diff.newVal;
+ }
+ });
+ return actionChangeTags(currEntity.id, newTags)(graph);
+ }
+ function showMessage(context) {
+ var currEntity = context.hasEntity(this.entityIds[0]);
+ if (!currEntity)
+ return "";
+ return _t.html("issues.private_data.contact.message", { feature: utilDisplayLabel(currEntity, context.graph()) });
+ }
+ function showReference(selection2) {
+ var enter = selection2.selectAll(".issue-reference").data([0]).enter();
+ enter.append("div").attr("class", "issue-reference").call(_t.append("issues.private_data.reference"));
+ enter.append("strong").call(_t.append("issues.suggested"));
+ enter.append("table").attr("class", "tagDiff-table").selectAll(".tagDiff-row").data(tagDiff).enter().append("tr").attr("class", "tagDiff-row").append("td").attr("class", function(d) {
+ var klass = d.type === "+" ? "add" : "remove";
+ return "tagDiff-cell tagDiff-cell-" + klass;
+ }).html(function(d) {
+ return d.display;
+ });
+ }
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/suspicious_name.js
+ function validationSuspiciousName() {
+ const type3 = "suspicious_name";
+ const keysToTestForGenericValues = [
+ "aerialway",
+ "aeroway",
+ "amenity",
+ "building",
+ "craft",
+ "highway",
+ "leisure",
+ "railway",
+ "man_made",
+ "office",
+ "shop",
+ "tourism",
+ "waterway"
+ ];
+ let _waitingForNsi = false;
+ function isGenericMatchInNsi(tags) {
+ const nsi = services.nsi;
+ if (nsi) {
+ _waitingForNsi = nsi.status() === "loading";
+ if (!_waitingForNsi) {
+ return nsi.isGenericName(tags);
+ }
+ }
+ return false;
+ }
+ function nameMatchesRawTag(lowercaseName, tags) {
+ for (let i2 = 0; i2 < keysToTestForGenericValues.length; i2++) {
+ let key = keysToTestForGenericValues[i2];
+ let val = tags[key];
+ if (val) {
+ val = val.toLowerCase();
+ if (key === lowercaseName || val === lowercaseName || key.replace(/\_/g, " ") === lowercaseName || val.replace(/\_/g, " ") === lowercaseName) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ function isGenericName(name2, tags) {
+ name2 = name2.toLowerCase();
+ return nameMatchesRawTag(name2, tags) || isGenericMatchInNsi(tags);
+ }
+ function makeGenericNameIssue(entityId, nameKey, genericName, langCode) {
+ return new validationIssue({
+ type: type3,
+ subtype: "generic_name",
+ severity: "warning",
+ message: function(context) {
+ let entity = context.hasEntity(this.entityIds[0]);
+ if (!entity)
+ return "";
+ let preset = _mainPresetIndex.match(entity, context.graph());
+ let langName = langCode && _mainLocalizer.languageName(langCode);
+ return _t.html("issues.generic_name.message" + (langName ? "_language" : ""), { feature: preset.name(), name: genericName, language: langName });
+ },
+ reference: showReference,
+ entityIds: [entityId],
+ hash: `${nameKey}=${genericName}`,
+ dynamicFixes: function() {
+ return [
+ new validationIssueFix({
+ icon: "iD-operation-delete",
+ title: _t.html("issues.fix.remove_the_name.title"),
+ onClick: function(context) {
+ let entityId2 = this.issue.entityIds[0];
+ let entity = context.entity(entityId2);
+ let tags = Object.assign({}, entity.tags);
+ delete tags[nameKey];
+ context.perform(actionChangeTags(entityId2, tags), _t("issues.fix.remove_generic_name.annotation"));
+ }
+ })
+ ];
+ }
+ });
+ function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.generic_name.reference"));
+ }
+ }
+ function makeIncorrectNameIssue(entityId, nameKey, incorrectName, langCode) {
+ return new validationIssue({
+ type: type3,
+ subtype: "not_name",
+ severity: "warning",
+ message: function(context) {
+ const entity = context.hasEntity(this.entityIds[0]);
+ if (!entity)
+ return "";
+ const preset = _mainPresetIndex.match(entity, context.graph());
+ const langName = langCode && _mainLocalizer.languageName(langCode);
+ return _t.html("issues.incorrect_name.message" + (langName ? "_language" : ""), { feature: preset.name(), name: incorrectName, language: langName });
+ },
+ reference: showReference,
+ entityIds: [entityId],
+ hash: `${nameKey}=${incorrectName}`,
+ dynamicFixes: function() {
+ return [
+ new validationIssueFix({
+ icon: "iD-operation-delete",
+ title: _t.html("issues.fix.remove_the_name.title"),
+ onClick: function(context) {
+ const entityId2 = this.issue.entityIds[0];
+ const entity = context.entity(entityId2);
+ let tags = Object.assign({}, entity.tags);
+ delete tags[nameKey];
+ context.perform(actionChangeTags(entityId2, tags), _t("issues.fix.remove_mistaken_name.annotation"));
+ }
+ })
+ ];
+ }
+ });
+ function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.generic_name.reference"));
+ }
+ }
+ let validation = function checkGenericName(entity) {
+ const tags = entity.tags;
+ const hasWikidata = !!tags.wikidata || !!tags["brand:wikidata"] || !!tags["operator:wikidata"];
+ if (hasWikidata)
+ return [];
+ let issues = [];
+ const notNames2 = (tags["not:name"] || "").split(";");
+ for (let key in tags) {
+ const m = key.match(/^name(?:(?::)([a-zA-Z_-]+))?$/);
+ if (!m)
+ continue;
+ const langCode = m.length >= 2 ? m[1] : null;
+ const value = tags[key];
+ if (notNames2.length) {
+ for (let i2 in notNames2) {
+ const notName = notNames2[i2];
+ if (notName && value === notName) {
+ issues.push(makeIncorrectNameIssue(entity.id, key, value, langCode));
+ continue;
+ }
+ }
+ }
+ if (isGenericName(value, tags)) {
+ issues.provisional = _waitingForNsi;
+ issues.push(makeGenericNameIssue(entity.id, key, value, langCode));
+ }
+ }
+ return issues;
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/validations/unsquare_way.js
+ function validationUnsquareWay(context) {
+ var type3 = "unsquare_way";
+ var DEFAULT_DEG_THRESHOLD = 5;
+ var epsilon3 = 0.05;
+ var nodeThreshold = 10;
+ function isBuilding(entity, graph) {
+ if (entity.type !== "way" || entity.geometry(graph) !== "area")
+ return false;
+ return entity.tags.building && entity.tags.building !== "no";
+ }
+ var validation = function checkUnsquareWay(entity, graph) {
+ if (!isBuilding(entity, graph))
+ return [];
+ if (entity.tags.nonsquare === "yes")
+ return [];
+ var isClosed = entity.isClosed();
+ if (!isClosed)
+ return [];
+ var nodes = graph.childNodes(entity).slice();
+ if (nodes.length > nodeThreshold + 1)
+ return [];
+ var osm = services.osm;
+ if (!osm || nodes.some(function(node) {
+ return !osm.isDataLoaded(node.loc);
+ }))
+ return [];
+ var hasConnectedSquarableWays = nodes.some(function(node) {
+ return graph.parentWays(node).some(function(way) {
+ if (way.id === entity.id)
+ return false;
+ if (isBuilding(way, graph))
+ return true;
+ return graph.parentRelations(way).some(function(parentRelation) {
+ return parentRelation.isMultipolygon() && parentRelation.tags.building && parentRelation.tags.building !== "no";
+ });
+ });
+ });
+ if (hasConnectedSquarableWays)
+ return [];
+ var storedDegreeThreshold = corePreferences("validate-square-degrees");
+ var degreeThreshold = isNaN(storedDegreeThreshold) ? DEFAULT_DEG_THRESHOLD : parseFloat(storedDegreeThreshold);
+ var points = nodes.map(function(node) {
+ return context.projection(node.loc);
+ });
+ if (!geoOrthoCanOrthogonalize(points, isClosed, epsilon3, degreeThreshold, true))
+ return [];
+ var autoArgs;
+ if (!entity.tags.wikidata) {
+ var autoAction = actionOrthogonalize(entity.id, context.projection, void 0, degreeThreshold);
+ autoAction.transitionable = false;
+ autoArgs = [autoAction, _t("operations.orthogonalize.annotation.feature", { n: 1 })];
+ }
+ return [new validationIssue({
+ type: type3,
+ subtype: "building",
+ severity: "warning",
+ message: function(context2) {
+ var entity2 = context2.hasEntity(this.entityIds[0]);
+ return entity2 ? _t.html("issues.unsquare_way.message", {
+ feature: utilDisplayLabel(entity2, context2.graph())
+ }) : "";
+ },
+ reference: showReference,
+ entityIds: [entity.id],
+ hash: degreeThreshold,
+ dynamicFixes: function() {
+ return [
+ new validationIssueFix({
+ icon: "iD-operation-orthogonalize",
+ title: _t.html("issues.fix.square_feature.title"),
+ autoArgs,
+ onClick: function(context2, completionHandler) {
+ var entityId = this.issue.entityIds[0];
+ context2.perform(actionOrthogonalize(entityId, context2.projection, void 0, degreeThreshold), _t("operations.orthogonalize.annotation.feature", { n: 1 }));
+ window.setTimeout(function() {
+ completionHandler();
+ }, 175);
+ }
+ })
+ ];
+ }
+ })];
+ function showReference(selection2) {
+ selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.unsquare_way.buildings.reference"));
+ }
+ };
+ validation.type = type3;
+ return validation;
+ }
+
+ // modules/core/validator.js
+ function coreValidator(context) {
+ let dispatch10 = dispatch_default("validated", "focusedIssue");
+ let validator = utilRebind({}, dispatch10, "on");
+ let _rules = {};
+ let _disabledRules = {};
+ let _ignoredIssueIDs = /* @__PURE__ */ new Set();
+ let _resolvedIssueIDs = /* @__PURE__ */ new Set();
+ let _baseCache = validationCache("base");
+ let _headCache = validationCache("head");
+ let _completeDiff = {};
+ let _headIsCurrent = false;
+ let _deferredRIC = {};
+ let _deferredST = /* @__PURE__ */ new Set();
+ let _headPromise;
+ const RETRY = 5e3;
+ const _errorOverrides = parseHashParam(context.initialHashParams.validationError);
+ const _warningOverrides = parseHashParam(context.initialHashParams.validationWarning);
+ const _disableOverrides = parseHashParam(context.initialHashParams.validationDisable);
+ function parseHashParam(param) {
+ let result = [];
+ let rules = (param || "").split(",");
+ rules.forEach((rule) => {
+ rule = rule.trim();
+ const parts = rule.split("/", 2);
+ const type3 = parts[0];
+ const subtype = parts[1] || "*";
+ if (!type3 || !subtype)
+ return;
+ result.push({ type: makeRegExp(type3), subtype: makeRegExp(subtype) });
+ });
+ return result;
+ function makeRegExp(str2) {
+ const escaped = str2.replace(/[-\/\\^$+?.()|[\]{}]/g, "\\$&").replace(/\*/g, ".*");
+ return new RegExp("^" + escaped + "$");
+ }
+ }
+ validator.init = () => {
+ Object.values(validations_exports).forEach((validation) => {
+ if (typeof validation !== "function")
+ return;
+ const fn = validation(context);
+ const key = fn.type;
+ _rules[key] = fn;
+ });
+ let disabledRules = corePreferences("validate-disabledRules");
+ if (disabledRules) {
+ disabledRules.split(",").forEach((k) => _disabledRules[k] = true);
+ }
+ };
+ function reset(resetIgnored) {
+ _baseCache.queue = [];
+ _headCache.queue = [];
+ Object.keys(_deferredRIC).forEach((key) => {
+ window.cancelIdleCallback(key);
+ _deferredRIC[key]();
+ });
+ _deferredRIC = {};
+ _deferredST.forEach(window.clearTimeout);
+ _deferredST.clear();
+ if (resetIgnored)
+ _ignoredIssueIDs.clear();
+ _resolvedIssueIDs.clear();
+ _baseCache = validationCache("base");
+ _headCache = validationCache("head");
+ _completeDiff = {};
+ _headIsCurrent = false;
+ }
+ validator.reset = () => {
+ reset(true);
+ };
+ validator.resetIgnoredIssues = () => {
+ _ignoredIssueIDs.clear();
+ dispatch10.call("validated");
+ };
+ validator.revalidateUnsquare = () => {
+ revalidateUnsquare(_headCache);
+ revalidateUnsquare(_baseCache);
+ dispatch10.call("validated");
+ };
+ function revalidateUnsquare(cache) {
+ const checkUnsquareWay = _rules.unsquare_way;
+ if (!cache.graph || typeof checkUnsquareWay !== "function")
+ return;
+ cache.uncacheIssuesOfType("unsquare_way");
+ const buildings = context.history().tree().intersects(geoExtent([-180, -90], [180, 90]), cache.graph).filter((entity) => entity.type === "way" && entity.tags.building && entity.tags.building !== "no");
+ buildings.forEach((entity) => {
+ const detected = checkUnsquareWay(entity, cache.graph);
+ if (!detected.length)
+ return;
+ cache.cacheIssues(detected);
+ });
+ }
+ validator.getIssues = (options2) => {
+ const opts = Object.assign({ what: "all", where: "all", includeIgnored: false, includeDisabledRules: false }, options2);
+ const view = context.map().extent();
+ let seen = /* @__PURE__ */ new Set();
+ let results = [];
+ if (_headCache.graph && _headCache.graph !== _baseCache.graph) {
+ Object.values(_headCache.issuesByIssueID).forEach((issue) => {
+ const userModified = (issue.entityIds || []).some((id2) => _completeDiff.hasOwnProperty(id2));
+ if (opts.what === "edited" && !userModified)
+ return;
+ if (!filter2(issue))
+ return;
+ seen.add(issue.id);
+ results.push(issue);
+ });
+ }
+ if (opts.what === "all") {
+ Object.values(_baseCache.issuesByIssueID).forEach((issue) => {
+ if (!filter2(issue))
+ return;
+ seen.add(issue.id);
+ results.push(issue);
+ });
+ }
+ return results;
+ function filter2(issue) {
+ if (!issue)
+ return false;
+ if (seen.has(issue.id))
+ return false;
+ if (_resolvedIssueIDs.has(issue.id))
+ return false;
+ if (opts.includeDisabledRules === "only" && !_disabledRules[issue.type])
+ return false;
+ if (!opts.includeDisabledRules && _disabledRules[issue.type])
+ return false;
+ if (opts.includeIgnored === "only" && !_ignoredIssueIDs.has(issue.id))
+ return false;
+ if (!opts.includeIgnored && _ignoredIssueIDs.has(issue.id))
+ return false;
+ if ((issue.entityIds || []).some((id2) => !context.hasEntity(id2)))
+ return false;
+ if (opts.where === "visible") {
+ const extent = issue.extent(context.graph());
+ if (!view.intersects(extent))
+ return false;
+ }
+ return true;
+ }
+ };
+ validator.getResolvedIssues = () => {
+ return Array.from(_resolvedIssueIDs).map((issueID) => _baseCache.issuesByIssueID[issueID]).filter(Boolean);
+ };
+ validator.focusIssue = (issue) => {
+ const graph = context.graph();
+ let selectID;
+ let focusCenter;
+ const issueExtent = issue.extent(graph);
+ if (issueExtent) {
+ focusCenter = issueExtent.center();
+ }
+ if (issue.entityIds && issue.entityIds.length) {
+ selectID = issue.entityIds[0];
+ if (selectID && selectID.charAt(0) === "r") {
+ const ids = utilEntityAndDeepMemberIDs([selectID], graph);
+ let nodeID = ids.find((id2) => id2.charAt(0) === "n" && graph.hasEntity(id2));
+ if (!nodeID) {
+ const wayID = ids.find((id2) => id2.charAt(0) === "w" && graph.hasEntity(id2));
+ if (wayID) {
+ nodeID = graph.entity(wayID).first();
+ }
+ }
+ if (nodeID) {
+ focusCenter = graph.entity(nodeID).loc;
+ }
+ }
+ }
+ if (focusCenter) {
+ const setZoom = Math.max(context.map().zoom(), 19);
+ context.map().unobscuredCenterZoomEase(focusCenter, setZoom);
+ }
+ if (selectID) {
+ window.setTimeout(() => {
+ context.enter(modeSelect(context, [selectID]));
+ dispatch10.call("focusedIssue", this, issue);
+ }, 250);
+ }
+ };
+ validator.getIssuesBySeverity = (options2) => {
+ let groups = utilArrayGroupBy(validator.getIssues(options2), "severity");
+ groups.error = groups.error || [];
+ groups.warning = groups.warning || [];
+ return groups;
+ };
+ validator.getSharedEntityIssues = (entityIDs, options2) => {
+ const orderedIssueTypes = [
+ "missing_tag",
+ "missing_role",
+ "outdated_tags",
+ "mismatched_geometry",
+ "crossing_ways",
+ "almost_junction",
+ "disconnected_way",
+ "impossible_oneway"
+ ];
+ const allIssues = validator.getIssues(options2);
+ const forEntityIDs = new Set(entityIDs);
+ return allIssues.filter((issue) => (issue.entityIds || []).some((entityID) => forEntityIDs.has(entityID))).sort((issue1, issue2) => {
+ if (issue1.type === issue2.type) {
+ return issue1.id < issue2.id ? -1 : 1;
+ }
+ const index1 = orderedIssueTypes.indexOf(issue1.type);
+ const index2 = orderedIssueTypes.indexOf(issue2.type);
+ if (index1 !== -1 && index2 !== -1) {
+ return index1 - index2;
+ } else if (index1 === -1 && index2 === -1) {
+ return issue1.type < issue2.type ? -1 : 1;
+ } else {
+ return index1 !== -1 ? -1 : 1;
+ }
+ });
+ };
+ validator.getEntityIssues = (entityID, options2) => {
+ return validator.getSharedEntityIssues([entityID], options2);
+ };
+ validator.getRuleKeys = () => {
+ return Object.keys(_rules);
+ };
+ validator.isRuleEnabled = (key) => {
+ return !_disabledRules[key];
+ };
+ validator.toggleRule = (key) => {
+ if (_disabledRules[key]) {
+ delete _disabledRules[key];
+ } else {
+ _disabledRules[key] = true;
+ }
+ corePreferences("validate-disabledRules", Object.keys(_disabledRules).join(","));
+ validator.validate();
+ };
+ validator.disableRules = (keys) => {
+ _disabledRules = {};
+ keys.forEach((k) => _disabledRules[k] = true);
+ corePreferences("validate-disabledRules", Object.keys(_disabledRules).join(","));
+ validator.validate();
+ };
+ validator.ignoreIssue = (issueID) => {
+ _ignoredIssueIDs.add(issueID);
+ };
+ validator.validate = () => {
+ const baseGraph = context.history().base();
+ if (!_headCache.graph)
+ _headCache.graph = baseGraph;
+ if (!_baseCache.graph)
+ _baseCache.graph = baseGraph;
+ const prevGraph = _headCache.graph;
+ const currGraph = context.graph();
+ if (currGraph === prevGraph) {
+ _headIsCurrent = true;
+ dispatch10.call("validated");
+ return Promise.resolve();
+ }
+ if (_headPromise) {
+ _headIsCurrent = false;
+ return _headPromise;
+ }
+ _headCache.graph = currGraph;
+ _completeDiff = context.history().difference().complete();
+ const incrementalDiff = coreDifference(prevGraph, currGraph);
+ let entityIDs = Object.keys(incrementalDiff.complete());
+ entityIDs = _headCache.withAllRelatedEntities(entityIDs);
+ if (!entityIDs.size) {
+ dispatch10.call("validated");
+ return Promise.resolve();
+ }
+ _headPromise = validateEntitiesAsync(entityIDs, _headCache).then(() => updateResolvedIssues(entityIDs)).then(() => dispatch10.call("validated")).catch(() => {
+ }).then(() => {
+ _headPromise = null;
+ if (!_headIsCurrent) {
+ validator.validate();
+ }
+ });
+ return _headPromise;
+ };
+ context.history().on("restore.validator", validator.validate).on("undone.validator", validator.validate).on("redone.validator", validator.validate).on("reset.validator", () => {
+ reset(false);
+ validator.validate();
+ });
+ context.on("exit.validator", validator.validate);
+ context.history().on("merge.validator", (entities) => {
+ if (!entities)
+ return;
+ const baseGraph = context.history().base();
+ if (!_headCache.graph)
+ _headCache.graph = baseGraph;
+ if (!_baseCache.graph)
+ _baseCache.graph = baseGraph;
+ let entityIDs = entities.map((entity) => entity.id);
+ entityIDs = _baseCache.withAllRelatedEntities(entityIDs);
+ validateEntitiesAsync(entityIDs, _baseCache);
+ });
+ function validateEntity(entity, graph) {
+ let result = { issues: [], provisional: false };
+ Object.keys(_rules).forEach(runValidation);
+ return result;
+ function runValidation(key) {
+ const fn = _rules[key];
+ if (typeof fn !== "function") {
+ console.error("no such validation rule = " + key);
+ return;
+ }
+ let detected = fn(entity, graph);
+ if (detected.provisional) {
+ result.provisional = true;
+ }
+ detected = detected.filter(applySeverityOverrides);
+ result.issues = result.issues.concat(detected);
+ function applySeverityOverrides(issue) {
+ const type3 = issue.type;
+ const subtype = issue.subtype || "";
+ let i2;
+ for (i2 = 0; i2 < _errorOverrides.length; i2++) {
+ if (_errorOverrides[i2].type.test(type3) && _errorOverrides[i2].subtype.test(subtype)) {
+ issue.severity = "error";
+ return true;
+ }
+ }
+ for (i2 = 0; i2 < _warningOverrides.length; i2++) {
+ if (_warningOverrides[i2].type.test(type3) && _warningOverrides[i2].subtype.test(subtype)) {
+ issue.severity = "warning";
+ return true;
+ }
+ }
+ for (i2 = 0; i2 < _disableOverrides.length; i2++) {
+ if (_disableOverrides[i2].type.test(type3) && _disableOverrides[i2].subtype.test(subtype)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+ }
+ function updateResolvedIssues(entityIDs) {
+ entityIDs.forEach((entityID) => {
+ const baseIssues = _baseCache.issuesByEntityID[entityID];
+ if (!baseIssues)
+ return;
+ baseIssues.forEach((issueID) => {
+ const issue = _baseCache.issuesByIssueID[issueID];
+ const userModified = (issue.entityIds || []).some((id2) => _completeDiff.hasOwnProperty(id2));
+ if (userModified && !_headCache.issuesByIssueID[issueID]) {
+ _resolvedIssueIDs.add(issueID);
+ } else {
+ _resolvedIssueIDs.delete(issueID);
+ }
+ });
+ });
+ }
+ function validateEntitiesAsync(entityIDs, cache) {
+ const jobs = Array.from(entityIDs).map((entityID) => {
+ if (cache.queuedEntityIDs.has(entityID))
+ return null;
+ cache.queuedEntityIDs.add(entityID);
+ cache.uncacheEntityID(entityID);
+ return () => {
+ cache.queuedEntityIDs.delete(entityID);
+ const graph = cache.graph;
+ if (!graph)
+ return;
+ const entity = graph.hasEntity(entityID);
+ if (!entity)
+ return;
+ const result = validateEntity(entity, graph);
+ if (result.provisional) {
+ cache.provisionalEntityIDs.add(entityID);
+ }
+ cache.cacheIssues(result.issues);
+ };
+ }).filter(Boolean);
+ cache.queue = cache.queue.concat(utilArrayChunk(jobs, 100));
+ if (cache.queuePromise)
+ return cache.queuePromise;
+ cache.queuePromise = processQueue(cache).then(() => revalidateProvisionalEntities(cache)).catch(() => {
+ }).finally(() => cache.queuePromise = null);
+ return cache.queuePromise;
+ }
+ function revalidateProvisionalEntities(cache) {
+ if (!cache.provisionalEntityIDs.size)
+ return;
+ const handle = window.setTimeout(() => {
+ _deferredST.delete(handle);
+ if (!cache.provisionalEntityIDs.size)
+ return;
+ validateEntitiesAsync(Array.from(cache.provisionalEntityIDs), cache);
+ }, RETRY);
+ _deferredST.add(handle);
+ }
+ function processQueue(cache) {
+ if (!cache.queue.length)
+ return Promise.resolve();
+ const chunk = cache.queue.pop();
+ return new Promise((resolvePromise, rejectPromise) => {
+ const handle = window.requestIdleCallback(() => {
+ delete _deferredRIC[handle];
+ chunk.forEach((job) => job());
+ resolvePromise();
+ });
+ _deferredRIC[handle] = rejectPromise;
+ }).then(() => {
+ if (cache.queue.length % 25 === 0)
+ dispatch10.call("validated");
+ }).then(() => processQueue(cache));
+ }
+ return validator;
+ }
+ function validationCache(which) {
+ let cache = {
+ which,
+ graph: null,
+ queue: [],
+ queuePromise: null,
+ queuedEntityIDs: /* @__PURE__ */ new Set(),
+ provisionalEntityIDs: /* @__PURE__ */ new Set(),
+ issuesByIssueID: {},
+ issuesByEntityID: {}
+ };
+ cache.cacheIssue = (issue) => {
+ (issue.entityIds || []).forEach((entityID) => {
+ if (!cache.issuesByEntityID[entityID]) {
+ cache.issuesByEntityID[entityID] = /* @__PURE__ */ new Set();
+ }
+ cache.issuesByEntityID[entityID].add(issue.id);
+ });
+ cache.issuesByIssueID[issue.id] = issue;
+ };
+ cache.uncacheIssue = (issue) => {
+ (issue.entityIds || []).forEach((entityID) => {
+ if (cache.issuesByEntityID[entityID]) {
+ cache.issuesByEntityID[entityID].delete(issue.id);
+ }
+ });
+ delete cache.issuesByIssueID[issue.id];
+ };
+ cache.cacheIssues = (issues) => {
+ issues.forEach(cache.cacheIssue);
+ };
+ cache.uncacheIssues = (issues) => {
+ issues.forEach(cache.uncacheIssue);
+ };
+ cache.uncacheIssuesOfType = (type3) => {
+ const issuesOfType = Object.values(cache.issuesByIssueID).filter((issue) => issue.type === type3);
+ cache.uncacheIssues(issuesOfType);
+ };
+ cache.uncacheEntityID = (entityID) => {
+ const entityIssueIDs = cache.issuesByEntityID[entityID];
+ if (entityIssueIDs) {
+ entityIssueIDs.forEach((issueID) => {
+ const issue = cache.issuesByIssueID[issueID];
+ if (issue) {
+ cache.uncacheIssue(issue);
+ } else {
+ delete cache.issuesByIssueID[issueID];
+ }
+ });
+ }
+ delete cache.issuesByEntityID[entityID];
+ cache.provisionalEntityIDs.delete(entityID);
+ };
+ cache.withAllRelatedEntities = (entityIDs) => {
+ let result = /* @__PURE__ */ new Set();
+ (entityIDs || []).forEach((entityID) => {
+ result.add(entityID);
+ const entityIssueIDs = cache.issuesByEntityID[entityID];
+ if (entityIssueIDs) {
+ entityIssueIDs.forEach((issueID) => {
+ const issue = cache.issuesByIssueID[issueID];
+ if (issue) {
+ (issue.entityIds || []).forEach((relatedID) => result.add(relatedID));
+ } else {
+ delete cache.issuesByIssueID[issueID];
+ }
+ });
+ }
+ });
+ return result;
+ };
+ return cache;
+ }
+
+ // modules/core/uploader.js
+ function coreUploader(context) {
+ var dispatch10 = dispatch_default("saveStarted", "saveEnded", "willAttemptUpload", "progressChanged", "resultNoChanges", "resultErrors", "resultConflicts", "resultSuccess");
+ var _isSaving = false;
+ var _conflicts = [];
+ var _errors = [];
+ var _origChanges;
+ var _discardTags = {};
+ _mainFileFetcher.get("discarded").then(function(d) {
+ _discardTags = d;
+ }).catch(function() {
+ });
+ var uploader = utilRebind({}, dispatch10, "on");
+ uploader.isSaving = function() {
+ return _isSaving;
+ };
+ uploader.save = function(changeset, tryAgain, checkConflicts) {
+ if (_isSaving && !tryAgain) {
+ return;
+ }
+ var osm = context.connection();
+ if (!osm)
+ return;
+ if (!osm.authenticated()) {
+ osm.authenticate(function(err) {
+ if (!err) {
+ uploader.save(changeset, tryAgain, checkConflicts);
+ }
+ });
+ return;
+ }
+ if (!_isSaving) {
+ _isSaving = true;
+ dispatch10.call("saveStarted", this);
+ }
+ var history = context.history();
+ _conflicts = [];
+ _errors = [];
+ _origChanges = history.changes(actionDiscardTags(history.difference(), _discardTags));
+ if (!tryAgain) {
+ history.perform(actionNoop());
+ }
+ if (!checkConflicts) {
+ upload(changeset);
+ } else {
+ performFullConflictCheck(changeset);
+ }
+ };
+ function performFullConflictCheck(changeset) {
+ var osm = context.connection();
+ if (!osm)
+ return;
+ var history = context.history();
+ var localGraph = context.graph();
+ var remoteGraph = coreGraph(history.base(), true);
+ var summary = history.difference().summary();
+ var _toCheck = [];
+ for (var i2 = 0; i2 < summary.length; i2++) {
+ var item = summary[i2];
+ if (item.changeType === "modified") {
+ _toCheck.push(item.entity.id);
+ }
+ }
+ var _toLoad = withChildNodes(_toCheck, localGraph);
+ var _loaded = {};
+ var _toLoadCount = 0;
+ var _toLoadTotal = _toLoad.length;
+ if (_toCheck.length) {
+ dispatch10.call("progressChanged", this, _toLoadCount, _toLoadTotal);
+ _toLoad.forEach(function(id2) {
+ _loaded[id2] = false;
+ });
+ osm.loadMultiple(_toLoad, loaded);
+ } else {
+ upload(changeset);
+ }
+ return;
+ function withChildNodes(ids, graph) {
+ var s = new Set(ids);
+ ids.forEach(function(id2) {
+ var entity = graph.entity(id2);
+ if (entity.type !== "way")
+ return;
+ graph.childNodes(entity).forEach(function(child) {
+ if (child.version !== void 0) {
+ s.add(child.id);
+ }
+ });
+ });
+ return Array.from(s);
+ }
+ function loaded(err, result) {
+ if (_errors.length)
+ return;
+ if (err) {
+ _errors.push({
+ msg: err.message || err.responseText,
+ details: [_t("save.status_code", { code: err.status })]
+ });
+ didResultInErrors();
+ } else {
+ var loadMore = [];
+ result.data.forEach(function(entity) {
+ remoteGraph.replace(entity);
+ _loaded[entity.id] = true;
+ _toLoad = _toLoad.filter(function(val) {
+ return val !== entity.id;
+ });
+ if (!entity.visible)
+ return;
+ var i3, id2;
+ if (entity.type === "way") {
+ for (i3 = 0; i3 < entity.nodes.length; i3++) {
+ id2 = entity.nodes[i3];
+ if (_loaded[id2] === void 0) {
+ _loaded[id2] = false;
+ loadMore.push(id2);
+ }
+ }
+ } else if (entity.type === "relation" && entity.isMultipolygon()) {
+ for (i3 = 0; i3 < entity.members.length; i3++) {
+ id2 = entity.members[i3].id;
+ if (_loaded[id2] === void 0) {
+ _loaded[id2] = false;
+ loadMore.push(id2);
+ }
+ }
+ }
+ });
+ _toLoadCount += result.data.length;
+ _toLoadTotal += loadMore.length;
+ dispatch10.call("progressChanged", this, _toLoadCount, _toLoadTotal);
+ if (loadMore.length) {
+ _toLoad.push.apply(_toLoad, loadMore);
+ osm.loadMultiple(loadMore, loaded);
+ }
+ if (!_toLoad.length) {
+ detectConflicts();
+ upload(changeset);
+ }
+ }
+ }
+ function detectConflicts() {
+ function choice(id2, text2, action) {
+ return {
+ id: id2,
+ text: text2,
+ action: function() {
+ history.replace(action);
+ }
+ };
+ }
+ function formatUser(d) {
+ return '<a href="' + osm.userURL(d) + '" target="_blank">' + escape_default(d) + "</a>";
+ }
+ function entityName(entity) {
+ return utilDisplayName(entity) || utilDisplayType(entity.id) + " " + entity.id;
+ }
+ function sameVersions(local, remote) {
+ if (local.version !== remote.version)
+ return false;
+ if (local.type === "way") {
+ var children2 = utilArrayUnion(local.nodes, remote.nodes);
+ for (var i3 = 0; i3 < children2.length; i3++) {
+ var a = localGraph.hasEntity(children2[i3]);
+ var b = remoteGraph.hasEntity(children2[i3]);
+ if (a && b && a.version !== b.version)
+ return false;
+ }
+ }
+ return true;
+ }
+ _toCheck.forEach(function(id2) {
+ var local = localGraph.entity(id2);
+ var remote = remoteGraph.entity(id2);
+ if (sameVersions(local, remote))
+ return;
+ var merge3 = actionMergeRemoteChanges(id2, localGraph, remoteGraph, _discardTags, formatUser);
+ history.replace(merge3);
+ var mergeConflicts = merge3.conflicts();
+ if (!mergeConflicts.length)
+ return;
+ var forceLocal = actionMergeRemoteChanges(id2, localGraph, remoteGraph, _discardTags).withOption("force_local");
+ var forceRemote = actionMergeRemoteChanges(id2, localGraph, remoteGraph, _discardTags).withOption("force_remote");
+ var keepMine = _t("save.conflict." + (remote.visible ? "keep_local" : "restore"));
+ var keepTheirs = _t("save.conflict." + (remote.visible ? "keep_remote" : "delete"));
+ _conflicts.push({
+ id: id2,
+ name: entityName(local),
+ details: mergeConflicts,
+ chosen: 1,
+ choices: [
+ choice(id2, keepMine, forceLocal),
+ choice(id2, keepTheirs, forceRemote)
+ ]
+ });
+ });
+ }
+ }
+ function upload(changeset) {
+ var osm = context.connection();
+ if (!osm) {
+ _errors.push({ msg: "No OSM Service" });
+ }
+ if (_conflicts.length) {
+ didResultInConflicts(changeset);
+ } else if (_errors.length) {
+ didResultInErrors();
+ } else {
+ var history = context.history();
+ var changes = history.changes(actionDiscardTags(history.difference(), _discardTags));
+ if (changes.modified.length || changes.created.length || changes.deleted.length) {
+ dispatch10.call("willAttemptUpload", this);
+ osm.putChangeset(changeset, changes, uploadCallback);
+ } else {
+ didResultInNoChanges();
+ }
+ }
+ }
+ function uploadCallback(err, changeset) {
+ if (err) {
+ if (err.status === 409) {
+ uploader.save(changeset, true, true);
+ } else {
+ _errors.push({
+ msg: err.message || err.responseText,
+ details: [_t("save.status_code", { code: err.status })]
+ });
+ didResultInErrors();
+ }
+ } else {
+ didResultInSuccess(changeset);
+ }
+ }
+ function didResultInNoChanges() {
+ dispatch10.call("resultNoChanges", this);
+ endSave();
+ context.flush();
+ }
+ function didResultInErrors() {
+ context.history().pop();
+ dispatch10.call("resultErrors", this, _errors);
+ endSave();
+ }
+ function didResultInConflicts(changeset) {
+ _conflicts.sort(function(a, b) {
+ return b.id.localeCompare(a.id);
+ });
+ dispatch10.call("resultConflicts", this, changeset, _conflicts, _origChanges);
+ endSave();
+ }
+ function didResultInSuccess(changeset) {
+ context.history().clearSaved();
+ dispatch10.call("resultSuccess", this, changeset);
+ window.setTimeout(function() {
+ endSave();
+ context.flush();
+ }, 2500);
+ }
+ function endSave() {
+ _isSaving = false;
+ dispatch10.call("saveEnded", this);
+ }
+ uploader.cancelConflictResolution = function() {
+ context.history().pop();
+ };
+ uploader.processResolvedConflicts = function(changeset) {
+ var history = context.history();
+ for (var i2 = 0; i2 < _conflicts.length; i2++) {
+ if (_conflicts[i2].chosen === 1) {
+ var entity = context.hasEntity(_conflicts[i2].id);
+ if (entity && entity.type === "way") {
+ var children2 = utilArrayUniq(entity.nodes);
+ for (var j2 = 0; j2 < children2.length; j2++) {
+ history.replace(actionRevert(children2[j2]));
+ }
+ }
+ history.replace(actionRevert(_conflicts[i2].id));
+ }
+ }
+ uploader.save(changeset, true, false);
+ };
+ uploader.reset = function() {
+ };
+ return uploader;
+ }
+
+ // modules/renderer/background_source.js
+ var import_lodash2 = __toESM(require_lodash());
+
+ // modules/util/IntervalTasksQueue.js
+ var IntervalTasksQueue = class {
+ constructor(intervalInMs) {
+ this.intervalInMs = intervalInMs;
+ this.pendingHandles = [];
+ this.time = 0;
+ }
+ enqueue(task) {
+ let taskTimeout = this.time;
+ this.time += this.intervalInMs;
+ this.pendingHandles.push(setTimeout(() => {
+ this.time -= this.intervalInMs;
+ task();
+ }, taskTimeout));
+ }
+ clear() {
+ this.pendingHandles.forEach((timeoutHandle) => {
+ clearTimeout(timeoutHandle);
+ });
+ this.pendingHandles = [];
+ this.time = 0;
+ }
+ };
+
+ // modules/renderer/background_source.js
+ var isRetina = window.devicePixelRatio && window.devicePixelRatio >= 2;
+ window.matchMedia(`
+ (-webkit-min-device-pixel-ratio: 2), /* Safari */
+ (min-resolution: 2dppx), /* standard */
+ (min-resolution: 192dpi) /* fallback */
+ `).addListener(function() {
+ isRetina = window.devicePixelRatio && window.devicePixelRatio >= 2;
+ });
+ function localeDateString(s) {
+ if (!s)
+ return null;
+ var options2 = { day: "numeric", month: "short", year: "numeric" };
+ var d = new Date(s);
+ if (isNaN(d.getTime()))
+ return null;
+ return d.toLocaleDateString(_mainLocalizer.localeCode(), options2);
+ }
+ function vintageRange(vintage) {
+ var s;
+ if (vintage.start || vintage.end) {
+ s = vintage.start || "?";
+ if (vintage.start !== vintage.end) {
+ s += " - " + (vintage.end || "?");
+ }
+ }
+ return s;
+ }
+ function rendererBackgroundSource(data) {
+ var source = Object.assign({}, data);
+ var _offset = [0, 0];
+ var _name = source.name;
+ var _description = source.description;
+ var _best = !!source.best;
+ var _template = source.encrypted ? utilAesDecrypt(source.template) : source.template;
+ source.tileSize = data.tileSize || 256;
+ source.zoomExtent = data.zoomExtent || [0, 22];
+ source.overzoom = data.overzoom !== false;
+ source.offset = function(val) {
+ if (!arguments.length)
+ return _offset;
+ _offset = val;
+ return source;
+ };
+ source.nudge = function(val, zoomlevel) {
+ _offset[0] += val[0] / Math.pow(2, zoomlevel);
+ _offset[1] += val[1] / Math.pow(2, zoomlevel);
+ return source;
+ };
+ source.name = function() {
+ var id_safe = source.id.replace(/\./g, "<TX_DOT>");
+ return _t("imagery." + id_safe + ".name", { default: (0, import_lodash2.escape)(_name) });
+ };
+ source.label = function() {
+ var id_safe = source.id.replace(/\./g, "<TX_DOT>");
+ return _t.html("imagery." + id_safe + ".name", { default: (0, import_lodash2.escape)(_name) });
+ };
+ source.description = function() {
+ var id_safe = source.id.replace(/\./g, "<TX_DOT>");
+ return _t.html("imagery." + id_safe + ".description", { default: (0, import_lodash2.escape)(_description) });
+ };
+ source.best = function() {
+ return _best;
+ };
+ source.area = function() {
+ if (!data.polygon)
+ return Number.MAX_VALUE;
+ var area = area_default({ type: "MultiPolygon", coordinates: [data.polygon] });
+ return isNaN(area) ? 0 : area;
+ };
+ source.imageryUsed = function() {
+ return _name || source.id;
+ };
+ source.template = function(val) {
+ if (!arguments.length)
+ return _template;
+ if (source.id === "custom" || source.id === "Bing") {
+ _template = val;
+ }
+ return source;
+ };
+ source.url = function(coord2) {
+ var result = _template.replace(/#[\s\S]*/u, "");
+ if (result === "")
+ return result;
+ if (!source.type || source.id === "custom") {
+ if (/SERVICE=WMS|\{(proj|wkid|bbox)\}/.test(result)) {
+ source.type = "wms";
+ source.projection = "EPSG:3857";
+ } else if (/\{(x|y)\}/.test(result)) {
+ source.type = "tms";
+ } else if (/\{u\}/.test(result)) {
+ source.type = "bing";
+ }
+ }
+ if (source.type === "wms") {
+ var tileToProjectedCoords = function(x, y, z) {
+ var zoomSize = Math.pow(2, z);
+ var lon = x / zoomSize * Math.PI * 2 - Math.PI;
+ var lat = Math.atan(Math.sinh(Math.PI * (1 - 2 * y / zoomSize)));
+ switch (source.projection) {
+ case "EPSG:4326":
+ return {
+ x: lon * 180 / Math.PI,
+ y: lat * 180 / Math.PI
+ };
+ default:
+ var mercCoords = mercatorRaw(lon, lat);
+ return {
+ x: 2003750834e-2 / Math.PI * mercCoords[0],
+ y: 2003750834e-2 / Math.PI * mercCoords[1]
+ };
+ }
+ };
+ var tileSize = source.tileSize;
+ var projection2 = source.projection;
+ var minXmaxY = tileToProjectedCoords(coord2[0], coord2[1], coord2[2]);
+ var maxXminY = tileToProjectedCoords(coord2[0] + 1, coord2[1] + 1, coord2[2]);
+ result = result.replace(/\{(\w+)\}/g, function(token, key) {
+ switch (key) {
+ case "width":
+ case "height":
+ return tileSize;
+ case "proj":
+ return projection2;
+ case "wkid":
+ return projection2.replace(/^EPSG:/, "");
+ case "bbox":
+ if (projection2 === "EPSG:4326" && /VERSION=1.3|CRS={proj}/.test(source.template().toUpperCase())) {
+ return maxXminY.y + "," + minXmaxY.x + "," + minXmaxY.y + "," + maxXminY.x;
+ } else {
+ return minXmaxY.x + "," + maxXminY.y + "," + maxXminY.x + "," + minXmaxY.y;
+ }
+ case "w":
+ return minXmaxY.x;
+ case "s":
+ return maxXminY.y;
+ case "n":
+ return maxXminY.x;
+ case "e":
+ return minXmaxY.y;
+ default:
+ return token;
+ }
+ });
+ } else if (source.type === "tms") {
+ result = result.replace("{x}", coord2[0]).replace("{y}", coord2[1]).replace(/\{[t-]y\}/, Math.pow(2, coord2[2]) - coord2[1] - 1).replace(/\{z(oom)?\}/, coord2[2]).replace(/\{@2x\}|\{r\}/, isRetina ? "@2x" : "");
+ } else if (source.type === "bing") {
+ result = result.replace("{u}", function() {
+ var u = "";
+ for (var zoom = coord2[2]; zoom > 0; zoom--) {
+ var b = 0;
+ var mask = 1 << zoom - 1;
+ if ((coord2[0] & mask) !== 0)
+ b++;
+ if ((coord2[1] & mask) !== 0)
+ b += 2;
+ u += b.toString();
+ }
+ return u;
+ });
+ }
+ result = result.replace(/\{switch:([^}]+)\}/, function(s, r) {
+ var subdomains = r.split(",");
+ return subdomains[(coord2[0] + coord2[1]) % subdomains.length];
+ });
+ return result;
+ };
+ source.validZoom = function(z) {
+ return source.zoomExtent[0] <= z && (source.overzoom || source.zoomExtent[1] > z);
+ };
+ source.isLocatorOverlay = function() {
+ return source.id === "mapbox_locator_overlay";
+ };
+ source.isHidden = function() {
+ return source.id === "DigitalGlobe-Premium-vintage" || source.id === "DigitalGlobe-Standard-vintage";
+ };
+ source.copyrightNotices = function() {
+ };
+ source.getMetadata = function(center, tileCoord, callback) {
+ var vintage = {
+ start: localeDateString(source.startDate),
+ end: localeDateString(source.endDate)
+ };
+ vintage.range = vintageRange(vintage);
+ var metadata = { vintage };
+ callback(null, metadata);
+ };
+ return source;
+ }
+ rendererBackgroundSource.Bing = function(data, dispatch10) {
+ data.template = "https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=1&pr=odbl&n=z";
+ var bing = rendererBackgroundSource(data);
+ var key = utilAesDecrypt("5c875730b09c6b422433e807e1ff060b6536c791dbfffcffc4c6b18a1bdba1f14593d151adb50e19e1be1ab19aef813bf135d0f103475e5c724dec94389e45d0");
+ const strictParam = "n";
+ var url = "https://dev.virtualearth.net/REST/v1/Imagery/Metadata/AerialOSM?include=ImageryProviders&uriScheme=https&key=" + key;
+ var cache = {};
+ var inflight = {};
+ var providers = [];
+ var taskQueue = new IntervalTasksQueue(250);
+ var metadataLastZoom = -1;
+ json_default(url).then(function(json) {
+ let imageryResource = json.resourceSets[0].resources[0];
+ let template = imageryResource.imageUrl;
+ let subDomains = imageryResource.imageUrlSubdomains;
+ let subDomainNumbers = subDomains.map((subDomain) => {
+ return subDomain.substring(1);
+ }).join(",");
+ template = template.replace("{subdomain}", `t{switch:${subDomainNumbers}}`).replace("{quadkey}", "{u}");
+ if (!new URLSearchParams(template).has(strictParam)) {
+ template += `&${strictParam}=z`;
+ }
+ bing.template(template);
+ providers = imageryResource.imageryProviders.map(function(provider) {
+ return {
+ attribution: provider.attribution,
+ areas: provider.coverageAreas.map(function(area) {
+ return {
+ zoom: [area.zoomMin, area.zoomMax],
+ extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
+ };
+ })
+ };
+ });
+ dispatch10.call("change");
+ }).catch(function() {
+ });
+ bing.copyrightNotices = function(zoom, extent) {
+ zoom = Math.min(zoom, 21);
+ return providers.filter(function(provider) {
+ return provider.areas.some(function(area) {
+ return extent.intersects(area.extent) && area.zoom[0] <= zoom && area.zoom[1] >= zoom;
+ });
+ }).map(function(provider) {
+ return provider.attribution;
+ }).join(", ");
+ };
+ bing.getMetadata = function(center, tileCoord, callback) {
+ var tileID = tileCoord.slice(0, 3).join("/");
+ var zoom = Math.min(tileCoord[2], 21);
+ var centerPoint = center[1] + "," + center[0];
+ var url2 = "https://dev.virtualearth.net/REST/v1/Imagery/BasicMetadata/AerialOSM/" + centerPoint + "?zl=" + zoom + "&key=" + key;
+ if (inflight[tileID])
+ return;
+ if (!cache[tileID]) {
+ cache[tileID] = {};
+ }
+ if (cache[tileID] && cache[tileID].metadata) {
+ return callback(null, cache[tileID].metadata);
+ }
+ inflight[tileID] = true;
+ if (metadataLastZoom !== tileCoord[2]) {
+ metadataLastZoom = tileCoord[2];
+ taskQueue.clear();
+ }
+ taskQueue.enqueue(() => {
+ json_default(url2).then(function(result) {
+ delete inflight[tileID];
+ if (!result) {
+ throw new Error("Unknown Error");
+ }
+ var vintage = {
+ start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
+ end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
+ };
+ vintage.range = vintageRange(vintage);
+ var metadata = { vintage };
+ cache[tileID].metadata = metadata;
+ if (callback)
+ callback(null, metadata);
+ }).catch(function(err) {
+ delete inflight[tileID];
+ if (callback)
+ callback(err.message);
+ });
+ });
+ };
+ bing.terms_url = "https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details";
+ return bing;
+ };
+ rendererBackgroundSource.Esri = function(data) {
+ if (data.template.match(/blankTile/) === null) {
+ data.template = data.template + "?blankTile=false";
+ }
+ var esri = rendererBackgroundSource(data);
+ var cache = {};
+ var inflight = {};
+ var _prevCenter;
+ esri.fetchTilemap = function(center) {
+ if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5e3)
+ return;
+ _prevCenter = center;
+ var z = 20;
+ var dummyUrl = esri.url([1, 2, 3]);
+ var x = Math.floor((center[0] + 180) / 360 * Math.pow(2, z));
+ 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));
+ var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, "tilemap") + "/" + z + "/" + y + "/" + x + "/8/8";
+ json_default(tilemapUrl).then(function(tilemap) {
+ if (!tilemap) {
+ throw new Error("Unknown Error");
+ }
+ var hasTiles = true;
+ for (var i2 = 0; i2 < tilemap.data.length; i2++) {
+ if (!tilemap.data[i2]) {
+ hasTiles = false;
+ break;
+ }
+ }
+ esri.zoomExtent[1] = hasTiles ? 22 : 19;
+ }).catch(function() {
+ });
+ };
+ esri.getMetadata = function(center, tileCoord, callback) {
+ if (esri.id !== "EsriWorldImagery") {
+ return callback(null, {});
+ }
+ var tileID = tileCoord.slice(0, 3).join("/");
+ var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
+ var centerPoint = center[0] + "," + center[1];
+ var unknown = _t("info_panels.background.unknown");
+ var vintage = {};
+ var metadata = {};
+ if (inflight[tileID])
+ return;
+ var url = "https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/4/query";
+ url += "?returnGeometry=false&geometry=" + centerPoint + "&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json";
+ if (!cache[tileID]) {
+ cache[tileID] = {};
+ }
+ if (cache[tileID] && cache[tileID].metadata) {
+ return callback(null, cache[tileID].metadata);
+ }
+ inflight[tileID] = true;
+ json_default(url).then(function(result) {
+ delete inflight[tileID];
+ result = result.features.map((f2) => f2.attributes).filter((a) => a.MinMapLevel <= zoom && a.MaxMapLevel >= zoom)[0];
+ if (!result) {
+ throw new Error("Unknown Error");
+ } else if (result.features && result.features.length < 1) {
+ throw new Error("No Results");
+ } else if (result.error && result.error.message) {
+ throw new Error(result.error.message);
+ }
+ var captureDate = localeDateString(result.SRC_DATE2);
+ vintage = {
+ start: captureDate,
+ end: captureDate,
+ range: captureDate
+ };
+ metadata = {
+ vintage,
+ source: clean2(result.NICE_NAME),
+ description: clean2(result.NICE_DESC),
+ resolution: clean2(+parseFloat(result.SRC_RES).toFixed(4)),
+ accuracy: clean2(+parseFloat(result.SRC_ACC).toFixed(4))
+ };
+ if (isFinite(metadata.resolution)) {
+ metadata.resolution += " m";
+ }
+ if (isFinite(metadata.accuracy)) {
+ metadata.accuracy += " m";
+ }
+ cache[tileID].metadata = metadata;
+ if (callback)
+ callback(null, metadata);
+ }).catch(function(err) {
+ delete inflight[tileID];
+ if (callback)
+ callback(err.message);
+ });
+ function clean2(val) {
+ return String(val).trim() || unknown;
+ }
+ };
+ return esri;
+ };
+ rendererBackgroundSource.None = function() {
+ var source = rendererBackgroundSource({ id: "none", template: "" });
+ source.name = function() {
+ return _t("background.none");
+ };
+ source.label = function() {
+ return _t.html("background.none");
+ };
+ source.imageryUsed = function() {
+ return null;
+ };
+ source.area = function() {
+ return -1;
+ };
+ return source;
+ };
+ rendererBackgroundSource.Custom = function(template) {
+ var source = rendererBackgroundSource({ id: "custom", template });
+ source.name = function() {
+ return _t("background.custom");
+ };
+ source.label = function() {
+ return _t.html("background.custom");
+ };
+ source.imageryUsed = function() {
+ var cleaned = source.template();
+ if (cleaned.indexOf("?") !== -1) {
+ var parts = cleaned.split("?", 2);
+ var qs = utilStringQs(parts[1]);
+ ["access_token", "connectId", "token"].forEach(function(param) {
+ if (qs[param]) {
+ qs[param] = "{apikey}";
+ }
+ });
+ cleaned = parts[0] + "?" + utilQsString(qs, true);
+ }
+ cleaned = cleaned.replace(/token\/(\w+)/, "token/{apikey}").replace(/key=(\w+)/, "key={apikey}");
+ return "Custom (" + cleaned + " )";
+ };
+ source.area = function() {
+ return -2;
+ };
+ return source;
+ };
+
+ // modules/renderer/background.js
+ var import_which_polygon4 = __toESM(require_which_polygon());
+
+ // modules/renderer/tile_layer.js
+ function rendererTileLayer(context) {
+ var transformProp = utilPrefixCSSProperty("Transform");
+ var tiler8 = utilTiler();
+ var _tileSize = 256;
+ var _projection;
+ var _cache4 = {};
+ var _tileOrigin;
+ var _zoom;
+ var _source;
+ function tileSizeAtZoom(d, z) {
+ var EPSILON = 2e-3;
+ return _tileSize * Math.pow(2, z - d[2]) / _tileSize + EPSILON;
+ }
+ function atZoom(t, distance) {
+ var power = Math.pow(2, distance);
+ return [
+ Math.floor(t[0] * power),
+ Math.floor(t[1] * power),
+ t[2] + distance
+ ];
+ }
+ function lookUp(d) {
+ for (var up = -1; up > -d[2]; up--) {
+ var tile = atZoom(d, up);
+ if (_cache4[_source.url(tile)] !== false) {
+ return tile;
+ }
+ }
+ }
+ function uniqueBy(a, n2) {
+ var o = [];
+ var seen = {};
+ for (var i2 = 0; i2 < a.length; i2++) {
+ if (seen[a[i2][n2]] === void 0) {
+ o.push(a[i2]);
+ seen[a[i2][n2]] = true;
+ }
+ }
+ return o;
+ }
+ function addSource(d) {
+ d.push(_source.url(d));
+ return d;
+ }
+ function background(selection2) {
+ _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
+ var pixelOffset;
+ if (_source) {
+ pixelOffset = [
+ _source.offset()[0] * Math.pow(2, _zoom),
+ _source.offset()[1] * Math.pow(2, _zoom)
+ ];
+ } else {
+ pixelOffset = [0, 0];
+ }
+ var translate = [
+ _projection.translate()[0] + pixelOffset[0],
+ _projection.translate()[1] + pixelOffset[1]
+ ];
+ tiler8.scale(_projection.scale() * 2 * Math.PI).translate(translate);
+ _tileOrigin = [
+ _projection.scale() * Math.PI - translate[0],
+ _projection.scale() * Math.PI - translate[1]
+ ];
+ render(selection2);
+ }
+ function render(selection2) {
+ if (!_source)
+ return;
+ var requests = [];
+ var showDebug = context.getDebug("tile") && !_source.overlay;
+ if (_source.validZoom(_zoom)) {
+ tiler8.skipNullIsland(!!_source.overlay);
+ tiler8().forEach(function(d) {
+ addSource(d);
+ if (d[3] === "")
+ return;
+ if (typeof d[3] !== "string")
+ return;
+ requests.push(d);
+ if (_cache4[d[3]] === false && lookUp(d)) {
+ requests.push(addSource(lookUp(d)));
+ }
+ });
+ requests = uniqueBy(requests, 3).filter(function(r) {
+ return _cache4[r[3]] !== false;
+ });
+ }
+ function load(d3_event, d) {
+ _cache4[d[3]] = true;
+ select_default2(this).on("error", null).on("load", null).classed("tile-loaded", true);
+ render(selection2);
+ }
+ function error(d3_event, d) {
+ _cache4[d[3]] = false;
+ select_default2(this).on("error", null).on("load", null).remove();
+ render(selection2);
+ }
+ function imageTransform(d) {
+ var ts = _tileSize * Math.pow(2, _zoom - d[2]);
+ var scale = tileSizeAtZoom(d, _zoom);
+ return "translate(" + (d[0] * ts - _tileOrigin[0]) + "px," + (d[1] * ts - _tileOrigin[1]) + "px) scale(" + scale + "," + scale + ")";
+ }
+ function tileCenter(d) {
+ var ts = _tileSize * Math.pow(2, _zoom - d[2]);
+ return [
+ d[0] * ts - _tileOrigin[0] + ts / 2,
+ d[1] * ts - _tileOrigin[1] + ts / 2
+ ];
+ }
+ function debugTransform(d) {
+ var coord2 = tileCenter(d);
+ return "translate(" + coord2[0] + "px," + coord2[1] + "px)";
+ }
+ var dims = tiler8.size();
+ var mapCenter = [dims[0] / 2, dims[1] / 2];
+ var minDist = Math.max(dims[0], dims[1]);
+ var nearCenter;
+ requests.forEach(function(d) {
+ var c = tileCenter(d);
+ var dist = geoVecLength(c, mapCenter);
+ if (dist < minDist) {
+ minDist = dist;
+ nearCenter = d;
+ }
+ });
+ var image = selection2.selectAll("img").data(requests, function(d) {
+ return d[3];
+ });
+ image.exit().style(transformProp, imageTransform).classed("tile-removing", true).classed("tile-center", false).each(function() {
+ var tile = select_default2(this);
+ window.setTimeout(function() {
+ if (tile.classed("tile-removing")) {
+ tile.remove();
+ }
+ }, 300);
+ });
+ image.enter().append("img").attr("class", "tile").attr("alt", "").attr("draggable", "false").style("width", _tileSize + "px").style("height", _tileSize + "px").attr("src", function(d) {
+ return d[3];
+ }).on("error", error).on("load", load).merge(image).style(transformProp, imageTransform).classed("tile-debug", showDebug).classed("tile-removing", false).classed("tile-center", function(d) {
+ return d === nearCenter;
+ });
+ var debug2 = selection2.selectAll(".tile-label-debug").data(showDebug ? requests : [], function(d) {
+ return d[3];
+ });
+ debug2.exit().remove();
+ if (showDebug) {
+ var debugEnter = debug2.enter().append("div").attr("class", "tile-label-debug");
+ debugEnter.append("div").attr("class", "tile-label-debug-coord");
+ debugEnter.append("div").attr("class", "tile-label-debug-vintage");
+ debug2 = debug2.merge(debugEnter);
+ debug2.style(transformProp, debugTransform);
+ debug2.selectAll(".tile-label-debug-coord").text(function(d) {
+ return d[2] + " / " + d[0] + " / " + d[1];
+ });
+ debug2.selectAll(".tile-label-debug-vintage").each(function(d) {
+ var span = select_default2(this);
+ var center = context.projection.invert(tileCenter(d));
+ _source.getMetadata(center, d, function(err, result) {
+ if (result && result.vintage && result.vintage.range) {
+ span.text(result.vintage.range);
+ } else {
+ span.html(_t.html("info_panels.background.vintage") + ": " + _t.html("info_panels.background.unknown"));
+ }
+ });
+ });
+ }
+ }
+ background.projection = function(val) {
+ if (!arguments.length)
+ return _projection;
+ _projection = val;
+ return background;
+ };
+ background.dimensions = function(val) {
+ if (!arguments.length)
+ return tiler8.size();
+ tiler8.size(val);
+ return background;
+ };
+ background.source = function(val) {
+ if (!arguments.length)
+ return _source;
+ _source = val;
+ _tileSize = _source.tileSize;
+ _cache4 = {};
+ tiler8.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
+ return background;
+ };
+ return background;
+ }
+
+ // modules/renderer/background.js
+ var _imageryIndex = null;
+ function rendererBackground(context) {
+ const dispatch10 = dispatch_default("change");
+ const baseLayer = rendererTileLayer(context).projection(context.projection);
+ let _checkedBlocklists = [];
+ let _isValid = true;
+ let _overlayLayers = [];
+ let _brightness = 1;
+ let _contrast = 1;
+ let _saturation = 1;
+ let _sharpness = 1;
+ function ensureImageryIndex() {
+ return _mainFileFetcher.get("imagery").then((sources) => {
+ if (_imageryIndex)
+ return _imageryIndex;
+ _imageryIndex = {
+ imagery: sources,
+ features: {}
+ };
+ const features2 = sources.map((source) => {
+ if (!source.polygon)
+ return null;
+ const rings = source.polygon.map((ring) => [ring]);
+ const feature3 = {
+ type: "Feature",
+ properties: { id: source.id },
+ geometry: { type: "MultiPolygon", coordinates: rings }
+ };
+ _imageryIndex.features[source.id] = feature3;
+ return feature3;
+ }).filter(Boolean);
+ _imageryIndex.query = (0, import_which_polygon4.default)({ type: "FeatureCollection", features: features2 });
+ _imageryIndex.backgrounds = sources.map((source) => {
+ if (source.type === "bing") {
+ return rendererBackgroundSource.Bing(source, dispatch10);
+ } else if (/^EsriWorldImagery/.test(source.id)) {
+ return rendererBackgroundSource.Esri(source);
+ } else {
+ return rendererBackgroundSource(source);
+ }
+ });
+ _imageryIndex.backgrounds.unshift(rendererBackgroundSource.None());
+ let template = corePreferences("background-custom-template") || "";
+ const custom = rendererBackgroundSource.Custom(template);
+ _imageryIndex.backgrounds.unshift(custom);
+ return _imageryIndex;
+ });
+ }
+ function background(selection2) {
+ const currSource = baseLayer.source();
+ if (context.map().zoom() > 18) {
+ if (currSource && /^EsriWorldImagery/.test(currSource.id)) {
+ const center = context.map().center();
+ currSource.fetchTilemap(center);
+ }
+ }
+ const sources = background.sources(context.map().extent());
+ const wasValid = _isValid;
+ _isValid = !!sources.filter((d) => d === currSource).length;
+ if (wasValid !== _isValid) {
+ background.updateImagery();
+ }
+ let baseFilter = "";
+ if (_brightness !== 1) {
+ baseFilter += ` brightness(${_brightness})`;
+ }
+ if (_contrast !== 1) {
+ baseFilter += ` contrast(${_contrast})`;
+ }
+ if (_saturation !== 1) {
+ baseFilter += ` saturate(${_saturation})`;
+ }
+ if (_sharpness < 1) {
+ const blur = number_default(0.5, 5)(1 - _sharpness);
+ baseFilter += ` blur(${blur}px)`;
+ }
+ let base = selection2.selectAll(".layer-background").data([0]);
+ base = base.enter().insert("div", ".layer-data").attr("class", "layer layer-background").merge(base);
+ base.style("filter", baseFilter || null);
+ let imagery = base.selectAll(".layer-imagery").data([0]);
+ imagery.enter().append("div").attr("class", "layer layer-imagery").merge(imagery).call(baseLayer);
+ let maskFilter = "";
+ let mixBlendMode = "";
+ if (_sharpness > 1) {
+ mixBlendMode = "overlay";
+ maskFilter = "saturate(0) blur(3px) invert(1)";
+ let contrast = _sharpness - 1;
+ maskFilter += ` contrast(${contrast})`;
+ let brightness = number_default(1, 0.85)(_sharpness - 1);
+ maskFilter += ` brightness(${brightness})`;
+ }
+ let mask = base.selectAll(".layer-unsharp-mask").data(_sharpness > 1 ? [0] : []);
+ mask.exit().remove();
+ mask.enter().append("div").attr("class", "layer layer-mask layer-unsharp-mask").merge(mask).call(baseLayer).style("filter", maskFilter || null).style("mix-blend-mode", mixBlendMode || null);
+ let overlays = selection2.selectAll(".layer-overlay").data(_overlayLayers, (d) => d.source().name());
+ overlays.exit().remove();
+ overlays.enter().insert("div", ".layer-data").attr("class", "layer layer-overlay").merge(overlays).each((layer, i2, nodes) => select_default2(nodes[i2]).call(layer));
+ }
+ background.updateImagery = function() {
+ let currSource = baseLayer.source();
+ if (context.inIntro() || !currSource)
+ return;
+ let o = _overlayLayers.filter((d) => !d.source().isLocatorOverlay() && !d.source().isHidden()).map((d) => d.source().id).join(",");
+ const meters = geoOffsetToMeters(currSource.offset());
+ const EPSILON = 0.01;
+ const x = +meters[0].toFixed(2);
+ const y = +meters[1].toFixed(2);
+ let hash = utilStringQs(window.location.hash);
+ let id2 = currSource.id;
+ if (id2 === "custom") {
+ id2 = `custom:${currSource.template()}`;
+ }
+ if (id2) {
+ hash.background = id2;
+ } else {
+ delete hash.background;
+ }
+ if (o) {
+ hash.overlays = o;
+ } else {
+ delete hash.overlays;
+ }
+ if (Math.abs(x) > EPSILON || Math.abs(y) > EPSILON) {
+ hash.offset = `${x},${y}`;
+ } else {
+ delete hash.offset;
+ }
+ if (!window.mocha) {
+ window.location.replace("#" + utilQsString(hash, true));
+ }
+ let imageryUsed = [];
+ let photoOverlaysUsed = [];
+ const currUsed = currSource.imageryUsed();
+ if (currUsed && _isValid) {
+ imageryUsed.push(currUsed);
+ }
+ _overlayLayers.filter((d) => !d.source().isLocatorOverlay() && !d.source().isHidden()).forEach((d) => imageryUsed.push(d.source().imageryUsed()));
+ const dataLayer = context.layers().layer("data");
+ if (dataLayer && dataLayer.enabled() && dataLayer.hasData()) {
+ imageryUsed.push(dataLayer.getSrc());
+ }
+ const photoOverlayLayers = {
+ streetside: "Bing Streetside",
+ mapillary: "Mapillary Images",
+ "mapillary-map-features": "Mapillary Map Features",
+ "mapillary-signs": "Mapillary Signs",
+ kartaview: "KartaView Images"
+ };
+ for (let layerID in photoOverlayLayers) {
+ const layer = context.layers().layer(layerID);
+ if (layer && layer.enabled()) {
+ photoOverlaysUsed.push(layerID);
+ imageryUsed.push(photoOverlayLayers[layerID]);
+ }
+ }
+ context.history().imageryUsed(imageryUsed);
+ context.history().photoOverlaysUsed(photoOverlaysUsed);
+ };
+ background.sources = (extent, zoom, includeCurrent) => {
+ if (!_imageryIndex)
+ return [];
+ let visible = {};
+ (_imageryIndex.query.bbox(extent.rectangle(), true) || []).forEach((d) => visible[d.id] = true);
+ const currSource = baseLayer.source();
+ const osm = context.connection();
+ const blocklists = osm && osm.imageryBlocklists() || [];
+ const blocklistChanged = blocklists.length !== _checkedBlocklists.length || blocklists.some((regex, index) => String(regex) !== _checkedBlocklists[index]);
+ if (blocklistChanged) {
+ _imageryIndex.backgrounds.forEach((source) => {
+ source.isBlocked = blocklists.some((regex) => regex.test(source.template()));
+ });
+ _checkedBlocklists = blocklists.map((regex) => String(regex));
+ }
+ return _imageryIndex.backgrounds.filter((source) => {
+ if (includeCurrent && currSource === source)
+ return true;
+ if (source.isBlocked)
+ return false;
+ if (!source.polygon)
+ return true;
+ if (zoom && zoom < 6)
+ return false;
+ return visible[source.id];
+ });
+ };
+ background.dimensions = (val) => {
+ if (!val)
+ return;
+ baseLayer.dimensions(val);
+ _overlayLayers.forEach((layer) => layer.dimensions(val));
+ };
+ background.baseLayerSource = function(d) {
+ if (!arguments.length)
+ return baseLayer.source();
+ const osm = context.connection();
+ if (!osm)
+ return background;
+ const blocklists = osm.imageryBlocklists();
+ const template = d.template();
+ let fail = false;
+ let tested = 0;
+ let regex;
+ for (let i2 = 0; i2 < blocklists.length; i2++) {
+ regex = blocklists[i2];
+ fail = regex.test(template);
+ tested++;
+ if (fail)
+ break;
+ }
+ if (!tested) {
+ regex = /.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/;
+ fail = regex.test(template);
+ }
+ baseLayer.source(!fail ? d : background.findSource("none"));
+ dispatch10.call("change");
+ background.updateImagery();
+ return background;
+ };
+ background.findSource = (id2) => {
+ if (!id2 || !_imageryIndex)
+ return null;
+ return _imageryIndex.backgrounds.find((d) => d.id && d.id === id2);
+ };
+ background.bing = () => {
+ background.baseLayerSource(background.findSource("Bing"));
+ };
+ background.showsLayer = (d) => {
+ const currSource = baseLayer.source();
+ if (!d || !currSource)
+ return false;
+ return d.id === currSource.id || _overlayLayers.some((layer) => d.id === layer.source().id);
+ };
+ background.overlayLayerSources = () => {
+ return _overlayLayers.map((layer) => layer.source());
+ };
+ background.toggleOverlayLayer = (d) => {
+ let layer;
+ for (let i2 = 0; i2 < _overlayLayers.length; i2++) {
+ layer = _overlayLayers[i2];
+ if (layer.source() === d) {
+ _overlayLayers.splice(i2, 1);
+ dispatch10.call("change");
+ background.updateImagery();
+ return;
+ }
+ }
+ layer = rendererTileLayer(context).source(d).projection(context.projection).dimensions(baseLayer.dimensions());
+ _overlayLayers.push(layer);
+ dispatch10.call("change");
+ background.updateImagery();
+ };
+ background.nudge = (d, zoom) => {
+ const currSource = baseLayer.source();
+ if (currSource) {
+ currSource.nudge(d, zoom);
+ dispatch10.call("change");
+ background.updateImagery();
+ }
+ return background;
+ };
+ background.offset = function(d) {
+ const currSource = baseLayer.source();
+ if (!arguments.length) {
+ return currSource && currSource.offset() || [0, 0];
+ }
+ if (currSource) {
+ currSource.offset(d);
+ dispatch10.call("change");
+ background.updateImagery();
+ }
+ return background;
+ };
+ background.brightness = function(d) {
+ if (!arguments.length)
+ return _brightness;
+ _brightness = d;
+ if (context.mode())
+ dispatch10.call("change");
+ return background;
+ };
+ background.contrast = function(d) {
+ if (!arguments.length)
+ return _contrast;
+ _contrast = d;
+ if (context.mode())
+ dispatch10.call("change");
+ return background;
+ };
+ background.saturation = function(d) {
+ if (!arguments.length)
+ return _saturation;
+ _saturation = d;
+ if (context.mode())
+ dispatch10.call("change");
+ return background;
+ };
+ background.sharpness = function(d) {
+ if (!arguments.length)
+ return _sharpness;
+ _sharpness = d;
+ if (context.mode())
+ dispatch10.call("change");
+ return background;
+ };
+ let _loadPromise;
+ background.ensureLoaded = () => {
+ if (_loadPromise)
+ return _loadPromise;
+ function parseMapParams(qmap) {
+ if (!qmap)
+ return false;
+ const params = qmap.split("/").map(Number);
+ if (params.length < 3 || params.some(isNaN))
+ return false;
+ return geoExtent([params[2], params[1]]);
+ }
+ const hash = utilStringQs(window.location.hash);
+ const requested = hash.background || hash.layer;
+ let extent = parseMapParams(hash.map);
+ return _loadPromise = ensureImageryIndex().then((imageryIndex) => {
+ const first = imageryIndex.backgrounds.length && imageryIndex.backgrounds[0];
+ let best;
+ if (!requested && extent) {
+ best = background.sources(extent).find((s) => s.best());
+ }
+ if (requested && requested.indexOf("custom:") === 0) {
+ const template = requested.replace(/^custom:/, "");
+ const custom = background.findSource("custom");
+ background.baseLayerSource(custom.template(template));
+ corePreferences("background-custom-template", template);
+ } else {
+ background.baseLayerSource(background.findSource(requested) || best || background.findSource(corePreferences("background-last-used")) || background.findSource("Bing") || first || background.findSource("none"));
+ }
+ const locator = imageryIndex.backgrounds.find((d) => d.overlay && d.default);
+ if (locator) {
+ background.toggleOverlayLayer(locator);
+ }
+ const overlays = (hash.overlays || "").split(",");
+ overlays.forEach((overlay) => {
+ overlay = background.findSource(overlay);
+ if (overlay) {
+ background.toggleOverlayLayer(overlay);
+ }
+ });
+ if (hash.gpx) {
+ const gpx2 = context.layers().layer("data");
+ if (gpx2) {
+ gpx2.url(hash.gpx, ".gpx");
+ }
+ }
+ if (hash.offset) {
+ const offset = hash.offset.replace(/;/g, ",").split(",").map((n2) => !isNaN(n2) && n2);
+ if (offset.length === 2) {
+ background.offset(geoMetersToOffset(offset));
+ }
+ }
+ }).catch(() => {
+ });
+ };
+ return utilRebind(background, dispatch10, "on");
+ }
+
+ // modules/renderer/features.js
+ function rendererFeatures(context) {
+ var dispatch10 = dispatch_default("change", "redraw");
+ var features2 = utilRebind({}, dispatch10, "on");
+ var _deferred2 = /* @__PURE__ */ new Set();
+ var traffic_roads = {
+ "motorway": true,
+ "motorway_link": true,
+ "trunk": true,
+ "trunk_link": true,
+ "primary": true,
+ "primary_link": true,
+ "secondary": true,
+ "secondary_link": true,
+ "tertiary": true,
+ "tertiary_link": true,
+ "residential": true,
+ "unclassified": true,
+ "living_street": true
+ };
+ var service_roads = {
+ "service": true,
+ "road": true,
+ "track": true
+ };
+ var paths = {
+ "path": true,
+ "footway": true,
+ "cycleway": true,
+ "bridleway": true,
+ "steps": true,
+ "pedestrian": true
+ };
+ var past_futures = {
+ "proposed": true,
+ "construction": true,
+ "abandoned": true,
+ "dismantled": true,
+ "disused": true,
+ "razed": true,
+ "demolished": true,
+ "obliterated": true
+ };
+ var _cullFactor = 1;
+ var _cache4 = {};
+ var _rules = {};
+ var _stats = {};
+ var _keys = [];
+ var _hidden = [];
+ var _forceVisible = {};
+ function update() {
+ if (!window.mocha) {
+ var hash = utilStringQs(window.location.hash);
+ var disabled = features2.disabled();
+ if (disabled.length) {
+ hash.disable_features = disabled.join(",");
+ } else {
+ delete hash.disable_features;
+ }
+ window.location.replace("#" + utilQsString(hash, true));
+ corePreferences("disabled-features", disabled.join(","));
+ }
+ _hidden = features2.hidden();
+ dispatch10.call("change");
+ dispatch10.call("redraw");
+ }
+ function defineRule(k, filter2, max3) {
+ var isEnabled = true;
+ _keys.push(k);
+ _rules[k] = {
+ filter: filter2,
+ enabled: isEnabled,
+ count: 0,
+ currentMax: max3 || Infinity,
+ defaultMax: max3 || Infinity,
+ enable: function() {
+ this.enabled = true;
+ this.currentMax = this.defaultMax;
+ },
+ disable: function() {
+ this.enabled = false;
+ this.currentMax = 0;
+ },
+ hidden: function() {
+ return this.count === 0 && !this.enabled || this.count > this.currentMax * _cullFactor;
+ },
+ autoHidden: function() {
+ return this.hidden() && this.currentMax > 0;
+ }
+ };
+ }
+ defineRule("points", function isPoint(tags, geometry) {
+ return geometry === "point";
+ }, 200);
+ defineRule("traffic_roads", function isTrafficRoad(tags) {
+ return traffic_roads[tags.highway];
+ });
+ defineRule("service_roads", function isServiceRoad(tags) {
+ return service_roads[tags.highway];
+ });
+ defineRule("paths", function isPath(tags) {
+ return paths[tags.highway];
+ });
+ defineRule("buildings", function isBuilding(tags) {
+ return !!tags.building && tags.building !== "no" || tags.parking === "multi-storey" || tags.parking === "sheds" || tags.parking === "carports" || tags.parking === "garage_boxes";
+ }, 250);
+ defineRule("building_parts", function isBuildingPart(tags) {
+ return tags["building:part"];
+ });
+ defineRule("indoor", function isIndoor(tags) {
+ return tags.indoor;
+ });
+ defineRule("landuse", function isLanduse(tags, geometry) {
+ return geometry === "area" && !_rules.buildings.filter(tags) && !_rules.building_parts.filter(tags) && !_rules.indoor.filter(tags) && !_rules.water.filter(tags) && !_rules.pistes.filter(tags);
+ });
+ defineRule("boundaries", function isBoundary(tags) {
+ return !!tags.boundary && !(traffic_roads[tags.highway] || service_roads[tags.highway] || paths[tags.highway] || tags.waterway || tags.railway || tags.landuse || tags.natural || tags.building || tags.power);
+ });
+ defineRule("water", function isWater(tags) {
+ return !!tags.waterway || tags.natural === "water" || tags.natural === "coastline" || tags.natural === "bay" || tags.landuse === "pond" || tags.landuse === "basin" || tags.landuse === "reservoir" || tags.landuse === "salt_pond";
+ });
+ defineRule("rail", function isRail(tags) {
+ return (!!tags.railway || tags.landuse === "railway") && !(traffic_roads[tags.highway] || service_roads[tags.highway] || paths[tags.highway]);
+ });
+ defineRule("pistes", function isPiste(tags) {
+ return tags["piste:type"];
+ });
+ defineRule("aerialways", function isPiste(tags) {
+ return tags.aerialway && tags.aerialway !== "yes" && tags.aerialway !== "station";
+ });
+ defineRule("power", function isPower(tags) {
+ return !!tags.power;
+ });
+ defineRule("past_future", function isPastFuture(tags) {
+ if (traffic_roads[tags.highway] || service_roads[tags.highway] || paths[tags.highway]) {
+ return false;
+ }
+ var strings = Object.keys(tags);
+ for (var i2 = 0; i2 < strings.length; i2++) {
+ var s = strings[i2];
+ if (past_futures[s] || past_futures[tags[s]]) {
+ return true;
+ }
+ }
+ return false;
+ });
+ defineRule("others", function isOther(tags, geometry) {
+ return geometry === "line" || geometry === "area";
+ });
+ features2.features = function() {
+ return _rules;
+ };
+ features2.keys = function() {
+ return _keys;
+ };
+ features2.enabled = function(k) {
+ if (!arguments.length) {
+ return _keys.filter(function(k2) {
+ return _rules[k2].enabled;
+ });
+ }
+ return _rules[k] && _rules[k].enabled;
+ };
+ features2.disabled = function(k) {
+ if (!arguments.length) {
+ return _keys.filter(function(k2) {
+ return !_rules[k2].enabled;
+ });
+ }
+ return _rules[k] && !_rules[k].enabled;
+ };
+ features2.hidden = function(k) {
+ if (!arguments.length) {
+ return _keys.filter(function(k2) {
+ return _rules[k2].hidden();
+ });
+ }
+ return _rules[k] && _rules[k].hidden();
+ };
+ features2.autoHidden = function(k) {
+ if (!arguments.length) {
+ return _keys.filter(function(k2) {
+ return _rules[k2].autoHidden();
+ });
+ }
+ return _rules[k] && _rules[k].autoHidden();
+ };
+ features2.enable = function(k) {
+ if (_rules[k] && !_rules[k].enabled) {
+ _rules[k].enable();
+ update();
+ }
+ };
+ features2.enableAll = function() {
+ var didEnable = false;
+ for (var k in _rules) {
+ if (!_rules[k].enabled) {
+ didEnable = true;
+ _rules[k].enable();
+ }
+ }
+ if (didEnable)
+ update();
+ };
+ features2.disable = function(k) {
+ if (_rules[k] && _rules[k].enabled) {
+ _rules[k].disable();
+ update();
+ }
+ };
+ features2.disableAll = function() {
+ var didDisable = false;
+ for (var k in _rules) {
+ if (_rules[k].enabled) {
+ didDisable = true;
+ _rules[k].disable();
+ }
+ }
+ if (didDisable)
+ update();
+ };
+ features2.toggle = function(k) {
+ if (_rules[k]) {
+ (function(f2) {
+ return f2.enabled ? f2.disable() : f2.enable();
+ })(_rules[k]);
+ update();
+ }
+ };
+ features2.resetStats = function() {
+ for (var i2 = 0; i2 < _keys.length; i2++) {
+ _rules[_keys[i2]].count = 0;
+ }
+ dispatch10.call("change");
+ };
+ features2.gatherStats = function(d, resolver, dimensions) {
+ var needsRedraw = false;
+ var types = utilArrayGroupBy(d, "type");
+ var entities = [].concat(types.relation || [], types.way || [], types.node || []);
+ var currHidden, geometry, matches, i2, j2;
+ for (i2 = 0; i2 < _keys.length; i2++) {
+ _rules[_keys[i2]].count = 0;
+ }
+ _cullFactor = dimensions[0] * dimensions[1] / 1e6;
+ for (i2 = 0; i2 < entities.length; i2++) {
+ geometry = entities[i2].geometry(resolver);
+ matches = Object.keys(features2.getMatches(entities[i2], resolver, geometry));
+ for (j2 = 0; j2 < matches.length; j2++) {
+ _rules[matches[j2]].count++;
+ }
+ }
+ currHidden = features2.hidden();
+ if (currHidden !== _hidden) {
+ _hidden = currHidden;
+ needsRedraw = true;
+ dispatch10.call("change");
+ }
+ return needsRedraw;
+ };
+ features2.stats = function() {
+ for (var i2 = 0; i2 < _keys.length; i2++) {
+ _stats[_keys[i2]] = _rules[_keys[i2]].count;
+ }
+ return _stats;
+ };
+ features2.clear = function(d) {
+ for (var i2 = 0; i2 < d.length; i2++) {
+ features2.clearEntity(d[i2]);
+ }
+ };
+ features2.clearEntity = function(entity) {
+ delete _cache4[osmEntity.key(entity)];
+ };
+ features2.reset = function() {
+ Array.from(_deferred2).forEach(function(handle) {
+ window.cancelIdleCallback(handle);
+ _deferred2.delete(handle);
+ });
+ _cache4 = {};
+ };
+ function relationShouldBeChecked(relation) {
+ return relation.tags.type === "boundary";
+ }
+ features2.getMatches = function(entity, resolver, geometry) {
+ if (geometry === "vertex" || geometry === "relation" && !relationShouldBeChecked(entity))
+ return {};
+ var ent = osmEntity.key(entity);
+ if (!_cache4[ent]) {
+ _cache4[ent] = {};
+ }
+ if (!_cache4[ent].matches) {
+ var matches = {};
+ var hasMatch = false;
+ for (var i2 = 0; i2 < _keys.length; i2++) {
+ if (_keys[i2] === "others") {
+ if (hasMatch)
+ continue;
+ if (entity.type === "way") {
+ var parents = features2.getParents(entity, resolver, geometry);
+ if (parents.length === 1 && parents[0].isMultipolygon() || parents.length > 0 && parents.every(function(parent) {
+ return parent.tags.type === "boundary";
+ })) {
+ var pkey = osmEntity.key(parents[0]);
+ if (_cache4[pkey] && _cache4[pkey].matches) {
+ matches = Object.assign({}, _cache4[pkey].matches);
+ continue;
+ }
+ }
+ }
+ }
+ if (_rules[_keys[i2]].filter(entity.tags, geometry)) {
+ matches[_keys[i2]] = hasMatch = true;
+ }
+ }
+ _cache4[ent].matches = matches;
+ }
+ return _cache4[ent].matches;
+ };
+ features2.getParents = function(entity, resolver, geometry) {
+ if (geometry === "point")
+ return [];
+ var ent = osmEntity.key(entity);
+ if (!_cache4[ent]) {
+ _cache4[ent] = {};
+ }
+ if (!_cache4[ent].parents) {
+ var parents = [];
+ if (geometry === "vertex") {
+ parents = resolver.parentWays(entity);
+ } else {
+ parents = resolver.parentRelations(entity);
+ }
+ _cache4[ent].parents = parents;
+ }
+ return _cache4[ent].parents;
+ };
+ features2.isHiddenPreset = function(preset, geometry) {
+ if (!_hidden.length)
+ return false;
+ if (!preset.tags)
+ return false;
+ var test = preset.setTags({}, geometry);
+ for (var key in _rules) {
+ if (_rules[key].filter(test, geometry)) {
+ if (_hidden.indexOf(key) !== -1) {
+ return key;
+ }
+ return false;
+ }
+ }
+ return false;
+ };
+ features2.isHiddenFeature = function(entity, resolver, geometry) {
+ if (!_hidden.length)
+ return false;
+ if (!entity.version)
+ return false;
+ if (_forceVisible[entity.id])
+ return false;
+ var matches = Object.keys(features2.getMatches(entity, resolver, geometry));
+ return matches.length && matches.every(function(k) {
+ return features2.hidden(k);
+ });
+ };
+ features2.isHiddenChild = function(entity, resolver, geometry) {
+ if (!_hidden.length)
+ return false;
+ if (!entity.version || geometry === "point")
+ return false;
+ if (_forceVisible[entity.id])
+ return false;
+ var parents = features2.getParents(entity, resolver, geometry);
+ if (!parents.length)
+ return false;
+ for (var i2 = 0; i2 < parents.length; i2++) {
+ if (!features2.isHidden(parents[i2], resolver, parents[i2].geometry(resolver))) {
+ return false;
+ }
+ }
+ return true;
+ };
+ features2.hasHiddenConnections = function(entity, resolver) {
+ if (!_hidden.length)
+ return false;
+ var childNodes, connections;
+ if (entity.type === "midpoint") {
+ childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
+ connections = [];
+ } else {
+ childNodes = entity.nodes ? resolver.childNodes(entity) : [];
+ connections = features2.getParents(entity, resolver, entity.geometry(resolver));
+ }
+ connections = childNodes.reduce(function(result, e) {
+ return resolver.isShared(e) ? utilArrayUnion(result, resolver.parentWays(e)) : result;
+ }, connections);
+ return connections.some(function(e) {
+ return features2.isHidden(e, resolver, e.geometry(resolver));
+ });
+ };
+ features2.isHidden = function(entity, resolver, geometry) {
+ if (!_hidden.length)
+ return false;
+ if (!entity.version)
+ return false;
+ var fn = geometry === "vertex" ? features2.isHiddenChild : features2.isHiddenFeature;
+ return fn(entity, resolver, geometry);
+ };
+ features2.filter = function(d, resolver) {
+ if (!_hidden.length)
+ return d;
+ var result = [];
+ for (var i2 = 0; i2 < d.length; i2++) {
+ var entity = d[i2];
+ if (!features2.isHidden(entity, resolver, entity.geometry(resolver))) {
+ result.push(entity);
+ }
+ }
+ return result;
+ };
+ features2.forceVisible = function(entityIDs) {
+ if (!arguments.length)
+ return Object.keys(_forceVisible);
+ _forceVisible = {};
+ for (var i2 = 0; i2 < entityIDs.length; i2++) {
+ _forceVisible[entityIDs[i2]] = true;
+ var entity = context.hasEntity(entityIDs[i2]);
+ if (entity && entity.type === "relation") {
+ for (var j2 in entity.members) {
+ _forceVisible[entity.members[j2].id] = true;
+ }
+ }
+ }
+ return features2;
+ };
+ features2.init = function() {
+ var storage = corePreferences("disabled-features");
+ if (storage) {
+ var storageDisabled = storage.replace(/;/g, ",").split(",");
+ storageDisabled.forEach(features2.disable);
+ }
+ var hash = utilStringQs(window.location.hash);
+ if (hash.disable_features) {
+ var hashDisabled = hash.disable_features.replace(/;/g, ",").split(",");
+ hashDisabled.forEach(features2.disable);
+ }
+ };
+ context.history().on("merge.features", function(newEntities) {
+ if (!newEntities)
+ return;
+ var handle = window.requestIdleCallback(function() {
+ var graph = context.graph();
+ var types = utilArrayGroupBy(newEntities, "type");
+ var entities = [].concat(types.relation || [], types.way || [], types.node || []);
+ for (var i2 = 0; i2 < entities.length; i2++) {
+ var geometry = entities[i2].geometry(graph);
+ features2.getMatches(entities[i2], graph, geometry);
+ }
+ });
+ _deferred2.add(handle);
+ });
+ return features2;
+ }
+
+ // modules/svg/areas.js
+ var import_fast_deep_equal5 = __toESM(require_fast_deep_equal());
+
+ // modules/svg/helpers.js
+ function svgPassiveVertex(node, graph, activeID) {
+ if (!activeID)
+ return 1;
+ if (activeID === node.id)
+ return 0;
+ var parents = graph.parentWays(node);
+ var i2, j2, nodes, isClosed, ix1, ix2, ix3, ix4, max3;
+ for (i2 = 0; i2 < parents.length; i2++) {
+ nodes = parents[i2].nodes;
+ isClosed = parents[i2].isClosed();
+ for (j2 = 0; j2 < nodes.length; j2++) {
+ if (nodes[j2] === node.id) {
+ ix1 = j2 - 2;
+ ix2 = j2 - 1;
+ ix3 = j2 + 1;
+ ix4 = j2 + 2;
+ if (isClosed) {
+ max3 = nodes.length - 1;
+ if (ix1 < 0)
+ ix1 = max3 + ix1;
+ if (ix2 < 0)
+ ix2 = max3 + ix2;
+ if (ix3 > max3)
+ ix3 = ix3 - max3;
+ if (ix4 > max3)
+ ix4 = ix4 - max3;
+ }
+ if (nodes[ix1] === activeID)
+ return 0;
+ else if (nodes[ix2] === activeID)
+ return 2;
+ else if (nodes[ix3] === activeID)
+ return 2;
+ else if (nodes[ix4] === activeID)
+ return 0;
+ else if (isClosed && nodes.indexOf(activeID) !== -1)
+ return 0;
+ }
+ }
+ }
+ return 1;
+ }
+ function svgMarkerSegments(projection2, graph, dt, shouldReverse, bothDirections) {
+ return function(entity) {
+ var i2 = 0;
+ var offset = dt;
+ var segments = [];
+ var clip = identity_default2().clipExtent(projection2.clipExtent()).stream;
+ var coordinates = graph.childNodes(entity).map(function(n2) {
+ return n2.loc;
+ });
+ var a, b;
+ if (shouldReverse(entity)) {
+ coordinates.reverse();
+ }
+ stream_default({
+ type: "LineString",
+ coordinates
+ }, projection2.stream(clip({
+ lineStart: function() {
+ },
+ lineEnd: function() {
+ a = null;
+ },
+ point: function(x, y) {
+ b = [x, y];
+ if (a) {
+ var span = geoVecLength(a, b) - offset;
+ if (span >= 0) {
+ var heading = geoVecAngle(a, b);
+ var dx = dt * Math.cos(heading);
+ var dy = dt * Math.sin(heading);
+ var p = [
+ a[0] + offset * Math.cos(heading),
+ a[1] + offset * Math.sin(heading)
+ ];
+ var coord2 = [a, p];
+ for (span -= dt; span >= 0; span -= dt) {
+ p = geoVecAdd(p, [dx, dy]);
+ coord2.push(p);
+ }
+ coord2.push(b);
+ var segment = "";
+ var j2;
+ for (j2 = 0; j2 < coord2.length; j2++) {
+ segment += (j2 === 0 ? "M" : "L") + coord2[j2][0] + "," + coord2[j2][1];
+ }
+ segments.push({ id: entity.id, index: i2++, d: segment });
+ if (bothDirections(entity)) {
+ segment = "";
+ for (j2 = coord2.length - 1; j2 >= 0; j2--) {
+ segment += (j2 === coord2.length - 1 ? "M" : "L") + coord2[j2][0] + "," + coord2[j2][1];
+ }
+ segments.push({ id: entity.id, index: i2++, d: segment });
+ }
+ }
+ offset = -span;
+ }
+ a = b;
+ }
+ })));
+ return segments;
+ };
+ }
+ function svgPath(projection2, graph, isArea) {
+ var cache = {};
+ var padding = isArea ? 65 : 5;
+ var viewport = projection2.clipExtent();
+ var paddedExtent = [
+ [viewport[0][0] - padding, viewport[0][1] - padding],
+ [viewport[1][0] + padding, viewport[1][1] + padding]
+ ];
+ var clip = identity_default2().clipExtent(paddedExtent).stream;
+ var project = projection2.stream;
+ var path = path_default().projection({ stream: function(output) {
+ return project(clip(output));
+ } });
+ var svgpath = function(entity) {
+ if (entity.id in cache) {
+ return cache[entity.id];
+ } else {
+ return cache[entity.id] = path(entity.asGeoJSON(graph));
+ }
+ };
+ svgpath.geojson = function(d) {
+ if (d.__featurehash__ !== void 0) {
+ if (d.__featurehash__ in cache) {
+ return cache[d.__featurehash__];
+ } else {
+ return cache[d.__featurehash__] = path(d);
+ }
+ } else {
+ return path(d);
+ }
+ };
+ return svgpath;
+ }
+ function svgPointTransform(projection2) {
+ var svgpoint = function(entity) {
+ var pt = projection2(entity.loc);
+ return "translate(" + pt[0] + "," + pt[1] + ")";
+ };
+ svgpoint.geojson = function(d) {
+ return svgpoint(d.properties.entity);
+ };
+ return svgpoint;
+ }
+ function svgRelationMemberTags(graph) {
+ return function(entity) {
+ var tags = entity.tags;
+ var shouldCopyMultipolygonTags = !entity.hasInterestingTags();
+ graph.parentRelations(entity).forEach(function(relation) {
+ var type3 = relation.tags.type;
+ if (type3 === "multipolygon" && shouldCopyMultipolygonTags || type3 === "boundary") {
+ tags = Object.assign({}, relation.tags, tags);
+ }
+ });
+ return tags;
+ };
+ }
+ function svgSegmentWay(way, graph, activeID) {
+ if (activeID === void 0) {
+ return graph.transient(way, "waySegments", getWaySegments);
+ } else {
+ return getWaySegments();
+ }
+ function getWaySegments() {
+ var isActiveWay = way.nodes.indexOf(activeID) !== -1;
+ var features2 = { passive: [], active: [] };
+ var start2 = {};
+ var end = {};
+ var node, type3;
+ for (var i2 = 0; i2 < way.nodes.length; i2++) {
+ node = graph.entity(way.nodes[i2]);
+ type3 = svgPassiveVertex(node, graph, activeID);
+ end = { node, type: type3 };
+ if (start2.type !== void 0) {
+ if (start2.node.id === activeID || end.node.id === activeID) {
+ } else if (isActiveWay && (start2.type === 2 || end.type === 2)) {
+ pushActive(start2, end, i2);
+ } else if (start2.type === 0 && end.type === 0) {
+ pushActive(start2, end, i2);
+ } else {
+ pushPassive(start2, end, i2);
+ }
+ }
+ start2 = end;
+ }
+ return features2;
+ function pushActive(start3, end2, index) {
+ features2.active.push({
+ type: "Feature",
+ id: way.id + "-" + index + "-nope",
+ properties: {
+ nope: true,
+ target: true,
+ entity: way,
+ nodes: [start3.node, end2.node],
+ index
+ },
+ geometry: {
+ type: "LineString",
+ coordinates: [start3.node.loc, end2.node.loc]
+ }
+ });
+ }
+ function pushPassive(start3, end2, index) {
+ features2.passive.push({
+ type: "Feature",
+ id: way.id + "-" + index,
+ properties: {
+ target: true,
+ entity: way,
+ nodes: [start3.node, end2.node],
+ index
+ },
+ geometry: {
+ type: "LineString",
+ coordinates: [start3.node.loc, end2.node.loc]
+ }
+ });
+ }
+ }
+ }
+
+ // modules/svg/tag_classes.js
+ function svgTagClasses() {
+ var primaries = [
+ "building",
+ "highway",
+ "railway",
+ "waterway",
+ "aeroway",
+ "aerialway",
+ "piste:type",
+ "boundary",
+ "power",
+ "amenity",
+ "natural",
+ "landuse",
+ "leisure",
+ "military",
+ "place",
+ "man_made",
+ "route",
+ "attraction",
+ "building:part",
+ "indoor"
+ ];
+ var statuses = [
+ "proposed",
+ "planned",
+ "construction",
+ "disused",
+ "abandoned",
+ "dismantled",
+ "razed",
+ "demolished",
+ "obliterated",
+ "intermittent"
+ ];
+ var secondaries = [
+ "oneway",
+ "bridge",
+ "tunnel",
+ "embankment",
+ "cutting",
+ "barrier",
+ "surface",
+ "tracktype",
+ "footway",
+ "crossing",
+ "service",
+ "sport",
+ "public_transport",
+ "location",
+ "parking",
+ "golf",
+ "type",
+ "leisure",
+ "man_made",
+ "indoor",
+ "construction",
+ "proposed"
+ ];
+ var _tags = function(entity) {
+ return entity.tags;
+ };
+ var tagClasses = function(selection2) {
+ selection2.each(function tagClassesEach(entity) {
+ var value = this.className;
+ if (value.baseVal !== void 0) {
+ value = value.baseVal;
+ }
+ var t = _tags(entity);
+ var computed = tagClasses.getClassesString(t, value);
+ if (computed !== value) {
+ select_default2(this).attr("class", computed);
+ }
+ });
+ };
+ tagClasses.getClassesString = function(t, value) {
+ var primary, status;
+ var i2, j2, k, v;
+ var overrideGeometry;
+ if (/\bstroke\b/.test(value)) {
+ if (!!t.barrier && t.barrier !== "no") {
+ overrideGeometry = "line";
+ }
+ }
+ var classes = value.trim().split(/\s+/).filter(function(klass) {
+ return klass.length && !/^tag-/.test(klass);
+ }).map(function(klass) {
+ return klass === "line" || klass === "area" ? overrideGeometry || klass : klass;
+ });
+ for (i2 = 0; i2 < primaries.length; i2++) {
+ k = primaries[i2];
+ v = t[k];
+ if (!v || v === "no")
+ continue;
+ if (k === "piste:type") {
+ k = "piste";
+ } else if (k === "building:part") {
+ k = "building_part";
+ }
+ primary = k;
+ if (statuses.indexOf(v) !== -1) {
+ status = v;
+ classes.push("tag-" + k);
+ } else {
+ classes.push("tag-" + k);
+ classes.push("tag-" + k + "-" + v);
+ }
+ break;
+ }
+ if (!primary) {
+ for (i2 = 0; i2 < statuses.length; i2++) {
+ for (j2 = 0; j2 < primaries.length; j2++) {
+ k = statuses[i2] + ":" + primaries[j2];
+ v = t[k];
+ if (!v || v === "no")
+ continue;
+ status = statuses[i2];
+ break;
+ }
+ }
+ }
+ if (!status) {
+ for (i2 = 0; i2 < statuses.length; i2++) {
+ k = statuses[i2];
+ v = t[k];
+ if (!v || v === "no")
+ continue;
+ if (v === "yes") {
+ status = k;
+ } else if (primary && primary === v) {
+ status = k;
+ } else if (!primary && primaries.indexOf(v) !== -1) {
+ status = k;
+ primary = v;
+ classes.push("tag-" + v);
+ }
+ if (status)
+ break;
+ }
+ }
+ if (status) {
+ classes.push("tag-status");
+ classes.push("tag-status-" + status);
+ }
+ for (i2 = 0; i2 < secondaries.length; i2++) {
+ k = secondaries[i2];
+ v = t[k];
+ if (!v || v === "no" || k === primary)
+ continue;
+ classes.push("tag-" + k);
+ classes.push("tag-" + k + "-" + v);
+ }
+ if (primary === "highway" && !osmPathHighwayTagValues[t.highway] || primary === "aeroway") {
+ var surface = t.highway === "track" ? "unpaved" : "paved";
+ for (k in t) {
+ v = t[k];
+ if (k in osmPavedTags) {
+ surface = osmPavedTags[k][v] ? "paved" : "unpaved";
+ }
+ if (k in osmSemipavedTags && !!osmSemipavedTags[k][v]) {
+ surface = "semipaved";
+ }
+ }
+ classes.push("tag-" + surface);
+ }
+ var qid = t.wikidata || t["flag:wikidata"] || t["brand:wikidata"] || t["network:wikidata"] || t["operator:wikidata"];
+ if (qid) {
+ classes.push("tag-wikidata");
+ }
+ return classes.join(" ").trim();
+ };
+ tagClasses.tags = function(val) {
+ if (!arguments.length)
+ return _tags;
+ _tags = val;
+ return tagClasses;
+ };
+ return tagClasses;
+ }
+
+ // modules/svg/tag_pattern.js
+ var patterns = {
+ amenity: {
+ grave_yard: "cemetery",
+ fountain: "water_standing"
+ },
+ landuse: {
+ cemetery: [
+ { religion: "christian", pattern: "cemetery_christian" },
+ { religion: "buddhist", pattern: "cemetery_buddhist" },
+ { religion: "muslim", pattern: "cemetery_muslim" },
+ { religion: "jewish", pattern: "cemetery_jewish" },
+ { pattern: "cemetery" }
+ ],
+ construction: "construction",
+ farmland: "farmland",
+ farmyard: "farmyard",
+ forest: [
+ { leaf_type: "broadleaved", pattern: "forest_broadleaved" },
+ { leaf_type: "needleleaved", pattern: "forest_needleleaved" },
+ { leaf_type: "leafless", pattern: "forest_leafless" },
+ { pattern: "forest" }
+ ],
+ grave_yard: "cemetery",
+ grass: "grass",
+ landfill: "landfill",
+ meadow: "meadow",
+ military: "construction",
+ orchard: "orchard",
+ quarry: "quarry",
+ vineyard: "vineyard"
+ },
+ leisure: {
+ horse_riding: "farmyard"
+ },
+ natural: {
+ beach: "beach",
+ grassland: "grass",
+ sand: "beach",
+ scrub: "scrub",
+ water: [
+ { water: "pond", pattern: "pond" },
+ { water: "reservoir", pattern: "water_standing" },
+ { pattern: "waves" }
+ ],
+ wetland: [
+ { wetland: "marsh", pattern: "wetland_marsh" },
+ { wetland: "swamp", pattern: "wetland_swamp" },
+ { wetland: "bog", pattern: "wetland_bog" },
+ { wetland: "reedbed", pattern: "wetland_reedbed" },
+ { pattern: "wetland" }
+ ],
+ wood: [
+ { leaf_type: "broadleaved", pattern: "forest_broadleaved" },
+ { leaf_type: "needleleaved", pattern: "forest_needleleaved" },
+ { leaf_type: "leafless", pattern: "forest_leafless" },
+ { pattern: "forest" }
+ ]
+ },
+ golf: {
+ green: "golf_green",
+ tee: "grass",
+ fairway: "grass",
+ rough: "scrub"
+ },
+ surface: {
+ grass: "grass",
+ sand: "beach"
+ }
+ };
+ function svgTagPattern(tags) {
+ if (tags.building && tags.building !== "no") {
+ return null;
+ }
+ for (var tag in patterns) {
+ var entityValue = tags[tag];
+ if (!entityValue)
+ continue;
+ if (typeof patterns[tag] === "string") {
+ return "pattern-" + patterns[tag];
+ } else {
+ var values = patterns[tag];
+ for (var value in values) {
+ if (entityValue !== value)
+ continue;
+ var rules = values[value];
+ if (typeof rules === "string") {
+ return "pattern-" + rules;
+ }
+ for (var ruleKey in rules) {
+ var rule = rules[ruleKey];
+ var pass = true;
+ for (var criterion in rule) {
+ if (criterion !== "pattern") {
+ var v = tags[criterion];
+ if (!v || v !== rule[criterion]) {
+ pass = false;
+ break;
+ }
+ }
+ }
+ if (pass) {
+ return "pattern-" + rule.pattern;
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ // modules/svg/areas.js
+ function svgAreas(projection2, context) {
+ function getPatternStyle(tags) {
+ var imageID = svgTagPattern(tags);
+ if (imageID) {
+ return 'url("#ideditor-' + imageID + '")';
+ }
+ return "";
+ }
+ function drawTargets(selection2, graph, entities, filter2) {
+ var targetClass = context.getDebug("target") ? "pink " : "nocolor ";
+ var nopeClass = context.getDebug("target") ? "red " : "nocolor ";
+ var getPath = svgPath(projection2).geojson;
+ var activeID = context.activeID();
+ var base = context.history().base();
+ var data = { targets: [], nopes: [] };
+ entities.forEach(function(way) {
+ var features2 = svgSegmentWay(way, graph, activeID);
+ data.targets.push.apply(data.targets, features2.passive);
+ data.nopes.push.apply(data.nopes, features2.active);
+ });
+ var targetData = data.targets.filter(getPath);
+ var targets = selection2.selectAll(".area.target-allowed").filter(function(d) {
+ return filter2(d.properties.entity);
+ }).data(targetData, function key(d) {
+ return d.id;
+ });
+ targets.exit().remove();
+ var segmentWasEdited = function(d) {
+ var wayID = d.properties.entity.id;
+ if (!base.entities[wayID] || !(0, import_fast_deep_equal5.default)(graph.entities[wayID].nodes, base.entities[wayID].nodes)) {
+ return false;
+ }
+ return d.properties.nodes.some(function(n2) {
+ return !base.entities[n2.id] || !(0, import_fast_deep_equal5.default)(graph.entities[n2.id].loc, base.entities[n2.id].loc);
+ });
+ };
+ targets.enter().append("path").merge(targets).attr("d", getPath).attr("class", function(d) {
+ return "way area target target-allowed " + targetClass + d.id;
+ }).classed("segment-edited", segmentWasEdited);
+ var nopeData = data.nopes.filter(getPath);
+ var nopes = selection2.selectAll(".area.target-nope").filter(function(d) {
+ return filter2(d.properties.entity);
+ }).data(nopeData, function key(d) {
+ return d.id;
+ });
+ nopes.exit().remove();
+ nopes.enter().append("path").merge(nopes).attr("d", getPath).attr("class", function(d) {
+ return "way area target target-nope " + nopeClass + d.id;
+ }).classed("segment-edited", segmentWasEdited);
+ }
+ function drawAreas(selection2, graph, entities, filter2) {
+ var path = svgPath(projection2, graph, true);
+ var areas = {};
+ var multipolygon;
+ var base = context.history().base();
+ for (var i2 = 0; i2 < entities.length; i2++) {
+ var entity = entities[i2];
+ if (entity.geometry(graph) !== "area")
+ continue;
+ multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
+ if (multipolygon) {
+ areas[multipolygon.id] = {
+ entity: multipolygon.mergeTags(entity.tags),
+ area: Math.abs(entity.area(graph))
+ };
+ } else if (!areas[entity.id]) {
+ areas[entity.id] = {
+ entity,
+ area: Math.abs(entity.area(graph))
+ };
+ }
+ }
+ var fills = Object.values(areas).filter(function hasPath(a) {
+ return path(a.entity);
+ });
+ fills.sort(function areaSort(a, b) {
+ return b.area - a.area;
+ });
+ fills = fills.map(function(a) {
+ return a.entity;
+ });
+ var strokes = fills.filter(function(area) {
+ return area.type === "way";
+ });
+ var data = {
+ clip: fills,
+ shadow: strokes,
+ stroke: strokes,
+ fill: fills
+ };
+ var clipPaths = context.surface().selectAll("defs").selectAll(".clipPath-osm").filter(filter2).data(data.clip, osmEntity.key);
+ clipPaths.exit().remove();
+ var clipPathsEnter = clipPaths.enter().append("clipPath").attr("class", "clipPath-osm").attr("id", function(entity2) {
+ return "ideditor-" + entity2.id + "-clippath";
+ });
+ clipPathsEnter.append("path");
+ clipPaths.merge(clipPathsEnter).selectAll("path").attr("d", path);
+ var drawLayer = selection2.selectAll(".layer-osm.areas");
+ var touchLayer = selection2.selectAll(".layer-touch.areas");
+ var areagroup = drawLayer.selectAll("g.areagroup").data(["fill", "shadow", "stroke"]);
+ areagroup = areagroup.enter().append("g").attr("class", function(d) {
+ return "areagroup area-" + d;
+ }).merge(areagroup);
+ var paths = areagroup.selectAll("path").filter(filter2).data(function(layer) {
+ return data[layer];
+ }, osmEntity.key);
+ paths.exit().remove();
+ var fillpaths = selection2.selectAll(".area-fill path.area").nodes();
+ var bisect = bisector(function(node) {
+ return -node.__data__.area(graph);
+ }).left;
+ function sortedByArea(entity2) {
+ if (this._parent.__data__ === "fill") {
+ return fillpaths[bisect(fillpaths, -entity2.area(graph))];
+ }
+ }
+ paths = paths.enter().insert("path", sortedByArea).merge(paths).each(function(entity2) {
+ var layer = this.parentNode.__data__;
+ this.setAttribute("class", entity2.type + " area " + layer + " " + entity2.id);
+ if (layer === "fill") {
+ this.setAttribute("clip-path", "url(#ideditor-" + entity2.id + "-clippath)");
+ this.style.fill = this.style.stroke = getPatternStyle(entity2.tags);
+ }
+ }).classed("added", function(d) {
+ return !base.entities[d.id];
+ }).classed("geometry-edited", function(d) {
+ return graph.entities[d.id] && base.entities[d.id] && !(0, import_fast_deep_equal5.default)(graph.entities[d.id].nodes, base.entities[d.id].nodes);
+ }).classed("retagged", function(d) {
+ return graph.entities[d.id] && base.entities[d.id] && !(0, import_fast_deep_equal5.default)(graph.entities[d.id].tags, base.entities[d.id].tags);
+ }).call(svgTagClasses()).attr("d", path);
+ touchLayer.call(drawTargets, graph, data.stroke, filter2);
+ }
+ return drawAreas;
+ }
+
+ // modules/svg/data.js
+ var import_fast_json_stable_stringify = __toESM(require_fast_json_stable_stringify());
+
+ // node_modules/@tmcw/togeojson/dist/togeojson.es.js
+ function nodeVal(x) {
+ if (x && x.normalize) {
+ x.normalize();
+ }
+ return x && x.textContent || "";
+ }
+ function get1(x, y) {
+ const n2 = x.getElementsByTagName(y);
+ return n2.length ? n2[0] : null;
+ }
+ function getLineStyle(extensions) {
+ const style = {};
+ if (extensions) {
+ const lineStyle = get1(extensions, "line");
+ if (lineStyle) {
+ const color2 = nodeVal(get1(lineStyle, "color")), opacity = parseFloat(nodeVal(get1(lineStyle, "opacity"))), width = parseFloat(nodeVal(get1(lineStyle, "width")));
+ if (color2)
+ style.stroke = color2;
+ if (!isNaN(opacity))
+ style["stroke-opacity"] = opacity;
+ if (!isNaN(width))
+ style["stroke-width"] = width * 96 / 25.4;
+ }
+ }
+ return style;
+ }
+ function getExtensions(node) {
+ let values = [];
+ if (node !== null) {
+ for (let i2 = 0; i2 < node.childNodes.length; i2++) {
+ const child = node.childNodes[i2];
+ if (child.nodeType !== 1)
+ continue;
+ const name2 = ["heart", "gpxtpx:hr", "hr"].includes(child.nodeName) ? "heart" : child.nodeName;
+ if (name2 === "gpxtpx:TrackPointExtension") {
+ values = values.concat(getExtensions(child));
+ } else {
+ const val = nodeVal(child);
+ values.push([name2, isNaN(val) ? val : parseFloat(val)]);
+ }
+ }
+ }
+ return values;
+ }
+ function getMulti(x, ys) {
+ const o = {};
+ let n2;
+ let k;
+ for (k = 0; k < ys.length; k++) {
+ n2 = get1(x, ys[k]);
+ if (n2)
+ o[ys[k]] = nodeVal(n2);
+ }
+ return o;
+ }
+ function getProperties$1(node) {
+ const prop = getMulti(node, [
+ "name",
+ "cmt",
+ "desc",
+ "type",
+ "time",
+ "keywords"
+ ]);
+ const extensions = node.getElementsByTagNameNS("http://www.garmin.com/xmlschemas/GpxExtensions/v3", "*");
+ for (let i2 = 0; i2 < extensions.length; i2++) {
+ const extension = extensions[i2];
+ if (extension.parentNode.parentNode === node) {
+ prop[extension.tagName.replace(":", "_")] = nodeVal(extension);
+ }
+ }
+ const links = node.getElementsByTagName("link");
+ if (links.length)
+ prop.links = [];
+ for (let i2 = 0; i2 < links.length; i2++) {
+ prop.links.push(Object.assign({ href: links[i2].getAttribute("href") }, getMulti(links[i2], ["text", "type"])));
+ }
+ return prop;
+ }
+ function coordPair$1(x) {
+ const ll = [
+ parseFloat(x.getAttribute("lon")),
+ parseFloat(x.getAttribute("lat"))
+ ];
+ const ele = get1(x, "ele");
+ const time = get1(x, "time");
+ if (ele) {
+ const e = parseFloat(nodeVal(ele));
+ if (!isNaN(e)) {
+ ll.push(e);
+ }
+ }
+ return {
+ coordinates: ll,
+ time: time ? nodeVal(time) : null,
+ extendedValues: getExtensions(get1(x, "extensions"))
+ };
+ }
+ function getRoute(node) {
+ const line = getPoints$1(node, "rtept");
+ if (!line)
+ return;
+ return {
+ type: "Feature",
+ properties: Object.assign(getProperties$1(node), getLineStyle(get1(node, "extensions")), { _gpxType: "rte" }),
+ geometry: {
+ type: "LineString",
+ coordinates: line.line
+ }
+ };
+ }
+ function getPoints$1(node, pointname) {
+ const pts = node.getElementsByTagName(pointname);
+ if (pts.length < 2)
+ return;
+ const line = [];
+ const times = [];
+ const extendedValues = {};
+ for (let i2 = 0; i2 < pts.length; i2++) {
+ const c = coordPair$1(pts[i2]);
+ line.push(c.coordinates);
+ if (c.time)
+ times.push(c.time);
+ for (let j2 = 0; j2 < c.extendedValues.length; j2++) {
+ const [name2, val] = c.extendedValues[j2];
+ const plural = name2 === "heart" ? name2 : name2.replace("gpxtpx:", "") + "s";
+ if (!extendedValues[plural]) {
+ extendedValues[plural] = Array(pts.length).fill(null);
+ }
+ extendedValues[plural][i2] = val;
+ }
+ }
+ return {
+ line,
+ times,
+ extendedValues
+ };
+ }
+ function getTrack(node) {
+ const segments = node.getElementsByTagName("trkseg");
+ const track = [];
+ const times = [];
+ const extractedLines = [];
+ for (let i2 = 0; i2 < segments.length; i2++) {
+ const line = getPoints$1(segments[i2], "trkpt");
+ if (line) {
+ extractedLines.push(line);
+ if (line.times && line.times.length)
+ times.push(line.times);
+ }
+ }
+ if (extractedLines.length === 0)
+ return;
+ const multi = extractedLines.length > 1;
+ const properties = Object.assign(getProperties$1(node), getLineStyle(get1(node, "extensions")), { _gpxType: "trk" }, times.length ? {
+ coordinateProperties: {
+ times: multi ? times : times[0]
+ }
+ } : {});
+ for (let i2 = 0; i2 < extractedLines.length; i2++) {
+ const line = extractedLines[i2];
+ track.push(line.line);
+ for (const [name2, val] of Object.entries(line.extendedValues)) {
+ if (!properties.coordinateProperties) {
+ properties.coordinateProperties = {};
+ }
+ const props = properties.coordinateProperties;
+ if (multi) {
+ if (!props[name2])
+ props[name2] = extractedLines.map((line2) => new Array(line2.line.length).fill(null));
+ props[name2][i2] = val;
+ } else {
+ props[name2] = val;
+ }
+ }
+ }
+ return {
+ type: "Feature",
+ properties,
+ geometry: multi ? {
+ type: "MultiLineString",
+ coordinates: track
+ } : {
+ type: "LineString",
+ coordinates: track[0]
+ }
+ };
+ }
+ function getPoint(node) {
+ return {
+ type: "Feature",
+ properties: Object.assign(getProperties$1(node), getMulti(node, ["sym"])),
+ geometry: {
+ type: "Point",
+ coordinates: coordPair$1(node).coordinates
+ }
+ };
+ }
+ function* gpxGen(doc) {
+ const tracks = doc.getElementsByTagName("trk");
+ const routes = doc.getElementsByTagName("rte");
+ const waypoints = doc.getElementsByTagName("wpt");
+ for (let i2 = 0; i2 < tracks.length; i2++) {
+ const feature3 = getTrack(tracks[i2]);
+ if (feature3)
+ yield feature3;
+ }
+ for (let i2 = 0; i2 < routes.length; i2++) {
+ const feature3 = getRoute(routes[i2]);
+ if (feature3)
+ yield feature3;
+ }
+ for (let i2 = 0; i2 < waypoints.length; i2++) {
+ yield getPoint(waypoints[i2]);
+ }
+ }
+ function gpx(doc) {
+ return {
+ type: "FeatureCollection",
+ features: Array.from(gpxGen(doc))
+ };
+ }
+ var removeSpace = /\s*/g;
+ var trimSpace = /^\s*|\s*$/g;
+ var splitSpace = /\s+/;
+ function okhash(x) {
+ if (!x || !x.length)
+ return 0;
+ let h = 0;
+ for (let i2 = 0; i2 < x.length; i2++) {
+ h = (h << 5) - h + x.charCodeAt(i2) | 0;
+ }
+ return h;
+ }
+ function coord1(v) {
+ return v.replace(removeSpace, "").split(",").map(parseFloat);
+ }
+ function coord(v) {
+ return v.replace(trimSpace, "").split(splitSpace).map(coord1);
+ }
+ function xml2str(node) {
+ if (node.xml !== void 0)
+ return node.xml;
+ if (node.tagName) {
+ let output = node.tagName;
+ for (let i2 = 0; i2 < node.attributes.length; i2++) {
+ output += node.attributes[i2].name + node.attributes[i2].value;
+ }
+ for (let i2 = 0; i2 < node.childNodes.length; i2++) {
+ output += xml2str(node.childNodes[i2]);
+ }
+ return output;
+ }
+ if (node.nodeName === "#text") {
+ return (node.nodeValue || node.value || "").trim();
+ }
+ if (node.nodeName === "#cdata-section") {
+ return node.nodeValue;
+ }
+ return "";
+ }
+ var geotypes = ["Polygon", "LineString", "Point", "Track", "gx:Track"];
+ function kmlColor(properties, elem, prefix) {
+ let v = nodeVal(get1(elem, "color")) || "";
+ const colorProp = prefix == "stroke" || prefix === "fill" ? prefix : prefix + "-color";
+ if (v.substr(0, 1) === "#") {
+ v = v.substr(1);
+ }
+ if (v.length === 6 || v.length === 3) {
+ properties[colorProp] = v;
+ } else if (v.length === 8) {
+ properties[prefix + "-opacity"] = parseInt(v.substr(0, 2), 16) / 255;
+ properties[colorProp] = "#" + v.substr(6, 2) + v.substr(4, 2) + v.substr(2, 2);
+ }
+ }
+ function numericProperty(properties, elem, source, target) {
+ const val = parseFloat(nodeVal(get1(elem, source)));
+ if (!isNaN(val))
+ properties[target] = val;
+ }
+ function gxCoords(root3) {
+ let elems = root3.getElementsByTagName("coord");
+ const coords = [];
+ const times = [];
+ if (elems.length === 0)
+ elems = root3.getElementsByTagName("gx:coord");
+ for (let i2 = 0; i2 < elems.length; i2++) {
+ coords.push(nodeVal(elems[i2]).split(" ").map(parseFloat));
+ }
+ const timeElems = root3.getElementsByTagName("when");
+ for (let j2 = 0; j2 < timeElems.length; j2++)
+ times.push(nodeVal(timeElems[j2]));
+ return {
+ coords,
+ times
+ };
+ }
+ function getGeometry(root3) {
+ let geomNode;
+ let geomNodes;
+ let i2;
+ let j2;
+ let k;
+ const geoms = [];
+ const coordTimes = [];
+ if (get1(root3, "MultiGeometry")) {
+ return getGeometry(get1(root3, "MultiGeometry"));
+ }
+ if (get1(root3, "MultiTrack")) {
+ return getGeometry(get1(root3, "MultiTrack"));
+ }
+ if (get1(root3, "gx:MultiTrack")) {
+ return getGeometry(get1(root3, "gx:MultiTrack"));
+ }
+ for (i2 = 0; i2 < geotypes.length; i2++) {
+ geomNodes = root3.getElementsByTagName(geotypes[i2]);
+ if (geomNodes) {
+ for (j2 = 0; j2 < geomNodes.length; j2++) {
+ geomNode = geomNodes[j2];
+ if (geotypes[i2] === "Point") {
+ geoms.push({
+ type: "Point",
+ coordinates: coord1(nodeVal(get1(geomNode, "coordinates")))
+ });
+ } else if (geotypes[i2] === "LineString") {
+ geoms.push({
+ type: "LineString",
+ coordinates: coord(nodeVal(get1(geomNode, "coordinates")))
+ });
+ } else if (geotypes[i2] === "Polygon") {
+ const rings = geomNode.getElementsByTagName("LinearRing"), coords = [];
+ for (k = 0; k < rings.length; k++) {
+ coords.push(coord(nodeVal(get1(rings[k], "coordinates"))));
+ }
+ geoms.push({
+ type: "Polygon",
+ coordinates: coords
+ });
+ } else if (geotypes[i2] === "Track" || geotypes[i2] === "gx:Track") {
+ const track = gxCoords(geomNode);
+ geoms.push({
+ type: "LineString",
+ coordinates: track.coords
+ });
+ if (track.times.length)
+ coordTimes.push(track.times);
+ }
+ }
+ }
+ }
+ return {
+ geoms,
+ coordTimes
+ };
+ }
+ function getPlacemark(root3, styleIndex, styleMapIndex, styleByHash) {
+ const geomsAndTimes = getGeometry(root3);
+ let i2;
+ const properties = {};
+ const name2 = nodeVal(get1(root3, "name"));
+ const address = nodeVal(get1(root3, "address"));
+ let styleUrl = nodeVal(get1(root3, "styleUrl"));
+ const description2 = nodeVal(get1(root3, "description"));
+ const timeSpan = get1(root3, "TimeSpan");
+ const timeStamp = get1(root3, "TimeStamp");
+ const extendedData = get1(root3, "ExtendedData");
+ let iconStyle = get1(root3, "IconStyle");
+ let labelStyle = get1(root3, "LabelStyle");
+ let lineStyle = get1(root3, "LineStyle");
+ let polyStyle = get1(root3, "PolyStyle");
+ const visibility = get1(root3, "visibility");
+ if (name2)
+ properties.name = name2;
+ if (address)
+ properties.address = address;
+ if (styleUrl) {
+ if (styleUrl[0] !== "#") {
+ styleUrl = "#" + styleUrl;
+ }
+ properties.styleUrl = styleUrl;
+ if (styleIndex[styleUrl]) {
+ properties.styleHash = styleIndex[styleUrl];
+ }
+ if (styleMapIndex[styleUrl]) {
+ properties.styleMapHash = styleMapIndex[styleUrl];
+ properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
+ }
+ const style = styleByHash[properties.styleHash];
+ if (style) {
+ if (!iconStyle)
+ iconStyle = get1(style, "IconStyle");
+ if (!labelStyle)
+ labelStyle = get1(style, "LabelStyle");
+ if (!lineStyle)
+ lineStyle = get1(style, "LineStyle");
+ if (!polyStyle)
+ polyStyle = get1(style, "PolyStyle");
+ }
+ }
+ if (description2)
+ properties.description = description2;
+ if (timeSpan) {
+ const begin = nodeVal(get1(timeSpan, "begin"));
+ const end = nodeVal(get1(timeSpan, "end"));
+ properties.timespan = { begin, end };
+ }
+ if (timeStamp) {
+ properties.timestamp = nodeVal(get1(timeStamp, "when"));
+ }
+ if (iconStyle) {
+ kmlColor(properties, iconStyle, "icon");
+ numericProperty(properties, iconStyle, "scale", "icon-scale");
+ numericProperty(properties, iconStyle, "heading", "icon-heading");
+ const hotspot = get1(iconStyle, "hotSpot");
+ if (hotspot) {
+ const left = parseFloat(hotspot.getAttribute("x"));
+ const top = parseFloat(hotspot.getAttribute("y"));
+ if (!isNaN(left) && !isNaN(top))
+ properties["icon-offset"] = [left, top];
+ }
+ const icon2 = get1(iconStyle, "Icon");
+ if (icon2) {
+ const href = nodeVal(get1(icon2, "href"));
+ if (href)
+ properties.icon = href;
+ }
+ }
+ if (labelStyle) {
+ kmlColor(properties, labelStyle, "label");
+ numericProperty(properties, labelStyle, "scale", "label-scale");
+ }
+ if (lineStyle) {
+ kmlColor(properties, lineStyle, "stroke");
+ numericProperty(properties, lineStyle, "width", "stroke-width");
+ }
+ if (polyStyle) {
+ kmlColor(properties, polyStyle, "fill");
+ const fill = nodeVal(get1(polyStyle, "fill"));
+ const outline = nodeVal(get1(polyStyle, "outline"));
+ if (fill)
+ properties["fill-opacity"] = fill === "1" ? properties["fill-opacity"] || 1 : 0;
+ if (outline)
+ properties["stroke-opacity"] = outline === "1" ? properties["stroke-opacity"] || 1 : 0;
+ }
+ if (extendedData) {
+ const datas = extendedData.getElementsByTagName("Data"), simpleDatas = extendedData.getElementsByTagName("SimpleData");
+ for (i2 = 0; i2 < datas.length; i2++) {
+ properties[datas[i2].getAttribute("name")] = nodeVal(get1(datas[i2], "value"));
+ }
+ for (i2 = 0; i2 < simpleDatas.length; i2++) {
+ properties[simpleDatas[i2].getAttribute("name")] = nodeVal(simpleDatas[i2]);
+ }
+ }
+ if (visibility) {
+ properties.visibility = nodeVal(visibility);
+ }
+ if (geomsAndTimes.coordTimes.length) {
+ properties.coordinateProperties = {
+ times: geomsAndTimes.coordTimes.length === 1 ? geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes
+ };
+ }
+ const feature3 = {
+ type: "Feature",
+ geometry: geomsAndTimes.geoms.length === 0 ? null : geomsAndTimes.geoms.length === 1 ? geomsAndTimes.geoms[0] : {
+ type: "GeometryCollection",
+ geometries: geomsAndTimes.geoms
+ },
+ properties
+ };
+ if (root3.getAttribute("id"))
+ feature3.id = root3.getAttribute("id");
+ return feature3;
+ }
+ function* kmlGen(doc) {
+ const styleIndex = {};
+ const styleByHash = {};
+ const styleMapIndex = {};
+ const placemarks = doc.getElementsByTagName("Placemark");
+ const styles = doc.getElementsByTagName("Style");
+ const styleMaps = doc.getElementsByTagName("StyleMap");
+ for (let k = 0; k < styles.length; k++) {
+ const style = styles[k];
+ const hash = okhash(xml2str(style)).toString(16);
+ let id2 = style.getAttribute("id");
+ if (!id2 && style.parentNode.tagName.replace("gx:", "") === "CascadingStyle") {
+ id2 = style.parentNode.getAttribute("kml:id") || style.parentNode.getAttribute("id");
+ }
+ styleIndex["#" + id2] = hash;
+ styleByHash[hash] = style;
+ }
+ for (let l = 0; l < styleMaps.length; l++) {
+ styleIndex["#" + styleMaps[l].getAttribute("id")] = okhash(xml2str(styleMaps[l])).toString(16);
+ const pairs = styleMaps[l].getElementsByTagName("Pair");
+ const pairsMap = {};
+ for (let m = 0; m < pairs.length; m++) {
+ pairsMap[nodeVal(get1(pairs[m], "key"))] = nodeVal(get1(pairs[m], "styleUrl"));
+ }
+ styleMapIndex["#" + styleMaps[l].getAttribute("id")] = pairsMap;
+ }
+ for (let j2 = 0; j2 < placemarks.length; j2++) {
+ const feature3 = getPlacemark(placemarks[j2], styleIndex, styleMapIndex, styleByHash);
+ if (feature3)
+ yield feature3;
+ }
+ }
+ function kml(doc) {
+ return {
+ type: "FeatureCollection",
+ features: Array.from(kmlGen(doc))
+ };
+ }
+
+ // modules/svg/data.js
+ var _initialized = false;
+ var _enabled = false;
+ var _geojson;
+ function svgData(projection2, context, dispatch10) {
+ var throttledRedraw = throttle_default(function() {
+ dispatch10.call("change");
+ }, 1e3);
+ var _showLabels = true;
+ var detected = utilDetect();
+ var layer = select_default2(null);
+ var _vtService;
+ var _fileList;
+ var _template;
+ var _src;
+ function init2() {
+ if (_initialized)
+ return;
+ _geojson = {};
+ _enabled = true;
+ function over(d3_event) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ d3_event.dataTransfer.dropEffect = "copy";
+ }
+ context.container().attr("dropzone", "copy").on("drop.svgData", function(d3_event) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ if (!detected.filedrop)
+ return;
+ drawData.fileList(d3_event.dataTransfer.files);
+ }).on("dragenter.svgData", over).on("dragexit.svgData", over).on("dragover.svgData", over);
+ _initialized = true;
+ }
+ function getService() {
+ if (services.vectorTile && !_vtService) {
+ _vtService = services.vectorTile;
+ _vtService.event.on("loadedData", throttledRedraw);
+ } else if (!services.vectorTile && _vtService) {
+ _vtService = null;
+ }
+ return _vtService;
+ }
+ function showLayer() {
+ layerOn();
+ layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() {
+ dispatch10.call("change");
+ });
+ }
+ function hideLayer() {
+ throttledRedraw.cancel();
+ layer.transition().duration(250).style("opacity", 0).on("end", layerOff);
+ }
+ function layerOn() {
+ layer.style("display", "block");
+ }
+ function layerOff() {
+ layer.selectAll(".viewfield-group").remove();
+ layer.style("display", "none");
+ }
+ function ensureIDs(gj) {
+ if (!gj)
+ return null;
+ if (gj.type === "FeatureCollection") {
+ for (var i2 = 0; i2 < gj.features.length; i2++) {
+ ensureFeatureID(gj.features[i2]);
+ }
+ } else {
+ ensureFeatureID(gj);
+ }
+ return gj;
+ }
+ function ensureFeatureID(feature3) {
+ if (!feature3)
+ return;
+ feature3.__featurehash__ = utilHashcode((0, import_fast_json_stable_stringify.default)(feature3));
+ return feature3;
+ }
+ function getFeatures(gj) {
+ if (!gj)
+ return [];
+ if (gj.type === "FeatureCollection") {
+ return gj.features;
+ } else {
+ return [gj];
+ }
+ }
+ function featureKey(d) {
+ return d.__featurehash__;
+ }
+ function isPolygon(d) {
+ return d.geometry.type === "Polygon" || d.geometry.type === "MultiPolygon";
+ }
+ function clipPathID(d) {
+ return "ideditor-data-" + d.__featurehash__ + "-clippath";
+ }
+ function featureClasses(d) {
+ return [
+ "data" + d.__featurehash__,
+ d.geometry.type,
+ isPolygon(d) ? "area" : "",
+ d.__layerID__ || ""
+ ].filter(Boolean).join(" ");
+ }
+ function drawData(selection2) {
+ var vtService = getService();
+ var getPath = svgPath(projection2).geojson;
+ var getAreaPath = svgPath(projection2, null, true).geojson;
+ var hasData = drawData.hasData();
+ layer = selection2.selectAll(".layer-mapdata").data(_enabled && hasData ? [0] : []);
+ layer.exit().remove();
+ layer = layer.enter().append("g").attr("class", "layer-mapdata").merge(layer);
+ var surface = context.surface();
+ if (!surface || surface.empty())
+ return;
+ var geoData, polygonData;
+ if (_template && vtService) {
+ var sourceID = _template;
+ vtService.loadTiles(sourceID, _template, projection2);
+ geoData = vtService.data(sourceID, projection2);
+ } else {
+ geoData = getFeatures(_geojson);
+ }
+ geoData = geoData.filter(getPath);
+ polygonData = geoData.filter(isPolygon);
+ var clipPaths = surface.selectAll("defs").selectAll(".clipPath-data").data(polygonData, featureKey);
+ clipPaths.exit().remove();
+ var clipPathsEnter = clipPaths.enter().append("clipPath").attr("class", "clipPath-data").attr("id", clipPathID);
+ clipPathsEnter.append("path");
+ clipPaths.merge(clipPathsEnter).selectAll("path").attr("d", getAreaPath);
+ var datagroups = layer.selectAll("g.datagroup").data(["fill", "shadow", "stroke"]);
+ datagroups = datagroups.enter().append("g").attr("class", function(d) {
+ return "datagroup datagroup-" + d;
+ }).merge(datagroups);
+ var pathData = {
+ fill: polygonData,
+ shadow: geoData,
+ stroke: geoData
+ };
+ var paths = datagroups.selectAll("path").data(function(layer2) {
+ return pathData[layer2];
+ }, featureKey);
+ paths.exit().remove();
+ paths = paths.enter().append("path").attr("class", function(d) {
+ var datagroup = this.parentNode.__data__;
+ return "pathdata " + datagroup + " " + featureClasses(d);
+ }).attr("clip-path", function(d) {
+ var datagroup = this.parentNode.__data__;
+ return datagroup === "fill" ? "url(#" + clipPathID(d) + ")" : null;
+ }).merge(paths).attr("d", function(d) {
+ var datagroup = this.parentNode.__data__;
+ return datagroup === "fill" ? getAreaPath(d) : getPath(d);
+ });
+ layer.call(drawLabels, "label-halo", geoData).call(drawLabels, "label", geoData);
+ function drawLabels(selection3, textClass, data) {
+ var labelPath = path_default(projection2);
+ var labelData = data.filter(function(d) {
+ return _showLabels && d.properties && (d.properties.desc || d.properties.name);
+ });
+ var labels = selection3.selectAll("text." + textClass).data(labelData, featureKey);
+ labels.exit().remove();
+ labels = labels.enter().append("text").attr("class", function(d) {
+ return textClass + " " + featureClasses(d);
+ }).merge(labels).text(function(d) {
+ return d.properties.desc || d.properties.name;
+ }).attr("x", function(d) {
+ var centroid = labelPath.centroid(d);
+ return centroid[0] + 11;
+ }).attr("y", function(d) {
+ var centroid = labelPath.centroid(d);
+ return centroid[1];
+ });
+ }
+ }
+ function getExtension(fileName) {
+ if (!fileName)
+ return;
+ var re2 = /\.(gpx|kml|(geo)?json)$/i;
+ var match = fileName.toLowerCase().match(re2);
+ return match && match.length && match[0];
+ }
+ function xmlToDom(textdata) {
+ return new DOMParser().parseFromString(textdata, "text/xml");
+ }
+ function stringifyGeojsonProperties(feature3) {
+ const properties = feature3.properties;
+ for (const key in properties) {
+ const property = properties[key];
+ if (typeof property === "number" || typeof property === "boolean" || Array.isArray(property)) {
+ properties[key] = property.toString();
+ } else if (property === null) {
+ properties[key] = "null";
+ } else if (typeof property === "object") {
+ properties[key] = JSON.stringify(property);
+ }
+ }
+ }
+ drawData.setFile = function(extension, data) {
+ _template = null;
+ _fileList = null;
+ _geojson = null;
+ _src = null;
+ var gj;
+ switch (extension) {
+ case ".gpx":
+ gj = gpx(xmlToDom(data));
+ break;
+ case ".kml":
+ gj = kml(xmlToDom(data));
+ break;
+ case ".geojson":
+ case ".json":
+ gj = JSON.parse(data);
+ if (gj.type === "FeatureCollection") {
+ gj.features.forEach(stringifyGeojsonProperties);
+ } else if (gj.type === "Feature") {
+ stringifyGeojsonProperties(gj);
+ }
+ break;
+ }
+ gj = gj || {};
+ if (Object.keys(gj).length) {
+ _geojson = ensureIDs(gj);
+ _src = extension + " data file";
+ this.fitZoom();
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ drawData.showLabels = function(val) {
+ if (!arguments.length)
+ return _showLabels;
+ _showLabels = val;
+ return this;
+ };
+ drawData.enabled = function(val) {
+ if (!arguments.length)
+ return _enabled;
+ _enabled = val;
+ if (_enabled) {
+ showLayer();
+ } else {
+ hideLayer();
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ drawData.hasData = function() {
+ var gj = _geojson || {};
+ return !!(_template || Object.keys(gj).length);
+ };
+ drawData.template = function(val, src) {
+ if (!arguments.length)
+ return _template;
+ var osm = context.connection();
+ if (osm) {
+ var blocklists = osm.imageryBlocklists();
+ var fail = false;
+ var tested = 0;
+ var regex;
+ for (var i2 = 0; i2 < blocklists.length; i2++) {
+ regex = blocklists[i2];
+ fail = regex.test(val);
+ tested++;
+ if (fail)
+ break;
+ }
+ if (!tested) {
+ regex = /.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/;
+ fail = regex.test(val);
+ }
+ }
+ _template = val;
+ _fileList = null;
+ _geojson = null;
+ _src = src || "vectortile:" + val.split(/[?#]/)[0];
+ dispatch10.call("change");
+ return this;
+ };
+ drawData.geojson = function(gj, src) {
+ if (!arguments.length)
+ return _geojson;
+ _template = null;
+ _fileList = null;
+ _geojson = null;
+ _src = null;
+ gj = gj || {};
+ if (Object.keys(gj).length) {
+ _geojson = ensureIDs(gj);
+ _src = src || "unknown.geojson";
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ drawData.fileList = function(fileList) {
+ if (!arguments.length)
+ return _fileList;
+ _template = null;
+ _fileList = fileList;
+ _geojson = null;
+ _src = null;
+ if (!fileList || !fileList.length)
+ return this;
+ var f2 = fileList[0];
+ var extension = getExtension(f2.name);
+ var reader = new FileReader();
+ reader.onload = function() {
+ return function(e) {
+ drawData.setFile(extension, e.target.result);
+ };
+ }(f2);
+ reader.readAsText(f2);
+ return this;
+ };
+ drawData.url = function(url, defaultExtension) {
+ _template = null;
+ _fileList = null;
+ _geojson = null;
+ _src = null;
+ var testUrl = url.split(/[?#]/)[0];
+ var extension = getExtension(testUrl) || defaultExtension;
+ if (extension) {
+ _template = null;
+ text_default3(url).then(function(data) {
+ drawData.setFile(extension, data);
+ }).catch(function() {
+ });
+ } else {
+ drawData.template(url);
+ }
+ return this;
+ };
+ drawData.getSrc = function() {
+ return _src || "";
+ };
+ drawData.fitZoom = function() {
+ var features2 = getFeatures(_geojson);
+ if (!features2.length)
+ return;
+ var map2 = context.map();
+ var viewport = map2.trimmedExtent().polygon();
+ var coords = features2.reduce(function(coords2, feature3) {
+ var geom = feature3.geometry;
+ if (!geom)
+ return coords2;
+ var c = geom.coordinates;
+ switch (geom.type) {
+ case "Point":
+ c = [c];
+ case "MultiPoint":
+ case "LineString":
+ break;
+ case "MultiPolygon":
+ c = utilArrayFlatten(c);
+ case "Polygon":
+ case "MultiLineString":
+ c = utilArrayFlatten(c);
+ break;
+ }
+ return utilArrayUnion(coords2, c);
+ }, []);
+ if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
+ var extent = geoExtent(bounds_default({ type: "LineString", coordinates: coords }));
+ map2.centerZoom(extent.center(), map2.trimmedExtentZoom(extent));
+ }
+ return this;
+ };
+ init2();
+ return drawData;
+ }
+
+ // modules/svg/debug.js
+ function svgDebug(projection2, context) {
+ function drawDebug(selection2) {
+ const showTile = context.getDebug("tile");
+ const showCollision = context.getDebug("collision");
+ const showImagery = context.getDebug("imagery");
+ const showTouchTargets = context.getDebug("target");
+ const showDownloaded = context.getDebug("downloaded");
+ let debugData = [];
+ if (showTile) {
+ debugData.push({ class: "red", label: "tile" });
+ }
+ if (showCollision) {
+ debugData.push({ class: "yellow", label: "collision" });
+ }
+ if (showImagery) {
+ debugData.push({ class: "orange", label: "imagery" });
+ }
+ if (showTouchTargets) {
+ debugData.push({ class: "pink", label: "touchTargets" });
+ }
+ if (showDownloaded) {
+ debugData.push({ class: "purple", label: "downloaded" });
+ }
+ let legend = context.container().select(".main-content").selectAll(".debug-legend").data(debugData.length ? [0] : []);
+ legend.exit().remove();
+ legend = legend.enter().append("div").attr("class", "fillD debug-legend").merge(legend);
+ let legendItems = legend.selectAll(".debug-legend-item").data(debugData, (d) => d.label);
+ legendItems.exit().remove();
+ legendItems.enter().append("span").attr("class", (d) => `debug-legend-item ${d.class}`).text((d) => d.label);
+ let layer = selection2.selectAll(".layer-debug").data(showImagery || showDownloaded ? [0] : []);
+ layer.exit().remove();
+ layer = layer.enter().append("g").attr("class", "layer-debug").merge(layer);
+ const extent = context.map().extent();
+ _mainFileFetcher.get("imagery").then((d) => {
+ const hits = showImagery && d.query.bbox(extent.rectangle(), true) || [];
+ const features2 = hits.map((d2) => d2.features[d2.id]);
+ let imagery = layer.selectAll("path.debug-imagery").data(features2);
+ imagery.exit().remove();
+ imagery.enter().append("path").attr("class", "debug-imagery debug orange");
+ }).catch(() => {
+ });
+ const osm = context.connection();
+ let dataDownloaded = [];
+ if (osm && showDownloaded) {
+ const rtree = osm.caches("get").tile.rtree;
+ dataDownloaded = rtree.all().map((bbox) => {
+ return {
+ type: "Feature",
+ properties: { id: bbox.id },
+ geometry: {
+ type: "Polygon",
+ coordinates: [[
+ [bbox.minX, bbox.minY],
+ [bbox.minX, bbox.maxY],
+ [bbox.maxX, bbox.maxY],
+ [bbox.maxX, bbox.minY],
+ [bbox.minX, bbox.minY]
+ ]]
+ }
+ };
+ });
+ }
+ let downloaded = layer.selectAll("path.debug-downloaded").data(showDownloaded ? dataDownloaded : []);
+ downloaded.exit().remove();
+ downloaded.enter().append("path").attr("class", "debug-downloaded debug purple");
+ layer.selectAll("path").attr("d", svgPath(projection2).geojson);
+ }
+ drawDebug.enabled = function() {
+ if (!arguments.length) {
+ return context.getDebug("tile") || context.getDebug("collision") || context.getDebug("imagery") || context.getDebug("target") || context.getDebug("downloaded");
+ } else {
+ return this;
+ }
+ };
+ return drawDebug;
+ }
+
+ // modules/svg/defs.js
+ function svgDefs(context) {
+ var _defsSelection = select_default2(null);
+ var _spritesheetIds = [
+ "iD-sprite",
+ "maki-sprite",
+ "temaki-sprite",
+ "fa-sprite",
+ "community-sprite"
+ ];
+ function drawDefs(selection2) {
+ _defsSelection = selection2.append("defs");
+ _defsSelection.append("marker").attr("id", "ideditor-oneway-marker").attr("viewBox", "0 0 10 5").attr("refX", 2.5).attr("refY", 2.5).attr("markerWidth", 2).attr("markerHeight", 2).attr("markerUnits", "strokeWidth").attr("orient", "auto").append("path").attr("class", "oneway-marker-path").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").attr("stroke", "none").attr("fill", "#000").attr("opacity", "0.75");
+ function addSidedMarker(name2, color2, offset) {
+ _defsSelection.append("marker").attr("id", "ideditor-sided-marker-" + name2).attr("viewBox", "0 0 2 2").attr("refX", 1).attr("refY", -offset).attr("markerWidth", 1.5).attr("markerHeight", 1.5).attr("markerUnits", "strokeWidth").attr("orient", "auto").append("path").attr("class", "sided-marker-path sided-marker-" + name2 + "-path").attr("d", "M 0,0 L 1,1 L 2,0 z").attr("stroke", "none").attr("fill", color2);
+ }
+ addSidedMarker("natural", "rgb(170, 170, 170)", 0);
+ addSidedMarker("coastline", "#77dede", 1);
+ addSidedMarker("waterway", "#77dede", 1);
+ addSidedMarker("barrier", "#ddd", 1);
+ addSidedMarker("man_made", "#fff", 0);
+ _defsSelection.append("marker").attr("id", "ideditor-viewfield-marker").attr("viewBox", "0 0 16 16").attr("refX", 8).attr("refY", 16).attr("markerWidth", 4).attr("markerHeight", 4).attr("markerUnits", "strokeWidth").attr("orient", "auto").append("path").attr("class", "viewfield-marker-path").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").attr("fill", "#333").attr("fill-opacity", "0.75").attr("stroke", "#fff").attr("stroke-width", "0.5px").attr("stroke-opacity", "0.75");
+ _defsSelection.append("marker").attr("id", "ideditor-viewfield-marker-wireframe").attr("viewBox", "0 0 16 16").attr("refX", 8).attr("refY", 16).attr("markerWidth", 4).attr("markerHeight", 4).attr("markerUnits", "strokeWidth").attr("orient", "auto").append("path").attr("class", "viewfield-marker-path").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").attr("fill", "none").attr("stroke", "#fff").attr("stroke-width", "0.5px").attr("stroke-opacity", "0.75");
+ var patterns2 = _defsSelection.selectAll("pattern").data([
+ ["beach", "dots"],
+ ["construction", "construction"],
+ ["cemetery", "cemetery"],
+ ["cemetery_christian", "cemetery_christian"],
+ ["cemetery_buddhist", "cemetery_buddhist"],
+ ["cemetery_muslim", "cemetery_muslim"],
+ ["cemetery_jewish", "cemetery_jewish"],
+ ["farmland", "farmland"],
+ ["farmyard", "farmyard"],
+ ["forest", "forest"],
+ ["forest_broadleaved", "forest_broadleaved"],
+ ["forest_needleleaved", "forest_needleleaved"],
+ ["forest_leafless", "forest_leafless"],
+ ["golf_green", "grass"],
+ ["grass", "grass"],
+ ["landfill", "landfill"],
+ ["meadow", "grass"],
+ ["orchard", "orchard"],
+ ["pond", "pond"],
+ ["quarry", "quarry"],
+ ["scrub", "bushes"],
+ ["vineyard", "vineyard"],
+ ["water_standing", "lines"],
+ ["waves", "waves"],
+ ["wetland", "wetland"],
+ ["wetland_marsh", "wetland_marsh"],
+ ["wetland_swamp", "wetland_swamp"],
+ ["wetland_bog", "wetland_bog"],
+ ["wetland_reedbed", "wetland_reedbed"]
+ ]).enter().append("pattern").attr("id", function(d) {
+ return "ideditor-pattern-" + d[0];
+ }).attr("width", 32).attr("height", 32).attr("patternUnits", "userSpaceOnUse");
+ patterns2.append("rect").attr("x", 0).attr("y", 0).attr("width", 32).attr("height", 32).attr("class", function(d) {
+ return "pattern-color-" + d[0];
+ });
+ patterns2.append("image").attr("x", 0).attr("y", 0).attr("width", 32).attr("height", 32).attr("xlink:href", function(d) {
+ return context.imagePath("pattern/" + d[1] + ".png");
+ });
+ _defsSelection.selectAll("clipPath").data([12, 18, 20, 32, 45]).enter().append("clipPath").attr("id", function(d) {
+ return "ideditor-clip-square-" + d;
+ }).append("rect").attr("x", 0).attr("y", 0).attr("width", function(d) {
+ return d;
+ }).attr("height", function(d) {
+ return d;
+ });
+ addSprites(_spritesheetIds, true);
+ }
+ function addSprites(ids, overrideColors) {
+ _spritesheetIds = utilArrayUniq(_spritesheetIds.concat(ids));
+ var spritesheets = _defsSelection.selectAll(".spritesheet").data(_spritesheetIds);
+ spritesheets.enter().append("g").attr("class", function(d) {
+ return "spritesheet spritesheet-" + d;
+ }).each(function(d) {
+ var url = context.imagePath(d + ".svg");
+ var node = select_default2(this).node();
+ svg(url).then(function(svg2) {
+ node.appendChild(select_default2(svg2.documentElement).attr("id", "ideditor-" + d).node());
+ if (overrideColors && d !== "iD-sprite") {
+ select_default2(node).selectAll("path").attr("fill", "currentColor");
+ }
+ }).catch(function() {
+ });
+ });
+ spritesheets.exit().remove();
+ }
+ drawDefs.addSprites = addSprites;
+ return drawDefs;
+ }
+
+ // modules/svg/keepRight.js
+ var _layerEnabled = false;
+ var _qaService;
+ function svgKeepRight(projection2, context, dispatch10) {
+ const throttledRedraw = throttle_default(() => dispatch10.call("change"), 1e3);
+ const minZoom3 = 12;
+ let touchLayer = select_default2(null);
+ let drawLayer = select_default2(null);
+ let layerVisible = false;
+ function markerPath(selection2, klass) {
+ selection2.attr("class", klass).attr("transform", "translate(-4, -24)").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");
+ }
+ function getService() {
+ if (services.keepRight && !_qaService) {
+ _qaService = services.keepRight;
+ _qaService.on("loaded", throttledRedraw);
+ } else if (!services.keepRight && _qaService) {
+ _qaService = null;
+ }
+ return _qaService;
+ }
+ function editOn() {
+ if (!layerVisible) {
+ layerVisible = true;
+ drawLayer.style("display", "block");
+ }
+ }
+ function editOff() {
+ if (layerVisible) {
+ layerVisible = false;
+ drawLayer.style("display", "none");
+ drawLayer.selectAll(".qaItem.keepRight").remove();
+ touchLayer.selectAll(".qaItem.keepRight").remove();
+ }
+ }
+ function layerOn() {
+ editOn();
+ drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch10.call("change"));
+ }
+ function layerOff() {
+ throttledRedraw.cancel();
+ drawLayer.interrupt();
+ touchLayer.selectAll(".qaItem.keepRight").remove();
+ drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", () => {
+ editOff();
+ dispatch10.call("change");
+ });
+ }
+ function updateMarkers() {
+ if (!layerVisible || !_layerEnabled)
+ return;
+ const service = getService();
+ const selectedID = context.selectedErrorID();
+ const data = service ? service.getItems(projection2) : [];
+ const getTransform = svgPointTransform(projection2);
+ const markers = drawLayer.selectAll(".qaItem.keepRight").data(data, (d) => d.id);
+ markers.exit().remove();
+ const markersEnter = markers.enter().append("g").attr("class", (d) => `qaItem ${d.service} itemId-${d.id} itemType-${d.parentIssueType}`);
+ markersEnter.append("ellipse").attr("cx", 0.5).attr("cy", 1).attr("rx", 6.5).attr("ry", 3).attr("class", "stroke");
+ markersEnter.append("path").call(markerPath, "shadow");
+ markersEnter.append("use").attr("class", "qaItem-fill").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").attr("xlink:href", "#iD-icon-bolt");
+ markers.merge(markersEnter).sort(sortY).classed("selected", (d) => d.id === selectedID).attr("transform", getTransform);
+ if (touchLayer.empty())
+ return;
+ const fillClass = context.getDebug("target") ? "pink " : "nocolor ";
+ const targets = touchLayer.selectAll(".qaItem.keepRight").data(data, (d) => d.id);
+ targets.exit().remove();
+ targets.enter().append("rect").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").merge(targets).sort(sortY).attr("class", (d) => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`).attr("transform", getTransform);
+ function sortY(a, b) {
+ return a.id === selectedID ? 1 : b.id === selectedID ? -1 : a.severity === "error" && b.severity !== "error" ? 1 : b.severity === "error" && a.severity !== "error" ? -1 : b.loc[1] - a.loc[1];
+ }
+ }
+ function drawKeepRight(selection2) {
+ const service = getService();
+ const surface = context.surface();
+ if (surface && !surface.empty()) {
+ touchLayer = surface.selectAll(".data-layer.touch .layer-touch.markers");
+ }
+ drawLayer = selection2.selectAll(".layer-keepRight").data(service ? [0] : []);
+ drawLayer.exit().remove();
+ drawLayer = drawLayer.enter().append("g").attr("class", "layer-keepRight").style("display", _layerEnabled ? "block" : "none").merge(drawLayer);
+ if (_layerEnabled) {
+ if (service && ~~context.map().zoom() >= minZoom3) {
+ editOn();
+ service.loadIssues(projection2);
+ updateMarkers();
+ } else {
+ editOff();
+ }
+ }
+ }
+ drawKeepRight.enabled = function(val) {
+ if (!arguments.length)
+ return _layerEnabled;
+ _layerEnabled = val;
+ if (_layerEnabled) {
+ layerOn();
+ } else {
+ layerOff();
+ if (context.selectedErrorID()) {
+ context.enter(modeBrowse(context));
+ }
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ drawKeepRight.supported = () => !!getService();
+ return drawKeepRight;
+ }
+
+ // modules/svg/geolocate.js
+ function svgGeolocate(projection2) {
+ var layer = select_default2(null);
+ var _position;
+ function init2() {
+ if (svgGeolocate.initialized)
+ return;
+ svgGeolocate.enabled = false;
+ svgGeolocate.initialized = true;
+ }
+ function showLayer() {
+ layer.style("display", "block");
+ }
+ function hideLayer() {
+ layer.transition().duration(250).style("opacity", 0);
+ }
+ function layerOn() {
+ layer.style("opacity", 0).transition().duration(250).style("opacity", 1);
+ }
+ function layerOff() {
+ layer.style("display", "none");
+ }
+ function transform2(d) {
+ return svgPointTransform(projection2)(d);
+ }
+ function accuracy(accuracy2, loc) {
+ var degreesRadius = geoMetersToLat(accuracy2), tangentLoc = [loc[0], loc[1] + degreesRadius], projectedTangent = projection2(tangentLoc), projectedLoc = projection2([loc[0], loc[1]]);
+ return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
+ }
+ function update() {
+ var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
+ var groups = layer.selectAll(".geolocations").selectAll(".geolocation").data([geolocation]);
+ groups.exit().remove();
+ var pointsEnter = groups.enter().append("g").attr("class", "geolocation");
+ pointsEnter.append("circle").attr("class", "geolocate-radius").attr("dx", "0").attr("dy", "0").attr("fill", "rgb(15,128,225)").attr("fill-opacity", "0.3").attr("r", "0");
+ pointsEnter.append("circle").attr("dx", "0").attr("dy", "0").attr("fill", "rgb(15,128,225)").attr("stroke", "white").attr("stroke-width", "1.5").attr("r", "6");
+ groups.merge(pointsEnter).attr("transform", transform2);
+ layer.select(".geolocate-radius").attr("r", accuracy(_position.coords.accuracy, geolocation.loc));
+ }
+ function drawLocation(selection2) {
+ var enabled = svgGeolocate.enabled;
+ layer = selection2.selectAll(".layer-geolocate").data([0]);
+ layer.exit().remove();
+ var layerEnter = layer.enter().append("g").attr("class", "layer-geolocate").style("display", enabled ? "block" : "none");
+ layerEnter.append("g").attr("class", "geolocations");
+ layer = layerEnter.merge(layer);
+ if (enabled) {
+ update();
+ } else {
+ layerOff();
+ }
+ }
+ drawLocation.enabled = function(position, enabled) {
+ if (!arguments.length)
+ return svgGeolocate.enabled;
+ _position = position;
+ svgGeolocate.enabled = enabled;
+ if (svgGeolocate.enabled) {
+ showLayer();
+ layerOn();
+ } else {
+ hideLayer();
+ }
+ return this;
+ };
+ init2();
+ return drawLocation;
+ }
+
+ // modules/svg/labels.js
+ var import_rbush7 = __toESM(require_rbush_min());
+ function svgLabels(projection2, context) {
+ var path = path_default(projection2);
+ var detected = utilDetect();
+ var baselineHack = detected.ie || detected.browser.toLowerCase() === "edge" || detected.browser.toLowerCase() === "firefox" && detected.version >= 70;
+ var _rdrawn = new import_rbush7.default();
+ var _rskipped = new import_rbush7.default();
+ var _textWidthCache = {};
+ var _entitybboxes = {};
+ var labelStack = [
+ ["line", "aeroway", "*", 12],
+ ["line", "highway", "motorway", 12],
+ ["line", "highway", "trunk", 12],
+ ["line", "highway", "primary", 12],
+ ["line", "highway", "secondary", 12],
+ ["line", "highway", "tertiary", 12],
+ ["line", "highway", "*", 12],
+ ["line", "railway", "*", 12],
+ ["line", "waterway", "*", 12],
+ ["area", "aeroway", "*", 12],
+ ["area", "amenity", "*", 12],
+ ["area", "building", "*", 12],
+ ["area", "historic", "*", 12],
+ ["area", "leisure", "*", 12],
+ ["area", "man_made", "*", 12],
+ ["area", "natural", "*", 12],
+ ["area", "shop", "*", 12],
+ ["area", "tourism", "*", 12],
+ ["area", "camp_site", "*", 12],
+ ["point", "aeroway", "*", 10],
+ ["point", "amenity", "*", 10],
+ ["point", "building", "*", 10],
+ ["point", "historic", "*", 10],
+ ["point", "leisure", "*", 10],
+ ["point", "man_made", "*", 10],
+ ["point", "natural", "*", 10],
+ ["point", "shop", "*", 10],
+ ["point", "tourism", "*", 10],
+ ["point", "camp_site", "*", 10],
+ ["line", "name", "*", 12],
+ ["area", "name", "*", 12],
+ ["point", "name", "*", 10]
+ ];
+ function shouldSkipIcon(preset) {
+ var noIcons = ["building", "landuse", "natural"];
+ return noIcons.some(function(s) {
+ return preset.id.indexOf(s) >= 0;
+ });
+ }
+ function get3(array2, prop) {
+ return function(d, i2) {
+ return array2[i2][prop];
+ };
+ }
+ function textWidth(text2, size, elem) {
+ var c = _textWidthCache[size];
+ if (!c)
+ c = _textWidthCache[size] = {};
+ if (c[text2]) {
+ return c[text2];
+ } else if (elem) {
+ c[text2] = elem.getComputedTextLength();
+ return c[text2];
+ } else {
+ var str2 = encodeURIComponent(text2).match(/%[CDEFcdef]/g);
+ if (str2 === null) {
+ return size / 3 * 2 * text2.length;
+ } else {
+ return size / 3 * (2 * text2.length + str2.length);
+ }
+ }
+ }
+ function drawLinePaths(selection2, entities, filter2, classes, labels) {
+ var paths = selection2.selectAll("path").filter(filter2).data(entities, osmEntity.key);
+ paths.exit().remove();
+ paths.enter().append("path").style("stroke-width", get3(labels, "font-size")).attr("id", function(d) {
+ return "ideditor-labelpath-" + d.id;
+ }).attr("class", classes).merge(paths).attr("d", get3(labels, "lineString"));
+ }
+ function drawLineLabels(selection2, entities, filter2, classes, labels) {
+ var texts = selection2.selectAll("text." + classes).filter(filter2).data(entities, osmEntity.key);
+ texts.exit().remove();
+ texts.enter().append("text").attr("class", function(d, i2) {
+ return classes + " " + labels[i2].classes + " " + d.id;
+ }).attr("dy", baselineHack ? "0.35em" : null).append("textPath").attr("class", "textpath");
+ selection2.selectAll("text." + classes).selectAll(".textpath").filter(filter2).data(entities, osmEntity.key).attr("startOffset", "50%").attr("xlink:href", function(d) {
+ return "#ideditor-labelpath-" + d.id;
+ }).text(utilDisplayNameForPath);
+ }
+ function drawPointLabels(selection2, entities, filter2, classes, labels) {
+ var texts = selection2.selectAll("text." + classes).filter(filter2).data(entities, osmEntity.key);
+ texts.exit().remove();
+ texts.enter().append("text").attr("class", function(d, i2) {
+ return classes + " " + labels[i2].classes + " " + d.id;
+ }).merge(texts).attr("x", get3(labels, "x")).attr("y", get3(labels, "y")).style("text-anchor", get3(labels, "textAnchor")).text(utilDisplayName).each(function(d, i2) {
+ textWidth(utilDisplayName(d), labels[i2].height, this);
+ });
+ }
+ function drawAreaLabels(selection2, entities, filter2, classes, labels) {
+ entities = entities.filter(hasText);
+ labels = labels.filter(hasText);
+ drawPointLabels(selection2, entities, filter2, classes, labels);
+ function hasText(d, i2) {
+ return labels[i2].hasOwnProperty("x") && labels[i2].hasOwnProperty("y");
+ }
+ }
+ function drawAreaIcons(selection2, entities, filter2, classes, labels) {
+ var icons = selection2.selectAll("use." + classes).filter(filter2).data(entities, osmEntity.key);
+ icons.exit().remove();
+ icons.enter().append("use").attr("class", "icon " + classes).attr("width", "17px").attr("height", "17px").merge(icons).attr("transform", get3(labels, "transform")).attr("xlink:href", function(d) {
+ var preset = _mainPresetIndex.match(d, context.graph());
+ var picon = preset && preset.icon;
+ return picon ? "#" + picon : "";
+ });
+ }
+ function drawCollisionBoxes(selection2, rtree, which) {
+ var classes = "debug " + which + " " + (which === "debug-skipped" ? "orange" : "yellow");
+ var gj = [];
+ if (context.getDebug("collision")) {
+ gj = rtree.all().map(function(d) {
+ return { type: "Polygon", coordinates: [[
+ [d.minX, d.minY],
+ [d.maxX, d.minY],
+ [d.maxX, d.maxY],
+ [d.minX, d.maxY],
+ [d.minX, d.minY]
+ ]] };
+ });
+ }
+ var boxes = selection2.selectAll("." + which).data(gj);
+ boxes.exit().remove();
+ boxes.enter().append("path").attr("class", classes).merge(boxes).attr("d", path_default());
+ }
+ function drawLabels(selection2, graph, entities, filter2, dimensions, fullRedraw) {
+ var wireframe = context.surface().classed("fill-wireframe");
+ var zoom = geoScaleToZoom(projection2.scale());
+ var labelable = [];
+ var renderNodeAs = {};
+ var i2, j2, k, entity, geometry;
+ for (i2 = 0; i2 < labelStack.length; i2++) {
+ labelable.push([]);
+ }
+ if (fullRedraw) {
+ _rdrawn.clear();
+ _rskipped.clear();
+ _entitybboxes = {};
+ } else {
+ for (i2 = 0; i2 < entities.length; i2++) {
+ entity = entities[i2];
+ var toRemove = [].concat(_entitybboxes[entity.id] || []).concat(_entitybboxes[entity.id + "I"] || []);
+ for (j2 = 0; j2 < toRemove.length; j2++) {
+ _rdrawn.remove(toRemove[j2]);
+ _rskipped.remove(toRemove[j2]);
+ }
+ }
+ }
+ for (i2 = 0; i2 < entities.length; i2++) {
+ entity = entities[i2];
+ geometry = entity.geometry(graph);
+ if (geometry === "point" || geometry === "vertex" && isInterestingVertex(entity)) {
+ var hasDirections = entity.directions(graph, projection2).length;
+ var markerPadding;
+ if (!wireframe && geometry === "point" && !(zoom >= 18 && hasDirections)) {
+ renderNodeAs[entity.id] = "point";
+ markerPadding = 20;
+ } else {
+ renderNodeAs[entity.id] = "vertex";
+ markerPadding = 0;
+ }
+ var coord2 = projection2(entity.loc);
+ var nodePadding = 10;
+ var bbox = {
+ minX: coord2[0] - nodePadding,
+ minY: coord2[1] - nodePadding - markerPadding,
+ maxX: coord2[0] + nodePadding,
+ maxY: coord2[1] + nodePadding
+ };
+ doInsert(bbox, entity.id + "P");
+ }
+ if (geometry === "vertex") {
+ geometry = "point";
+ }
+ var preset = geometry === "area" && _mainPresetIndex.match(entity, graph);
+ var icon2 = preset && !shouldSkipIcon(preset) && preset.icon;
+ if (!icon2 && !utilDisplayName(entity))
+ continue;
+ for (k = 0; k < labelStack.length; k++) {
+ var matchGeom = labelStack[k][0];
+ var matchKey = labelStack[k][1];
+ var matchVal = labelStack[k][2];
+ var hasVal = entity.tags[matchKey];
+ if (geometry === matchGeom && hasVal && (matchVal === "*" || matchVal === hasVal)) {
+ labelable[k].push(entity);
+ break;
+ }
+ }
+ }
+ var positions = {
+ point: [],
+ line: [],
+ area: []
+ };
+ var labelled = {
+ point: [],
+ line: [],
+ area: []
+ };
+ for (k = 0; k < labelable.length; k++) {
+ var fontSize = labelStack[k][3];
+ for (i2 = 0; i2 < labelable[k].length; i2++) {
+ entity = labelable[k][i2];
+ geometry = entity.geometry(graph);
+ var getName = geometry === "line" ? utilDisplayNameForPath : utilDisplayName;
+ var name2 = getName(entity);
+ var width = name2 && textWidth(name2, fontSize);
+ var p = null;
+ if (geometry === "point" || geometry === "vertex") {
+ if (wireframe)
+ continue;
+ var renderAs = renderNodeAs[entity.id];
+ if (renderAs === "vertex" && zoom < 17)
+ continue;
+ p = getPointLabel(entity, width, fontSize, renderAs);
+ } else if (geometry === "line") {
+ p = getLineLabel(entity, width, fontSize);
+ } else if (geometry === "area") {
+ p = getAreaLabel(entity, width, fontSize);
+ }
+ if (p) {
+ if (geometry === "vertex") {
+ geometry = "point";
+ }
+ p.classes = geometry + " tag-" + labelStack[k][1];
+ positions[geometry].push(p);
+ labelled[geometry].push(entity);
+ }
+ }
+ }
+ function isInterestingVertex(entity2) {
+ var selectedIDs = context.selectedIDs();
+ return entity2.hasInterestingTags() || entity2.isEndpoint(graph) || entity2.isConnected(graph) || selectedIDs.indexOf(entity2.id) !== -1 || graph.parentWays(entity2).some(function(parent) {
+ return selectedIDs.indexOf(parent.id) !== -1;
+ });
+ }
+ function getPointLabel(entity2, width2, height, geometry2) {
+ var y = geometry2 === "point" ? -12 : 0;
+ var pointOffsets = {
+ ltr: [15, y, "start"],
+ rtl: [-15, y, "end"]
+ };
+ var textDirection = _mainLocalizer.textDirection();
+ var coord3 = projection2(entity2.loc);
+ var textPadding = 2;
+ var offset = pointOffsets[textDirection];
+ var p2 = {
+ height,
+ width: width2,
+ x: coord3[0] + offset[0],
+ y: coord3[1] + offset[1],
+ textAnchor: offset[2]
+ };
+ var bbox2;
+ if (textDirection === "rtl") {
+ bbox2 = {
+ minX: p2.x - width2 - textPadding,
+ minY: p2.y - height / 2 - textPadding,
+ maxX: p2.x + textPadding,
+ maxY: p2.y + height / 2 + textPadding
+ };
+ } else {
+ bbox2 = {
+ minX: p2.x - textPadding,
+ minY: p2.y - height / 2 - textPadding,
+ maxX: p2.x + width2 + textPadding,
+ maxY: p2.y + height / 2 + textPadding
+ };
+ }
+ if (tryInsert([bbox2], entity2.id, true)) {
+ return p2;
+ }
+ }
+ function getLineLabel(entity2, width2, height) {
+ var viewport = geoExtent(context.projection.clipExtent()).polygon();
+ var points = graph.childNodes(entity2).map(function(node) {
+ return projection2(node.loc);
+ });
+ var length = geoPathLength(points);
+ if (length < width2 + 20)
+ return;
+ var lineOffsets = [
+ 50,
+ 45,
+ 55,
+ 40,
+ 60,
+ 35,
+ 65,
+ 30,
+ 70,
+ 25,
+ 75,
+ 20,
+ 80,
+ 15,
+ 95,
+ 10,
+ 90,
+ 5,
+ 95
+ ];
+ var padding = 3;
+ for (var i3 = 0; i3 < lineOffsets.length; i3++) {
+ var offset = lineOffsets[i3];
+ var middle = offset / 100 * length;
+ var start2 = middle - width2 / 2;
+ if (start2 < 0 || start2 + width2 > length)
+ continue;
+ var sub = subpath(points, start2, start2 + width2);
+ if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
+ continue;
+ }
+ var isReverse = reverse(sub);
+ if (isReverse) {
+ sub = sub.reverse();
+ }
+ var bboxes = [];
+ var boxsize = (height + 2) / 2;
+ for (var j3 = 0; j3 < sub.length - 1; j3++) {
+ var a = sub[j3];
+ var b = sub[j3 + 1];
+ var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
+ for (var box = 0; box < num; box++) {
+ var p2 = geoVecInterp(a, b, box / num);
+ var x05 = p2[0] - boxsize - padding;
+ var y05 = p2[1] - boxsize - padding;
+ var x12 = p2[0] + boxsize + padding;
+ var y12 = p2[1] + boxsize + padding;
+ bboxes.push({
+ minX: Math.min(x05, x12),
+ minY: Math.min(y05, y12),
+ maxX: Math.max(x05, x12),
+ maxY: Math.max(y05, y12)
+ });
+ }
+ }
+ if (tryInsert(bboxes, entity2.id, false)) {
+ return {
+ "font-size": height + 2,
+ lineString: lineString2(sub),
+ startOffset: offset + "%"
+ };
+ }
+ }
+ function reverse(p3) {
+ var angle2 = Math.atan2(p3[1][1] - p3[0][1], p3[1][0] - p3[0][0]);
+ return !(p3[0][0] < p3[p3.length - 1][0] && angle2 < Math.PI / 2 && angle2 > -Math.PI / 2);
+ }
+ function lineString2(points2) {
+ return "M" + points2.join("L");
+ }
+ function subpath(points2, from, to) {
+ var sofar = 0;
+ var start3, end, i0, i1;
+ for (var i4 = 0; i4 < points2.length - 1; i4++) {
+ var a2 = points2[i4];
+ var b2 = points2[i4 + 1];
+ var current = geoVecLength(a2, b2);
+ var portion;
+ if (!start3 && sofar + current >= from) {
+ portion = (from - sofar) / current;
+ start3 = [
+ a2[0] + portion * (b2[0] - a2[0]),
+ a2[1] + portion * (b2[1] - a2[1])
+ ];
+ i0 = i4 + 1;
+ }
+ if (!end && sofar + current >= to) {
+ portion = (to - sofar) / current;
+ end = [
+ a2[0] + portion * (b2[0] - a2[0]),
+ a2[1] + portion * (b2[1] - a2[1])
+ ];
+ i1 = i4 + 1;
+ }
+ sofar += current;
+ }
+ var result = points2.slice(i0, i1);
+ result.unshift(start3);
+ result.push(end);
+ return result;
+ }
+ }
+ function getAreaLabel(entity2, width2, height) {
+ var centroid = path.centroid(entity2.asGeoJSON(graph));
+ var extent = entity2.extent(graph);
+ var areaWidth = projection2(extent[1])[0] - projection2(extent[0])[0];
+ if (isNaN(centroid[0]) || areaWidth < 20)
+ return;
+ var preset2 = _mainPresetIndex.match(entity2, context.graph());
+ var picon = preset2 && preset2.icon;
+ var iconSize = 17;
+ var padding = 2;
+ var p2 = {};
+ if (picon) {
+ if (addIcon()) {
+ addLabel(iconSize + padding);
+ return p2;
+ }
+ } else {
+ if (addLabel(0)) {
+ return p2;
+ }
+ }
+ function addIcon() {
+ var iconX = centroid[0] - iconSize / 2;
+ var iconY = centroid[1] - iconSize / 2;
+ var bbox2 = {
+ minX: iconX,
+ minY: iconY,
+ maxX: iconX + iconSize,
+ maxY: iconY + iconSize
+ };
+ if (tryInsert([bbox2], entity2.id + "I", true)) {
+ p2.transform = "translate(" + iconX + "," + iconY + ")";
+ return true;
+ }
+ return false;
+ }
+ function addLabel(yOffset) {
+ if (width2 && areaWidth >= width2 + 20) {
+ var labelX = centroid[0];
+ var labelY = centroid[1] + yOffset;
+ var bbox2 = {
+ minX: labelX - width2 / 2 - padding,
+ minY: labelY - height / 2 - padding,
+ maxX: labelX + width2 / 2 + padding,
+ maxY: labelY + height / 2 + padding
+ };
+ if (tryInsert([bbox2], entity2.id, true)) {
+ p2.x = labelX;
+ p2.y = labelY;
+ p2.textAnchor = "middle";
+ p2.height = height;
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+ function doInsert(bbox2, id2) {
+ bbox2.id = id2;
+ var oldbox = _entitybboxes[id2];
+ if (oldbox) {
+ _rdrawn.remove(oldbox);
+ }
+ _entitybboxes[id2] = bbox2;
+ _rdrawn.insert(bbox2);
+ }
+ function tryInsert(bboxes, id2, saveSkipped) {
+ var skipped = false;
+ for (var i3 = 0; i3 < bboxes.length; i3++) {
+ var bbox2 = bboxes[i3];
+ bbox2.id = id2;
+ if (bbox2.minX < 0 || bbox2.minY < 0 || bbox2.maxX > dimensions[0] || bbox2.maxY > dimensions[1]) {
+ skipped = true;
+ break;
+ }
+ if (_rdrawn.collides(bbox2)) {
+ skipped = true;
+ break;
+ }
+ }
+ _entitybboxes[id2] = bboxes;
+ if (skipped) {
+ if (saveSkipped) {
+ _rskipped.load(bboxes);
+ }
+ } else {
+ _rdrawn.load(bboxes);
+ }
+ return !skipped;
+ }
+ var layer = selection2.selectAll(".layer-osm.labels");
+ layer.selectAll(".labels-group").data(["halo", "label", "debug"]).enter().append("g").attr("class", function(d) {
+ return "labels-group " + d;
+ });
+ var halo = layer.selectAll(".labels-group.halo");
+ var label = layer.selectAll(".labels-group.label");
+ var debug2 = layer.selectAll(".labels-group.debug");
+ drawPointLabels(label, labelled.point, filter2, "pointlabel", positions.point);
+ drawPointLabels(halo, labelled.point, filter2, "pointlabel-halo", positions.point);
+ drawLinePaths(layer, labelled.line, filter2, "", positions.line);
+ drawLineLabels(label, labelled.line, filter2, "linelabel", positions.line);
+ drawLineLabels(halo, labelled.line, filter2, "linelabel-halo", positions.line);
+ drawAreaLabels(label, labelled.area, filter2, "arealabel", positions.area);
+ drawAreaLabels(halo, labelled.area, filter2, "arealabel-halo", positions.area);
+ drawAreaIcons(label, labelled.area, filter2, "areaicon", positions.area);
+ drawAreaIcons(halo, labelled.area, filter2, "areaicon-halo", positions.area);
+ drawCollisionBoxes(debug2, _rskipped, "debug-skipped");
+ drawCollisionBoxes(debug2, _rdrawn, "debug-drawn");
+ layer.call(filterLabels);
+ }
+ function filterLabels(selection2) {
+ var drawLayer = selection2.selectAll(".layer-osm.labels");
+ var layers = drawLayer.selectAll(".labels-group.halo, .labels-group.label");
+ layers.selectAll(".nolabel").classed("nolabel", false);
+ var mouse = context.map().mouse();
+ var graph = context.graph();
+ var selectedIDs = context.selectedIDs();
+ var ids = [];
+ var pad2, bbox;
+ if (mouse) {
+ pad2 = 20;
+ bbox = { minX: mouse[0] - pad2, minY: mouse[1] - pad2, maxX: mouse[0] + pad2, maxY: mouse[1] + pad2 };
+ var nearMouse = _rdrawn.search(bbox).map(function(entity2) {
+ return entity2.id;
+ });
+ ids.push.apply(ids, nearMouse);
+ }
+ for (var i2 = 0; i2 < selectedIDs.length; i2++) {
+ var entity = graph.hasEntity(selectedIDs[i2]);
+ if (entity && entity.type === "node") {
+ ids.push(selectedIDs[i2]);
+ }
+ }
+ layers.selectAll(utilEntitySelector(ids)).classed("nolabel", true);
+ var debug2 = selection2.selectAll(".labels-group.debug");
+ var gj = [];
+ if (context.getDebug("collision")) {
+ gj = bbox ? [{
+ type: "Polygon",
+ coordinates: [[
+ [bbox.minX, bbox.minY],
+ [bbox.maxX, bbox.minY],
+ [bbox.maxX, bbox.maxY],
+ [bbox.minX, bbox.maxY],
+ [bbox.minX, bbox.minY]
+ ]]
+ }] : [];
+ }
+ var box = debug2.selectAll(".debug-mouse").data(gj);
+ box.exit().remove();
+ box.enter().append("path").attr("class", "debug debug-mouse yellow").merge(box).attr("d", path_default());
+ }
+ var throttleFilterLabels = throttle_default(filterLabels, 100);
+ drawLabels.observe = function(selection2) {
+ var listener = function() {
+ throttleFilterLabels(selection2);
+ };
+ selection2.on("mousemove.hidelabels", listener);
+ context.on("enter.hidelabels", listener);
+ };
+ drawLabels.off = function(selection2) {
+ throttleFilterLabels.cancel();
+ selection2.on("mousemove.hidelabels", null);
+ context.on("enter.hidelabels", null);
+ };
+ return drawLabels;
+ }
+
+ // modules/svg/improveOSM.js
+ var _layerEnabled2 = false;
+ var _qaService2;
+ function svgImproveOSM(projection2, context, dispatch10) {
+ const throttledRedraw = throttle_default(() => dispatch10.call("change"), 1e3);
+ const minZoom3 = 12;
+ let touchLayer = select_default2(null);
+ let drawLayer = select_default2(null);
+ let layerVisible = false;
+ function markerPath(selection2, klass) {
+ selection2.attr("class", klass).attr("transform", "translate(-10, -28)").attr("points", "16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6");
+ }
+ function getService() {
+ if (services.improveOSM && !_qaService2) {
+ _qaService2 = services.improveOSM;
+ _qaService2.on("loaded", throttledRedraw);
+ } else if (!services.improveOSM && _qaService2) {
+ _qaService2 = null;
+ }
+ return _qaService2;
+ }
+ function editOn() {
+ if (!layerVisible) {
+ layerVisible = true;
+ drawLayer.style("display", "block");
+ }
+ }
+ function editOff() {
+ if (layerVisible) {
+ layerVisible = false;
+ drawLayer.style("display", "none");
+ drawLayer.selectAll(".qaItem.improveOSM").remove();
+ touchLayer.selectAll(".qaItem.improveOSM").remove();
+ }
+ }
+ function layerOn() {
+ editOn();
+ drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch10.call("change"));
+ }
+ function layerOff() {
+ throttledRedraw.cancel();
+ drawLayer.interrupt();
+ touchLayer.selectAll(".qaItem.improveOSM").remove();
+ drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", () => {
+ editOff();
+ dispatch10.call("change");
+ });
+ }
+ function updateMarkers() {
+ if (!layerVisible || !_layerEnabled2)
+ return;
+ const service = getService();
+ const selectedID = context.selectedErrorID();
+ const data = service ? service.getItems(projection2) : [];
+ const getTransform = svgPointTransform(projection2);
+ const markers = drawLayer.selectAll(".qaItem.improveOSM").data(data, (d) => d.id);
+ markers.exit().remove();
+ const markersEnter = markers.enter().append("g").attr("class", (d) => `qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
+ markersEnter.append("polygon").call(markerPath, "shadow");
+ markersEnter.append("ellipse").attr("cx", 0).attr("cy", 0).attr("rx", 4.5).attr("ry", 2).attr("class", "stroke");
+ markersEnter.append("polygon").attr("fill", "currentColor").call(markerPath, "qaItem-fill");
+ markersEnter.append("use").attr("class", "icon-annotation").attr("transform", "translate(-6, -22)").attr("width", "12px").attr("height", "12px").attr("xlink:href", (d) => d.icon ? "#" + d.icon : "");
+ markers.merge(markersEnter).sort(sortY).classed("selected", (d) => d.id === selectedID).attr("transform", getTransform);
+ if (touchLayer.empty())
+ return;
+ const fillClass = context.getDebug("target") ? "pink " : "nocolor ";
+ const targets = touchLayer.selectAll(".qaItem.improveOSM").data(data, (d) => d.id);
+ targets.exit().remove();
+ targets.enter().append("rect").attr("width", "20px").attr("height", "30px").attr("x", "-10px").attr("y", "-28px").merge(targets).sort(sortY).attr("class", (d) => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`).attr("transform", getTransform);
+ function sortY(a, b) {
+ return a.id === selectedID ? 1 : b.id === selectedID ? -1 : b.loc[1] - a.loc[1];
+ }
+ }
+ function drawImproveOSM(selection2) {
+ const service = getService();
+ const surface = context.surface();
+ if (surface && !surface.empty()) {
+ touchLayer = surface.selectAll(".data-layer.touch .layer-touch.markers");
+ }
+ drawLayer = selection2.selectAll(".layer-improveOSM").data(service ? [0] : []);
+ drawLayer.exit().remove();
+ drawLayer = drawLayer.enter().append("g").attr("class", "layer-improveOSM").style("display", _layerEnabled2 ? "block" : "none").merge(drawLayer);
+ if (_layerEnabled2) {
+ if (service && ~~context.map().zoom() >= minZoom3) {
+ editOn();
+ service.loadIssues(projection2);
+ updateMarkers();
+ } else {
+ editOff();
+ }
+ }
+ }
+ drawImproveOSM.enabled = function(val) {
+ if (!arguments.length)
+ return _layerEnabled2;
+ _layerEnabled2 = val;
+ if (_layerEnabled2) {
+ layerOn();
+ } else {
+ layerOff();
+ if (context.selectedErrorID()) {
+ context.enter(modeBrowse(context));
+ }
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ drawImproveOSM.supported = () => !!getService();
+ return drawImproveOSM;
+ }
+
+ // modules/svg/osmose.js
+ var _layerEnabled3 = false;
+ var _qaService3;
+ function svgOsmose(projection2, context, dispatch10) {
+ const throttledRedraw = throttle_default(() => dispatch10.call("change"), 1e3);
+ const minZoom3 = 12;
+ let touchLayer = select_default2(null);
+ let drawLayer = select_default2(null);
+ let layerVisible = false;
+ function markerPath(selection2, klass) {
+ selection2.attr("class", klass).attr("transform", "translate(-10, -28)").attr("points", "16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6");
+ }
+ function getService() {
+ if (services.osmose && !_qaService3) {
+ _qaService3 = services.osmose;
+ _qaService3.on("loaded", throttledRedraw);
+ } else if (!services.osmose && _qaService3) {
+ _qaService3 = null;
+ }
+ return _qaService3;
+ }
+ function editOn() {
+ if (!layerVisible) {
+ layerVisible = true;
+ drawLayer.style("display", "block");
+ }
+ }
+ function editOff() {
+ if (layerVisible) {
+ layerVisible = false;
+ drawLayer.style("display", "none");
+ drawLayer.selectAll(".qaItem.osmose").remove();
+ touchLayer.selectAll(".qaItem.osmose").remove();
+ }
+ }
+ function layerOn() {
+ editOn();
+ drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch10.call("change"));
+ }
+ function layerOff() {
+ throttledRedraw.cancel();
+ drawLayer.interrupt();
+ touchLayer.selectAll(".qaItem.osmose").remove();
+ drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", () => {
+ editOff();
+ dispatch10.call("change");
+ });
+ }
+ function updateMarkers() {
+ if (!layerVisible || !_layerEnabled3)
+ return;
+ const service = getService();
+ const selectedID = context.selectedErrorID();
+ const data = service ? service.getItems(projection2) : [];
+ const getTransform = svgPointTransform(projection2);
+ const markers = drawLayer.selectAll(".qaItem.osmose").data(data, (d) => d.id);
+ markers.exit().remove();
+ const markersEnter = markers.enter().append("g").attr("class", (d) => `qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
+ markersEnter.append("polygon").call(markerPath, "shadow");
+ markersEnter.append("ellipse").attr("cx", 0).attr("cy", 0).attr("rx", 4.5).attr("ry", 2).attr("class", "stroke");
+ markersEnter.append("polygon").attr("fill", (d) => service.getColor(d.item)).call(markerPath, "qaItem-fill");
+ markersEnter.append("use").attr("class", "icon-annotation").attr("transform", "translate(-6, -22)").attr("width", "12px").attr("height", "12px").attr("xlink:href", (d) => d.icon ? "#" + d.icon : "");
+ markers.merge(markersEnter).sort(sortY).classed("selected", (d) => d.id === selectedID).attr("transform", getTransform);
+ if (touchLayer.empty())
+ return;
+ const fillClass = context.getDebug("target") ? "pink" : "nocolor";
+ const targets = touchLayer.selectAll(".qaItem.osmose").data(data, (d) => d.id);
+ targets.exit().remove();
+ targets.enter().append("rect").attr("width", "20px").attr("height", "30px").attr("x", "-10px").attr("y", "-28px").merge(targets).sort(sortY).attr("class", (d) => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`).attr("transform", getTransform);
+ function sortY(a, b) {
+ return a.id === selectedID ? 1 : b.id === selectedID ? -1 : b.loc[1] - a.loc[1];
+ }
+ }
+ function drawOsmose(selection2) {
+ const service = getService();
+ const surface = context.surface();
+ if (surface && !surface.empty()) {
+ touchLayer = surface.selectAll(".data-layer.touch .layer-touch.markers");
+ }
+ drawLayer = selection2.selectAll(".layer-osmose").data(service ? [0] : []);
+ drawLayer.exit().remove();
+ drawLayer = drawLayer.enter().append("g").attr("class", "layer-osmose").style("display", _layerEnabled3 ? "block" : "none").merge(drawLayer);
+ if (_layerEnabled3) {
+ if (service && ~~context.map().zoom() >= minZoom3) {
+ editOn();
+ service.loadIssues(projection2);
+ updateMarkers();
+ } else {
+ editOff();
+ }
+ }
+ }
+ drawOsmose.enabled = function(val) {
+ if (!arguments.length)
+ return _layerEnabled3;
+ _layerEnabled3 = val;
+ if (_layerEnabled3) {
+ getService().loadStrings().then(layerOn).catch((err) => {
+ console.log(err);
+ });
+ } else {
+ layerOff();
+ if (context.selectedErrorID()) {
+ context.enter(modeBrowse(context));
+ }
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ drawOsmose.supported = () => !!getService();
+ return drawOsmose;
+ }
+
+ // modules/svg/streetside.js
+ function svgStreetside(projection2, context, dispatch10) {
+ var throttledRedraw = throttle_default(function() {
+ dispatch10.call("change");
+ }, 1e3);
+ var minZoom3 = 14;
+ var minMarkerZoom = 16;
+ var minViewfieldZoom = 18;
+ var layer = select_default2(null);
+ var _viewerYaw = 0;
+ var _selectedSequence = null;
+ var _streetside;
+ function init2() {
+ if (svgStreetside.initialized)
+ return;
+ svgStreetside.enabled = false;
+ svgStreetside.initialized = true;
+ }
+ function getService() {
+ if (services.streetside && !_streetside) {
+ _streetside = services.streetside;
+ _streetside.event.on("viewerChanged.svgStreetside", viewerChanged).on("loadedImages.svgStreetside", throttledRedraw);
+ } else if (!services.streetside && _streetside) {
+ _streetside = null;
+ }
+ return _streetside;
+ }
+ function showLayer() {
+ var service = getService();
+ if (!service)
+ return;
+ editOn();
+ layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() {
+ dispatch10.call("change");
+ });
+ }
+ function hideLayer() {
+ throttledRedraw.cancel();
+ layer.transition().duration(250).style("opacity", 0).on("end", editOff);
+ }
+ function editOn() {
+ layer.style("display", "block");
+ }
+ function editOff() {
+ layer.selectAll(".viewfield-group").remove();
+ layer.style("display", "none");
+ }
+ function click(d3_event, d) {
+ var service = getService();
+ if (!service)
+ return;
+ if (d.sequenceKey !== _selectedSequence) {
+ _viewerYaw = 0;
+ }
+ _selectedSequence = d.sequenceKey;
+ service.ensureViewerLoaded(context).then(function() {
+ service.selectImage(context, d.key).yaw(_viewerYaw).showViewer(context);
+ });
+ context.map().centerEase(d.loc);
+ }
+ function mouseover(d3_event, d) {
+ var service = getService();
+ if (service)
+ service.setStyles(context, d);
+ }
+ function mouseout() {
+ var service = getService();
+ if (service)
+ service.setStyles(context, null);
+ }
+ function transform2(d) {
+ var t = svgPointTransform(projection2)(d);
+ var rot = d.ca + _viewerYaw;
+ if (rot) {
+ t += " rotate(" + Math.floor(rot) + ",0,0)";
+ }
+ return t;
+ }
+ function viewerChanged() {
+ var service = getService();
+ if (!service)
+ return;
+ var viewer = service.viewer();
+ if (!viewer)
+ return;
+ _viewerYaw = viewer.getYaw();
+ if (context.map().isTransformed())
+ return;
+ layer.selectAll(".viewfield-group.currentView").attr("transform", transform2);
+ }
+ function filterBubbles(bubbles) {
+ var fromDate = context.photos().fromDate();
+ var toDate = context.photos().toDate();
+ var usernames = context.photos().usernames();
+ if (fromDate) {
+ var fromTimestamp = new Date(fromDate).getTime();
+ bubbles = bubbles.filter(function(bubble) {
+ return new Date(bubble.captured_at).getTime() >= fromTimestamp;
+ });
+ }
+ if (toDate) {
+ var toTimestamp = new Date(toDate).getTime();
+ bubbles = bubbles.filter(function(bubble) {
+ return new Date(bubble.captured_at).getTime() <= toTimestamp;
+ });
+ }
+ if (usernames) {
+ bubbles = bubbles.filter(function(bubble) {
+ return usernames.indexOf(bubble.captured_by) !== -1;
+ });
+ }
+ return bubbles;
+ }
+ function filterSequences(sequences) {
+ var fromDate = context.photos().fromDate();
+ var toDate = context.photos().toDate();
+ var usernames = context.photos().usernames();
+ if (fromDate) {
+ var fromTimestamp = new Date(fromDate).getTime();
+ sequences = sequences.filter(function(sequences2) {
+ return new Date(sequences2.properties.captured_at).getTime() >= fromTimestamp;
+ });
+ }
+ if (toDate) {
+ var toTimestamp = new Date(toDate).getTime();
+ sequences = sequences.filter(function(sequences2) {
+ return new Date(sequences2.properties.captured_at).getTime() <= toTimestamp;
+ });
+ }
+ if (usernames) {
+ sequences = sequences.filter(function(sequences2) {
+ return usernames.indexOf(sequences2.properties.captured_by) !== -1;
+ });
+ }
+ return sequences;
+ }
+ function update() {
+ var viewer = context.container().select(".photoviewer");
+ var selected = viewer.empty() ? void 0 : viewer.datum();
+ var z = ~~context.map().zoom();
+ var showMarkers = z >= minMarkerZoom;
+ var showViewfields = z >= minViewfieldZoom;
+ var service = getService();
+ var sequences = [];
+ var bubbles = [];
+ if (context.photos().showsPanoramic()) {
+ sequences = service ? service.sequences(projection2) : [];
+ bubbles = service && showMarkers ? service.bubbles(projection2) : [];
+ sequences = filterSequences(sequences);
+ bubbles = filterBubbles(bubbles);
+ }
+ var traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d) {
+ return d.properties.key;
+ });
+ traces.exit().remove();
+ traces = traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson);
+ var groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(bubbles, function(d) {
+ return d.key + (d.sequenceKey ? "v1" : "v0");
+ });
+ groups.exit().remove();
+ var groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click);
+ groupsEnter.append("g").attr("class", "viewfield-scale");
+ var markers = groups.merge(groupsEnter).sort(function(a, b) {
+ return a === selected ? 1 : b === selected ? -1 : b.loc[1] - a.loc[1];
+ }).attr("transform", transform2).select(".viewfield-scale");
+ markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6");
+ var viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []);
+ viewfields.exit().remove();
+ viewfields.enter().insert("path", "circle").attr("class", "viewfield").attr("transform", "scale(1.5,1.5),translate(-8, -13)").attr("d", viewfieldPath);
+ function viewfieldPath() {
+ var d = this.parentNode.__data__;
+ if (d.pano) {
+ return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0";
+ } else {
+ return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z";
+ }
+ }
+ }
+ function drawImages(selection2) {
+ var enabled = svgStreetside.enabled;
+ var service = getService();
+ layer = selection2.selectAll(".layer-streetside-images").data(service ? [0] : []);
+ layer.exit().remove();
+ var layerEnter = layer.enter().append("g").attr("class", "layer-streetside-images").style("display", enabled ? "block" : "none");
+ layerEnter.append("g").attr("class", "sequences");
+ layerEnter.append("g").attr("class", "markers");
+ layer = layerEnter.merge(layer);
+ if (enabled) {
+ if (service && ~~context.map().zoom() >= minZoom3) {
+ editOn();
+ update();
+ service.loadBubbles(projection2);
+ } else {
+ editOff();
+ }
+ }
+ }
+ drawImages.enabled = function(_) {
+ if (!arguments.length)
+ return svgStreetside.enabled;
+ svgStreetside.enabled = _;
+ if (svgStreetside.enabled) {
+ showLayer();
+ context.photos().on("change.streetside", update);
+ } else {
+ hideLayer();
+ context.photos().on("change.streetside", null);
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ drawImages.supported = function() {
+ return !!getService();
+ };
+ init2();
+ return drawImages;
+ }
+
+ // modules/svg/mapillary_images.js
+ function svgMapillaryImages(projection2, context, dispatch10) {
+ const throttledRedraw = throttle_default(function() {
+ dispatch10.call("change");
+ }, 1e3);
+ const minZoom3 = 12;
+ const minMarkerZoom = 16;
+ const minViewfieldZoom = 18;
+ let layer = select_default2(null);
+ let _mapillary;
+ function init2() {
+ if (svgMapillaryImages.initialized)
+ return;
+ svgMapillaryImages.enabled = false;
+ svgMapillaryImages.initialized = true;
+ }
+ function getService() {
+ if (services.mapillary && !_mapillary) {
+ _mapillary = services.mapillary;
+ _mapillary.event.on("loadedImages", throttledRedraw);
+ } else if (!services.mapillary && _mapillary) {
+ _mapillary = null;
+ }
+ return _mapillary;
+ }
+ function showLayer() {
+ const service = getService();
+ if (!service)
+ return;
+ editOn();
+ layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() {
+ dispatch10.call("change");
+ });
+ }
+ function hideLayer() {
+ throttledRedraw.cancel();
+ layer.transition().duration(250).style("opacity", 0).on("end", editOff);
+ }
+ function editOn() {
+ layer.style("display", "block");
+ }
+ function editOff() {
+ layer.selectAll(".viewfield-group").remove();
+ layer.style("display", "none");
+ }
+ function click(d3_event, image) {
+ const service = getService();
+ if (!service)
+ return;
+ service.ensureViewerLoaded(context).then(function() {
+ service.selectImage(context, image.id).showViewer(context);
+ });
+ context.map().centerEase(image.loc);
+ }
+ function mouseover(d3_event, image) {
+ const service = getService();
+ if (service)
+ service.setStyles(context, image);
+ }
+ function mouseout() {
+ const service = getService();
+ if (service)
+ service.setStyles(context, null);
+ }
+ function transform2(d) {
+ let t = svgPointTransform(projection2)(d);
+ if (d.ca) {
+ t += " rotate(" + Math.floor(d.ca) + ",0,0)";
+ }
+ return t;
+ }
+ function filterImages(images) {
+ const showsPano = context.photos().showsPanoramic();
+ const showsFlat = context.photos().showsFlat();
+ const fromDate = context.photos().fromDate();
+ const toDate = context.photos().toDate();
+ if (!showsPano || !showsFlat) {
+ images = images.filter(function(image) {
+ if (image.is_pano)
+ return showsPano;
+ return showsFlat;
+ });
+ }
+ if (fromDate) {
+ images = images.filter(function(image) {
+ return new Date(image.captured_at).getTime() >= new Date(fromDate).getTime();
+ });
+ }
+ if (toDate) {
+ images = images.filter(function(image) {
+ return new Date(image.captured_at).getTime() <= new Date(toDate).getTime();
+ });
+ }
+ return images;
+ }
+ function filterSequences(sequences) {
+ const showsPano = context.photos().showsPanoramic();
+ const showsFlat = context.photos().showsFlat();
+ const fromDate = context.photos().fromDate();
+ const toDate = context.photos().toDate();
+ if (!showsPano || !showsFlat) {
+ sequences = sequences.filter(function(sequence) {
+ if (sequence.properties.hasOwnProperty("is_pano")) {
+ if (sequence.properties.is_pano)
+ return showsPano;
+ return showsFlat;
+ }
+ return false;
+ });
+ }
+ if (fromDate) {
+ sequences = sequences.filter(function(sequence) {
+ return new Date(sequence.properties.captured_at).getTime() >= new Date(fromDate).getTime().toString();
+ });
+ }
+ if (toDate) {
+ sequences = sequences.filter(function(sequence) {
+ return new Date(sequence.properties.captured_at).getTime() <= new Date(toDate).getTime().toString();
+ });
+ }
+ return sequences;
+ }
+ function update() {
+ const z = ~~context.map().zoom();
+ const showMarkers = z >= minMarkerZoom;
+ const showViewfields = z >= minViewfieldZoom;
+ const service = getService();
+ let sequences = service ? service.sequences(projection2) : [];
+ let images = service && showMarkers ? service.images(projection2) : [];
+ images = filterImages(images);
+ sequences = filterSequences(sequences, service);
+ service.filterViewer(context);
+ let traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d) {
+ return d.properties.id;
+ });
+ traces.exit().remove();
+ traces = traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson);
+ const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(images, function(d) {
+ return d.id;
+ });
+ groups.exit().remove();
+ const groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click);
+ groupsEnter.append("g").attr("class", "viewfield-scale");
+ const markers = groups.merge(groupsEnter).sort(function(a, b) {
+ return b.loc[1] - a.loc[1];
+ }).attr("transform", transform2).select(".viewfield-scale");
+ markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6");
+ const viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []);
+ viewfields.exit().remove();
+ viewfields.enter().insert("path", "circle").attr("class", "viewfield").classed("pano", function() {
+ return this.parentNode.__data__.is_pano;
+ }).attr("transform", "scale(1.5,1.5),translate(-8, -13)").attr("d", viewfieldPath);
+ function viewfieldPath() {
+ if (this.parentNode.__data__.is_pano) {
+ return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0";
+ } else {
+ return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z";
+ }
+ }
+ }
+ function drawImages(selection2) {
+ const enabled = svgMapillaryImages.enabled;
+ const service = getService();
+ layer = selection2.selectAll(".layer-mapillary").data(service ? [0] : []);
+ layer.exit().remove();
+ const layerEnter = layer.enter().append("g").attr("class", "layer-mapillary").style("display", enabled ? "block" : "none");
+ layerEnter.append("g").attr("class", "sequences");
+ layerEnter.append("g").attr("class", "markers");
+ layer = layerEnter.merge(layer);
+ if (enabled) {
+ if (service && ~~context.map().zoom() >= minZoom3) {
+ editOn();
+ update();
+ service.loadImages(projection2);
+ } else {
+ editOff();
+ }
+ }
+ }
+ drawImages.enabled = function(_) {
+ if (!arguments.length)
+ return svgMapillaryImages.enabled;
+ svgMapillaryImages.enabled = _;
+ if (svgMapillaryImages.enabled) {
+ showLayer();
+ context.photos().on("change.mapillary_images", update);
+ } else {
+ hideLayer();
+ context.photos().on("change.mapillary_images", null);
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ drawImages.supported = function() {
+ return !!getService();
+ };
+ init2();
+ return drawImages;
+ }
+
+ // modules/svg/mapillary_position.js
+ function svgMapillaryPosition(projection2, context) {
+ const throttledRedraw = throttle_default(function() {
+ update();
+ }, 1e3);
+ const minZoom3 = 12;
+ const minViewfieldZoom = 18;
+ let layer = select_default2(null);
+ let _mapillary;
+ let viewerCompassAngle;
+ function init2() {
+ if (svgMapillaryPosition.initialized)
+ return;
+ svgMapillaryPosition.initialized = true;
+ }
+ function getService() {
+ if (services.mapillary && !_mapillary) {
+ _mapillary = services.mapillary;
+ _mapillary.event.on("imageChanged", throttledRedraw);
+ _mapillary.event.on("bearingChanged", function(e) {
+ viewerCompassAngle = e.bearing;
+ if (context.map().isTransformed())
+ return;
+ layer.selectAll(".viewfield-group.currentView").filter(function(d) {
+ return d.is_pano;
+ }).attr("transform", transform2);
+ });
+ } else if (!services.mapillary && _mapillary) {
+ _mapillary = null;
+ }
+ return _mapillary;
+ }
+ function editOn() {
+ layer.style("display", "block");
+ }
+ function editOff() {
+ layer.selectAll(".viewfield-group").remove();
+ layer.style("display", "none");
+ }
+ function transform2(d) {
+ let t = svgPointTransform(projection2)(d);
+ if (d.is_pano && viewerCompassAngle !== null && isFinite(viewerCompassAngle)) {
+ t += " rotate(" + Math.floor(viewerCompassAngle) + ",0,0)";
+ } else if (d.ca) {
+ t += " rotate(" + Math.floor(d.ca) + ",0,0)";
+ }
+ return t;
+ }
+ function update() {
+ const z = ~~context.map().zoom();
+ const showViewfields = z >= minViewfieldZoom;
+ const service = getService();
+ const image = service && service.getActiveImage();
+ const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(image ? [image] : [], function(d) {
+ return d.id;
+ });
+ groups.exit().remove();
+ const groupsEnter = groups.enter().append("g").attr("class", "viewfield-group currentView highlighted");
+ groupsEnter.append("g").attr("class", "viewfield-scale");
+ const markers = groups.merge(groupsEnter).attr("transform", transform2).select(".viewfield-scale");
+ markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6");
+ const viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []);
+ viewfields.exit().remove();
+ viewfields.enter().insert("path", "circle").attr("class", "viewfield").attr("transform", "scale(1.5,1.5),translate(-8, -13)").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");
+ }
+ function drawImages(selection2) {
+ const service = getService();
+ layer = selection2.selectAll(".layer-mapillary-position").data(service ? [0] : []);
+ layer.exit().remove();
+ const layerEnter = layer.enter().append("g").attr("class", "layer-mapillary-position");
+ layerEnter.append("g").attr("class", "markers");
+ layer = layerEnter.merge(layer);
+ if (service && ~~context.map().zoom() >= minZoom3) {
+ editOn();
+ update();
+ } else {
+ editOff();
+ }
+ }
+ drawImages.enabled = function() {
+ update();
+ return this;
+ };
+ drawImages.supported = function() {
+ return !!getService();
+ };
+ init2();
+ return drawImages;
+ }
+
+ // modules/svg/mapillary_signs.js
+ function svgMapillarySigns(projection2, context, dispatch10) {
+ const throttledRedraw = throttle_default(function() {
+ dispatch10.call("change");
+ }, 1e3);
+ const minZoom3 = 12;
+ let layer = select_default2(null);
+ let _mapillary;
+ function init2() {
+ if (svgMapillarySigns.initialized)
+ return;
+ svgMapillarySigns.enabled = false;
+ svgMapillarySigns.initialized = true;
+ }
+ function getService() {
+ if (services.mapillary && !_mapillary) {
+ _mapillary = services.mapillary;
+ _mapillary.event.on("loadedSigns", throttledRedraw);
+ } else if (!services.mapillary && _mapillary) {
+ _mapillary = null;
+ }
+ return _mapillary;
+ }
+ function showLayer() {
+ const service = getService();
+ if (!service)
+ return;
+ service.loadSignResources(context);
+ editOn();
+ }
+ function hideLayer() {
+ throttledRedraw.cancel();
+ editOff();
+ }
+ function editOn() {
+ layer.style("display", "block");
+ }
+ function editOff() {
+ layer.selectAll(".icon-sign").remove();
+ layer.style("display", "none");
+ }
+ function click(d3_event, d) {
+ const service = getService();
+ if (!service)
+ return;
+ context.map().centerEase(d.loc);
+ const selectedImageId = service.getActiveImage() && service.getActiveImage().id;
+ service.getDetections(d.id).then((detections) => {
+ if (detections.length) {
+ const imageId = detections[0].image.id;
+ if (imageId === selectedImageId) {
+ service.highlightDetection(detections[0]).selectImage(context, imageId);
+ } else {
+ service.ensureViewerLoaded(context).then(function() {
+ service.highlightDetection(detections[0]).selectImage(context, imageId).showViewer(context);
+ });
+ }
+ }
+ });
+ }
+ function filterData(detectedFeatures) {
+ var fromDate = context.photos().fromDate();
+ var toDate = context.photos().toDate();
+ if (fromDate) {
+ var fromTimestamp = new Date(fromDate).getTime();
+ detectedFeatures = detectedFeatures.filter(function(feature3) {
+ return new Date(feature3.last_seen_at).getTime() >= fromTimestamp;
+ });
+ }
+ if (toDate) {
+ var toTimestamp = new Date(toDate).getTime();
+ detectedFeatures = detectedFeatures.filter(function(feature3) {
+ return new Date(feature3.first_seen_at).getTime() <= toTimestamp;
+ });
+ }
+ return detectedFeatures;
+ }
+ function update() {
+ const service = getService();
+ let data = service ? service.signs(projection2) : [];
+ data = filterData(data);
+ const transform2 = svgPointTransform(projection2);
+ const signs = layer.selectAll(".icon-sign").data(data, function(d) {
+ return d.id;
+ });
+ signs.exit().remove();
+ const enter = signs.enter().append("g").attr("class", "icon-sign icon-detected").on("click", click);
+ enter.append("use").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px").attr("xlink:href", function(d) {
+ return "#" + d.value;
+ });
+ enter.append("rect").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px");
+ signs.merge(enter).attr("transform", transform2);
+ }
+ function drawSigns(selection2) {
+ const enabled = svgMapillarySigns.enabled;
+ const service = getService();
+ layer = selection2.selectAll(".layer-mapillary-signs").data(service ? [0] : []);
+ layer.exit().remove();
+ layer = layer.enter().append("g").attr("class", "layer-mapillary-signs layer-mapillary-detections").style("display", enabled ? "block" : "none").merge(layer);
+ if (enabled) {
+ if (service && ~~context.map().zoom() >= minZoom3) {
+ editOn();
+ update();
+ service.loadSigns(projection2);
+ service.showSignDetections(true);
+ } else {
+ editOff();
+ }
+ } else if (service) {
+ service.showSignDetections(false);
+ }
+ }
+ drawSigns.enabled = function(_) {
+ if (!arguments.length)
+ return svgMapillarySigns.enabled;
+ svgMapillarySigns.enabled = _;
+ if (svgMapillarySigns.enabled) {
+ showLayer();
+ context.photos().on("change.mapillary_signs", update);
+ } else {
+ hideLayer();
+ context.photos().on("change.mapillary_signs", null);
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ drawSigns.supported = function() {
+ return !!getService();
+ };
+ init2();
+ return drawSigns;
+ }
+
+ // modules/svg/mapillary_map_features.js
+ function svgMapillaryMapFeatures(projection2, context, dispatch10) {
+ const throttledRedraw = throttle_default(function() {
+ dispatch10.call("change");
+ }, 1e3);
+ const minZoom3 = 12;
+ let layer = select_default2(null);
+ let _mapillary;
+ function init2() {
+ if (svgMapillaryMapFeatures.initialized)
+ return;
+ svgMapillaryMapFeatures.enabled = false;
+ svgMapillaryMapFeatures.initialized = true;
+ }
+ function getService() {
+ if (services.mapillary && !_mapillary) {
+ _mapillary = services.mapillary;
+ _mapillary.event.on("loadedMapFeatures", throttledRedraw);
+ } else if (!services.mapillary && _mapillary) {
+ _mapillary = null;
+ }
+ return _mapillary;
+ }
+ function showLayer() {
+ const service = getService();
+ if (!service)
+ return;
+ service.loadObjectResources(context);
+ editOn();
+ }
+ function hideLayer() {
+ throttledRedraw.cancel();
+ editOff();
+ }
+ function editOn() {
+ layer.style("display", "block");
+ }
+ function editOff() {
+ layer.selectAll(".icon-map-feature").remove();
+ layer.style("display", "none");
+ }
+ function click(d3_event, d) {
+ const service = getService();
+ if (!service)
+ return;
+ context.map().centerEase(d.loc);
+ const selectedImageId = service.getActiveImage() && service.getActiveImage().id;
+ service.getDetections(d.id).then((detections) => {
+ if (detections.length) {
+ const imageId = detections[0].image.id;
+ if (imageId === selectedImageId) {
+ service.highlightDetection(detections[0]).selectImage(context, imageId);
+ } else {
+ service.ensureViewerLoaded(context).then(function() {
+ service.highlightDetection(detections[0]).selectImage(context, imageId).showViewer(context);
+ });
+ }
+ }
+ });
+ }
+ function filterData(detectedFeatures) {
+ const fromDate = context.photos().fromDate();
+ const toDate = context.photos().toDate();
+ if (fromDate) {
+ detectedFeatures = detectedFeatures.filter(function(feature3) {
+ return new Date(feature3.last_seen_at).getTime() >= new Date(fromDate).getTime();
+ });
+ }
+ if (toDate) {
+ detectedFeatures = detectedFeatures.filter(function(feature3) {
+ return new Date(feature3.first_seen_at).getTime() <= new Date(toDate).getTime();
+ });
+ }
+ return detectedFeatures;
+ }
+ function update() {
+ const service = getService();
+ let data = service ? service.mapFeatures(projection2) : [];
+ data = filterData(data);
+ const transform2 = svgPointTransform(projection2);
+ const mapFeatures = layer.selectAll(".icon-map-feature").data(data, function(d) {
+ return d.id;
+ });
+ mapFeatures.exit().remove();
+ const enter = mapFeatures.enter().append("g").attr("class", "icon-map-feature icon-detected").on("click", click);
+ enter.append("title").text(function(d) {
+ var id2 = d.value.replace(/--/g, ".").replace(/-/g, "_");
+ return _t("mapillary_map_features." + id2);
+ });
+ enter.append("use").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px").attr("xlink:href", function(d) {
+ if (d.value === "object--billboard") {
+ return "#object--sign--advertisement";
+ }
+ return "#" + d.value;
+ });
+ enter.append("rect").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px");
+ mapFeatures.merge(enter).attr("transform", transform2);
+ }
+ function drawMapFeatures(selection2) {
+ const enabled = svgMapillaryMapFeatures.enabled;
+ const service = getService();
+ layer = selection2.selectAll(".layer-mapillary-map-features").data(service ? [0] : []);
+ layer.exit().remove();
+ layer = layer.enter().append("g").attr("class", "layer-mapillary-map-features layer-mapillary-detections").style("display", enabled ? "block" : "none").merge(layer);
+ if (enabled) {
+ if (service && ~~context.map().zoom() >= minZoom3) {
+ editOn();
+ update();
+ service.loadMapFeatures(projection2);
+ service.showFeatureDetections(true);
+ } else {
+ editOff();
+ }
+ } else if (service) {
+ service.showFeatureDetections(false);
+ }
+ }
+ drawMapFeatures.enabled = function(_) {
+ if (!arguments.length)
+ return svgMapillaryMapFeatures.enabled;
+ svgMapillaryMapFeatures.enabled = _;
+ if (svgMapillaryMapFeatures.enabled) {
+ showLayer();
+ context.photos().on("change.mapillary_map_features", update);
+ } else {
+ hideLayer();
+ context.photos().on("change.mapillary_map_features", null);
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ drawMapFeatures.supported = function() {
+ return !!getService();
+ };
+ init2();
+ return drawMapFeatures;
+ }
+
+ // modules/svg/kartaview_images.js
+ function svgKartaviewImages(projection2, context, dispatch10) {
+ var throttledRedraw = throttle_default(function() {
+ dispatch10.call("change");
+ }, 1e3);
+ var minZoom3 = 12;
+ var minMarkerZoom = 16;
+ var minViewfieldZoom = 18;
+ var layer = select_default2(null);
+ var _kartaview;
+ function init2() {
+ if (svgKartaviewImages.initialized)
+ return;
+ svgKartaviewImages.enabled = false;
+ svgKartaviewImages.initialized = true;
+ }
+ function getService() {
+ if (services.kartaview && !_kartaview) {
+ _kartaview = services.kartaview;
+ _kartaview.event.on("loadedImages", throttledRedraw);
+ } else if (!services.kartaview && _kartaview) {
+ _kartaview = null;
+ }
+ return _kartaview;
+ }
+ function showLayer() {
+ var service = getService();
+ if (!service)
+ return;
+ editOn();
+ layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() {
+ dispatch10.call("change");
+ });
+ }
+ function hideLayer() {
+ throttledRedraw.cancel();
+ layer.transition().duration(250).style("opacity", 0).on("end", editOff);
+ }
+ function editOn() {
+ layer.style("display", "block");
+ }
+ function editOff() {
+ layer.selectAll(".viewfield-group").remove();
+ layer.style("display", "none");
+ }
+ function click(d3_event, d) {
+ var service = getService();
+ if (!service)
+ return;
+ service.ensureViewerLoaded(context).then(function() {
+ service.selectImage(context, d.key).showViewer(context);
+ });
+ context.map().centerEase(d.loc);
+ }
+ function mouseover(d3_event, d) {
+ var service = getService();
+ if (service)
+ service.setStyles(context, d);
+ }
+ function mouseout() {
+ var service = getService();
+ if (service)
+ service.setStyles(context, null);
+ }
+ function transform2(d) {
+ var t = svgPointTransform(projection2)(d);
+ if (d.ca) {
+ t += " rotate(" + Math.floor(d.ca) + ",0,0)";
+ }
+ return t;
+ }
+ function filterImages(images) {
+ var fromDate = context.photos().fromDate();
+ var toDate = context.photos().toDate();
+ var usernames = context.photos().usernames();
+ if (fromDate) {
+ var fromTimestamp = new Date(fromDate).getTime();
+ images = images.filter(function(item) {
+ return new Date(item.captured_at).getTime() >= fromTimestamp;
+ });
+ }
+ if (toDate) {
+ var toTimestamp = new Date(toDate).getTime();
+ images = images.filter(function(item) {
+ return new Date(item.captured_at).getTime() <= toTimestamp;
+ });
+ }
+ if (usernames) {
+ images = images.filter(function(item) {
+ return usernames.indexOf(item.captured_by) !== -1;
+ });
+ }
+ return images;
+ }
+ function filterSequences(sequences) {
+ var fromDate = context.photos().fromDate();
+ var toDate = context.photos().toDate();
+ var usernames = context.photos().usernames();
+ if (fromDate) {
+ var fromTimestamp = new Date(fromDate).getTime();
+ sequences = sequences.filter(function(image) {
+ return new Date(image.properties.captured_at).getTime() >= fromTimestamp;
+ });
+ }
+ if (toDate) {
+ var toTimestamp = new Date(toDate).getTime();
+ sequences = sequences.filter(function(image) {
+ return new Date(image.properties.captured_at).getTime() <= toTimestamp;
+ });
+ }
+ if (usernames) {
+ sequences = sequences.filter(function(image) {
+ return usernames.indexOf(image.properties.captured_by) !== -1;
+ });
+ }
+ return sequences;
+ }
+ function update() {
+ var viewer = context.container().select(".photoviewer");
+ var selected = viewer.empty() ? void 0 : viewer.datum();
+ var z = ~~context.map().zoom();
+ var showMarkers = z >= minMarkerZoom;
+ var showViewfields = z >= minViewfieldZoom;
+ var service = getService();
+ var sequences = [];
+ var images = [];
+ if (context.photos().showsFlat()) {
+ sequences = service ? service.sequences(projection2) : [];
+ images = service && showMarkers ? service.images(projection2) : [];
+ sequences = filterSequences(sequences);
+ images = filterImages(images);
+ }
+ var traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d) {
+ return d.properties.key;
+ });
+ traces.exit().remove();
+ traces = traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson);
+ var groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(images, function(d) {
+ return d.key;
+ });
+ groups.exit().remove();
+ var groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click);
+ groupsEnter.append("g").attr("class", "viewfield-scale");
+ var markers = groups.merge(groupsEnter).sort(function(a, b) {
+ return a === selected ? 1 : b === selected ? -1 : b.loc[1] - a.loc[1];
+ }).attr("transform", transform2).select(".viewfield-scale");
+ markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6");
+ var viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []);
+ viewfields.exit().remove();
+ viewfields.enter().insert("path", "circle").attr("class", "viewfield").attr("transform", "scale(1.5,1.5),translate(-8, -13)").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");
+ }
+ function drawImages(selection2) {
+ var enabled = svgKartaviewImages.enabled, service = getService();
+ layer = selection2.selectAll(".layer-kartaview").data(service ? [0] : []);
+ layer.exit().remove();
+ var layerEnter = layer.enter().append("g").attr("class", "layer-kartaview").style("display", enabled ? "block" : "none");
+ layerEnter.append("g").attr("class", "sequences");
+ layerEnter.append("g").attr("class", "markers");
+ layer = layerEnter.merge(layer);
+ if (enabled) {
+ if (service && ~~context.map().zoom() >= minZoom3) {
+ editOn();
+ update();
+ service.loadImages(projection2);
+ } else {
+ editOff();
+ }
+ }
+ }
+ drawImages.enabled = function(_) {
+ if (!arguments.length)
+ return svgKartaviewImages.enabled;
+ svgKartaviewImages.enabled = _;
+ if (svgKartaviewImages.enabled) {
+ showLayer();
+ context.photos().on("change.kartaview_images", update);
+ } else {
+ hideLayer();
+ context.photos().on("change.kartaview_images", null);
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ drawImages.supported = function() {
+ return !!getService();
+ };
+ init2();
+ return drawImages;
+ }
+
+ // modules/svg/osm.js
+ function svgOsm(projection2, context, dispatch10) {
+ var enabled = true;
+ function drawOsm(selection2) {
+ selection2.selectAll(".layer-osm").data(["covered", "areas", "lines", "points", "labels"]).enter().append("g").attr("class", function(d) {
+ return "layer-osm " + d;
+ });
+ selection2.selectAll(".layer-osm.points").selectAll(".points-group").data(["points", "midpoints", "vertices", "turns"]).enter().append("g").attr("class", function(d) {
+ return "points-group " + d;
+ });
+ }
+ function showLayer() {
+ var layer = context.surface().selectAll(".data-layer.osm");
+ layer.interrupt();
+ layer.classed("disabled", false).style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", function() {
+ dispatch10.call("change");
+ });
+ }
+ function hideLayer() {
+ var layer = context.surface().selectAll(".data-layer.osm");
+ layer.interrupt();
+ layer.transition().duration(250).style("opacity", 0).on("end interrupt", function() {
+ layer.classed("disabled", true);
+ dispatch10.call("change");
+ });
+ }
+ drawOsm.enabled = function(val) {
+ if (!arguments.length)
+ return enabled;
+ enabled = val;
+ if (enabled) {
+ showLayer();
+ } else {
+ hideLayer();
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ return drawOsm;
+ }
+
+ // modules/svg/notes.js
+ var _notesEnabled = false;
+ var _osmService;
+ function svgNotes(projection2, context, dispatch10) {
+ if (!dispatch10) {
+ dispatch10 = dispatch_default("change");
+ }
+ var throttledRedraw = throttle_default(function() {
+ dispatch10.call("change");
+ }, 1e3);
+ var minZoom3 = 12;
+ var touchLayer = select_default2(null);
+ var drawLayer = select_default2(null);
+ var _notesVisible = false;
+ function markerPath(selection2, klass) {
+ selection2.attr("class", klass).attr("transform", "translate(-8, -22)").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");
+ }
+ function getService() {
+ if (services.osm && !_osmService) {
+ _osmService = services.osm;
+ _osmService.on("loadedNotes", throttledRedraw);
+ } else if (!services.osm && _osmService) {
+ _osmService = null;
+ }
+ return _osmService;
+ }
+ function editOn() {
+ if (!_notesVisible) {
+ _notesVisible = true;
+ drawLayer.style("display", "block");
+ }
+ }
+ function editOff() {
+ if (_notesVisible) {
+ _notesVisible = false;
+ drawLayer.style("display", "none");
+ drawLayer.selectAll(".note").remove();
+ touchLayer.selectAll(".note").remove();
+ }
+ }
+ function layerOn() {
+ editOn();
+ drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", function() {
+ dispatch10.call("change");
+ });
+ }
+ function layerOff() {
+ throttledRedraw.cancel();
+ drawLayer.interrupt();
+ touchLayer.selectAll(".note").remove();
+ drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", function() {
+ editOff();
+ dispatch10.call("change");
+ });
+ }
+ function updateMarkers() {
+ if (!_notesVisible || !_notesEnabled)
+ return;
+ var service = getService();
+ var selectedID = context.selectedNoteID();
+ var data = service ? service.notes(projection2) : [];
+ var getTransform = svgPointTransform(projection2);
+ var notes = drawLayer.selectAll(".note").data(data, function(d) {
+ return d.status + d.id;
+ });
+ notes.exit().remove();
+ var notesEnter = notes.enter().append("g").attr("class", function(d) {
+ return "note note-" + d.id + " " + d.status;
+ }).classed("new", function(d) {
+ return d.id < 0;
+ });
+ notesEnter.append("ellipse").attr("cx", 0.5).attr("cy", 1).attr("rx", 6.5).attr("ry", 3).attr("class", "stroke");
+ notesEnter.append("path").call(markerPath, "shadow");
+ notesEnter.append("use").attr("class", "note-fill").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").attr("xlink:href", "#iD-icon-note");
+ notesEnter.selectAll(".icon-annotation").data(function(d) {
+ return [d];
+ }).enter().append("use").attr("class", "icon-annotation").attr("width", "10px").attr("height", "10px").attr("x", "-3px").attr("y", "-19px").attr("xlink:href", function(d) {
+ if (d.id < 0)
+ return "#iD-icon-plus";
+ if (d.status === "open")
+ return "#iD-icon-close";
+ return "#iD-icon-apply";
+ });
+ notes.merge(notesEnter).sort(sortY).classed("selected", function(d) {
+ var mode = context.mode();
+ var isMoving = mode && mode.id === "drag-note";
+ return !isMoving && d.id === selectedID;
+ }).attr("transform", getTransform);
+ if (touchLayer.empty())
+ return;
+ var fillClass = context.getDebug("target") ? "pink " : "nocolor ";
+ var targets = touchLayer.selectAll(".note").data(data, function(d) {
+ return d.id;
+ });
+ targets.exit().remove();
+ targets.enter().append("rect").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").merge(targets).sort(sortY).attr("class", function(d) {
+ var newClass = d.id < 0 ? "new" : "";
+ return "note target note-" + d.id + " " + fillClass + newClass;
+ }).attr("transform", getTransform);
+ function sortY(a, b) {
+ if (a.id === selectedID)
+ return 1;
+ if (b.id === selectedID)
+ return -1;
+ return b.loc[1] - a.loc[1];
+ }
+ }
+ function drawNotes(selection2) {
+ var service = getService();
+ var surface = context.surface();
+ if (surface && !surface.empty()) {
+ touchLayer = surface.selectAll(".data-layer.touch .layer-touch.markers");
+ }
+ drawLayer = selection2.selectAll(".layer-notes").data(service ? [0] : []);
+ drawLayer.exit().remove();
+ drawLayer = drawLayer.enter().append("g").attr("class", "layer-notes").style("display", _notesEnabled ? "block" : "none").merge(drawLayer);
+ if (_notesEnabled) {
+ if (service && ~~context.map().zoom() >= minZoom3) {
+ editOn();
+ service.loadNotes(projection2);
+ updateMarkers();
+ } else {
+ editOff();
+ }
+ }
+ }
+ drawNotes.enabled = function(val) {
+ if (!arguments.length)
+ return _notesEnabled;
+ _notesEnabled = val;
+ if (_notesEnabled) {
+ layerOn();
+ } else {
+ layerOff();
+ if (context.selectedNoteID()) {
+ context.enter(modeBrowse(context));
+ }
+ }
+ dispatch10.call("change");
+ return this;
+ };
+ return drawNotes;
+ }
+
+ // modules/svg/touch.js
+ function svgTouch() {
+ function drawTouch(selection2) {
+ selection2.selectAll(".layer-touch").data(["areas", "lines", "points", "turns", "markers"]).enter().append("g").attr("class", function(d) {
+ return "layer-touch " + d;
+ });
+ }
+ return drawTouch;
+ }
+
+ // modules/util/dimensions.js
+ function refresh(selection2, node) {
+ var cr = node.getBoundingClientRect();
+ var prop = [cr.width, cr.height];
+ selection2.property("__dimensions__", prop);
+ return prop;
+ }
+ function utilGetDimensions(selection2, force) {
+ if (!selection2 || selection2.empty()) {
+ return [0, 0];
+ }
+ var node = selection2.node(), cached = selection2.property("__dimensions__");
+ return !cached || force ? refresh(selection2, node) : cached;
+ }
+ function utilSetDimensions(selection2, dimensions) {
+ if (!selection2 || selection2.empty()) {
+ return selection2;
+ }
+ var node = selection2.node();
+ if (dimensions === null) {
+ refresh(selection2, node);
+ return selection2;
+ }
+ return selection2.property("__dimensions__", [dimensions[0], dimensions[1]]).attr("width", dimensions[0]).attr("height", dimensions[1]);
+ }
+
+ // modules/svg/layers.js
+ function svgLayers(projection2, context) {
+ var dispatch10 = dispatch_default("change");
+ var svg2 = select_default2(null);
+ var _layers = [
+ { id: "osm", layer: svgOsm(projection2, context, dispatch10) },
+ { id: "notes", layer: svgNotes(projection2, context, dispatch10) },
+ { id: "data", layer: svgData(projection2, context, dispatch10) },
+ { id: "keepRight", layer: svgKeepRight(projection2, context, dispatch10) },
+ { id: "improveOSM", layer: svgImproveOSM(projection2, context, dispatch10) },
+ { id: "osmose", layer: svgOsmose(projection2, context, dispatch10) },
+ { id: "streetside", layer: svgStreetside(projection2, context, dispatch10) },
+ { id: "mapillary", layer: svgMapillaryImages(projection2, context, dispatch10) },
+ { id: "mapillary-position", layer: svgMapillaryPosition(projection2, context, dispatch10) },
+ { id: "mapillary-map-features", layer: svgMapillaryMapFeatures(projection2, context, dispatch10) },
+ { id: "mapillary-signs", layer: svgMapillarySigns(projection2, context, dispatch10) },
+ { id: "kartaview", layer: svgKartaviewImages(projection2, context, dispatch10) },
+ { id: "debug", layer: svgDebug(projection2, context, dispatch10) },
+ { id: "geolocate", layer: svgGeolocate(projection2, context, dispatch10) },
+ { id: "touch", layer: svgTouch(projection2, context, dispatch10) }
+ ];
+ function drawLayers(selection2) {
+ svg2 = selection2.selectAll(".surface").data([0]);
+ svg2 = svg2.enter().append("svg").attr("class", "surface").merge(svg2);
+ var defs = svg2.selectAll(".surface-defs").data([0]);
+ defs.enter().append("defs").attr("class", "surface-defs");
+ var groups = svg2.selectAll(".data-layer").data(_layers);
+ groups.exit().remove();
+ groups.enter().append("g").attr("class", function(d) {
+ return "data-layer " + d.id;
+ }).merge(groups).each(function(d) {
+ select_default2(this).call(d.layer);
+ });
+ }
+ drawLayers.all = function() {
+ return _layers;
+ };
+ drawLayers.layer = function(id2) {
+ var obj = _layers.find(function(o) {
+ return o.id === id2;
+ });
+ return obj && obj.layer;
+ };
+ drawLayers.only = function(what) {
+ var arr = [].concat(what);
+ var all = _layers.map(function(layer) {
+ return layer.id;
+ });
+ return drawLayers.remove(utilArrayDifference(all, arr));
+ };
+ drawLayers.remove = function(what) {
+ var arr = [].concat(what);
+ arr.forEach(function(id2) {
+ _layers = _layers.filter(function(o) {
+ return o.id !== id2;
+ });
+ });
+ dispatch10.call("change");
+ return this;
+ };
+ drawLayers.add = function(what) {
+ var arr = [].concat(what);
+ arr.forEach(function(obj) {
+ if ("id" in obj && "layer" in obj) {
+ _layers.push(obj);
+ }
+ });
+ dispatch10.call("change");
+ return this;
+ };
+ drawLayers.dimensions = function(val) {
+ if (!arguments.length)
+ return utilGetDimensions(svg2);
+ utilSetDimensions(svg2, val);
+ return this;
+ };
+ return utilRebind(drawLayers, dispatch10, "on");
+ }
+
+ // modules/svg/lines.js
+ var import_fast_deep_equal6 = __toESM(require_fast_deep_equal());
+ function svgLines(projection2, context) {
+ var detected = utilDetect();
+ var highway_stack = {
+ motorway: 0,
+ motorway_link: 1,
+ trunk: 2,
+ trunk_link: 3,
+ primary: 4,
+ primary_link: 5,
+ secondary: 6,
+ tertiary: 7,
+ unclassified: 8,
+ residential: 9,
+ service: 10,
+ footway: 11
+ };
+ function drawTargets(selection2, graph, entities, filter2) {
+ var targetClass = context.getDebug("target") ? "pink " : "nocolor ";
+ var nopeClass = context.getDebug("target") ? "red " : "nocolor ";
+ var getPath = svgPath(projection2).geojson;
+ var activeID = context.activeID();
+ var base = context.history().base();
+ var data = { targets: [], nopes: [] };
+ entities.forEach(function(way) {
+ var features2 = svgSegmentWay(way, graph, activeID);
+ data.targets.push.apply(data.targets, features2.passive);
+ data.nopes.push.apply(data.nopes, features2.active);
+ });
+ var targetData = data.targets.filter(getPath);
+ var targets = selection2.selectAll(".line.target-allowed").filter(function(d) {
+ return filter2(d.properties.entity);
+ }).data(targetData, function key(d) {
+ return d.id;
+ });
+ targets.exit().remove();
+ var segmentWasEdited = function(d) {
+ var wayID = d.properties.entity.id;
+ if (!base.entities[wayID] || !(0, import_fast_deep_equal6.default)(graph.entities[wayID].nodes, base.entities[wayID].nodes)) {
+ return false;
+ }
+ return d.properties.nodes.some(function(n2) {
+ return !base.entities[n2.id] || !(0, import_fast_deep_equal6.default)(graph.entities[n2.id].loc, base.entities[n2.id].loc);
+ });
+ };
+ targets.enter().append("path").merge(targets).attr("d", getPath).attr("class", function(d) {
+ return "way line target target-allowed " + targetClass + d.id;
+ }).classed("segment-edited", segmentWasEdited);
+ var nopeData = data.nopes.filter(getPath);
+ var nopes = selection2.selectAll(".line.target-nope").filter(function(d) {
+ return filter2(d.properties.entity);
+ }).data(nopeData, function key(d) {
+ return d.id;
+ });
+ nopes.exit().remove();
+ nopes.enter().append("path").merge(nopes).attr("d", getPath).attr("class", function(d) {
+ return "way line target target-nope " + nopeClass + d.id;
+ }).classed("segment-edited", segmentWasEdited);
+ }
+ function drawLines(selection2, graph, entities, filter2) {
+ var base = context.history().base();
+ function waystack(a, b) {
+ var selected = context.selectedIDs();
+ var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
+ var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
+ if (a.tags.highway) {
+ scoreA -= highway_stack[a.tags.highway];
+ }
+ if (b.tags.highway) {
+ scoreB -= highway_stack[b.tags.highway];
+ }
+ return scoreA - scoreB;
+ }
+ function drawLineGroup(selection3, klass, isSelected) {
+ var mode = context.mode();
+ var isDrawing = mode && /^draw/.test(mode.id);
+ var selectedClass = !isDrawing && isSelected ? "selected " : "";
+ var lines = selection3.selectAll("path").filter(filter2).data(getPathData(isSelected), osmEntity.key);
+ lines.exit().remove();
+ lines.enter().append("path").attr("class", function(d) {
+ var prefix = "way line";
+ if (!d.hasInterestingTags()) {
+ var parentRelations = graph.parentRelations(d);
+ var parentMultipolygons = parentRelations.filter(function(relation) {
+ return relation.isMultipolygon();
+ });
+ if (parentMultipolygons.length > 0 && parentRelations.length === parentMultipolygons.length) {
+ prefix = "relation area";
+ }
+ }
+ var oldMPClass = oldMultiPolygonOuters[d.id] ? "old-multipolygon " : "";
+ return prefix + " " + klass + " " + selectedClass + oldMPClass + d.id;
+ }).classed("added", function(d) {
+ return !base.entities[d.id];
+ }).classed("geometry-edited", function(d) {
+ return graph.entities[d.id] && base.entities[d.id] && !(0, import_fast_deep_equal6.default)(graph.entities[d.id].nodes, base.entities[d.id].nodes);
+ }).classed("retagged", function(d) {
+ return graph.entities[d.id] && base.entities[d.id] && !(0, import_fast_deep_equal6.default)(graph.entities[d.id].tags, base.entities[d.id].tags);
+ }).call(svgTagClasses()).merge(lines).sort(waystack).attr("d", getPath).call(svgTagClasses().tags(svgRelationMemberTags(graph)));
+ return selection3;
+ }
+ function getPathData(isSelected) {
+ return function() {
+ var layer = this.parentNode.__data__;
+ var data = pathdata[layer] || [];
+ return data.filter(function(d) {
+ if (isSelected) {
+ return context.selectedIDs().indexOf(d.id) !== -1;
+ } else {
+ return context.selectedIDs().indexOf(d.id) === -1;
+ }
+ });
+ };
+ }
+ function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
+ var markergroup = layergroup.selectAll("g." + groupclass).data([pathclass]);
+ markergroup = markergroup.enter().append("g").attr("class", groupclass).merge(markergroup);
+ var markers = markergroup.selectAll("path").filter(filter2).data(function data() {
+ return groupdata[this.parentNode.__data__] || [];
+ }, function key(d) {
+ return [d.id, d.index];
+ });
+ markers.exit().remove();
+ markers = markers.enter().append("path").attr("class", pathclass).merge(markers).attr("marker-mid", marker).attr("d", function(d) {
+ return d.d;
+ });
+ if (detected.ie) {
+ markers.each(function() {
+ this.parentNode.insertBefore(this, this);
+ });
+ }
+ }
+ var getPath = svgPath(projection2, graph);
+ var ways = [];
+ var onewaydata = {};
+ var sideddata = {};
+ var oldMultiPolygonOuters = {};
+ for (var i2 = 0; i2 < entities.length; i2++) {
+ var entity = entities[i2];
+ var outer = osmOldMultipolygonOuterMember(entity, graph);
+ if (outer) {
+ ways.push(entity.mergeTags(outer.tags));
+ oldMultiPolygonOuters[outer.id] = true;
+ } else if (entity.geometry(graph) === "line") {
+ ways.push(entity);
+ }
+ }
+ ways = ways.filter(getPath);
+ var pathdata = utilArrayGroupBy(ways, function(way) {
+ return way.layer();
+ });
+ Object.keys(pathdata).forEach(function(k) {
+ var v = pathdata[k];
+ var onewayArr = v.filter(function(d) {
+ return d.isOneWay();
+ });
+ var onewaySegments = svgMarkerSegments(projection2, graph, 35, function shouldReverse(entity2) {
+ return entity2.tags.oneway === "-1";
+ }, function bothDirections(entity2) {
+ return entity2.tags.oneway === "reversible" || entity2.tags.oneway === "alternating";
+ });
+ onewaydata[k] = utilArrayFlatten(onewayArr.map(onewaySegments));
+ var sidedArr = v.filter(function(d) {
+ return d.isSided();
+ });
+ var sidedSegments = svgMarkerSegments(projection2, graph, 30, function shouldReverse() {
+ return false;
+ }, function bothDirections() {
+ return false;
+ });
+ sideddata[k] = utilArrayFlatten(sidedArr.map(sidedSegments));
+ });
+ var covered = selection2.selectAll(".layer-osm.covered");
+ var uncovered = selection2.selectAll(".layer-osm.lines");
+ var touchLayer = selection2.selectAll(".layer-touch.lines");
+ [covered, uncovered].forEach(function(selection3) {
+ var range3 = selection3 === covered ? range(-10, 0) : range(0, 11);
+ var layergroup = selection3.selectAll("g.layergroup").data(range3);
+ layergroup = layergroup.enter().append("g").attr("class", function(d) {
+ return "layergroup layer" + String(d);
+ }).merge(layergroup);
+ layergroup.selectAll("g.linegroup").data(["shadow", "casing", "stroke", "shadow-highlighted", "casing-highlighted", "stroke-highlighted"]).enter().append("g").attr("class", function(d) {
+ return "linegroup line-" + d;
+ });
+ layergroup.selectAll("g.line-shadow").call(drawLineGroup, "shadow", false);
+ layergroup.selectAll("g.line-casing").call(drawLineGroup, "casing", false);
+ layergroup.selectAll("g.line-stroke").call(drawLineGroup, "stroke", false);
+ layergroup.selectAll("g.line-shadow-highlighted").call(drawLineGroup, "shadow", true);
+ layergroup.selectAll("g.line-casing-highlighted").call(drawLineGroup, "casing", true);
+ layergroup.selectAll("g.line-stroke-highlighted").call(drawLineGroup, "stroke", true);
+ addMarkers(layergroup, "oneway", "onewaygroup", onewaydata, "url(#ideditor-oneway-marker)");
+ addMarkers(layergroup, "sided", "sidedgroup", sideddata, function marker(d) {
+ var category = graph.entity(d.id).sidednessIdentifier();
+ return "url(#ideditor-sided-marker-" + category + ")";
+ });
+ });
+ touchLayer.call(drawTargets, graph, ways, filter2);
+ }
+ return drawLines;
+ }
+
+ // modules/svg/midpoints.js
+ function svgMidpoints(projection2, context) {
+ var targetRadius = 8;
+ function drawTargets(selection2, graph, entities, filter2) {
+ var fillClass = context.getDebug("target") ? "pink " : "nocolor ";
+ var getTransform = svgPointTransform(projection2).geojson;
+ var data = entities.map(function(midpoint) {
+ return {
+ type: "Feature",
+ id: midpoint.id,
+ properties: {
+ target: true,
+ entity: midpoint
+ },
+ geometry: {
+ type: "Point",
+ coordinates: midpoint.loc
+ }
+ };
+ });
+ var targets = selection2.selectAll(".midpoint.target").filter(function(d) {
+ return filter2(d.properties.entity);
+ }).data(data, function key(d) {
+ return d.id;
+ });
+ targets.exit().remove();
+ targets.enter().append("circle").attr("r", targetRadius).merge(targets).attr("class", function(d) {
+ return "node midpoint target " + fillClass + d.id;
+ }).attr("transform", getTransform);
+ }
+ function drawMidpoints(selection2, graph, entities, filter2, extent) {
+ var drawLayer = selection2.selectAll(".layer-osm.points .points-group.midpoints");
+ var touchLayer = selection2.selectAll(".layer-touch.points");
+ var mode = context.mode();
+ if (mode && mode.id !== "select" || !context.map().withinEditableZoom()) {
+ drawLayer.selectAll(".midpoint").remove();
+ touchLayer.selectAll(".midpoint.target").remove();
+ return;
+ }
+ var poly = extent.polygon();
+ var midpoints = {};
+ for (var i2 = 0; i2 < entities.length; i2++) {
+ var entity = entities[i2];
+ if (entity.type !== "way")
+ continue;
+ if (!filter2(entity))
+ continue;
+ if (context.selectedIDs().indexOf(entity.id) < 0)
+ continue;
+ var nodes = graph.childNodes(entity);
+ for (var j2 = 0; j2 < nodes.length - 1; j2++) {
+ var a = nodes[j2];
+ var b = nodes[j2 + 1];
+ var id2 = [a.id, b.id].sort().join("-");
+ if (midpoints[id2]) {
+ midpoints[id2].parents.push(entity);
+ } else if (geoVecLength(projection2(a.loc), projection2(b.loc)) > 40) {
+ var point = geoVecInterp(a.loc, b.loc, 0.5);
+ var loc = null;
+ if (extent.intersects(point)) {
+ loc = point;
+ } else {
+ for (var k = 0; k < 4; k++) {
+ point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
+ if (point && geoVecLength(projection2(a.loc), projection2(point)) > 20 && geoVecLength(projection2(b.loc), projection2(point)) > 20) {
+ loc = point;
+ break;
+ }
+ }
+ }
+ if (loc) {
+ midpoints[id2] = {
+ type: "midpoint",
+ id: id2,
+ loc,
+ edge: [a.id, b.id],
+ parents: [entity]
+ };
+ }
+ }
+ }
+ }
+ function midpointFilter(d) {
+ if (midpoints[d.id])
+ return true;
+ for (var i3 = 0; i3 < d.parents.length; i3++) {
+ if (filter2(d.parents[i3])) {
+ return true;
+ }
+ }
+ return false;
+ }
+ var groups = drawLayer.selectAll(".midpoint").filter(midpointFilter).data(Object.values(midpoints), function(d) {
+ return d.id;
+ });
+ groups.exit().remove();
+ var enter = groups.enter().insert("g", ":first-child").attr("class", "midpoint");
+ enter.append("polygon").attr("points", "-6,8 10,0 -6,-8").attr("class", "shadow");
+ enter.append("polygon").attr("points", "-3,4 5,0 -3,-4").attr("class", "fill");
+ groups = groups.merge(enter).attr("transform", function(d) {
+ var translate = svgPointTransform(projection2);
+ var a2 = graph.entity(d.edge[0]);
+ var b2 = graph.entity(d.edge[1]);
+ var angle2 = geoAngle(a2, b2, projection2) * (180 / Math.PI);
+ return translate(d) + " rotate(" + angle2 + ")";
+ }).call(svgTagClasses().tags(function(d) {
+ return d.parents[0].tags;
+ }));
+ groups.select("polygon.shadow");
+ groups.select("polygon.fill");
+ touchLayer.call(drawTargets, graph, Object.values(midpoints), midpointFilter);
+ }
+ return drawMidpoints;
+ }
+
+ // modules/svg/points.js
+ var import_fast_deep_equal7 = __toESM(require_fast_deep_equal());
+ function svgPoints(projection2, context) {
+ function markerPath(selection2, klass) {
+ selection2.attr("class", klass).attr("transform", "translate(-8, -23)").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");
+ }
+ function sortY(a, b) {
+ return b.loc[1] - a.loc[1];
+ }
+ function fastEntityKey(d) {
+ var mode = context.mode();
+ var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
+ return isMoving ? d.id : osmEntity.key(d);
+ }
+ function drawTargets(selection2, graph, entities, filter2) {
+ var fillClass = context.getDebug("target") ? "pink " : "nocolor ";
+ var getTransform = svgPointTransform(projection2).geojson;
+ var activeID = context.activeID();
+ var data = [];
+ entities.forEach(function(node) {
+ if (activeID === node.id)
+ return;
+ data.push({
+ type: "Feature",
+ id: node.id,
+ properties: {
+ target: true,
+ entity: node
+ },
+ geometry: node.asGeoJSON()
+ });
+ });
+ var targets = selection2.selectAll(".point.target").filter(function(d) {
+ return filter2(d.properties.entity);
+ }).data(data, function key(d) {
+ return d.id;
+ });
+ targets.exit().remove();
+ targets.enter().append("rect").attr("x", -10).attr("y", -26).attr("width", 20).attr("height", 30).merge(targets).attr("class", function(d) {
+ return "node point target " + fillClass + d.id;
+ }).attr("transform", getTransform);
+ }
+ function drawPoints(selection2, graph, entities, filter2) {
+ var wireframe = context.surface().classed("fill-wireframe");
+ var zoom = geoScaleToZoom(projection2.scale());
+ var base = context.history().base();
+ function renderAsPoint(entity) {
+ return entity.geometry(graph) === "point" && !(zoom >= 18 && entity.directions(graph, projection2).length);
+ }
+ var points = wireframe ? [] : entities.filter(renderAsPoint);
+ points.sort(sortY);
+ var drawLayer = selection2.selectAll(".layer-osm.points .points-group.points");
+ var touchLayer = selection2.selectAll(".layer-touch.points");
+ var groups = drawLayer.selectAll("g.point").filter(filter2).data(points, fastEntityKey);
+ groups.exit().remove();
+ var enter = groups.enter().append("g").attr("class", function(d) {
+ return "node point " + d.id;
+ }).order();
+ enter.append("path").call(markerPath, "shadow");
+ enter.append("ellipse").attr("cx", 0.5).attr("cy", 1).attr("rx", 6.5).attr("ry", 3).attr("class", "stroke");
+ enter.append("path").call(markerPath, "stroke");
+ enter.append("use").attr("transform", "translate(-5.5, -20)").attr("class", "icon").attr("width", "12px").attr("height", "12px");
+ groups = groups.merge(enter).attr("transform", svgPointTransform(projection2)).classed("added", function(d) {
+ return !base.entities[d.id];
+ }).classed("moved", function(d) {
+ return base.entities[d.id] && !(0, import_fast_deep_equal7.default)(graph.entities[d.id].loc, base.entities[d.id].loc);
+ }).classed("retagged", function(d) {
+ return base.entities[d.id] && !(0, import_fast_deep_equal7.default)(graph.entities[d.id].tags, base.entities[d.id].tags);
+ }).call(svgTagClasses());
+ groups.select(".shadow");
+ groups.select(".stroke");
+ groups.select(".icon").attr("xlink:href", function(entity) {
+ var preset = _mainPresetIndex.match(entity, graph);
+ var picon = preset && preset.icon;
+ return picon ? "#" + picon : "";
+ });
+ touchLayer.call(drawTargets, graph, points, filter2);
+ }
+ return drawPoints;
+ }
+
+ // modules/svg/turns.js
+ function svgTurns(projection2, context) {
+ function icon2(turn) {
+ var u = turn.u ? "-u" : "";
+ if (turn.no)
+ return "#iD-turn-no" + u;
+ if (turn.only)
+ return "#iD-turn-only" + u;
+ return "#iD-turn-yes" + u;
+ }
+ function drawTurns(selection2, graph, turns) {
+ function turnTransform(d) {
+ var pxRadius = 50;
+ var toWay = graph.entity(d.to.way);
+ var toPoints = graph.childNodes(toWay).map(function(n2) {
+ return n2.loc;
+ }).map(projection2);
+ var toLength = geoPathLength(toPoints);
+ var mid = toLength / 2;
+ var toNode = graph.entity(d.to.node);
+ var toVertex = graph.entity(d.to.vertex);
+ var a = geoAngle(toVertex, toNode, projection2);
+ var o = projection2(toVertex.loc);
+ var r = d.u ? 0 : !toWay.__via ? pxRadius : Math.min(mid, pxRadius);
+ return "translate(" + (r * Math.cos(a) + o[0]) + "," + (r * Math.sin(a) + o[1]) + ") rotate(" + a * 180 / Math.PI + ")";
+ }
+ var drawLayer = selection2.selectAll(".layer-osm.points .points-group.turns");
+ var touchLayer = selection2.selectAll(".layer-touch.turns");
+ var groups = drawLayer.selectAll("g.turn").data(turns, function(d) {
+ return d.key;
+ });
+ groups.exit().remove();
+ var groupsEnter = groups.enter().append("g").attr("class", function(d) {
+ return "turn " + d.key;
+ });
+ var turnsEnter = groupsEnter.filter(function(d) {
+ return !d.u;
+ });
+ turnsEnter.append("rect").attr("transform", "translate(-22, -12)").attr("width", "44").attr("height", "24");
+ turnsEnter.append("use").attr("transform", "translate(-22, -12)").attr("width", "44").attr("height", "24");
+ var uEnter = groupsEnter.filter(function(d) {
+ return d.u;
+ });
+ uEnter.append("circle").attr("r", "16");
+ uEnter.append("use").attr("transform", "translate(-16, -16)").attr("width", "32").attr("height", "32");
+ groups = groups.merge(groupsEnter).attr("opacity", function(d) {
+ return d.direct === false ? "0.7" : null;
+ }).attr("transform", turnTransform);
+ groups.select("use").attr("xlink:href", icon2);
+ groups.select("rect");
+ groups.select("circle");
+ var fillClass = context.getDebug("target") ? "pink " : "nocolor ";
+ groups = touchLayer.selectAll("g.turn").data(turns, function(d) {
+ return d.key;
+ });
+ groups.exit().remove();
+ groupsEnter = groups.enter().append("g").attr("class", function(d) {
+ return "turn " + d.key;
+ });
+ turnsEnter = groupsEnter.filter(function(d) {
+ return !d.u;
+ });
+ turnsEnter.append("rect").attr("class", "target " + fillClass).attr("transform", "translate(-22, -12)").attr("width", "44").attr("height", "24");
+ uEnter = groupsEnter.filter(function(d) {
+ return d.u;
+ });
+ uEnter.append("circle").attr("class", "target " + fillClass).attr("r", "16");
+ groups = groups.merge(groupsEnter).attr("transform", turnTransform);
+ groups.select("rect");
+ groups.select("circle");
+ return this;
+ }
+ return drawTurns;
+ }
+
+ // modules/svg/vertices.js
+ var import_fast_deep_equal8 = __toESM(require_fast_deep_equal());
+ function svgVertices(projection2, context) {
+ var radiuses = {
+ shadow: [6, 7.5, 7.5, 12],
+ stroke: [2.5, 3.5, 3.5, 8],
+ fill: [1, 1.5, 1.5, 1.5]
+ };
+ var _currHoverTarget;
+ var _currPersistent = {};
+ var _currHover = {};
+ var _prevHover = {};
+ var _currSelected = {};
+ var _prevSelected = {};
+ var _radii = {};
+ function sortY(a, b) {
+ return b.loc[1] - a.loc[1];
+ }
+ function fastEntityKey(d) {
+ var mode = context.mode();
+ var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
+ return isMoving ? d.id : osmEntity.key(d);
+ }
+ function draw(selection2, graph, vertices, sets2, filter2) {
+ sets2 = sets2 || { selected: {}, important: {}, hovered: {} };
+ var icons = {};
+ var directions = {};
+ var wireframe = context.surface().classed("fill-wireframe");
+ var zoom = geoScaleToZoom(projection2.scale());
+ var z = zoom < 17 ? 0 : zoom < 18 ? 1 : 2;
+ var activeID = context.activeID();
+ var base = context.history().base();
+ function getIcon(d) {
+ var entity = graph.entity(d.id);
+ if (entity.id in icons)
+ return icons[entity.id];
+ icons[entity.id] = entity.hasInterestingTags() && _mainPresetIndex.match(entity, graph).icon;
+ return icons[entity.id];
+ }
+ function getDirections(entity) {
+ if (entity.id in directions)
+ return directions[entity.id];
+ var angles = entity.directions(graph, projection2);
+ directions[entity.id] = angles.length ? angles : false;
+ return angles;
+ }
+ function updateAttributes(selection3) {
+ ["shadow", "stroke", "fill"].forEach(function(klass) {
+ var rads = radiuses[klass];
+ selection3.selectAll("." + klass).each(function(entity) {
+ var i2 = z && getIcon(entity);
+ var r = rads[i2 ? 3 : z];
+ if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
+ r += 1.5;
+ }
+ if (klass === "shadow") {
+ _radii[entity.id] = r;
+ }
+ select_default2(this).attr("r", r).attr("visibility", i2 && klass === "fill" ? "hidden" : null);
+ });
+ });
+ }
+ vertices.sort(sortY);
+ var groups = selection2.selectAll("g.vertex").filter(filter2).data(vertices, fastEntityKey);
+ groups.exit().remove();
+ var enter = groups.enter().append("g").attr("class", function(d) {
+ return "node vertex " + d.id;
+ }).order();
+ enter.append("circle").attr("class", "shadow");
+ enter.append("circle").attr("class", "stroke");
+ enter.filter(function(d) {
+ return d.hasInterestingTags();
+ }).append("circle").attr("class", "fill");
+ groups = groups.merge(enter).attr("transform", svgPointTransform(projection2)).classed("sibling", function(d) {
+ return d.id in sets2.selected;
+ }).classed("shared", function(d) {
+ return graph.isShared(d);
+ }).classed("endpoint", function(d) {
+ return d.isEndpoint(graph);
+ }).classed("added", function(d) {
+ return !base.entities[d.id];
+ }).classed("moved", function(d) {
+ return base.entities[d.id] && !(0, import_fast_deep_equal8.default)(graph.entities[d.id].loc, base.entities[d.id].loc);
+ }).classed("retagged", function(d) {
+ return base.entities[d.id] && !(0, import_fast_deep_equal8.default)(graph.entities[d.id].tags, base.entities[d.id].tags);
+ }).call(updateAttributes);
+ var iconUse = groups.selectAll(".icon").data(function data(d) {
+ return zoom >= 17 && getIcon(d) ? [d] : [];
+ }, fastEntityKey);
+ iconUse.exit().remove();
+ iconUse.enter().append("use").attr("class", "icon").attr("width", "12px").attr("height", "12px").attr("transform", "translate(-6, -6)").attr("xlink:href", function(d) {
+ var picon = getIcon(d);
+ return picon ? "#" + picon : "";
+ });
+ var dgroups = groups.selectAll(".viewfieldgroup").data(function data(d) {
+ return zoom >= 18 && getDirections(d) ? [d] : [];
+ }, fastEntityKey);
+ dgroups.exit().remove();
+ dgroups = dgroups.enter().insert("g", ".shadow").attr("class", "viewfieldgroup").merge(dgroups);
+ var viewfields = dgroups.selectAll(".viewfield").data(getDirections, function key(d) {
+ return osmEntity.key(d);
+ });
+ viewfields.exit().remove();
+ viewfields.enter().append("path").attr("class", "viewfield").attr("d", "M0,0H0").merge(viewfields).attr("marker-start", "url(#ideditor-viewfield-marker" + (wireframe ? "-wireframe" : "") + ")").attr("transform", function(d) {
+ return "rotate(" + d + ")";
+ });
+ }
+ function drawTargets(selection2, graph, entities, filter2) {
+ var targetClass = context.getDebug("target") ? "pink " : "nocolor ";
+ var nopeClass = context.getDebug("target") ? "red " : "nocolor ";
+ var getTransform = svgPointTransform(projection2).geojson;
+ var activeID = context.activeID();
+ var data = { targets: [], nopes: [] };
+ entities.forEach(function(node) {
+ if (activeID === node.id)
+ return;
+ var vertexType = svgPassiveVertex(node, graph, activeID);
+ if (vertexType !== 0) {
+ data.targets.push({
+ type: "Feature",
+ id: node.id,
+ properties: {
+ target: true,
+ entity: node
+ },
+ geometry: node.asGeoJSON()
+ });
+ } else {
+ data.nopes.push({
+ type: "Feature",
+ id: node.id + "-nope",
+ properties: {
+ nope: true,
+ target: true,
+ entity: node
+ },
+ geometry: node.asGeoJSON()
+ });
+ }
+ });
+ var targets = selection2.selectAll(".vertex.target-allowed").filter(function(d) {
+ return filter2(d.properties.entity);
+ }).data(data.targets, function key(d) {
+ return d.id;
+ });
+ targets.exit().remove();
+ targets.enter().append("circle").attr("r", function(d) {
+ return _radii[d.id] || radiuses.shadow[3];
+ }).merge(targets).attr("class", function(d) {
+ return "node vertex target target-allowed " + targetClass + d.id;
+ }).attr("transform", getTransform);
+ var nopes = selection2.selectAll(".vertex.target-nope").filter(function(d) {
+ return filter2(d.properties.entity);
+ }).data(data.nopes, function key(d) {
+ return d.id;
+ });
+ nopes.exit().remove();
+ nopes.enter().append("circle").attr("r", function(d) {
+ return _radii[d.properties.entity.id] || radiuses.shadow[3];
+ }).merge(nopes).attr("class", function(d) {
+ return "node vertex target target-nope " + nopeClass + d.id;
+ }).attr("transform", getTransform);
+ }
+ function renderAsVertex(entity, graph, wireframe, zoom) {
+ var geometry = entity.geometry(graph);
+ return geometry === "vertex" || geometry === "point" && (wireframe || zoom >= 18 && entity.directions(graph, projection2).length);
+ }
+ function isEditedNode(node, base, head) {
+ var baseNode = base.entities[node.id];
+ var headNode = head.entities[node.id];
+ return !headNode || !baseNode || !(0, import_fast_deep_equal8.default)(headNode.tags, baseNode.tags) || !(0, import_fast_deep_equal8.default)(headNode.loc, baseNode.loc);
+ }
+ function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
+ var results = {};
+ var seenIds = {};
+ function addChildVertices(entity) {
+ if (seenIds[entity.id])
+ return;
+ seenIds[entity.id] = true;
+ var geometry = entity.geometry(graph);
+ if (!context.features().isHiddenFeature(entity, graph, geometry)) {
+ var i2;
+ if (entity.type === "way") {
+ for (i2 = 0; i2 < entity.nodes.length; i2++) {
+ var child = graph.hasEntity(entity.nodes[i2]);
+ if (child) {
+ addChildVertices(child);
+ }
+ }
+ } else if (entity.type === "relation") {
+ for (i2 = 0; i2 < entity.members.length; i2++) {
+ var member = graph.hasEntity(entity.members[i2].id);
+ if (member) {
+ addChildVertices(member);
+ }
+ }
+ } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
+ results[entity.id] = entity;
+ }
+ }
+ }
+ ids.forEach(function(id2) {
+ var entity = graph.hasEntity(id2);
+ if (!entity)
+ return;
+ if (entity.type === "node") {
+ if (renderAsVertex(entity, graph, wireframe, zoom)) {
+ results[entity.id] = entity;
+ graph.parentWays(entity).forEach(function(entity2) {
+ addChildVertices(entity2);
+ });
+ }
+ } else {
+ addChildVertices(entity);
+ }
+ });
+ return results;
+ }
+ function drawVertices(selection2, graph, entities, filter2, extent, fullRedraw) {
+ var wireframe = context.surface().classed("fill-wireframe");
+ var visualDiff = context.surface().classed("highlight-edited");
+ var zoom = geoScaleToZoom(projection2.scale());
+ var mode = context.mode();
+ var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
+ var base = context.history().base();
+ var drawLayer = selection2.selectAll(".layer-osm.points .points-group.vertices");
+ var touchLayer = selection2.selectAll(".layer-touch.points");
+ if (fullRedraw) {
+ _currPersistent = {};
+ _radii = {};
+ }
+ for (var i2 = 0; i2 < entities.length; i2++) {
+ var entity = entities[i2];
+ var geometry = entity.geometry(graph);
+ var keep = false;
+ if (geometry === "point" && renderAsVertex(entity, graph, wireframe, zoom)) {
+ _currPersistent[entity.id] = entity;
+ keep = true;
+ } else if (geometry === "vertex" && (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph) || visualDiff && isEditedNode(entity, base, graph))) {
+ _currPersistent[entity.id] = entity;
+ keep = true;
+ }
+ if (!keep && !fullRedraw) {
+ delete _currPersistent[entity.id];
+ }
+ }
+ var sets2 = {
+ persistent: _currPersistent,
+ selected: _currSelected,
+ hovered: _currHover
+ };
+ var all = Object.assign({}, isMoving ? _currHover : {}, _currSelected, _currPersistent);
+ var filterRendered = function(d) {
+ return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter2(d);
+ };
+ drawLayer.call(draw, graph, currentVisible(all), sets2, filterRendered);
+ var filterTouch = function(d) {
+ return isMoving ? true : filterRendered(d);
+ };
+ touchLayer.call(drawTargets, graph, currentVisible(all), filterTouch);
+ function currentVisible(which) {
+ return Object.keys(which).map(graph.hasEntity, graph).filter(function(entity2) {
+ return entity2 && entity2.intersects(extent, graph);
+ });
+ }
+ }
+ drawVertices.drawSelected = function(selection2, graph, extent) {
+ var wireframe = context.surface().classed("fill-wireframe");
+ var zoom = geoScaleToZoom(projection2.scale());
+ _prevSelected = _currSelected || {};
+ if (context.map().isInWideSelection()) {
+ _currSelected = {};
+ context.selectedIDs().forEach(function(id2) {
+ var entity = graph.hasEntity(id2);
+ if (!entity)
+ return;
+ if (entity.type === "node") {
+ if (renderAsVertex(entity, graph, wireframe, zoom)) {
+ _currSelected[entity.id] = entity;
+ }
+ }
+ });
+ } else {
+ _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
+ }
+ var filter2 = function(d) {
+ return d.id in _prevSelected;
+ };
+ drawVertices(selection2, graph, Object.values(_prevSelected), filter2, extent, false);
+ };
+ drawVertices.drawHover = function(selection2, graph, target, extent) {
+ if (target === _currHoverTarget)
+ return;
+ var wireframe = context.surface().classed("fill-wireframe");
+ var zoom = geoScaleToZoom(projection2.scale());
+ _prevHover = _currHover || {};
+ _currHoverTarget = target;
+ var entity = target && target.properties && target.properties.entity;
+ if (entity) {
+ _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
+ } else {
+ _currHover = {};
+ }
+ var filter2 = function(d) {
+ return d.id in _prevHover;
+ };
+ drawVertices(selection2, graph, Object.values(_prevHover), filter2, extent, false);
+ };
+ return drawVertices;
+ }
+
+ // modules/util/bind_once.js
+ function utilBindOnce(target, type3, listener, capture) {
+ var typeOnce = type3 + ".once";
+ function one2() {
+ target.on(typeOnce, null);
+ listener.apply(this, arguments);
+ }
+ target.on(typeOnce, one2, capture);
+ return this;
+ }
+
+ // modules/util/zoom_pan.js
+ function defaultFilter3(d3_event) {
+ return !d3_event.ctrlKey && !d3_event.button;
+ }
+ function defaultExtent2() {
+ var e = this;
+ if (e instanceof SVGElement) {
+ e = e.ownerSVGElement || e;
+ if (e.hasAttribute("viewBox")) {
+ e = e.viewBox.baseVal;
+ return [[e.x, e.y], [e.x + e.width, e.y + e.height]];
+ }
+ return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];
+ }
+ return [[0, 0], [e.clientWidth, e.clientHeight]];
+ }
+ function defaultWheelDelta2(d3_event) {
+ return -d3_event.deltaY * (d3_event.deltaMode === 1 ? 0.05 : d3_event.deltaMode ? 1 : 2e-3);
+ }
+ function defaultConstrain2(transform2, extent, translateExtent) {
+ var dx0 = transform2.invertX(extent[0][0]) - translateExtent[0][0], dx1 = transform2.invertX(extent[1][0]) - translateExtent[1][0], dy0 = transform2.invertY(extent[0][1]) - translateExtent[0][1], dy1 = transform2.invertY(extent[1][1]) - translateExtent[1][1];
+ return transform2.translate(dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1));
+ }
+ function utilZoomPan() {
+ var filter2 = defaultFilter3, extent = defaultExtent2, constrain = defaultConstrain2, wheelDelta = defaultWheelDelta2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], interpolate = zoom_default, dispatch10 = dispatch_default("start", "zoom", "end"), _wheelDelay = 150, _transform = identity2, _activeGesture;
+ function zoom(selection2) {
+ selection2.on("pointerdown.zoom", pointerdown).on("wheel.zoom", wheeled).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
+ select_default2(window).on("pointermove.zoompan", pointermove).on("pointerup.zoompan pointercancel.zoompan", pointerup);
+ }
+ zoom.transform = function(collection, transform2, point) {
+ var selection2 = collection.selection ? collection.selection() : collection;
+ if (collection !== selection2) {
+ schedule(collection, transform2, point);
+ } else {
+ selection2.interrupt().each(function() {
+ gesture(this, arguments).start(null).zoom(null, null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end(null);
+ });
+ }
+ };
+ zoom.scaleBy = function(selection2, k, p) {
+ zoom.scaleTo(selection2, function() {
+ var k0 = _transform.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k;
+ return k0 * k1;
+ }, p);
+ };
+ zoom.scaleTo = function(selection2, k, p) {
+ zoom.transform(selection2, function() {
+ var e = extent.apply(this, arguments), t0 = _transform, p02 = !p ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t0.invert(p02), k1 = typeof k === "function" ? k.apply(this, arguments) : k;
+ return constrain(translate(scale(t0, k1), p02, p1), e, translateExtent);
+ }, p);
+ };
+ zoom.translateBy = function(selection2, x, y) {
+ zoom.transform(selection2, function() {
+ return constrain(_transform.translate(typeof x === "function" ? x.apply(this, arguments) : x, typeof y === "function" ? y.apply(this, arguments) : y), extent.apply(this, arguments), translateExtent);
+ });
+ };
+ zoom.translateTo = function(selection2, x, y, p) {
+ zoom.transform(selection2, function() {
+ var e = extent.apply(this, arguments), t = _transform, p02 = !p ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p;
+ return constrain(identity2.translate(p02[0], p02[1]).scale(t.k).translate(typeof x === "function" ? -x.apply(this, arguments) : -x, typeof y === "function" ? -y.apply(this, arguments) : -y), e, translateExtent);
+ }, p);
+ };
+ function scale(transform2, k) {
+ k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
+ return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y);
+ }
+ function translate(transform2, p02, p1) {
+ var x = p02[0] - p1[0] * transform2.k, y = p02[1] - p1[1] * transform2.k;
+ return x === transform2.x && y === transform2.y ? transform2 : new Transform(transform2.k, x, y);
+ }
+ function centroid(extent2) {
+ return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2];
+ }
+ function schedule(transition2, transform2, point) {
+ transition2.on("start.zoom", function() {
+ gesture(this, arguments).start(null);
+ }).on("interrupt.zoom end.zoom", function() {
+ gesture(this, arguments).end(null);
+ }).tween("zoom", function() {
+ var that = this, args = arguments, g = gesture(that, args), e = extent.apply(that, args), p = !point ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a = _transform, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i2 = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
+ return function(t) {
+ if (t === 1) {
+ t = b;
+ } else {
+ var l = i2(t);
+ var k = w / l[2];
+ t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
+ }
+ g.zoom(null, null, t);
+ };
+ });
+ }
+ function gesture(that, args, clean2) {
+ return !clean2 && _activeGesture || new Gesture(that, args);
+ }
+ function Gesture(that, args) {
+ this.that = that;
+ this.args = args;
+ this.active = 0;
+ this.extent = extent.apply(that, args);
+ }
+ Gesture.prototype = {
+ start: function(d3_event) {
+ if (++this.active === 1) {
+ _activeGesture = this;
+ dispatch10.call("start", this, d3_event);
+ }
+ return this;
+ },
+ zoom: function(d3_event, key, transform2) {
+ if (this.mouse && key !== "mouse")
+ this.mouse[1] = transform2.invert(this.mouse[0]);
+ if (this.pointer0 && key !== "touch")
+ this.pointer0[1] = transform2.invert(this.pointer0[0]);
+ if (this.pointer1 && key !== "touch")
+ this.pointer1[1] = transform2.invert(this.pointer1[0]);
+ _transform = transform2;
+ dispatch10.call("zoom", this, d3_event, key, transform2);
+ return this;
+ },
+ end: function(d3_event) {
+ if (--this.active === 0) {
+ _activeGesture = null;
+ dispatch10.call("end", this, d3_event);
+ }
+ return this;
+ }
+ };
+ function wheeled(d3_event) {
+ if (!filter2.apply(this, arguments))
+ return;
+ var g = gesture(this, arguments), t = _transform, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = utilFastMouse(this)(d3_event);
+ if (g.wheel) {
+ if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
+ g.mouse[1] = t.invert(g.mouse[0] = p);
+ }
+ clearTimeout(g.wheel);
+ } else {
+ g.mouse = [p, t.invert(p)];
+ interrupt_default(this);
+ g.start(d3_event);
+ }
+ d3_event.preventDefault();
+ d3_event.stopImmediatePropagation();
+ g.wheel = setTimeout(wheelidled, _wheelDelay);
+ g.zoom(d3_event, "mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
+ function wheelidled() {
+ g.wheel = null;
+ g.end(d3_event);
+ }
+ }
+ var _downPointerIDs = /* @__PURE__ */ new Set();
+ var _pointerLocGetter;
+ function pointerdown(d3_event) {
+ _downPointerIDs.add(d3_event.pointerId);
+ if (!filter2.apply(this, arguments))
+ return;
+ var g = gesture(this, arguments, _downPointerIDs.size === 1);
+ var started;
+ d3_event.stopImmediatePropagation();
+ _pointerLocGetter = utilFastMouse(this);
+ var loc = _pointerLocGetter(d3_event);
+ var p = [loc, _transform.invert(loc), d3_event.pointerId];
+ if (!g.pointer0) {
+ g.pointer0 = p;
+ started = true;
+ } else if (!g.pointer1 && g.pointer0[2] !== p[2]) {
+ g.pointer1 = p;
+ }
+ if (started) {
+ interrupt_default(this);
+ g.start(d3_event);
+ }
+ }
+ function pointermove(d3_event) {
+ if (!_downPointerIDs.has(d3_event.pointerId))
+ return;
+ if (!_activeGesture || !_pointerLocGetter)
+ return;
+ var g = gesture(this, arguments);
+ var isPointer0 = g.pointer0 && g.pointer0[2] === d3_event.pointerId;
+ var isPointer1 = !isPointer0 && g.pointer1 && g.pointer1[2] === d3_event.pointerId;
+ if ((isPointer0 || isPointer1) && "buttons" in d3_event && !d3_event.buttons) {
+ if (g.pointer0)
+ _downPointerIDs.delete(g.pointer0[2]);
+ if (g.pointer1)
+ _downPointerIDs.delete(g.pointer1[2]);
+ g.end(d3_event);
+ return;
+ }
+ d3_event.preventDefault();
+ d3_event.stopImmediatePropagation();
+ var loc = _pointerLocGetter(d3_event);
+ var t, p, l;
+ if (isPointer0)
+ g.pointer0[0] = loc;
+ else if (isPointer1)
+ g.pointer1[0] = loc;
+ t = _transform;
+ if (g.pointer1) {
+ var p02 = g.pointer0[0], l0 = g.pointer0[1], p1 = g.pointer1[0], l1 = g.pointer1[1], dp = (dp = p1[0] - p02[0]) * dp + (dp = p1[1] - p02[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
+ t = scale(t, Math.sqrt(dp / dl));
+ p = [(p02[0] + p1[0]) / 2, (p02[1] + p1[1]) / 2];
+ l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
+ } else if (g.pointer0) {
+ p = g.pointer0[0];
+ l = g.pointer0[1];
+ } else {
+ return;
+ }
+ g.zoom(d3_event, "touch", constrain(translate(t, p, l), g.extent, translateExtent));
+ }
+ function pointerup(d3_event) {
+ if (!_downPointerIDs.has(d3_event.pointerId))
+ return;
+ _downPointerIDs.delete(d3_event.pointerId);
+ if (!_activeGesture)
+ return;
+ var g = gesture(this, arguments);
+ d3_event.stopImmediatePropagation();
+ if (g.pointer0 && g.pointer0[2] === d3_event.pointerId)
+ delete g.pointer0;
+ else if (g.pointer1 && g.pointer1[2] === d3_event.pointerId)
+ delete g.pointer1;
+ if (g.pointer1 && !g.pointer0) {
+ g.pointer0 = g.pointer1;
+ delete g.pointer1;
+ }
+ if (g.pointer0) {
+ g.pointer0[1] = _transform.invert(g.pointer0[0]);
+ } else {
+ g.end(d3_event);
+ }
+ }
+ zoom.wheelDelta = function(_) {
+ return arguments.length ? (wheelDelta = utilFunctor(+_), zoom) : wheelDelta;
+ };
+ zoom.filter = function(_) {
+ return arguments.length ? (filter2 = utilFunctor(!!_), zoom) : filter2;
+ };
+ zoom.extent = function(_) {
+ return arguments.length ? (extent = utilFunctor([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
+ };
+ zoom.scaleExtent = function(_) {
+ return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
+ };
+ zoom.translateExtent = function(_) {
+ 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]]];
+ };
+ zoom.constrain = function(_) {
+ return arguments.length ? (constrain = _, zoom) : constrain;
+ };
+ zoom.interpolate = function(_) {
+ return arguments.length ? (interpolate = _, zoom) : interpolate;
+ };
+ zoom._transform = function(_) {
+ return arguments.length ? (_transform = _, zoom) : _transform;
+ };
+ return utilRebind(zoom, dispatch10, "on");
+ }
+
+ // modules/util/double_up.js
+ function utilDoubleUp() {
+ var dispatch10 = dispatch_default("doubleUp");
+ var _maxTimespan = 500;
+ var _maxDistance = 20;
+ var _pointer;
+ function pointerIsValidFor(loc) {
+ return new Date().getTime() - _pointer.startTime <= _maxTimespan && geoVecLength(_pointer.startLoc, loc) <= _maxDistance;
+ }
+ function pointerdown(d3_event) {
+ if (d3_event.ctrlKey || d3_event.button === 2)
+ return;
+ var loc = [d3_event.clientX, d3_event.clientY];
+ if (_pointer && !pointerIsValidFor(loc)) {
+ _pointer = void 0;
+ }
+ if (!_pointer) {
+ _pointer = {
+ startLoc: loc,
+ startTime: new Date().getTime(),
+ upCount: 0,
+ pointerId: d3_event.pointerId
+ };
+ } else {
+ _pointer.pointerId = d3_event.pointerId;
+ }
+ }
+ function pointerup(d3_event) {
+ if (d3_event.ctrlKey || d3_event.button === 2)
+ return;
+ if (!_pointer || _pointer.pointerId !== d3_event.pointerId)
+ return;
+ _pointer.upCount += 1;
+ if (_pointer.upCount === 2) {
+ var loc = [d3_event.clientX, d3_event.clientY];
+ if (pointerIsValidFor(loc)) {
+ var locInThis = utilFastMouse(this)(d3_event);
+ dispatch10.call("doubleUp", this, d3_event, locInThis);
+ }
+ _pointer = void 0;
+ }
+ }
+ function doubleUp(selection2) {
+ if ("PointerEvent" in window) {
+ selection2.on("pointerdown.doubleUp", pointerdown).on("pointerup.doubleUp", pointerup);
+ } else {
+ selection2.on("dblclick.doubleUp", function(d3_event) {
+ dispatch10.call("doubleUp", this, d3_event, utilFastMouse(this)(d3_event));
+ });
+ }
+ }
+ doubleUp.off = function(selection2) {
+ selection2.on("pointerdown.doubleUp", null).on("pointerup.doubleUp", null).on("dblclick.doubleUp", null);
+ };
+ return utilRebind(doubleUp, dispatch10, "on");
+ }
+
+ // modules/renderer/map.js
+ var TILESIZE = 256;
+ var minZoom2 = 2;
+ var maxZoom = 24;
+ var kMin = geoZoomToScale(minZoom2, TILESIZE);
+ var kMax = geoZoomToScale(maxZoom, TILESIZE);
+ function clamp(num, min3, max3) {
+ return Math.max(min3, Math.min(num, max3));
+ }
+ function rendererMap(context) {
+ var dispatch10 = dispatch_default("move", "drawn", "crossEditableZoom", "hitMinZoom", "changeHighlighting", "changeAreaFill");
+ var projection2 = context.projection;
+ var curtainProjection = context.curtainProjection;
+ var drawLayers;
+ var drawPoints;
+ var drawVertices;
+ var drawLines;
+ var drawAreas;
+ var drawMidpoints;
+ var drawLabels;
+ var _selection = select_default2(null);
+ var supersurface = select_default2(null);
+ var wrapper = select_default2(null);
+ var surface = select_default2(null);
+ var _dimensions = [1, 1];
+ var _dblClickZoomEnabled = true;
+ var _redrawEnabled = true;
+ var _gestureTransformStart;
+ var _transformStart = projection2.transform();
+ var _transformLast;
+ var _isTransformed = false;
+ var _minzoom = 0;
+ var _getMouseCoords;
+ var _lastPointerEvent;
+ var _lastWithinEditableZoom;
+ var _pointerDown = false;
+ var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ var _zoomerPannerFunction = "PointerEvent" in window ? utilZoomPan : zoom_default2;
+ var _zoomerPanner = _zoomerPannerFunction().scaleExtent([kMin, kMax]).interpolate(value_default).filter(zoomEventFilter).on("zoom.map", zoomPan).on("start.map", function(d3_event) {
+ _pointerDown = d3_event && (d3_event.type === "pointerdown" || d3_event.sourceEvent && d3_event.sourceEvent.type === "pointerdown");
+ }).on("end.map", function() {
+ _pointerDown = false;
+ });
+ var _doubleUpHandler = utilDoubleUp();
+ var scheduleRedraw = throttle_default(redraw, 750);
+ function cancelPendingRedraw() {
+ scheduleRedraw.cancel();
+ }
+ function map2(selection2) {
+ _selection = selection2;
+ context.on("change.map", immediateRedraw);
+ var osm = context.connection();
+ if (osm) {
+ osm.on("change.map", immediateRedraw);
+ }
+ function didUndoOrRedo(targetTransform) {
+ var mode = context.mode().id;
+ if (mode !== "browse" && mode !== "select")
+ return;
+ if (targetTransform) {
+ map2.transformEase(targetTransform);
+ }
+ }
+ context.history().on("merge.map", function() {
+ scheduleRedraw();
+ }).on("change.map", immediateRedraw).on("undone.map", function(stack, fromStack) {
+ didUndoOrRedo(fromStack.transform);
+ }).on("redone.map", function(stack) {
+ didUndoOrRedo(stack.transform);
+ });
+ context.background().on("change.map", immediateRedraw);
+ context.features().on("redraw.map", immediateRedraw);
+ drawLayers.on("change.map", function() {
+ context.background().updateImagery();
+ immediateRedraw();
+ });
+ selection2.on("wheel.map mousewheel.map", function(d3_event) {
+ d3_event.preventDefault();
+ }).call(_zoomerPanner).call(_zoomerPanner.transform, projection2.transform()).on("dblclick.zoom", null);
+ map2.supersurface = supersurface = selection2.append("div").attr("class", "supersurface").call(utilSetTransform, 0, 0);
+ wrapper = supersurface.append("div").attr("class", "layer layer-data");
+ map2.surface = surface = wrapper.call(drawLayers).selectAll(".surface");
+ surface.call(drawLabels.observe).call(_doubleUpHandler).on(_pointerPrefix + "down.zoom", function(d3_event) {
+ _lastPointerEvent = d3_event;
+ if (d3_event.button === 2) {
+ d3_event.stopPropagation();
+ }
+ }, true).on(_pointerPrefix + "up.zoom", function(d3_event) {
+ _lastPointerEvent = d3_event;
+ if (resetTransform()) {
+ immediateRedraw();
+ }
+ }).on(_pointerPrefix + "move.map", function(d3_event) {
+ _lastPointerEvent = d3_event;
+ }).on(_pointerPrefix + "over.vertices", function(d3_event) {
+ if (map2.editableDataEnabled() && !_isTransformed) {
+ var hover = d3_event.target.__data__;
+ surface.call(drawVertices.drawHover, context.graph(), hover, map2.extent());
+ dispatch10.call("drawn", this, { full: false });
+ }
+ }).on(_pointerPrefix + "out.vertices", function(d3_event) {
+ if (map2.editableDataEnabled() && !_isTransformed) {
+ var hover = d3_event.relatedTarget && d3_event.relatedTarget.__data__;
+ surface.call(drawVertices.drawHover, context.graph(), hover, map2.extent());
+ dispatch10.call("drawn", this, { full: false });
+ }
+ });
+ var detected = utilDetect();
+ if ("GestureEvent" in window && !detected.isMobileWebKit) {
+ surface.on("gesturestart.surface", function(d3_event) {
+ d3_event.preventDefault();
+ _gestureTransformStart = projection2.transform();
+ }).on("gesturechange.surface", gestureChange);
+ }
+ updateAreaFill();
+ _doubleUpHandler.on("doubleUp.map", function(d3_event, p02) {
+ if (!_dblClickZoomEnabled)
+ return;
+ if (typeof d3_event.target.__data__ === "object" && !select_default2(d3_event.target).classed("fill"))
+ return;
+ var zoomOut2 = d3_event.shiftKey;
+ var t = projection2.transform();
+ var p1 = t.invert(p02);
+ t = t.scale(zoomOut2 ? 0.5 : 2);
+ t.x = p02[0] - p1[0] * t.k;
+ t.y = p02[1] - p1[1] * t.k;
+ map2.transformEase(t);
+ });
+ context.on("enter.map", function() {
+ if (!map2.editableDataEnabled(true))
+ return;
+ if (_isTransformed)
+ return;
+ var graph = context.graph();
+ var selectedAndParents = {};
+ context.selectedIDs().forEach(function(id2) {
+ var entity = graph.hasEntity(id2);
+ if (entity) {
+ selectedAndParents[entity.id] = entity;
+ if (entity.type === "node") {
+ graph.parentWays(entity).forEach(function(parent) {
+ selectedAndParents[parent.id] = parent;
+ });
+ }
+ }
+ });
+ var data = Object.values(selectedAndParents);
+ var filter2 = function(d) {
+ return d.id in selectedAndParents;
+ };
+ data = context.features().filter(data, graph);
+ surface.call(drawVertices.drawSelected, graph, map2.extent()).call(drawLines, graph, data, filter2).call(drawAreas, graph, data, filter2).call(drawMidpoints, graph, data, filter2, map2.trimmedExtent());
+ dispatch10.call("drawn", this, { full: false });
+ scheduleRedraw();
+ });
+ map2.dimensions(utilGetDimensions(selection2));
+ }
+ function zoomEventFilter(d3_event) {
+ if (d3_event.type === "mousedown") {
+ var hasOrphan = false;
+ var listeners = window.__on;
+ for (var i2 = 0; i2 < listeners.length; i2++) {
+ var listener = listeners[i2];
+ if (listener.name === "zoom" && listener.type === "mouseup") {
+ hasOrphan = true;
+ break;
+ }
+ }
+ if (hasOrphan) {
+ var event = window.CustomEvent;
+ if (event) {
+ event = new event("mouseup");
+ } else {
+ event = window.document.createEvent("Event");
+ event.initEvent("mouseup", false, false);
+ }
+ event.view = window;
+ window.dispatchEvent(event);
+ }
+ }
+ return d3_event.button !== 2;
+ }
+ function pxCenter() {
+ return [_dimensions[0] / 2, _dimensions[1] / 2];
+ }
+ function drawEditable(difference, extent) {
+ var mode = context.mode();
+ var graph = context.graph();
+ var features2 = context.features();
+ var all = context.history().intersects(map2.extent());
+ var fullRedraw = false;
+ var data;
+ var set3;
+ var filter2;
+ var applyFeatureLayerFilters = true;
+ if (map2.isInWideSelection()) {
+ data = [];
+ utilEntityAndDeepMemberIDs(mode.selectedIDs(), context.graph()).forEach(function(id2) {
+ var entity = context.hasEntity(id2);
+ if (entity)
+ data.push(entity);
+ });
+ fullRedraw = true;
+ filter2 = utilFunctor(true);
+ applyFeatureLayerFilters = false;
+ } else if (difference) {
+ var complete = difference.complete(map2.extent());
+ data = Object.values(complete).filter(Boolean);
+ set3 = new Set(Object.keys(complete));
+ filter2 = function(d) {
+ return set3.has(d.id);
+ };
+ features2.clear(data);
+ } else {
+ if (features2.gatherStats(all, graph, _dimensions)) {
+ extent = void 0;
+ }
+ if (extent) {
+ data = context.history().intersects(map2.extent().intersection(extent));
+ set3 = new Set(data.map(function(entity) {
+ return entity.id;
+ }));
+ filter2 = function(d) {
+ return set3.has(d.id);
+ };
+ } else {
+ data = all;
+ fullRedraw = true;
+ filter2 = utilFunctor(true);
+ }
+ }
+ if (applyFeatureLayerFilters) {
+ data = features2.filter(data, graph);
+ } else {
+ context.features().resetStats();
+ }
+ if (mode && mode.id === "select") {
+ surface.call(drawVertices.drawSelected, graph, map2.extent());
+ }
+ surface.call(drawVertices, graph, data, filter2, map2.extent(), fullRedraw).call(drawLines, graph, data, filter2).call(drawAreas, graph, data, filter2).call(drawMidpoints, graph, data, filter2, map2.trimmedExtent()).call(drawLabels, graph, data, filter2, _dimensions, fullRedraw).call(drawPoints, graph, data, filter2);
+ dispatch10.call("drawn", this, { full: true });
+ }
+ map2.init = function() {
+ drawLayers = svgLayers(projection2, context);
+ drawPoints = svgPoints(projection2, context);
+ drawVertices = svgVertices(projection2, context);
+ drawLines = svgLines(projection2, context);
+ drawAreas = svgAreas(projection2, context);
+ drawMidpoints = svgMidpoints(projection2, context);
+ drawLabels = svgLabels(projection2, context);
+ };
+ function editOff() {
+ context.features().resetStats();
+ surface.selectAll(".layer-osm *").remove();
+ surface.selectAll(".layer-touch:not(.markers) *").remove();
+ var allowed = {
+ "browse": true,
+ "save": true,
+ "select-note": true,
+ "select-data": true,
+ "select-error": true
+ };
+ var mode = context.mode();
+ if (mode && !allowed[mode.id]) {
+ context.enter(modeBrowse(context));
+ }
+ dispatch10.call("drawn", this, { full: true });
+ }
+ function gestureChange(d3_event) {
+ var e = d3_event;
+ e.preventDefault();
+ var props = {
+ deltaMode: 0,
+ deltaY: 1,
+ clientX: e.clientX,
+ clientY: e.clientY,
+ screenX: e.screenX,
+ screenY: e.screenY,
+ x: e.x,
+ y: e.y
+ };
+ var e22 = new WheelEvent("wheel", props);
+ e22._scale = e.scale;
+ e22._rotation = e.rotation;
+ _selection.node().dispatchEvent(e22);
+ }
+ function zoomPan(event, key, transform2) {
+ var source = event && event.sourceEvent || event;
+ var eventTransform = transform2 || event && event.transform;
+ var x = eventTransform.x;
+ var y = eventTransform.y;
+ var k = eventTransform.k;
+ if (source && source.type === "wheel") {
+ if (_pointerDown)
+ return;
+ var detected = utilDetect();
+ var dX = source.deltaX;
+ var dY = source.deltaY;
+ var x2 = x;
+ var y2 = y;
+ var k2 = k;
+ var t0, p02, p1;
+ if (source.deltaMode === 1) {
+ var lines = Math.abs(source.deltaY);
+ var sign2 = source.deltaY > 0 ? 1 : -1;
+ dY = sign2 * clamp(Math.exp((lines - 1) * 0.75) * 4.000244140625, 4.000244140625, 350.000244140625);
+ if (detected.os !== "mac") {
+ dY *= 5;
+ }
+ t0 = _isTransformed ? _transformLast : _transformStart;
+ p02 = _getMouseCoords(source);
+ p1 = t0.invert(p02);
+ k2 = t0.k * Math.pow(2, -dY / 500);
+ k2 = clamp(k2, kMin, kMax);
+ x2 = p02[0] - p1[0] * k2;
+ y2 = p02[1] - p1[1] * k2;
+ } else if (source._scale) {
+ t0 = _gestureTransformStart;
+ p02 = _getMouseCoords(source);
+ p1 = t0.invert(p02);
+ k2 = t0.k * source._scale;
+ k2 = clamp(k2, kMin, kMax);
+ x2 = p02[0] - p1[0] * k2;
+ y2 = p02[1] - p1[1] * k2;
+ } else if (source.ctrlKey && !isInteger(dY)) {
+ dY *= 6;
+ t0 = _isTransformed ? _transformLast : _transformStart;
+ p02 = _getMouseCoords(source);
+ p1 = t0.invert(p02);
+ k2 = t0.k * Math.pow(2, -dY / 500);
+ k2 = clamp(k2, kMin, kMax);
+ x2 = p02[0] - p1[0] * k2;
+ y2 = p02[1] - p1[1] * k2;
+ } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
+ t0 = _isTransformed ? _transformLast : _transformStart;
+ p02 = _getMouseCoords(source);
+ p1 = t0.invert(p02);
+ k2 = t0.k * Math.pow(2, -dY / 500);
+ k2 = clamp(k2, kMin, kMax);
+ x2 = p02[0] - p1[0] * k2;
+ y2 = p02[1] - p1[1] * k2;
+ } else if (detected.os === "mac" && detected.browser !== "Firefox" && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
+ p1 = projection2.translate();
+ x2 = p1[0] - dX;
+ y2 = p1[1] - dY;
+ k2 = projection2.scale();
+ k2 = clamp(k2, kMin, kMax);
+ }
+ if (x2 !== x || y2 !== y || k2 !== k) {
+ x = x2;
+ y = y2;
+ k = k2;
+ eventTransform = identity2.translate(x2, y2).scale(k2);
+ if (_zoomerPanner._transform) {
+ _zoomerPanner._transform(eventTransform);
+ } else {
+ _selection.node().__zoom = eventTransform;
+ }
+ }
+ }
+ if (_transformStart.x === x && _transformStart.y === y && _transformStart.k === k) {
+ return;
+ }
+ if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
+ surface.interrupt();
+ dispatch10.call("hitMinZoom", this, map2);
+ setCenterZoom(map2.center(), context.minEditableZoom(), 0, true);
+ scheduleRedraw();
+ dispatch10.call("move", this, map2);
+ return;
+ }
+ projection2.transform(eventTransform);
+ var withinEditableZoom = map2.withinEditableZoom();
+ if (_lastWithinEditableZoom !== withinEditableZoom) {
+ if (_lastWithinEditableZoom !== void 0) {
+ dispatch10.call("crossEditableZoom", this, withinEditableZoom);
+ }
+ _lastWithinEditableZoom = withinEditableZoom;
+ }
+ var scale = k / _transformStart.k;
+ var tX = (x / scale - _transformStart.x) * scale;
+ var tY = (y / scale - _transformStart.y) * scale;
+ if (context.inIntro()) {
+ curtainProjection.transform({
+ x: x - tX,
+ y: y - tY,
+ k
+ });
+ }
+ if (source) {
+ _lastPointerEvent = event;
+ }
+ _isTransformed = true;
+ _transformLast = eventTransform;
+ utilSetTransform(supersurface, tX, tY, scale);
+ scheduleRedraw();
+ dispatch10.call("move", this, map2);
+ function isInteger(val) {
+ return typeof val === "number" && isFinite(val) && Math.floor(val) === val;
+ }
+ }
+ function resetTransform() {
+ if (!_isTransformed)
+ return false;
+ utilSetTransform(supersurface, 0, 0);
+ _isTransformed = false;
+ if (context.inIntro()) {
+ curtainProjection.transform(projection2.transform());
+ }
+ return true;
+ }
+ function redraw(difference, extent) {
+ if (surface.empty() || !_redrawEnabled)
+ return;
+ if (resetTransform()) {
+ difference = extent = void 0;
+ }
+ var zoom = map2.zoom();
+ var z = String(~~zoom);
+ if (surface.attr("data-zoom") !== z) {
+ surface.attr("data-zoom", z);
+ }
+ var lat = map2.center()[1];
+ var lowzoom = linear3().domain([-60, 0, 60]).range([17, 18.5, 17]).clamp(true);
+ surface.classed("low-zoom", zoom <= lowzoom(lat));
+ if (!difference) {
+ supersurface.call(context.background());
+ wrapper.call(drawLayers);
+ }
+ if (map2.editableDataEnabled() || map2.isInWideSelection()) {
+ context.loadTiles(projection2);
+ drawEditable(difference, extent);
+ } else {
+ editOff();
+ }
+ _transformStart = projection2.transform();
+ return map2;
+ }
+ var immediateRedraw = function(difference, extent) {
+ if (!difference && !extent)
+ cancelPendingRedraw();
+ redraw(difference, extent);
+ };
+ map2.lastPointerEvent = function() {
+ return _lastPointerEvent;
+ };
+ map2.mouse = function(d3_event) {
+ var event = d3_event || _lastPointerEvent;
+ if (event) {
+ var s;
+ while (s = event.sourceEvent) {
+ event = s;
+ }
+ return _getMouseCoords(event);
+ }
+ return null;
+ };
+ map2.mouseCoordinates = function() {
+ var coord2 = map2.mouse() || pxCenter();
+ return projection2.invert(coord2);
+ };
+ map2.dblclickZoomEnable = function(val) {
+ if (!arguments.length)
+ return _dblClickZoomEnabled;
+ _dblClickZoomEnabled = val;
+ return map2;
+ };
+ map2.redrawEnable = function(val) {
+ if (!arguments.length)
+ return _redrawEnabled;
+ _redrawEnabled = val;
+ return map2;
+ };
+ map2.isTransformed = function() {
+ return _isTransformed;
+ };
+ function setTransform(t2, duration, force) {
+ var t = projection2.transform();
+ if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y)
+ return false;
+ if (duration) {
+ _selection.transition().duration(duration).on("start", function() {
+ map2.startEase();
+ }).call(_zoomerPanner.transform, identity2.translate(t2.x, t2.y).scale(t2.k));
+ } else {
+ projection2.transform(t2);
+ _transformStart = t2;
+ _selection.call(_zoomerPanner.transform, _transformStart);
+ }
+ return true;
+ }
+ function setCenterZoom(loc2, z2, duration, force) {
+ var c = map2.center();
+ var z = map2.zoom();
+ if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force)
+ return false;
+ var proj = geoRawMercator().transform(projection2.transform());
+ var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
+ proj.scale(k2);
+ var t = proj.translate();
+ var point = proj(loc2);
+ var center = pxCenter();
+ t[0] += center[0] - point[0];
+ t[1] += center[1] - point[1];
+ return setTransform(identity2.translate(t[0], t[1]).scale(k2), duration, force);
+ }
+ map2.pan = function(delta, duration) {
+ var t = projection2.translate();
+ var k = projection2.scale();
+ t[0] += delta[0];
+ t[1] += delta[1];
+ if (duration) {
+ _selection.transition().duration(duration).on("start", function() {
+ map2.startEase();
+ }).call(_zoomerPanner.transform, identity2.translate(t[0], t[1]).scale(k));
+ } else {
+ projection2.translate(t);
+ _transformStart = projection2.transform();
+ _selection.call(_zoomerPanner.transform, _transformStart);
+ dispatch10.call("move", this, map2);
+ immediateRedraw();
+ }
+ return map2;
+ };
+ map2.dimensions = function(val) {
+ if (!arguments.length)
+ return _dimensions;
+ _dimensions = val;
+ drawLayers.dimensions(_dimensions);
+ context.background().dimensions(_dimensions);
+ projection2.clipExtent([[0, 0], _dimensions]);
+ _getMouseCoords = utilFastMouse(supersurface.node());
+ scheduleRedraw();
+ return map2;
+ };
+ function zoomIn(delta) {
+ setCenterZoom(map2.center(), ~~map2.zoom() + delta, 250, true);
+ }
+ function zoomOut(delta) {
+ setCenterZoom(map2.center(), ~~map2.zoom() - delta, 250, true);
+ }
+ map2.zoomIn = function() {
+ zoomIn(1);
+ };
+ map2.zoomInFurther = function() {
+ zoomIn(4);
+ };
+ map2.canZoomIn = function() {
+ return map2.zoom() < maxZoom;
+ };
+ map2.zoomOut = function() {
+ zoomOut(1);
+ };
+ map2.zoomOutFurther = function() {
+ zoomOut(4);
+ };
+ map2.canZoomOut = function() {
+ return map2.zoom() > minZoom2;
+ };
+ map2.center = function(loc2) {
+ if (!arguments.length) {
+ return projection2.invert(pxCenter());
+ }
+ if (setCenterZoom(loc2, map2.zoom())) {
+ dispatch10.call("move", this, map2);
+ }
+ scheduleRedraw();
+ return map2;
+ };
+ map2.unobscuredCenterZoomEase = function(loc, zoom) {
+ var offset = map2.unobscuredOffsetPx();
+ var proj = geoRawMercator().transform(projection2.transform());
+ proj.scale(geoZoomToScale(zoom, TILESIZE));
+ var locPx = proj(loc);
+ var offsetLocPx = [locPx[0] + offset[0], locPx[1] + offset[1]];
+ var offsetLoc = proj.invert(offsetLocPx);
+ map2.centerZoomEase(offsetLoc, zoom);
+ };
+ map2.unobscuredOffsetPx = function() {
+ var openPane = context.container().select(".map-panes .map-pane.shown");
+ if (!openPane.empty()) {
+ return [openPane.node().offsetWidth / 2, 0];
+ }
+ return [0, 0];
+ };
+ map2.zoom = function(z2) {
+ if (!arguments.length) {
+ return Math.max(geoScaleToZoom(projection2.scale(), TILESIZE), 0);
+ }
+ if (z2 < _minzoom) {
+ surface.interrupt();
+ dispatch10.call("hitMinZoom", this, map2);
+ z2 = context.minEditableZoom();
+ }
+ if (setCenterZoom(map2.center(), z2)) {
+ dispatch10.call("move", this, map2);
+ }
+ scheduleRedraw();
+ return map2;
+ };
+ map2.centerZoom = function(loc2, z2) {
+ if (setCenterZoom(loc2, z2)) {
+ dispatch10.call("move", this, map2);
+ }
+ scheduleRedraw();
+ return map2;
+ };
+ map2.zoomTo = function(entity) {
+ var extent = entity.extent(context.graph());
+ if (!isFinite(extent.area()))
+ return map2;
+ var z2 = clamp(map2.trimmedExtentZoom(extent), 0, 20);
+ return map2.centerZoom(extent.center(), z2);
+ };
+ map2.centerEase = function(loc2, duration) {
+ duration = duration || 250;
+ setCenterZoom(loc2, map2.zoom(), duration);
+ return map2;
+ };
+ map2.zoomEase = function(z2, duration) {
+ duration = duration || 250;
+ setCenterZoom(map2.center(), z2, duration, false);
+ return map2;
+ };
+ map2.centerZoomEase = function(loc2, z2, duration) {
+ duration = duration || 250;
+ setCenterZoom(loc2, z2, duration, false);
+ return map2;
+ };
+ map2.transformEase = function(t2, duration) {
+ duration = duration || 250;
+ setTransform(t2, duration, false);
+ return map2;
+ };
+ map2.zoomToEase = function(obj, duration) {
+ var extent;
+ if (Array.isArray(obj)) {
+ obj.forEach(function(entity) {
+ var entityExtent = entity.extent(context.graph());
+ if (!extent) {
+ extent = entityExtent;
+ } else {
+ extent = extent.extend(entityExtent);
+ }
+ });
+ } else {
+ extent = obj.extent(context.graph());
+ }
+ if (!isFinite(extent.area()))
+ return map2;
+ var z2 = clamp(map2.trimmedExtentZoom(extent), 0, 20);
+ return map2.centerZoomEase(extent.center(), z2, duration);
+ };
+ map2.startEase = function() {
+ utilBindOnce(surface, _pointerPrefix + "down.ease", function() {
+ map2.cancelEase();
+ });
+ return map2;
+ };
+ map2.cancelEase = function() {
+ _selection.interrupt();
+ return map2;
+ };
+ map2.extent = function(val) {
+ if (!arguments.length) {
+ return new geoExtent(projection2.invert([0, _dimensions[1]]), projection2.invert([_dimensions[0], 0]));
+ } else {
+ var extent = geoExtent(val);
+ map2.centerZoom(extent.center(), map2.extentZoom(extent));
+ }
+ };
+ map2.trimmedExtent = function(val) {
+ if (!arguments.length) {
+ var headerY = 71;
+ var footerY = 30;
+ var pad2 = 10;
+ return new geoExtent(projection2.invert([pad2, _dimensions[1] - footerY - pad2]), projection2.invert([_dimensions[0] - pad2, headerY + pad2]));
+ } else {
+ var extent = geoExtent(val);
+ map2.centerZoom(extent.center(), map2.trimmedExtentZoom(extent));
+ }
+ };
+ function calcExtentZoom(extent, dim) {
+ var tl = projection2([extent[0][0], extent[1][1]]);
+ var br = projection2([extent[1][0], extent[0][1]]);
+ var hFactor = (br[0] - tl[0]) / dim[0];
+ var vFactor = (br[1] - tl[1]) / dim[1];
+ var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
+ var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
+ var newZoom = map2.zoom() - Math.max(hZoomDiff, vZoomDiff);
+ return newZoom;
+ }
+ map2.extentZoom = function(val) {
+ return calcExtentZoom(geoExtent(val), _dimensions);
+ };
+ map2.trimmedExtentZoom = function(val) {
+ var trimY = 120;
+ var trimX = 40;
+ var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
+ return calcExtentZoom(geoExtent(val), trimmed);
+ };
+ map2.withinEditableZoom = function() {
+ return map2.zoom() >= context.minEditableZoom();
+ };
+ map2.isInWideSelection = function() {
+ return !map2.withinEditableZoom() && context.selectedIDs().length;
+ };
+ map2.editableDataEnabled = function(skipZoomCheck) {
+ var layer = context.layers().layer("osm");
+ if (!layer || !layer.enabled())
+ return false;
+ return skipZoomCheck || map2.withinEditableZoom();
+ };
+ map2.notesEditable = function() {
+ var layer = context.layers().layer("notes");
+ if (!layer || !layer.enabled())
+ return false;
+ return map2.withinEditableZoom();
+ };
+ map2.minzoom = function(val) {
+ if (!arguments.length)
+ return _minzoom;
+ _minzoom = val;
+ return map2;
+ };
+ map2.toggleHighlightEdited = function() {
+ surface.classed("highlight-edited", !surface.classed("highlight-edited"));
+ map2.pan([0, 0]);
+ dispatch10.call("changeHighlighting", this);
+ };
+ map2.areaFillOptions = ["wireframe", "partial", "full"];
+ map2.activeAreaFill = function(val) {
+ if (!arguments.length)
+ return corePreferences("area-fill") || "partial";
+ corePreferences("area-fill", val);
+ if (val !== "wireframe") {
+ corePreferences("area-fill-toggle", val);
+ }
+ updateAreaFill();
+ map2.pan([0, 0]);
+ dispatch10.call("changeAreaFill", this);
+ return map2;
+ };
+ map2.toggleWireframe = function() {
+ var activeFill = map2.activeAreaFill();
+ if (activeFill === "wireframe") {
+ activeFill = corePreferences("area-fill-toggle") || "partial";
+ } else {
+ activeFill = "wireframe";
+ }
+ map2.activeAreaFill(activeFill);
+ };
+ function updateAreaFill() {
+ var activeFill = map2.activeAreaFill();
+ map2.areaFillOptions.forEach(function(opt) {
+ surface.classed("fill-" + opt, Boolean(opt === activeFill));
+ });
+ }
+ map2.layers = () => drawLayers;
+ map2.doubleUpHandler = function() {
+ return _doubleUpHandler;
+ };
+ return utilRebind(map2, dispatch10, "on");
+ }
+
+ // modules/renderer/photos.js
+ function rendererPhotos(context) {
+ var dispatch10 = dispatch_default("change");
+ var _layerIDs = ["streetside", "mapillary", "mapillary-map-features", "mapillary-signs", "kartaview"];
+ var _allPhotoTypes = ["flat", "panoramic"];
+ var _shownPhotoTypes = _allPhotoTypes.slice();
+ var _dateFilters = ["fromDate", "toDate"];
+ var _fromDate;
+ var _toDate;
+ var _usernames;
+ function photos() {
+ }
+ function updateStorage() {
+ if (window.mocha)
+ return;
+ var hash = utilStringQs(window.location.hash);
+ var enabled = context.layers().all().filter(function(d) {
+ return _layerIDs.indexOf(d.id) !== -1 && d.layer && d.layer.supported() && d.layer.enabled();
+ }).map(function(d) {
+ return d.id;
+ });
+ if (enabled.length) {
+ hash.photo_overlay = enabled.join(",");
+ } else {
+ delete hash.photo_overlay;
+ }
+ window.location.replace("#" + utilQsString(hash, true));
+ }
+ photos.overlayLayerIDs = function() {
+ return _layerIDs;
+ };
+ photos.allPhotoTypes = function() {
+ return _allPhotoTypes;
+ };
+ photos.dateFilters = function() {
+ return _dateFilters;
+ };
+ photos.dateFilterValue = function(val) {
+ return val === _dateFilters[0] ? _fromDate : _toDate;
+ };
+ photos.setDateFilter = function(type3, val, updateUrl) {
+ var date = val && new Date(val);
+ if (date && !isNaN(date)) {
+ val = date.toISOString().substr(0, 10);
+ } else {
+ val = null;
+ }
+ if (type3 === _dateFilters[0]) {
+ _fromDate = val;
+ if (_fromDate && _toDate && new Date(_toDate) < new Date(_fromDate)) {
+ _toDate = _fromDate;
+ }
+ }
+ if (type3 === _dateFilters[1]) {
+ _toDate = val;
+ if (_fromDate && _toDate && new Date(_toDate) < new Date(_fromDate)) {
+ _fromDate = _toDate;
+ }
+ }
+ dispatch10.call("change", this);
+ if (updateUrl) {
+ var rangeString;
+ if (_fromDate || _toDate) {
+ rangeString = (_fromDate || "") + "_" + (_toDate || "");
+ }
+ setUrlFilterValue("photo_dates", rangeString);
+ }
+ };
+ photos.setUsernameFilter = function(val, updateUrl) {
+ if (val && typeof val === "string")
+ val = val.replace(/;/g, ",").split(",");
+ if (val) {
+ val = val.map((d) => d.trim()).filter(Boolean);
+ if (!val.length) {
+ val = null;
+ }
+ }
+ _usernames = val;
+ dispatch10.call("change", this);
+ if (updateUrl) {
+ var hashString;
+ if (_usernames) {
+ hashString = _usernames.join(",");
+ }
+ setUrlFilterValue("photo_username", hashString);
+ }
+ };
+ function setUrlFilterValue(property, val) {
+ if (!window.mocha) {
+ var hash = utilStringQs(window.location.hash);
+ if (val) {
+ if (hash[property] === val)
+ return;
+ hash[property] = val;
+ } else {
+ if (!(property in hash))
+ return;
+ delete hash[property];
+ }
+ window.location.replace("#" + utilQsString(hash, true));
+ }
+ }
+ function showsLayer(id2) {
+ var layer = context.layers().layer(id2);
+ return layer && layer.supported() && layer.enabled();
+ }
+ photos.shouldFilterByDate = function() {
+ return showsLayer("mapillary") || showsLayer("kartaview") || showsLayer("streetside");
+ };
+ photos.shouldFilterByPhotoType = function() {
+ return showsLayer("mapillary") || showsLayer("streetside") && showsLayer("kartaview");
+ };
+ photos.shouldFilterByUsername = function() {
+ return !showsLayer("mapillary") && showsLayer("kartaview") && !showsLayer("streetside");
+ };
+ photos.showsPhotoType = function(val) {
+ if (!photos.shouldFilterByPhotoType())
+ return true;
+ return _shownPhotoTypes.indexOf(val) !== -1;
+ };
+ photos.showsFlat = function() {
+ return photos.showsPhotoType("flat");
+ };
+ photos.showsPanoramic = function() {
+ return photos.showsPhotoType("panoramic");
+ };
+ photos.fromDate = function() {
+ return _fromDate;
+ };
+ photos.toDate = function() {
+ return _toDate;
+ };
+ photos.togglePhotoType = function(val) {
+ var index = _shownPhotoTypes.indexOf(val);
+ if (index !== -1) {
+ _shownPhotoTypes.splice(index, 1);
+ } else {
+ _shownPhotoTypes.push(val);
+ }
+ dispatch10.call("change", this);
+ return photos;
+ };
+ photos.usernames = function() {
+ return _usernames;
+ };
+ photos.init = function() {
+ var hash = utilStringQs(window.location.hash);
+ if (hash.photo_dates) {
+ var parts = /^(.*)[–_](.*)$/g.exec(hash.photo_dates.trim());
+ this.setDateFilter("fromDate", parts && parts.length >= 2 && parts[1], false);
+ this.setDateFilter("toDate", parts && parts.length >= 3 && parts[2], false);
+ }
+ if (hash.photo_username) {
+ this.setUsernameFilter(hash.photo_username, false);
+ }
+ if (hash.photo_overlay) {
+ var hashOverlayIDs = hash.photo_overlay.replace(/;/g, ",").split(",");
+ hashOverlayIDs.forEach(function(id2) {
+ if (id2 === "openstreetcam")
+ id2 = "kartaview";
+ var layer2 = _layerIDs.indexOf(id2) !== -1 && context.layers().layer(id2);
+ if (layer2 && !layer2.enabled())
+ layer2.enabled(true);
+ });
+ }
+ if (hash.photo) {
+ var photoIds = hash.photo.replace(/;/g, ",").split(",");
+ var photoId = photoIds.length && photoIds[0].trim();
+ var results = /(.*)\/(.*)/g.exec(photoId);
+ if (results && results.length >= 3) {
+ var serviceId = results[1];
+ if (serviceId === "openstreetcam")
+ serviceId = "kartaview";
+ var photoKey = results[2];
+ var service = services[serviceId];
+ if (service && service.ensureViewerLoaded) {
+ var layer = _layerIDs.indexOf(serviceId) !== -1 && context.layers().layer(serviceId);
+ if (layer && !layer.enabled())
+ layer.enabled(true);
+ var baselineTime = Date.now();
+ service.on("loadedImages.rendererPhotos", function() {
+ if (Date.now() - baselineTime > 45e3) {
+ service.on("loadedImages.rendererPhotos", null);
+ return;
+ }
+ if (!service.cachedImage(photoKey))
+ return;
+ service.on("loadedImages.rendererPhotos", null);
+ service.ensureViewerLoaded(context).then(function() {
+ service.selectImage(context, photoKey).showViewer(context);
+ });
+ });
+ }
+ }
+ }
+ context.layers().on("change.rendererPhotos", updateStorage);
+ };
+ return utilRebind(photos, dispatch10, "on");
+ }
+
+ // modules/ui/account.js
+ function uiAccount(context) {
+ const osm = context.connection();
+ function updateUserDetails(selection2) {
+ if (!osm)
+ return;
+ if (!osm.authenticated()) {
+ render(selection2, null);
+ } else {
+ osm.userDetails((err, user) => render(selection2, user));
+ }
+ }
+ function render(selection2, user) {
+ let userInfo = selection2.select(".userInfo");
+ let loginLogout = selection2.select(".loginLogout");
+ if (user) {
+ userInfo.html("").classed("hide", false);
+ let userLink = userInfo.append("a").attr("href", osm.userURL(user.display_name)).attr("target", "_blank");
+ if (user.image_url) {
+ userLink.append("img").attr("class", "icon pre-text user-icon").attr("src", user.image_url);
+ } else {
+ userLink.call(svgIcon("#iD-icon-avatar", "pre-text light"));
+ }
+ userLink.append("span").attr("class", "label").html(user.display_name);
+ loginLogout.classed("hide", false).select("a").text(_t("logout")).on("click", (e) => {
+ e.preventDefault();
+ osm.logout();
+ tryLogout();
+ });
+ } else {
+ userInfo.html("").classed("hide", true);
+ loginLogout.classed("hide", false).select("a").text(_t("login")).on("click", (e) => {
+ e.preventDefault();
+ osm.authenticate();
+ });
+ }
+ }
+ function tryLogout() {
+ if (!osm)
+ return;
+ const url = osm.getUrlRoot() + "/logout?referer=%2Flogin";
+ const w = 600;
+ const h = 550;
+ const settings = [
+ ["width", w],
+ ["height", h],
+ ["left", window.screen.width / 2 - w / 2],
+ ["top", window.screen.height / 2 - h / 2]
+ ].map((x) => x.join("=")).join(",");
+ window.open(url, "_blank", settings);
+ }
+ return function(selection2) {
+ if (!osm)
+ return;
+ selection2.append("li").attr("class", "userInfo").classed("hide", true);
+ selection2.append("li").attr("class", "loginLogout").classed("hide", true).append("a").attr("href", "#");
+ osm.on("change.account", () => updateUserDetails(selection2));
+ updateUserDetails(selection2);
+ };
+ }
+
+ // modules/ui/attribution.js
+ function uiAttribution(context) {
+ let _selection = select_default2(null);
+ function render(selection2, data, klass) {
+ let div = selection2.selectAll(`.${klass}`).data([0]);
+ div = div.enter().append("div").attr("class", klass).merge(div);
+ let attributions = div.selectAll(".attribution").data(data, (d) => d.id);
+ attributions.exit().remove();
+ attributions = attributions.enter().append("span").attr("class", "attribution").each((d, i2, nodes) => {
+ let attribution = select_default2(nodes[i2]);
+ if (d.terms_html) {
+ attribution.html(d.terms_html);
+ return;
+ }
+ if (d.terms_url) {
+ attribution = attribution.append("a").attr("href", d.terms_url).attr("target", "_blank");
+ }
+ const sourceID = d.id.replace(/\./g, "<TX_DOT>");
+ const terms_text = _t(`imagery.${sourceID}.attribution.text`, { default: d.terms_text || d.id || d.name() });
+ if (d.icon && !d.overlay) {
+ attribution.append("img").attr("class", "source-image").attr("src", d.icon);
+ }
+ attribution.append("span").attr("class", "attribution-text").text(terms_text);
+ }).merge(attributions);
+ let copyright = attributions.selectAll(".copyright-notice").data((d) => {
+ let notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
+ return notice ? [notice] : [];
+ });
+ copyright.exit().remove();
+ copyright = copyright.enter().append("span").attr("class", "copyright-notice").merge(copyright);
+ copyright.text(String);
+ }
+ function update() {
+ let baselayer = context.background().baseLayerSource();
+ _selection.call(render, baselayer ? [baselayer] : [], "base-layer-attribution");
+ const z = context.map().zoom();
+ let overlays = context.background().overlayLayerSources() || [];
+ _selection.call(render, overlays.filter((s) => s.validZoom(z)), "overlay-layer-attribution");
+ }
+ return function(selection2) {
+ _selection = selection2;
+ context.background().on("change.attribution", update);
+ context.map().on("move.attribution", throttle_default(update, 400, { leading: false }));
+ update();
+ };
+ }
+
+ // modules/ui/contributors.js
+ function uiContributors(context) {
+ var osm = context.connection(), debouncedUpdate = debounce_default(function() {
+ update();
+ }, 1e3), limit = 4, hidden = false, wrap2 = select_default2(null);
+ function update() {
+ if (!osm)
+ return;
+ var users = {}, entities = context.history().intersects(context.map().extent());
+ entities.forEach(function(entity) {
+ if (entity && entity.user)
+ users[entity.user] = true;
+ });
+ var u = Object.keys(users), subset = u.slice(0, u.length > limit ? limit - 1 : limit);
+ wrap2.html("").call(svgIcon("#iD-icon-nearby", "pre-text light"));
+ var userList = select_default2(document.createElement("span"));
+ userList.selectAll().data(subset).enter().append("a").attr("class", "user-link").attr("href", function(d) {
+ return osm.userURL(d);
+ }).attr("target", "_blank").text(String);
+ if (u.length > limit) {
+ var count = select_default2(document.createElement("span"));
+ var othersNum = u.length - limit + 1;
+ count.append("a").attr("target", "_blank").attr("href", function() {
+ return osm.changesetsURL(context.map().center(), context.map().zoom());
+ }).text(othersNum);
+ wrap2.append("span").html(_t.html("contributors.truncated_list", { n: othersNum, users: { html: userList.html() }, count: { html: count.html() } }));
+ } else {
+ wrap2.append("span").html(_t.html("contributors.list", { users: { html: userList.html() } }));
+ }
+ if (!u.length) {
+ hidden = true;
+ wrap2.transition().style("opacity", 0);
+ } else if (hidden) {
+ wrap2.transition().style("opacity", 1);
+ }
+ }
+ return function(selection2) {
+ if (!osm)
+ return;
+ wrap2 = selection2;
+ update();
+ osm.on("loaded.contributors", debouncedUpdate);
+ context.map().on("move.contributors", debouncedUpdate);
+ };
+ }
+
+ // modules/ui/popover.js
+ var _popoverID = 0;
+ function uiPopover(klass) {
+ var _id = _popoverID++;
+ var _anchorSelection = select_default2(null);
+ var popover = function(selection2) {
+ _anchorSelection = selection2;
+ selection2.each(setup);
+ };
+ var _animation = utilFunctor(false);
+ var _placement = utilFunctor("top");
+ var _alignment = utilFunctor("center");
+ var _scrollContainer = utilFunctor(select_default2(null));
+ var _content;
+ var _displayType = utilFunctor("");
+ var _hasArrow = utilFunctor(true);
+ var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ popover.displayType = function(val) {
+ if (arguments.length) {
+ _displayType = utilFunctor(val);
+ return popover;
+ } else {
+ return _displayType;
+ }
+ };
+ popover.hasArrow = function(val) {
+ if (arguments.length) {
+ _hasArrow = utilFunctor(val);
+ return popover;
+ } else {
+ return _hasArrow;
+ }
+ };
+ popover.placement = function(val) {
+ if (arguments.length) {
+ _placement = utilFunctor(val);
+ return popover;
+ } else {
+ return _placement;
+ }
+ };
+ popover.alignment = function(val) {
+ if (arguments.length) {
+ _alignment = utilFunctor(val);
+ return popover;
+ } else {
+ return _alignment;
+ }
+ };
+ popover.scrollContainer = function(val) {
+ if (arguments.length) {
+ _scrollContainer = utilFunctor(val);
+ return popover;
+ } else {
+ return _scrollContainer;
+ }
+ };
+ popover.content = function(val) {
+ if (arguments.length) {
+ _content = val;
+ return popover;
+ } else {
+ return _content;
+ }
+ };
+ popover.isShown = function() {
+ var popoverSelection = _anchorSelection.select(".popover-" + _id);
+ return !popoverSelection.empty() && popoverSelection.classed("in");
+ };
+ popover.show = function() {
+ _anchorSelection.each(show);
+ };
+ popover.updateContent = function() {
+ _anchorSelection.each(updateContent);
+ };
+ popover.hide = function() {
+ _anchorSelection.each(hide);
+ };
+ popover.toggle = function() {
+ _anchorSelection.each(toggle);
+ };
+ popover.destroy = function(selection2, selector) {
+ selector = selector || ".popover-" + _id;
+ selection2.on(_pointerPrefix + "enter.popover", null).on(_pointerPrefix + "leave.popover", null).on(_pointerPrefix + "up.popover", null).on(_pointerPrefix + "down.popover", null).on("click.popover", null).attr("title", function() {
+ return this.getAttribute("data-original-title") || this.getAttribute("title");
+ }).attr("data-original-title", null).selectAll(selector).remove();
+ };
+ popover.destroyAny = function(selection2) {
+ selection2.call(popover.destroy, ".popover");
+ };
+ function setup() {
+ var anchor = select_default2(this);
+ var animate = _animation.apply(this, arguments);
+ var popoverSelection = anchor.selectAll(".popover-" + _id).data([0]);
+ var enter = popoverSelection.enter().append("div").attr("class", "popover popover-" + _id + " " + (klass ? klass : "")).classed("arrowed", _hasArrow.apply(this, arguments));
+ enter.append("div").attr("class", "popover-arrow");
+ enter.append("div").attr("class", "popover-inner");
+ popoverSelection = enter.merge(popoverSelection);
+ if (animate) {
+ popoverSelection.classed("fade", true);
+ }
+ var display = _displayType.apply(this, arguments);
+ if (display === "hover") {
+ var _lastNonMouseEnterTime;
+ anchor.on(_pointerPrefix + "enter.popover", function(d3_event) {
+ if (d3_event.pointerType) {
+ if (d3_event.pointerType !== "mouse") {
+ _lastNonMouseEnterTime = d3_event.timeStamp;
+ return;
+ } else if (_lastNonMouseEnterTime && d3_event.timeStamp - _lastNonMouseEnterTime < 1500) {
+ return;
+ }
+ }
+ if (d3_event.buttons !== 0)
+ return;
+ show.apply(this, arguments);
+ }).on(_pointerPrefix + "leave.popover", function() {
+ hide.apply(this, arguments);
+ }).on("focus.popover", function() {
+ show.apply(this, arguments);
+ }).on("blur.popover", function() {
+ hide.apply(this, arguments);
+ });
+ } else if (display === "clickFocus") {
+ anchor.on(_pointerPrefix + "down.popover", function(d3_event) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ }).on(_pointerPrefix + "up.popover", function(d3_event) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ }).on("click.popover", toggle);
+ popoverSelection.attr("tabindex", 0).on("blur.popover", function() {
+ anchor.each(function() {
+ hide.apply(this, arguments);
+ });
+ });
+ }
+ }
+ function show() {
+ var anchor = select_default2(this);
+ var popoverSelection = anchor.selectAll(".popover-" + _id);
+ if (popoverSelection.empty()) {
+ anchor.call(popover.destroy);
+ anchor.each(setup);
+ popoverSelection = anchor.selectAll(".popover-" + _id);
+ }
+ popoverSelection.classed("in", true);
+ var displayType = _displayType.apply(this, arguments);
+ if (displayType === "clickFocus") {
+ anchor.classed("active", true);
+ popoverSelection.node().focus();
+ }
+ anchor.each(updateContent);
+ }
+ function updateContent() {
+ var anchor = select_default2(this);
+ if (_content) {
+ anchor.selectAll(".popover-" + _id + " > .popover-inner").call(_content.apply(this, arguments));
+ }
+ updatePosition.apply(this, arguments);
+ updatePosition.apply(this, arguments);
+ updatePosition.apply(this, arguments);
+ }
+ function updatePosition() {
+ var anchor = select_default2(this);
+ var popoverSelection = anchor.selectAll(".popover-" + _id);
+ var scrollContainer = _scrollContainer && _scrollContainer.apply(this, arguments);
+ var scrollNode = scrollContainer && !scrollContainer.empty() && scrollContainer.node();
+ var scrollLeft = scrollNode ? scrollNode.scrollLeft : 0;
+ var scrollTop = scrollNode ? scrollNode.scrollTop : 0;
+ var placement = _placement.apply(this, arguments);
+ popoverSelection.classed("left", false).classed("right", false).classed("top", false).classed("bottom", false).classed(placement, true);
+ var alignment = _alignment.apply(this, arguments);
+ var alignFactor = 0.5;
+ if (alignment === "leading") {
+ alignFactor = 0;
+ } else if (alignment === "trailing") {
+ alignFactor = 1;
+ }
+ var anchorFrame = getFrame(anchor.node());
+ var popoverFrame = getFrame(popoverSelection.node());
+ var position;
+ switch (placement) {
+ case "top":
+ position = {
+ x: anchorFrame.x + (anchorFrame.w - popoverFrame.w) * alignFactor,
+ y: anchorFrame.y - popoverFrame.h
+ };
+ break;
+ case "bottom":
+ position = {
+ x: anchorFrame.x + (anchorFrame.w - popoverFrame.w) * alignFactor,
+ y: anchorFrame.y + anchorFrame.h
+ };
+ break;
+ case "left":
+ position = {
+ x: anchorFrame.x - popoverFrame.w,
+ y: anchorFrame.y + (anchorFrame.h - popoverFrame.h) * alignFactor
+ };
+ break;
+ case "right":
+ position = {
+ x: anchorFrame.x + anchorFrame.w,
+ y: anchorFrame.y + (anchorFrame.h - popoverFrame.h) * alignFactor
+ };
+ break;
+ }
+ if (position) {
+ if (scrollNode && (placement === "top" || placement === "bottom")) {
+ var initialPosX = position.x;
+ if (position.x + popoverFrame.w > scrollNode.offsetWidth - 10) {
+ position.x = scrollNode.offsetWidth - 10 - popoverFrame.w;
+ } else if (position.x < 10) {
+ position.x = 10;
+ }
+ var arrow = anchor.selectAll(".popover-" + _id + " > .popover-arrow");
+ var arrowPosX = Math.min(Math.max(popoverFrame.w / 2 - (position.x - initialPosX), 10), popoverFrame.w - 10);
+ arrow.style("left", ~~arrowPosX + "px");
+ }
+ popoverSelection.style("left", ~~position.x + "px").style("top", ~~position.y + "px");
+ } else {
+ popoverSelection.style("left", null).style("top", null);
+ }
+ function getFrame(node) {
+ var positionStyle = select_default2(node).style("position");
+ if (positionStyle === "absolute" || positionStyle === "static") {
+ return {
+ x: node.offsetLeft - scrollLeft,
+ y: node.offsetTop - scrollTop,
+ w: node.offsetWidth,
+ h: node.offsetHeight
+ };
+ } else {
+ return {
+ x: 0,
+ y: 0,
+ w: node.offsetWidth,
+ h: node.offsetHeight
+ };
+ }
+ }
+ }
+ function hide() {
+ var anchor = select_default2(this);
+ if (_displayType.apply(this, arguments) === "clickFocus") {
+ anchor.classed("active", false);
+ }
+ anchor.selectAll(".popover-" + _id).classed("in", false);
+ }
+ function toggle() {
+ if (select_default2(this).select(".popover-" + _id).classed("in")) {
+ hide.apply(this, arguments);
+ } else {
+ show.apply(this, arguments);
+ }
+ }
+ return popover;
+ }
+
+ // modules/ui/tooltip.js
+ function uiTooltip(klass) {
+ var tooltip = uiPopover((klass || "") + " tooltip").displayType("hover");
+ var _title = function() {
+ var title = this.getAttribute("data-original-title");
+ if (title) {
+ return title;
+ } else {
+ title = this.getAttribute("title");
+ this.removeAttribute("title");
+ this.setAttribute("data-original-title", title);
+ }
+ return title;
+ };
+ var _heading = utilFunctor(null);
+ var _keys = utilFunctor(null);
+ tooltip.title = function(val) {
+ if (!arguments.length)
+ return _title;
+ _title = utilFunctor(val);
+ return tooltip;
+ };
+ tooltip.heading = function(val) {
+ if (!arguments.length)
+ return _heading;
+ _heading = utilFunctor(val);
+ return tooltip;
+ };
+ tooltip.keys = function(val) {
+ if (!arguments.length)
+ return _keys;
+ _keys = utilFunctor(val);
+ return tooltip;
+ };
+ tooltip.content(function() {
+ var heading = _heading.apply(this, arguments);
+ var text2 = _title.apply(this, arguments);
+ var keys = _keys.apply(this, arguments);
+ return function(selection2) {
+ var headingSelect = selection2.selectAll(".tooltip-heading").data(heading ? [heading] : []);
+ headingSelect.exit().remove();
+ headingSelect.enter().append("div").attr("class", "tooltip-heading").merge(headingSelect).html(heading);
+ var textSelect = selection2.selectAll(".tooltip-text").data(text2 ? [text2] : []);
+ textSelect.exit().remove();
+ textSelect.enter().append("div").attr("class", "tooltip-text").merge(textSelect).html(text2);
+ var keyhintWrap = selection2.selectAll(".keyhint-wrap").data(keys && keys.length ? [0] : []);
+ keyhintWrap.exit().remove();
+ var keyhintWrapEnter = keyhintWrap.enter().append("div").attr("class", "keyhint-wrap");
+ keyhintWrapEnter.append("span").call(_t.append("tooltip_keyhint"));
+ keyhintWrap = keyhintWrapEnter.merge(keyhintWrap);
+ keyhintWrap.selectAll("kbd.shortcut").data(keys && keys.length ? keys : []).enter().append("kbd").attr("class", "shortcut").html(function(d) {
+ return d;
+ });
+ };
+ });
+ return tooltip;
+ }
+
+ // modules/ui/edit_menu.js
+ function uiEditMenu(context) {
+ var dispatch10 = dispatch_default("toggled");
+ var _menu = select_default2(null);
+ var _operations = [];
+ var _anchorLoc = [0, 0];
+ var _anchorLocLonLat = [0, 0];
+ var _triggerType = "";
+ var _vpTopMargin = 85;
+ var _vpBottomMargin = 45;
+ var _vpSideMargin = 35;
+ var _menuTop = false;
+ var _menuHeight;
+ var _menuWidth;
+ var _verticalPadding = 4;
+ var _tooltipWidth = 210;
+ var _menuSideMargin = 10;
+ var _tooltips = [];
+ var editMenu = function(selection2) {
+ var isTouchMenu = _triggerType.includes("touch") || _triggerType.includes("pen");
+ var ops = _operations.filter(function(op) {
+ return !isTouchMenu || !op.mouseOnly;
+ });
+ if (!ops.length)
+ return;
+ _tooltips = [];
+ _menuTop = isTouchMenu;
+ var showLabels = isTouchMenu;
+ var buttonHeight = showLabels ? 32 : 34;
+ if (showLabels) {
+ _menuWidth = 52 + Math.min(120, 6 * Math.max.apply(Math, ops.map(function(op) {
+ return op.title.length;
+ })));
+ } else {
+ _menuWidth = 44;
+ }
+ _menuHeight = _verticalPadding * 2 + ops.length * buttonHeight;
+ _menu = selection2.append("div").attr("class", "edit-menu").classed("touch-menu", isTouchMenu).style("padding", _verticalPadding + "px 0");
+ var buttons = _menu.selectAll(".edit-menu-item").data(ops);
+ var buttonsEnter = buttons.enter().append("button").attr("class", function(d) {
+ return "edit-menu-item edit-menu-item-" + d.id;
+ }).style("height", buttonHeight + "px").on("click", click).on("pointerup", pointerup).on("pointerdown mousedown", function pointerdown(d3_event) {
+ d3_event.stopPropagation();
+ }).on("mouseenter.highlight", function(d3_event, d) {
+ if (!d.relatedEntityIds || select_default2(this).classed("disabled"))
+ return;
+ utilHighlightEntities(d.relatedEntityIds(), true, context);
+ }).on("mouseleave.highlight", function(d3_event, d) {
+ if (!d.relatedEntityIds)
+ return;
+ utilHighlightEntities(d.relatedEntityIds(), false, context);
+ });
+ buttonsEnter.each(function(d) {
+ var tooltip = uiTooltip().heading(d.title).title(d.tooltip()).keys([d.keys[0]]);
+ _tooltips.push(tooltip);
+ select_default2(this).call(tooltip).append("div").attr("class", "icon-wrap").call(svgIcon(d.icon && d.icon() || "#iD-operation-" + d.id, "operation"));
+ });
+ if (showLabels) {
+ buttonsEnter.append("span").attr("class", "label").html(function(d) {
+ return d.title;
+ });
+ }
+ buttonsEnter.merge(buttons).classed("disabled", function(d) {
+ return d.disabled();
+ });
+ updatePosition();
+ var initialScale = context.projection.scale();
+ context.map().on("move.edit-menu", function() {
+ if (initialScale !== context.projection.scale()) {
+ editMenu.close();
+ }
+ }).on("drawn.edit-menu", function(info) {
+ if (info.full)
+ updatePosition();
+ });
+ var lastPointerUpType;
+ function pointerup(d3_event) {
+ lastPointerUpType = d3_event.pointerType;
+ }
+ function click(d3_event, operation) {
+ d3_event.stopPropagation();
+ if (operation.relatedEntityIds) {
+ utilHighlightEntities(operation.relatedEntityIds(), false, context);
+ }
+ if (operation.disabled()) {
+ if (lastPointerUpType === "touch" || lastPointerUpType === "pen") {
+ context.ui().flash.duration(4e3).iconName("#iD-operation-" + operation.id).iconClass("operation disabled").label(operation.tooltip)();
+ }
+ } else {
+ if (lastPointerUpType === "touch" || lastPointerUpType === "pen") {
+ context.ui().flash.duration(2e3).iconName("#iD-operation-" + operation.id).iconClass("operation").label(operation.annotation() || operation.title)();
+ }
+ operation();
+ editMenu.close();
+ }
+ lastPointerUpType = null;
+ }
+ dispatch10.call("toggled", this, true);
+ };
+ function updatePosition() {
+ if (!_menu || _menu.empty())
+ return;
+ var anchorLoc = context.projection(_anchorLocLonLat);
+ var viewport = context.surfaceRect();
+ if (anchorLoc[0] < 0 || anchorLoc[0] > viewport.width || anchorLoc[1] < 0 || anchorLoc[1] > viewport.height) {
+ editMenu.close();
+ return;
+ }
+ var menuLeft = displayOnLeft(viewport);
+ var offset = [0, 0];
+ offset[0] = menuLeft ? -1 * (_menuSideMargin + _menuWidth) : _menuSideMargin;
+ if (_menuTop) {
+ if (anchorLoc[1] - _menuHeight < _vpTopMargin) {
+ offset[1] = -anchorLoc[1] + _vpTopMargin;
+ } else {
+ offset[1] = -_menuHeight;
+ }
+ } else {
+ if (anchorLoc[1] + _menuHeight > viewport.height - _vpBottomMargin) {
+ offset[1] = -anchorLoc[1] - _menuHeight + viewport.height - _vpBottomMargin;
+ } else {
+ offset[1] = 0;
+ }
+ }
+ var origin = geoVecAdd(anchorLoc, offset);
+ _menu.style("left", origin[0] + "px").style("top", origin[1] + "px");
+ var tooltipSide = tooltipPosition(viewport, menuLeft);
+ _tooltips.forEach(function(tooltip) {
+ tooltip.placement(tooltipSide);
+ });
+ function displayOnLeft(viewport2) {
+ if (_mainLocalizer.textDirection() === "ltr") {
+ if (anchorLoc[0] + _menuSideMargin + _menuWidth > viewport2.width - _vpSideMargin) {
+ return true;
+ }
+ return false;
+ } else {
+ if (anchorLoc[0] - _menuSideMargin - _menuWidth < _vpSideMargin) {
+ return false;
+ }
+ return true;
+ }
+ }
+ function tooltipPosition(viewport2, menuLeft2) {
+ if (_mainLocalizer.textDirection() === "ltr") {
+ if (menuLeft2) {
+ return "left";
+ }
+ if (anchorLoc[0] + _menuSideMargin + _menuWidth + _tooltipWidth > viewport2.width - _vpSideMargin) {
+ return "left";
+ }
+ return "right";
+ } else {
+ if (!menuLeft2) {
+ return "right";
+ }
+ if (anchorLoc[0] - _menuSideMargin - _menuWidth - _tooltipWidth < _vpSideMargin) {
+ return "right";
+ }
+ return "left";
+ }
+ }
+ }
+ editMenu.close = function() {
+ context.map().on("move.edit-menu", null).on("drawn.edit-menu", null);
+ _menu.remove();
+ _tooltips = [];
+ dispatch10.call("toggled", this, false);
+ };
+ editMenu.anchorLoc = function(val) {
+ if (!arguments.length)
+ return _anchorLoc;
+ _anchorLoc = val;
+ _anchorLocLonLat = context.projection.invert(_anchorLoc);
+ return editMenu;
+ };
+ editMenu.triggerType = function(val) {
+ if (!arguments.length)
+ return _triggerType;
+ _triggerType = val;
+ return editMenu;
+ };
+ editMenu.operations = function(val) {
+ if (!arguments.length)
+ return _operations;
+ _operations = val;
+ return editMenu;
+ };
+ return utilRebind(editMenu, dispatch10, "on");
+ }
+
+ // modules/ui/feature_info.js
+ function uiFeatureInfo(context) {
+ function update(selection2) {
+ var features2 = context.features();
+ var stats = features2.stats();
+ var count = 0;
+ var hiddenList = features2.hidden().map(function(k) {
+ if (stats[k]) {
+ count += stats[k];
+ return _t.html("inspector.title_count", { title: { html: _t.html("feature." + k + ".description") }, count: stats[k] });
+ }
+ return null;
+ }).filter(Boolean);
+ selection2.html("");
+ if (hiddenList.length) {
+ var tooltipBehavior = uiTooltip().placement("top").title(function() {
+ return hiddenList.join("<br/>");
+ });
+ selection2.append("a").attr("class", "chip").attr("href", "#").call(_t.append("feature_info.hidden_warning", { count })).call(tooltipBehavior).on("click", function(d3_event) {
+ tooltipBehavior.hide();
+ d3_event.preventDefault();
+ context.ui().togglePanes(context.container().select(".map-panes .map-data-pane"));
+ });
+ }
+ selection2.classed("hide", !hiddenList.length);
+ }
+ return function(selection2) {
+ update(selection2);
+ context.features().on("change.feature_info", function() {
+ update(selection2);
+ });
+ };
+ }
+
+ // modules/ui/flash.js
+ function uiFlash(context) {
+ var _flashTimer;
+ var _duration = 2e3;
+ var _iconName = "#iD-icon-no";
+ var _iconClass = "disabled";
+ var _label = "";
+ function flash() {
+ if (_flashTimer) {
+ _flashTimer.stop();
+ }
+ context.container().select(".main-footer-wrap").classed("footer-hide", true).classed("footer-show", false);
+ context.container().select(".flash-wrap").classed("footer-hide", false).classed("footer-show", true);
+ var content = context.container().select(".flash-wrap").selectAll(".flash-content").data([0]);
+ var contentEnter = content.enter().append("div").attr("class", "flash-content");
+ var iconEnter = contentEnter.append("svg").attr("class", "flash-icon icon").append("g").attr("transform", "translate(10,10)");
+ iconEnter.append("circle").attr("r", 9);
+ iconEnter.append("use").attr("transform", "translate(-7,-7)").attr("width", "14").attr("height", "14");
+ contentEnter.append("div").attr("class", "flash-text");
+ content = content.merge(contentEnter);
+ content.selectAll(".flash-icon").attr("class", "icon flash-icon " + (_iconClass || ""));
+ content.selectAll(".flash-icon use").attr("xlink:href", _iconName);
+ content.selectAll(".flash-text").attr("class", "flash-text").html(_label);
+ _flashTimer = timeout_default(function() {
+ _flashTimer = null;
+ context.container().select(".main-footer-wrap").classed("footer-hide", false).classed("footer-show", true);
+ context.container().select(".flash-wrap").classed("footer-hide", true).classed("footer-show", false);
+ }, _duration);
+ return content;
+ }
+ flash.duration = function(_) {
+ if (!arguments.length)
+ return _duration;
+ _duration = _;
+ return flash;
+ };
+ flash.label = function(_) {
+ if (!arguments.length)
+ return _label;
+ _label = _;
+ return flash;
+ };
+ flash.iconName = function(_) {
+ if (!arguments.length)
+ return _iconName;
+ _iconName = _;
+ return flash;
+ };
+ flash.iconClass = function(_) {
+ if (!arguments.length)
+ return _iconClass;
+ _iconClass = _;
+ return flash;
+ };
+ return flash;
+ }
+
+ // modules/ui/full_screen.js
+ function uiFullScreen(context) {
+ var element = context.container().node();
+ function getFullScreenFn() {
+ if (element.requestFullscreen) {
+ return element.requestFullscreen;
+ } else if (element.msRequestFullscreen) {
+ return element.msRequestFullscreen;
+ } else if (element.mozRequestFullScreen) {
+ return element.mozRequestFullScreen;
+ } else if (element.webkitRequestFullscreen) {
+ return element.webkitRequestFullscreen;
+ }
+ }
+ function getExitFullScreenFn() {
+ if (document.exitFullscreen) {
+ return document.exitFullscreen;
+ } else if (document.msExitFullscreen) {
+ return document.msExitFullscreen;
+ } else if (document.mozCancelFullScreen) {
+ return document.mozCancelFullScreen;
+ } else if (document.webkitExitFullscreen) {
+ return document.webkitExitFullscreen;
+ }
+ }
+ function isFullScreen() {
+ return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
+ }
+ function isSupported() {
+ return !!getFullScreenFn();
+ }
+ function fullScreen(d3_event) {
+ d3_event.preventDefault();
+ if (!isFullScreen()) {
+ getFullScreenFn().apply(element);
+ } else {
+ getExitFullScreenFn().apply(document);
+ }
+ }
+ return function() {
+ if (!isSupported())
+ return;
+ var detected = utilDetect();
+ var keys = detected.os === "mac" ? [uiCmd("\u2303\u2318F"), "f11"] : ["f11"];
+ context.keybinding().on(keys, fullScreen);
+ };
+ }
+
+ // modules/ui/geolocate.js
+ function uiGeolocate(context) {
+ var _geolocationOptions = {
+ enableHighAccuracy: false,
+ timeout: 6e3
+ };
+ var _locating = uiLoading(context).message(_t.html("geolocate.locating")).blocking(true);
+ var _layer = context.layers().layer("geolocate");
+ var _position;
+ var _extent;
+ var _timeoutID;
+ var _button = select_default2(null);
+ function click() {
+ if (context.inIntro())
+ return;
+ if (!_layer.enabled() && !_locating.isShown()) {
+ _timeoutID = setTimeout(error, 1e4);
+ context.container().call(_locating);
+ navigator.geolocation.getCurrentPosition(success, error, _geolocationOptions);
+ } else {
+ _locating.close();
+ _layer.enabled(null, false);
+ updateButtonState();
+ }
+ }
+ function zoomTo() {
+ context.enter(modeBrowse(context));
+ var map2 = context.map();
+ _layer.enabled(_position, true);
+ updateButtonState();
+ map2.centerZoomEase(_extent.center(), Math.min(20, map2.extentZoom(_extent)));
+ }
+ function success(geolocation) {
+ _position = geolocation;
+ var coords = _position.coords;
+ _extent = geoExtent([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
+ zoomTo();
+ finish();
+ }
+ function error() {
+ if (_position) {
+ zoomTo();
+ } else {
+ context.ui().flash.label(_t.html("geolocate.location_unavailable")).iconName("#iD-icon-geolocate")();
+ }
+ finish();
+ }
+ function finish() {
+ _locating.close();
+ if (_timeoutID) {
+ clearTimeout(_timeoutID);
+ }
+ _timeoutID = void 0;
+ }
+ function updateButtonState() {
+ _button.classed("active", _layer.enabled());
+ _button.attr("aria-pressed", _layer.enabled());
+ }
+ return function(selection2) {
+ if (!navigator.geolocation || !navigator.geolocation.getCurrentPosition)
+ return;
+ _button = selection2.append("button").on("click", click).attr("aria-pressed", false).call(svgIcon("#iD-icon-geolocate", "light")).call(uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(_t.html("geolocate.title")).keys([_t("geolocate.key")]));
+ context.keybinding().on(_t("geolocate.key"), click);
+ };
+ }
+
+ // modules/ui/panels/background.js
+ function uiPanelBackground(context) {
+ var background = context.background();
+ var _currSourceName = null;
+ var _metadata = {};
+ var _metadataKeys = [
+ "zoom",
+ "vintage",
+ "source",
+ "description",
+ "resolution",
+ "accuracy"
+ ];
+ var debouncedRedraw = debounce_default(redraw, 250);
+ function redraw(selection2) {
+ var source = background.baseLayerSource();
+ if (!source)
+ return;
+ var isDG = source.id.match(/^DigitalGlobe/i) !== null;
+ var sourceLabel = source.label();
+ if (_currSourceName !== sourceLabel) {
+ _currSourceName = sourceLabel;
+ _metadata = {};
+ }
+ selection2.html("");
+ var list = selection2.append("ul").attr("class", "background-info");
+ list.append("li").html(_currSourceName);
+ _metadataKeys.forEach(function(k) {
+ if (isDG && k === "vintage")
+ return;
+ list.append("li").attr("class", "background-info-list-" + k).classed("hide", !_metadata[k]).call(_t.append("info_panels.background." + k, { suffix: ":" })).append("span").attr("class", "background-info-span-" + k).text(_metadata[k]);
+ });
+ debouncedGetMetadata(selection2);
+ var toggleTiles = context.getDebug("tile") ? "hide_tiles" : "show_tiles";
+ selection2.append("a").call(_t.append("info_panels.background." + toggleTiles)).attr("href", "#").attr("class", "button button-toggle-tiles").on("click", function(d3_event) {
+ d3_event.preventDefault();
+ context.setDebug("tile", !context.getDebug("tile"));
+ selection2.call(redraw);
+ });
+ if (isDG) {
+ var key = source.id + "-vintage";
+ var sourceVintage = context.background().findSource(key);
+ var showsVintage = context.background().showsLayer(sourceVintage);
+ var toggleVintage = showsVintage ? "hide_vintage" : "show_vintage";
+ selection2.append("a").call(_t.append("info_panels.background." + toggleVintage)).attr("href", "#").attr("class", "button button-toggle-vintage").on("click", function(d3_event) {
+ d3_event.preventDefault();
+ context.background().toggleOverlayLayer(sourceVintage);
+ selection2.call(redraw);
+ });
+ }
+ ["DigitalGlobe-Premium", "DigitalGlobe-Standard"].forEach(function(layerId) {
+ if (source.id !== layerId) {
+ var key2 = layerId + "-vintage";
+ var sourceVintage2 = context.background().findSource(key2);
+ if (context.background().showsLayer(sourceVintage2)) {
+ context.background().toggleOverlayLayer(sourceVintage2);
+ }
+ }
+ });
+ }
+ var debouncedGetMetadata = debounce_default(getMetadata, 250);
+ function getMetadata(selection2) {
+ var tile = context.container().select(".layer-background img.tile-center");
+ if (tile.empty())
+ return;
+ var sourceName = _currSourceName;
+ var d = tile.datum();
+ var zoom = d && d.length >= 3 && d[2] || Math.floor(context.map().zoom());
+ var center = context.map().center();
+ _metadata.zoom = String(zoom);
+ selection2.selectAll(".background-info-list-zoom").classed("hide", false).selectAll(".background-info-span-zoom").text(_metadata.zoom);
+ if (!d || !d.length >= 3)
+ return;
+ background.baseLayerSource().getMetadata(center, d, function(err, result) {
+ if (err || _currSourceName !== sourceName)
+ return;
+ var vintage = result.vintage;
+ _metadata.vintage = vintage && vintage.range || _t("info_panels.background.unknown");
+ selection2.selectAll(".background-info-list-vintage").classed("hide", false).selectAll(".background-info-span-vintage").text(_metadata.vintage);
+ _metadataKeys.forEach(function(k) {
+ if (k === "zoom" || k === "vintage")
+ return;
+ var val = result[k];
+ _metadata[k] = val;
+ selection2.selectAll(".background-info-list-" + k).classed("hide", !val).selectAll(".background-info-span-" + k).text(val);
+ });
+ });
+ }
+ var panel = function(selection2) {
+ selection2.call(redraw);
+ context.map().on("drawn.info-background", function() {
+ selection2.call(debouncedRedraw);
+ }).on("move.info-background", function() {
+ selection2.call(debouncedGetMetadata);
+ });
+ };
+ panel.off = function() {
+ context.map().on("drawn.info-background", null).on("move.info-background", null);
+ };
+ panel.id = "background";
+ panel.label = _t.html("info_panels.background.title");
+ panel.key = _t("info_panels.background.key");
+ return panel;
+ }
+
+ // modules/ui/panels/history.js
+ function uiPanelHistory(context) {
+ var osm;
+ function displayTimestamp(timestamp) {
+ if (!timestamp)
+ return _t("info_panels.history.unknown");
+ var options2 = {
+ day: "numeric",
+ month: "short",
+ year: "numeric",
+ hour: "numeric",
+ minute: "numeric",
+ second: "numeric"
+ };
+ var d = new Date(timestamp);
+ if (isNaN(d.getTime()))
+ return _t("info_panels.history.unknown");
+ return d.toLocaleString(_mainLocalizer.localeCode(), options2);
+ }
+ function displayUser(selection2, userName) {
+ if (!userName) {
+ selection2.append("span").call(_t.append("info_panels.history.unknown"));
+ return;
+ }
+ selection2.append("span").attr("class", "user-name").text(userName);
+ var links = selection2.append("div").attr("class", "links");
+ if (osm) {
+ links.append("a").attr("class", "user-osm-link").attr("href", osm.userURL(userName)).attr("target", "_blank").call(_t.append("info_panels.history.profile_link"));
+ }
+ links.append("a").attr("class", "user-hdyc-link").attr("href", "https://hdyc.neis-one.org/?" + userName).attr("target", "_blank").attr("tabindex", -1).text("HDYC");
+ }
+ function displayChangeset(selection2, changeset) {
+ if (!changeset) {
+ selection2.append("span").call(_t.append("info_panels.history.unknown"));
+ return;
+ }
+ selection2.append("span").attr("class", "changeset-id").text(changeset);
+ var links = selection2.append("div").attr("class", "links");
+ if (osm) {
+ links.append("a").attr("class", "changeset-osm-link").attr("href", osm.changesetURL(changeset)).attr("target", "_blank").call(_t.append("info_panels.history.changeset_link"));
+ }
+ links.append("a").attr("class", "changeset-osmcha-link").attr("href", "https://osmcha.org/changesets/" + changeset).attr("target", "_blank").text("OSMCha");
+ links.append("a").attr("class", "changeset-achavi-link").attr("href", "https://overpass-api.de/achavi/?changeset=" + changeset).attr("target", "_blank").text("Achavi");
+ }
+ function redraw(selection2) {
+ var selectedNoteID = context.selectedNoteID();
+ osm = context.connection();
+ var selected, note, entity;
+ if (selectedNoteID && osm) {
+ selected = [_t.html("note.note") + " " + selectedNoteID];
+ note = osm.getNote(selectedNoteID);
+ } else {
+ selected = context.selectedIDs().filter(function(e) {
+ return context.hasEntity(e);
+ });
+ if (selected.length) {
+ entity = context.entity(selected[0]);
+ }
+ }
+ var singular = selected.length === 1 ? selected[0] : null;
+ selection2.html("");
+ if (singular) {
+ selection2.append("h4").attr("class", "history-heading").html(singular);
+ } else {
+ selection2.append("h4").attr("class", "history-heading").call(_t.append("info_panels.selected", { n: selected.length }));
+ }
+ if (!singular)
+ return;
+ if (entity) {
+ selection2.call(redrawEntity, entity);
+ } else if (note) {
+ selection2.call(redrawNote, note);
+ }
+ }
+ function redrawNote(selection2, note) {
+ if (!note || note.isNew()) {
+ selection2.append("div").call(_t.append("info_panels.history.note_no_history"));
+ return;
+ }
+ var list = selection2.append("ul");
+ list.append("li").call(_t.append("info_panels.history.note_comments", { suffix: ":" })).append("span").text(note.comments.length);
+ if (note.comments.length) {
+ list.append("li").call(_t.append("info_panels.history.note_created_date", { suffix: ":" })).append("span").text(displayTimestamp(note.comments[0].date));
+ list.append("li").call(_t.append("info_panels.history.note_created_user", { suffix: ":" })).call(displayUser, note.comments[0].user);
+ }
+ if (osm) {
+ selection2.append("a").attr("class", "view-history-on-osm").attr("target", "_blank").attr("href", osm.noteURL(note)).call(svgIcon("#iD-icon-out-link", "inline")).append("span").call(_t.append("info_panels.history.note_link_text"));
+ }
+ }
+ function redrawEntity(selection2, entity) {
+ if (!entity || entity.isNew()) {
+ selection2.append("div").call(_t.append("info_panels.history.no_history"));
+ return;
+ }
+ var links = selection2.append("div").attr("class", "links");
+ if (osm) {
+ links.append("a").attr("class", "view-history-on-osm").attr("href", osm.historyURL(entity)).attr("target", "_blank").call(_t.append("info_panels.history.history_link"));
+ }
+ links.append("a").attr("class", "pewu-history-viewer-link").attr("href", "https://pewu.github.io/osm-history/#/" + entity.type + "/" + entity.osmId()).attr("target", "_blank").attr("tabindex", -1).text("PeWu");
+ var list = selection2.append("ul");
+ list.append("li").call(_t.append("info_panels.history.version", { suffix: ":" })).append("span").text(entity.version);
+ list.append("li").call(_t.append("info_panels.history.last_edit", { suffix: ":" })).append("span").text(displayTimestamp(entity.timestamp));
+ list.append("li").call(_t.append("info_panels.history.edited_by", { suffix: ":" })).call(displayUser, entity.user);
+ list.append("li").call(_t.append("info_panels.history.changeset", { suffix: ":" })).call(displayChangeset, entity.changeset);
+ }
+ var panel = function(selection2) {
+ selection2.call(redraw);
+ context.map().on("drawn.info-history", function() {
+ selection2.call(redraw);
+ });
+ context.on("enter.info-history", function() {
+ selection2.call(redraw);
+ });
+ };
+ panel.off = function() {
+ context.map().on("drawn.info-history", null);
+ context.on("enter.info-history", null);
+ };
+ panel.id = "history";
+ panel.label = _t.html("info_panels.history.title");
+ panel.key = _t("info_panels.history.key");
+ return panel;
+ }
+
+ // modules/util/units.js
+ var OSM_PRECISION = 7;
+ function displayLength(m, isImperial) {
+ var d = m * (isImperial ? 3.28084 : 1);
+ var unit2;
+ if (isImperial) {
+ if (d >= 5280) {
+ d /= 5280;
+ unit2 = "miles";
+ } else {
+ unit2 = "feet";
+ }
+ } else {
+ if (d >= 1e3) {
+ d /= 1e3;
+ unit2 = "kilometers";
+ } else {
+ unit2 = "meters";
+ }
+ }
+ return _t("units." + unit2, {
+ quantity: d.toLocaleString(_mainLocalizer.localeCode(), {
+ maximumSignificantDigits: 4
+ })
+ });
+ }
+ function displayArea(m2, isImperial) {
+ var locale2 = _mainLocalizer.localeCode();
+ var d = m2 * (isImperial ? 10.7639111056 : 1);
+ var d1, d2, area;
+ var unit1 = "";
+ var unit2 = "";
+ if (isImperial) {
+ if (d >= 6969600) {
+ d1 = d / 27878400;
+ unit1 = "square_miles";
+ } else {
+ d1 = d;
+ unit1 = "square_feet";
+ }
+ if (d > 4356 && d < 4356e4) {
+ d2 = d / 43560;
+ unit2 = "acres";
+ }
+ } else {
+ if (d >= 25e4) {
+ d1 = d / 1e6;
+ unit1 = "square_kilometers";
+ } else {
+ d1 = d;
+ unit1 = "square_meters";
+ }
+ if (d > 1e3 && d < 1e7) {
+ d2 = d / 1e4;
+ unit2 = "hectares";
+ }
+ }
+ area = _t("units." + unit1, {
+ quantity: d1.toLocaleString(locale2, {
+ maximumSignificantDigits: 4
+ })
+ });
+ if (d2) {
+ return _t("units.area_pair", {
+ area1: area,
+ area2: _t("units." + unit2, {
+ quantity: d2.toLocaleString(locale2, {
+ maximumSignificantDigits: 2
+ })
+ })
+ });
+ } else {
+ return area;
+ }
+ }
+ function wrap(x, min3, max3) {
+ var d = max3 - min3;
+ return ((x - min3) % d + d) % d + min3;
+ }
+ function clamp2(x, min3, max3) {
+ return Math.max(min3, Math.min(x, max3));
+ }
+ function displayCoordinate(deg, pos, neg) {
+ var locale2 = _mainLocalizer.localeCode();
+ var min3 = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
+ var sec = (min3 - Math.floor(min3)) * 60;
+ var displayDegrees = _t("units.arcdegrees", {
+ quantity: Math.floor(Math.abs(deg)).toLocaleString(locale2)
+ });
+ var displayCoordinate2;
+ if (Math.floor(sec) > 0) {
+ displayCoordinate2 = displayDegrees + _t("units.arcminutes", {
+ quantity: Math.floor(min3).toLocaleString(locale2)
+ }) + _t("units.arcseconds", {
+ quantity: Math.round(sec).toLocaleString(locale2)
+ });
+ } else if (Math.floor(min3) > 0) {
+ displayCoordinate2 = displayDegrees + _t("units.arcminutes", {
+ quantity: Math.round(min3).toLocaleString(locale2)
+ });
+ } else {
+ displayCoordinate2 = _t("units.arcdegrees", {
+ quantity: Math.round(Math.abs(deg)).toLocaleString(locale2)
+ });
+ }
+ if (deg === 0) {
+ return displayCoordinate2;
+ } else {
+ return _t("units.coordinate", {
+ coordinate: displayCoordinate2,
+ direction: _t("units." + (deg > 0 ? pos : neg))
+ });
+ }
+ }
+ function dmsCoordinatePair(coord2) {
+ return _t("units.coordinate_pair", {
+ latitude: displayCoordinate(clamp2(coord2[1], -90, 90), "north", "south"),
+ longitude: displayCoordinate(wrap(coord2[0], -180, 180), "east", "west")
+ });
+ }
+ function decimalCoordinatePair(coord2) {
+ return _t("units.coordinate_pair", {
+ latitude: clamp2(coord2[1], -90, 90).toFixed(OSM_PRECISION),
+ longitude: wrap(coord2[0], -180, 180).toFixed(OSM_PRECISION)
+ });
+ }
+
+ // modules/ui/panels/location.js
+ function uiPanelLocation(context) {
+ var currLocation = "";
+ function redraw(selection2) {
+ selection2.html("");
+ var list = selection2.append("ul");
+ var coord2 = context.map().mouseCoordinates();
+ if (coord2.some(isNaN)) {
+ coord2 = context.map().center();
+ }
+ list.append("li").text(dmsCoordinatePair(coord2)).append("li").text(decimalCoordinatePair(coord2));
+ selection2.append("div").attr("class", "location-info").text(currLocation || " ");
+ debouncedGetLocation(selection2, coord2);
+ }
+ var debouncedGetLocation = debounce_default(getLocation, 250);
+ function getLocation(selection2, coord2) {
+ if (!services.geocoder) {
+ currLocation = _t("info_panels.location.unknown_location");
+ selection2.selectAll(".location-info").text(currLocation);
+ } else {
+ services.geocoder.reverse(coord2, function(err, result) {
+ currLocation = result ? result.display_name : _t("info_panels.location.unknown_location");
+ selection2.selectAll(".location-info").text(currLocation);
+ });
+ }
+ }
+ var panel = function(selection2) {
+ selection2.call(redraw);
+ context.surface().on(("PointerEvent" in window ? "pointer" : "mouse") + "move.info-location", function() {
+ selection2.call(redraw);
+ });
+ };
+ panel.off = function() {
+ context.surface().on(".info-location", null);
+ };
+ panel.id = "location";
+ panel.label = _t.html("info_panels.location.title");
+ panel.key = _t("info_panels.location.key");
+ return panel;
+ }
+
+ // modules/ui/panels/measurement.js
+ function uiPanelMeasurement(context) {
+ function radiansToMeters(r) {
+ return r * 63710071809e-4;
+ }
+ function steradiansToSqmeters(r) {
+ return r / (4 * Math.PI) * 510065621724e3;
+ }
+ function toLineString(feature3) {
+ if (feature3.type === "LineString")
+ return feature3;
+ var result = { type: "LineString", coordinates: [] };
+ if (feature3.type === "Polygon") {
+ result.coordinates = feature3.coordinates[0];
+ } else if (feature3.type === "MultiPolygon") {
+ result.coordinates = feature3.coordinates[0][0];
+ }
+ return result;
+ }
+ var _isImperial = !_mainLocalizer.usesMetric();
+ function redraw(selection2) {
+ var graph = context.graph();
+ var selectedNoteID = context.selectedNoteID();
+ var osm = services.osm;
+ var localeCode = _mainLocalizer.localeCode();
+ var heading;
+ var center, location, centroid;
+ var closed, geometry;
+ var totalNodeCount, length = 0, area = 0, distance;
+ if (selectedNoteID && osm) {
+ var note = osm.getNote(selectedNoteID);
+ heading = _t.html("note.note") + " " + selectedNoteID;
+ location = note.loc;
+ geometry = "note";
+ } else {
+ var selectedIDs = context.selectedIDs().filter(function(id2) {
+ return context.hasEntity(id2);
+ });
+ var selected = selectedIDs.map(function(id2) {
+ return context.entity(id2);
+ });
+ heading = selected.length === 1 ? selected[0].id : _t.html("info_panels.selected", { n: selected.length });
+ if (selected.length) {
+ var extent = geoExtent();
+ for (var i2 in selected) {
+ var entity = selected[i2];
+ extent._extend(entity.extent(graph));
+ geometry = entity.geometry(graph);
+ if (geometry === "line" || geometry === "area") {
+ closed = entity.type === "relation" || entity.isClosed() && !entity.isDegenerate();
+ var feature3 = entity.asGeoJSON(graph);
+ length += radiansToMeters(length_default(toLineString(feature3)));
+ centroid = path_default(context.projection).centroid(entity.asGeoJSON(graph));
+ centroid = centroid && context.projection.invert(centroid);
+ if (!centroid || !isFinite(centroid[0]) || !isFinite(centroid[1])) {
+ centroid = entity.extent(graph).center();
+ }
+ if (closed) {
+ area += steradiansToSqmeters(entity.area(graph));
+ }
+ }
+ }
+ if (selected.length > 1) {
+ geometry = null;
+ closed = null;
+ centroid = null;
+ }
+ if (selected.length === 2 && selected[0].type === "node" && selected[1].type === "node") {
+ distance = geoSphericalDistance(selected[0].loc, selected[1].loc);
+ }
+ if (selected.length === 1 && selected[0].type === "node") {
+ location = selected[0].loc;
+ } else {
+ totalNodeCount = utilGetAllNodes(selectedIDs, context.graph()).length;
+ }
+ if (!location && !centroid) {
+ center = extent.center();
+ }
+ }
+ }
+ selection2.html("");
+ if (heading) {
+ selection2.append("h4").attr("class", "measurement-heading").html(heading);
+ }
+ var list = selection2.append("ul");
+ var coordItem;
+ if (geometry) {
+ list.append("li").call(_t.append("info_panels.measurement.geometry", { suffix: ":" })).append("span").html(closed ? _t.html("info_panels.measurement.closed_" + geometry) : _t.html("geometry." + geometry));
+ }
+ if (totalNodeCount) {
+ list.append("li").call(_t.append("info_panels.measurement.node_count", { suffix: ":" })).append("span").text(totalNodeCount.toLocaleString(localeCode));
+ }
+ if (area) {
+ list.append("li").call(_t.append("info_panels.measurement.area", { suffix: ":" })).append("span").text(displayArea(area, _isImperial));
+ }
+ if (length) {
+ list.append("li").call(_t.append("info_panels.measurement." + (closed ? "perimeter" : "length"), { suffix: ":" })).append("span").text(displayLength(length, _isImperial));
+ }
+ if (typeof distance === "number") {
+ list.append("li").call(_t.append("info_panels.measurement.distance", { suffix: ":" })).append("span").text(displayLength(distance, _isImperial));
+ }
+ if (location) {
+ coordItem = list.append("li").call(_t.append("info_panels.measurement.location", { suffix: ":" }));
+ coordItem.append("span").text(dmsCoordinatePair(location));
+ coordItem.append("span").text(decimalCoordinatePair(location));
+ }
+ if (centroid) {
+ coordItem = list.append("li").call(_t.append("info_panels.measurement.centroid", { suffix: ":" }));
+ coordItem.append("span").text(dmsCoordinatePair(centroid));
+ coordItem.append("span").text(decimalCoordinatePair(centroid));
+ }
+ if (center) {
+ coordItem = list.append("li").call(_t.append("info_panels.measurement.center", { suffix: ":" }));
+ coordItem.append("span").text(dmsCoordinatePair(center));
+ coordItem.append("span").text(decimalCoordinatePair(center));
+ }
+ if (length || area || typeof distance === "number") {
+ var toggle = _isImperial ? "imperial" : "metric";
+ selection2.append("a").call(_t.append("info_panels.measurement." + toggle)).attr("href", "#").attr("class", "button button-toggle-units").on("click", function(d3_event) {
+ d3_event.preventDefault();
+ _isImperial = !_isImperial;
+ selection2.call(redraw);
+ });
+ }
+ }
+ var panel = function(selection2) {
+ selection2.call(redraw);
+ context.map().on("drawn.info-measurement", function() {
+ selection2.call(redraw);
+ });
+ context.on("enter.info-measurement", function() {
+ selection2.call(redraw);
+ });
+ };
+ panel.off = function() {
+ context.map().on("drawn.info-measurement", null);
+ context.on("enter.info-measurement", null);
+ };
+ panel.id = "measurement";
+ panel.label = _t.html("info_panels.measurement.title");
+ panel.key = _t("info_panels.measurement.key");
+ return panel;
+ }
+
+ // modules/ui/panels/index.js
+ var uiInfoPanels = {
+ background: uiPanelBackground,
+ history: uiPanelHistory,
+ location: uiPanelLocation,
+ measurement: uiPanelMeasurement
+ };
+
+ // modules/ui/info.js
+ function uiInfo(context) {
+ var ids = Object.keys(uiInfoPanels);
+ var wasActive = ["measurement"];
+ var panels = {};
+ var active = {};
+ ids.forEach(function(k) {
+ if (!panels[k]) {
+ panels[k] = uiInfoPanels[k](context);
+ active[k] = false;
+ }
+ });
+ function info(selection2) {
+ function redraw() {
+ var activeids = ids.filter(function(k) {
+ return active[k];
+ }).sort();
+ var containers = infoPanels.selectAll(".panel-container").data(activeids, function(k) {
+ return k;
+ });
+ containers.exit().style("opacity", 1).transition().duration(200).style("opacity", 0).on("end", function(d) {
+ select_default2(this).call(panels[d].off).remove();
+ });
+ var enter = containers.enter().append("div").attr("class", function(d) {
+ return "fillD2 panel-container panel-container-" + d;
+ });
+ enter.style("opacity", 0).transition().duration(200).style("opacity", 1);
+ var title = enter.append("div").attr("class", "panel-title fillD2");
+ title.append("h3").html(function(d) {
+ return panels[d].label;
+ });
+ title.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function(d3_event, d) {
+ d3_event.stopImmediatePropagation();
+ d3_event.preventDefault();
+ info.toggle(d);
+ }).call(svgIcon("#iD-icon-close"));
+ enter.append("div").attr("class", function(d) {
+ return "panel-content panel-content-" + d;
+ });
+ infoPanels.selectAll(".panel-content").each(function(d) {
+ select_default2(this).call(panels[d]);
+ });
+ }
+ info.toggle = function(which) {
+ var activeids = ids.filter(function(k) {
+ return active[k];
+ });
+ if (which) {
+ active[which] = !active[which];
+ if (activeids.length === 1 && activeids[0] === which) {
+ wasActive = [which];
+ }
+ context.container().select("." + which + "-panel-toggle-item").classed("active", active[which]).select("input").property("checked", active[which]);
+ } else {
+ if (activeids.length) {
+ wasActive = activeids;
+ activeids.forEach(function(k) {
+ active[k] = false;
+ });
+ } else {
+ wasActive.forEach(function(k) {
+ active[k] = true;
+ });
+ }
+ }
+ redraw();
+ };
+ var infoPanels = selection2.selectAll(".info-panels").data([0]);
+ infoPanels = infoPanels.enter().append("div").attr("class", "info-panels").merge(infoPanels);
+ redraw();
+ context.keybinding().on(uiCmd("\u2318" + _t("info_panels.key")), function(d3_event) {
+ d3_event.stopImmediatePropagation();
+ d3_event.preventDefault();
+ info.toggle();
+ });
+ ids.forEach(function(k) {
+ var key = _t("info_panels." + k + ".key", { default: null });
+ if (!key)
+ return;
+ context.keybinding().on(uiCmd("\u2318\u21E7" + key), function(d3_event) {
+ d3_event.stopImmediatePropagation();
+ d3_event.preventDefault();
+ info.toggle(k);
+ });
+ });
+ }
+ return info;
+ }
+
+ // modules/ui/intro/helper.js
+ function pointBox(loc, context) {
+ var rect = context.surfaceRect();
+ var point = context.curtainProjection(loc);
+ return {
+ left: point[0] + rect.left - 40,
+ top: point[1] + rect.top - 60,
+ width: 80,
+ height: 90
+ };
+ }
+ function pad(locOrBox, padding, context) {
+ var box;
+ if (locOrBox instanceof Array) {
+ var rect = context.surfaceRect();
+ var point = context.curtainProjection(locOrBox);
+ box = {
+ left: point[0] + rect.left,
+ top: point[1] + rect.top
+ };
+ } else {
+ box = locOrBox;
+ }
+ return {
+ left: box.left - padding,
+ top: box.top - padding,
+ width: (box.width || 0) + 2 * padding,
+ height: (box.width || 0) + 2 * padding
+ };
+ }
+ function icon(name2, svgklass, useklass) {
+ return '<svg class="icon ' + (svgklass || "") + '"><use xlink:href="' + name2 + '"' + (useklass ? ' class="' + useklass + '"' : "") + "></use></svg>";
+ }
+ var helpStringReplacements;
+ function helpHtml(id2, replacements) {
+ if (!helpStringReplacements) {
+ helpStringReplacements = {
+ point_icon: icon("#iD-icon-point", "inline"),
+ line_icon: icon("#iD-icon-line", "inline"),
+ area_icon: icon("#iD-icon-area", "inline"),
+ note_icon: icon("#iD-icon-note", "inline add-note"),
+ plus: icon("#iD-icon-plus", "inline"),
+ minus: icon("#iD-icon-minus", "inline"),
+ layers_icon: icon("#iD-icon-layers", "inline"),
+ data_icon: icon("#iD-icon-data", "inline"),
+ inspect: icon("#iD-icon-inspect", "inline"),
+ help_icon: icon("#iD-icon-help", "inline"),
+ undo_icon: icon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-redo" : "#iD-icon-undo", "inline"),
+ redo_icon: icon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-undo" : "#iD-icon-redo", "inline"),
+ save_icon: icon("#iD-icon-save", "inline"),
+ circularize_icon: icon("#iD-operation-circularize", "inline operation"),
+ continue_icon: icon("#iD-operation-continue", "inline operation"),
+ copy_icon: icon("#iD-operation-copy", "inline operation"),
+ delete_icon: icon("#iD-operation-delete", "inline operation"),
+ disconnect_icon: icon("#iD-operation-disconnect", "inline operation"),
+ downgrade_icon: icon("#iD-operation-downgrade", "inline operation"),
+ extract_icon: icon("#iD-operation-extract", "inline operation"),
+ merge_icon: icon("#iD-operation-merge", "inline operation"),
+ move_icon: icon("#iD-operation-move", "inline operation"),
+ orthogonalize_icon: icon("#iD-operation-orthogonalize", "inline operation"),
+ paste_icon: icon("#iD-operation-paste", "inline operation"),
+ reflect_long_icon: icon("#iD-operation-reflect-long", "inline operation"),
+ reflect_short_icon: icon("#iD-operation-reflect-short", "inline operation"),
+ reverse_icon: icon("#iD-operation-reverse", "inline operation"),
+ rotate_icon: icon("#iD-operation-rotate", "inline operation"),
+ split_icon: icon("#iD-operation-split", "inline operation"),
+ straighten_icon: icon("#iD-operation-straighten", "inline operation"),
+ leftclick: icon("#iD-walkthrough-mouse-left", "inline operation"),
+ rightclick: icon("#iD-walkthrough-mouse-right", "inline operation"),
+ mousewheel_icon: icon("#iD-walkthrough-mousewheel", "inline operation"),
+ tap_icon: icon("#iD-walkthrough-tap", "inline operation"),
+ doubletap_icon: icon("#iD-walkthrough-doubletap", "inline operation"),
+ longpress_icon: icon("#iD-walkthrough-longpress", "inline operation"),
+ touchdrag_icon: icon("#iD-walkthrough-touchdrag", "inline operation"),
+ pinch_icon: icon("#iD-walkthrough-pinch-apart", "inline operation"),
+ shift: uiCmd.display("\u21E7"),
+ alt: uiCmd.display("\u2325"),
+ return: uiCmd.display("\u21B5"),
+ esc: _t.html("shortcuts.key.esc"),
+ space: _t.html("shortcuts.key.space"),
+ add_note_key: _t.html("modes.add_note.key"),
+ help_key: _t.html("help.key"),
+ shortcuts_key: _t.html("shortcuts.toggle.key"),
+ save: _t.html("save.title"),
+ undo: _t.html("undo.title"),
+ redo: _t.html("redo.title"),
+ upload: _t.html("commit.save"),
+ point: _t.html("modes.add_point.title"),
+ line: _t.html("modes.add_line.title"),
+ area: _t.html("modes.add_area.title"),
+ note: _t.html("modes.add_note.label"),
+ circularize: _t.html("operations.circularize.title"),
+ continue: _t.html("operations.continue.title"),
+ copy: _t.html("operations.copy.title"),
+ delete: _t.html("operations.delete.title"),
+ disconnect: _t.html("operations.disconnect.title"),
+ downgrade: _t.html("operations.downgrade.title"),
+ extract: _t.html("operations.extract.title"),
+ merge: _t.html("operations.merge.title"),
+ move: _t.html("operations.move.title"),
+ orthogonalize: _t.html("operations.orthogonalize.title"),
+ paste: _t.html("operations.paste.title"),
+ reflect_long: _t.html("operations.reflect.title.long"),
+ reflect_short: _t.html("operations.reflect.title.short"),
+ reverse: _t.html("operations.reverse.title"),
+ rotate: _t.html("operations.rotate.title"),
+ split: _t.html("operations.split.title"),
+ straighten: _t.html("operations.straighten.title"),
+ map_data: _t.html("map_data.title"),
+ osm_notes: _t.html("map_data.layers.notes.title"),
+ fields: _t.html("inspector.fields"),
+ tags: _t.html("inspector.tags"),
+ relations: _t.html("inspector.relations"),
+ new_relation: _t.html("inspector.new_relation"),
+ turn_restrictions: _t.html("_tagging.presets.fields.restrictions.label"),
+ background_settings: _t.html("background.description"),
+ imagery_offset: _t.html("background.fix_misalignment"),
+ start_the_walkthrough: _t.html("splash.walkthrough"),
+ help: _t.html("help.title"),
+ ok: _t.html("intro.ok")
+ };
+ for (var key in helpStringReplacements) {
+ helpStringReplacements[key] = { html: helpStringReplacements[key] };
+ }
+ }
+ var reps;
+ if (replacements) {
+ reps = Object.assign(replacements, helpStringReplacements);
+ } else {
+ reps = helpStringReplacements;
+ }
+ return _t.html(id2, reps).replace(/\`(.*?)\`/g, "<kbd>$1</kbd>");
+ }
+ function slugify(text2) {
+ return text2.toString().toLowerCase().replace(/\s+/g, "-").replace(/[^\w\-]+/g, "").replace(/\-\-+/g, "-").replace(/^-+/, "").replace(/-+$/, "");
+ }
+ var missingStrings = {};
+ function checkKey(key, text2) {
+ if (_t(key, { default: void 0 }) === void 0) {
+ if (missingStrings.hasOwnProperty(key))
+ return;
+ missingStrings[key] = text2;
+ var missing = key + ": " + text2;
+ if (typeof console !== "undefined")
+ console.log(missing);
+ }
+ }
+ function localize(obj) {
+ var key;
+ var name2 = obj.tags && obj.tags.name;
+ if (name2) {
+ key = "intro.graph.name." + slugify(name2);
+ obj.tags.name = _t(key, { default: name2 });
+ checkKey(key, name2);
+ }
+ var street = obj.tags && obj.tags["addr:street"];
+ if (street) {
+ key = "intro.graph.name." + slugify(street);
+ obj.tags["addr:street"] = _t(key, { default: street });
+ checkKey(key, street);
+ var addrTags = [
+ "block_number",
+ "city",
+ "county",
+ "district",
+ "hamlet",
+ "neighbourhood",
+ "postcode",
+ "province",
+ "quarter",
+ "state",
+ "subdistrict",
+ "suburb"
+ ];
+ addrTags.forEach(function(k) {
+ var key2 = "intro.graph." + k;
+ var tag = "addr:" + k;
+ var val = obj.tags && obj.tags[tag];
+ var str2 = _t(key2, { default: val });
+ if (str2) {
+ if (str2.match(/^<.*>$/) !== null) {
+ delete obj.tags[tag];
+ } else {
+ obj.tags[tag] = str2;
+ }
+ }
+ });
+ }
+ return obj;
+ }
+ function isMostlySquare(points) {
+ var threshold = 15;
+ var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);
+ var upperBound = Math.cos(threshold * Math.PI / 180);
+ for (var i2 = 0; i2 < points.length; i2++) {
+ var a = points[(i2 - 1 + points.length) % points.length];
+ var origin = points[i2];
+ var b = points[(i2 + 1) % points.length];
+ var dotp = geoVecNormalizedDot(a, b, origin);
+ var mag = Math.abs(dotp);
+ if (mag > lowerBound && mag < upperBound) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function selectMenuItem(context, operation) {
+ return context.container().select(".edit-menu .edit-menu-item-" + operation);
+ }
+ function transitionTime(point1, point2) {
+ var distance = geoSphericalDistance(point1, point2);
+ if (distance === 0) {
+ return 0;
+ } else if (distance < 80) {
+ return 500;
+ } else {
+ return 1e3;
+ }
+ }
+
+ // modules/ui/toggle.js
+ function uiToggle(show, callback) {
+ return function(selection2) {
+ selection2.style("opacity", show ? 0 : 1).classed("hide", false).transition().style("opacity", show ? 1 : 0).on("end", function() {
+ select_default2(this).classed("hide", !show).style("opacity", null);
+ if (callback)
+ callback.apply(this);
+ });
+ };
+ }
+
+ // modules/ui/curtain.js
+ function uiCurtain(containerNode) {
+ var surface = select_default2(null), tooltip = select_default2(null), darkness = select_default2(null);
+ function curtain(selection2) {
+ surface = selection2.append("svg").attr("class", "curtain").style("top", 0).style("left", 0);
+ darkness = surface.append("path").attr("x", 0).attr("y", 0).attr("class", "curtain-darkness");
+ select_default2(window).on("resize.curtain", resize);
+ tooltip = selection2.append("div").attr("class", "tooltip");
+ tooltip.append("div").attr("class", "popover-arrow");
+ tooltip.append("div").attr("class", "popover-inner");
+ resize();
+ function resize() {
+ surface.attr("width", containerNode.clientWidth).attr("height", containerNode.clientHeight);
+ curtain.cut(darkness.datum());
+ }
+ }
+ curtain.reveal = function(box, html2, options2) {
+ options2 = options2 || {};
+ if (typeof box === "string") {
+ box = select_default2(box).node();
+ }
+ if (box && box.getBoundingClientRect) {
+ box = copyBox(box.getBoundingClientRect());
+ var containerRect = containerNode.getBoundingClientRect();
+ box.top -= containerRect.top;
+ box.left -= containerRect.left;
+ }
+ if (box && options2.padding) {
+ box.top -= options2.padding;
+ box.left -= options2.padding;
+ box.bottom += options2.padding;
+ box.right += options2.padding;
+ box.height += options2.padding * 2;
+ box.width += options2.padding * 2;
+ }
+ var tooltipBox;
+ if (options2.tooltipBox) {
+ tooltipBox = options2.tooltipBox;
+ if (typeof tooltipBox === "string") {
+ tooltipBox = select_default2(tooltipBox).node();
+ }
+ if (tooltipBox && tooltipBox.getBoundingClientRect) {
+ tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
+ }
+ } else {
+ tooltipBox = box;
+ }
+ if (tooltipBox && html2) {
+ if (html2.indexOf("**") !== -1) {
+ if (html2.indexOf("<span") === 0) {
+ html2 = html2.replace(/^(<span.*?>)(.+?)(\*\*)/, "$1<span>$2</span>$3");
+ } else {
+ html2 = html2.replace(/^(.+?)(\*\*)/, "<span>$1</span>$2");
+ }
+ html2 = html2.replace(/\*\*(.*?)\*\*/g, '<span class="instruction">$1</span>');
+ }
+ html2 = html2.replace(/\*(.*?)\*/g, "<em>$1</em>");
+ html2 = html2.replace(/\{br\}/g, "<br/><br/>");
+ if (options2.buttonText && options2.buttonCallback) {
+ html2 += '<div class="button-section"><button href="#" class="button action">' + options2.buttonText + "</button></div>";
+ }
+ var classes = "curtain-tooltip popover tooltip arrowed in " + (options2.tooltipClass || "");
+ tooltip.classed(classes, true).selectAll(".popover-inner").html(html2);
+ if (options2.buttonText && options2.buttonCallback) {
+ var button = tooltip.selectAll(".button-section .button.action");
+ button.on("click", function(d3_event) {
+ d3_event.preventDefault();
+ options2.buttonCallback();
+ });
+ }
+ var tip = copyBox(tooltip.node().getBoundingClientRect()), w = containerNode.clientWidth, h = containerNode.clientHeight, tooltipWidth = 200, tooltipArrow = 5, side, pos;
+ if (options2.tooltipClass === "intro-mouse") {
+ tip.height += 80;
+ }
+ if (tooltipBox.top + tooltipBox.height > h) {
+ tooltipBox.height -= tooltipBox.top + tooltipBox.height - h;
+ }
+ if (tooltipBox.left + tooltipBox.width > w) {
+ tooltipBox.width -= tooltipBox.left + tooltipBox.width - w;
+ }
+ if (tooltipBox.top + tooltipBox.height < 100) {
+ side = "bottom";
+ pos = [
+ tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
+ tooltipBox.top + tooltipBox.height
+ ];
+ } else if (tooltipBox.top > h - 140) {
+ side = "top";
+ pos = [
+ tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
+ tooltipBox.top - tip.height
+ ];
+ } else {
+ var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
+ if (_mainLocalizer.textDirection() === "rtl") {
+ if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
+ side = "right";
+ pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
+ } else {
+ side = "left";
+ pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
+ }
+ } else {
+ if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
+ side = "left";
+ pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
+ } else {
+ side = "right";
+ pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
+ }
+ }
+ }
+ if (options2.duration !== 0 || !tooltip.classed(side)) {
+ tooltip.call(uiToggle(true));
+ }
+ tooltip.style("top", pos[1] + "px").style("left", pos[0] + "px").attr("class", classes + " " + side);
+ var shiftY = 0;
+ if (side === "left" || side === "right") {
+ if (pos[1] < 60) {
+ shiftY = 60 - pos[1];
+ } else if (pos[1] + tip.height > h - 100) {
+ shiftY = h - pos[1] - tip.height - 100;
+ }
+ }
+ tooltip.selectAll(".popover-inner").style("top", shiftY + "px");
+ } else {
+ tooltip.classed("in", false).call(uiToggle(false));
+ }
+ curtain.cut(box, options2.duration);
+ return tooltip;
+ };
+ curtain.cut = function(datum2, duration) {
+ darkness.datum(datum2).interrupt();
+ var selection2;
+ if (duration === 0) {
+ selection2 = darkness;
+ } else {
+ selection2 = darkness.transition().duration(duration || 600).ease(linear2);
+ }
+ selection2.attr("d", function(d) {
+ var containerWidth = containerNode.clientWidth;
+ var containerHeight = containerNode.clientHeight;
+ var string = "M 0,0 L 0," + containerHeight + " L " + containerWidth + "," + containerHeight + "L" + containerWidth + ",0 Z";
+ if (!d)
+ return string;
+ return string + "M" + d.left + "," + d.top + "L" + d.left + "," + (d.top + d.height) + "L" + (d.left + d.width) + "," + (d.top + d.height) + "L" + (d.left + d.width) + "," + d.top + "Z";
+ });
+ };
+ curtain.remove = function() {
+ surface.remove();
+ tooltip.remove();
+ select_default2(window).on("resize.curtain", null);
+ };
+ function copyBox(src) {
+ return {
+ top: src.top,
+ right: src.right,
+ bottom: src.bottom,
+ left: src.left,
+ width: src.width,
+ height: src.height
+ };
+ }
+ return curtain;
+ }
+
+ // modules/ui/intro/welcome.js
+ function uiIntroWelcome(context, reveal) {
+ var dispatch10 = dispatch_default("done");
+ var chapter = {
+ title: "intro.welcome.title"
+ };
+ function welcome() {
+ context.map().centerZoom([-85.63591, 41.94285], 19);
+ reveal(".intro-nav-wrap .chapter-welcome", helpHtml("intro.welcome.welcome"), { buttonText: _t.html("intro.ok"), buttonCallback: practice });
+ }
+ function practice() {
+ reveal(".intro-nav-wrap .chapter-welcome", helpHtml("intro.welcome.practice"), { buttonText: _t.html("intro.ok"), buttonCallback: words });
+ }
+ function words() {
+ reveal(".intro-nav-wrap .chapter-welcome", helpHtml("intro.welcome.words"), { buttonText: _t.html("intro.ok"), buttonCallback: chapters });
+ }
+ function chapters() {
+ dispatch10.call("done");
+ reveal(".intro-nav-wrap .chapter-navigation", helpHtml("intro.welcome.chapters", { next: _t("intro.navigation.title") }));
+ }
+ chapter.enter = function() {
+ welcome();
+ };
+ chapter.exit = function() {
+ context.container().select(".curtain-tooltip.intro-mouse").selectAll(".counter").remove();
+ };
+ chapter.restart = function() {
+ chapter.exit();
+ chapter.enter();
+ };
+ return utilRebind(chapter, dispatch10, "on");
+ }
+
+ // modules/ui/intro/navigation.js
+ function uiIntroNavigation(context, reveal) {
+ var dispatch10 = dispatch_default("done");
+ var timeouts = [];
+ var hallId = "n2061";
+ var townHall = [-85.63591, 41.94285];
+ var springStreetId = "w397";
+ var springStreetEndId = "n1834";
+ var springStreet = [-85.63582, 41.94255];
+ var onewayField = _mainPresetIndex.field("oneway");
+ var maxspeedField = _mainPresetIndex.field("maxspeed");
+ var chapter = {
+ title: "intro.navigation.title"
+ };
+ function timeout2(f2, t) {
+ timeouts.push(window.setTimeout(f2, t));
+ }
+ function eventCancel(d3_event) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ }
+ function isTownHallSelected() {
+ var ids = context.selectedIDs();
+ return ids.length === 1 && ids[0] === hallId;
+ }
+ function dragMap() {
+ context.enter(modeBrowse(context));
+ context.history().reset("initial");
+ var msec = transitionTime(townHall, context.map().center());
+ if (msec) {
+ reveal(null, null, { duration: 0 });
+ }
+ context.map().centerZoomEase(townHall, 19, msec);
+ timeout2(function() {
+ var centerStart = context.map().center();
+ var textId = context.lastPointerType() === "mouse" ? "drag" : "drag_touch";
+ var dragString = helpHtml("intro.navigation.map_info") + "{br}" + helpHtml("intro.navigation." + textId);
+ reveal(".surface", dragString);
+ context.map().on("drawn.intro", function() {
+ reveal(".surface", dragString, { duration: 0 });
+ });
+ context.map().on("move.intro", function() {
+ var centerNow = context.map().center();
+ if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
+ context.map().on("move.intro", null);
+ timeout2(function() {
+ continueTo(zoomMap);
+ }, 3e3);
+ }
+ });
+ }, msec + 100);
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ nextStep();
+ }
+ }
+ function zoomMap() {
+ var zoomStart = context.map().zoom();
+ var textId = context.lastPointerType() === "mouse" ? "zoom" : "zoom_touch";
+ var zoomString = helpHtml("intro.navigation." + textId);
+ reveal(".surface", zoomString);
+ context.map().on("drawn.intro", function() {
+ reveal(".surface", zoomString, { duration: 0 });
+ });
+ context.map().on("move.intro", function() {
+ if (context.map().zoom() !== zoomStart) {
+ context.map().on("move.intro", null);
+ timeout2(function() {
+ continueTo(features2);
+ }, 3e3);
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ nextStep();
+ }
+ }
+ function features2() {
+ var onClick = function() {
+ continueTo(pointsLinesAreas);
+ };
+ reveal(".surface", helpHtml("intro.navigation.features"), { buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ context.map().on("drawn.intro", function() {
+ reveal(".surface", helpHtml("intro.navigation.features"), { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ });
+ function continueTo(nextStep) {
+ context.map().on("drawn.intro", null);
+ nextStep();
+ }
+ }
+ function pointsLinesAreas() {
+ var onClick = function() {
+ continueTo(nodesWays);
+ };
+ reveal(".surface", helpHtml("intro.navigation.points_lines_areas"), { buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ context.map().on("drawn.intro", function() {
+ reveal(".surface", helpHtml("intro.navigation.points_lines_areas"), { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ });
+ function continueTo(nextStep) {
+ context.map().on("drawn.intro", null);
+ nextStep();
+ }
+ }
+ function nodesWays() {
+ var onClick = function() {
+ continueTo(clickTownHall);
+ };
+ reveal(".surface", helpHtml("intro.navigation.nodes_ways"), { buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ context.map().on("drawn.intro", function() {
+ reveal(".surface", helpHtml("intro.navigation.nodes_ways"), { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ });
+ function continueTo(nextStep) {
+ context.map().on("drawn.intro", null);
+ nextStep();
+ }
+ }
+ function clickTownHall() {
+ context.enter(modeBrowse(context));
+ context.history().reset("initial");
+ var entity = context.hasEntity(hallId);
+ if (!entity)
+ return;
+ reveal(null, null, { duration: 0 });
+ context.map().centerZoomEase(entity.loc, 19, 500);
+ timeout2(function() {
+ var entity2 = context.hasEntity(hallId);
+ if (!entity2)
+ return;
+ var box = pointBox(entity2.loc, context);
+ var textId = context.lastPointerType() === "mouse" ? "click_townhall" : "tap_townhall";
+ reveal(box, helpHtml("intro.navigation." + textId));
+ context.map().on("move.intro drawn.intro", function() {
+ var entity3 = context.hasEntity(hallId);
+ if (!entity3)
+ return;
+ var box2 = pointBox(entity3.loc, context);
+ reveal(box2, helpHtml("intro.navigation." + textId), { duration: 0 });
+ });
+ context.on("enter.intro", function() {
+ if (isTownHallSelected())
+ continueTo(selectedTownHall);
+ });
+ }, 550);
+ context.history().on("change.intro", function() {
+ if (!context.hasEntity(hallId)) {
+ continueTo(clickTownHall);
+ }
+ });
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function selectedTownHall() {
+ if (!isTownHallSelected())
+ return clickTownHall();
+ var entity = context.hasEntity(hallId);
+ if (!entity)
+ return clickTownHall();
+ var box = pointBox(entity.loc, context);
+ var onClick = function() {
+ continueTo(editorTownHall);
+ };
+ reveal(box, helpHtml("intro.navigation.selected_townhall"), { buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ context.map().on("move.intro drawn.intro", function() {
+ var entity2 = context.hasEntity(hallId);
+ if (!entity2)
+ return;
+ var box2 = pointBox(entity2.loc, context);
+ reveal(box2, helpHtml("intro.navigation.selected_townhall"), { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ });
+ context.history().on("change.intro", function() {
+ if (!context.hasEntity(hallId)) {
+ continueTo(clickTownHall);
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function editorTownHall() {
+ if (!isTownHallSelected())
+ return clickTownHall();
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ var onClick = function() {
+ continueTo(presetTownHall);
+ };
+ reveal(".entity-editor-pane", helpHtml("intro.navigation.editor_townhall"), { buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ context.on("exit.intro", function() {
+ continueTo(clickTownHall);
+ });
+ context.history().on("change.intro", function() {
+ if (!context.hasEntity(hallId)) {
+ continueTo(clickTownHall);
+ }
+ });
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ context.history().on("change.intro", null);
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ nextStep();
+ }
+ }
+ function presetTownHall() {
+ if (!isTownHallSelected())
+ return clickTownHall();
+ context.container().select(".inspector-wrap .panewrap").style("right", "0%");
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ var entity = context.entity(context.selectedIDs()[0]);
+ var preset = _mainPresetIndex.match(entity, context.graph());
+ var onClick = function() {
+ continueTo(fieldsTownHall);
+ };
+ reveal(".entity-editor-pane .section-feature-type", helpHtml("intro.navigation.preset_townhall", { preset: preset.name() }), { buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ context.on("exit.intro", function() {
+ continueTo(clickTownHall);
+ });
+ context.history().on("change.intro", function() {
+ if (!context.hasEntity(hallId)) {
+ continueTo(clickTownHall);
+ }
+ });
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ context.history().on("change.intro", null);
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ nextStep();
+ }
+ }
+ function fieldsTownHall() {
+ if (!isTownHallSelected())
+ return clickTownHall();
+ context.container().select(".inspector-wrap .panewrap").style("right", "0%");
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ var onClick = function() {
+ continueTo(closeTownHall);
+ };
+ reveal(".entity-editor-pane .section-preset-fields", helpHtml("intro.navigation.fields_townhall"), { buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ context.on("exit.intro", function() {
+ continueTo(clickTownHall);
+ });
+ context.history().on("change.intro", function() {
+ if (!context.hasEntity(hallId)) {
+ continueTo(clickTownHall);
+ }
+ });
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ context.history().on("change.intro", null);
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ nextStep();
+ }
+ }
+ function closeTownHall() {
+ if (!isTownHallSelected())
+ return clickTownHall();
+ var selector = ".entity-editor-pane button.close svg use";
+ var href = select_default2(selector).attr("href") || "#iD-icon-close";
+ reveal(".entity-editor-pane", helpHtml("intro.navigation.close_townhall", { button: { html: icon(href, "inline") } }));
+ context.on("exit.intro", function() {
+ continueTo(searchStreet);
+ });
+ context.history().on("change.intro", function() {
+ var selector2 = ".entity-editor-pane button.close svg use";
+ var href2 = select_default2(selector2).attr("href") || "#iD-icon-close";
+ reveal(".entity-editor-pane", helpHtml("intro.navigation.close_townhall", { button: { html: icon(href2, "inline") } }), { duration: 0 });
+ });
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function searchStreet() {
+ context.enter(modeBrowse(context));
+ context.history().reset("initial");
+ var msec = transitionTime(springStreet, context.map().center());
+ if (msec) {
+ reveal(null, null, { duration: 0 });
+ }
+ context.map().centerZoomEase(springStreet, 19, msec);
+ timeout2(function() {
+ reveal(".search-header input", helpHtml("intro.navigation.search_street", { name: _t("intro.graph.name.spring-street") }));
+ context.container().select(".search-header input").on("keyup.intro", checkSearchResult);
+ }, msec + 100);
+ }
+ function checkSearchResult() {
+ var first = context.container().select(".feature-list-item:nth-child(0n+2)");
+ var firstName = first.select(".entity-name");
+ var name2 = _t("intro.graph.name.spring-street");
+ if (!firstName.empty() && firstName.html() === name2) {
+ reveal(first.node(), helpHtml("intro.navigation.choose_street", { name: name2 }), { duration: 300 });
+ context.on("exit.intro", function() {
+ continueTo(selectedStreet);
+ });
+ context.container().select(".search-header input").on("keydown.intro", eventCancel, true).on("keyup.intro", null);
+ }
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ context.container().select(".search-header input").on("keydown.intro", null).on("keyup.intro", null);
+ nextStep();
+ }
+ }
+ function selectedStreet() {
+ if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
+ return searchStreet();
+ }
+ var onClick = function() {
+ continueTo(editorStreet);
+ };
+ var entity = context.entity(springStreetEndId);
+ var box = pointBox(entity.loc, context);
+ box.height = 500;
+ reveal(box, helpHtml("intro.navigation.selected_street", { name: _t("intro.graph.name.spring-street") }), { duration: 600, buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ timeout2(function() {
+ context.map().on("move.intro drawn.intro", function() {
+ var entity2 = context.hasEntity(springStreetEndId);
+ if (!entity2)
+ return;
+ var box2 = pointBox(entity2.loc, context);
+ box2.height = 500;
+ reveal(box2, helpHtml("intro.navigation.selected_street", { name: _t("intro.graph.name.spring-street") }), { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ });
+ }, 600);
+ context.on("enter.intro", function(mode) {
+ if (!context.hasEntity(springStreetId)) {
+ return continueTo(searchStreet);
+ }
+ var ids = context.selectedIDs();
+ if (mode.id !== "select" || !ids.length || ids[0] !== springStreetId) {
+ context.enter(modeSelect(context, [springStreetId]));
+ }
+ });
+ context.history().on("change.intro", function() {
+ if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
+ timeout2(function() {
+ continueTo(searchStreet);
+ }, 300);
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function editorStreet() {
+ var selector = ".entity-editor-pane button.close svg use";
+ var href = select_default2(selector).attr("href") || "#iD-icon-close";
+ reveal(".entity-editor-pane", helpHtml("intro.navigation.street_different_fields") + "{br}" + helpHtml("intro.navigation.editor_street", {
+ button: { html: icon(href, "inline") },
+ field1: { html: onewayField.label() },
+ field2: { html: maxspeedField.label() }
+ }));
+ context.on("exit.intro", function() {
+ continueTo(play);
+ });
+ context.history().on("change.intro", function() {
+ var selector2 = ".entity-editor-pane button.close svg use";
+ var href2 = select_default2(selector2).attr("href") || "#iD-icon-close";
+ reveal(".entity-editor-pane", helpHtml("intro.navigation.street_different_fields") + "{br}" + helpHtml("intro.navigation.editor_street", {
+ button: { html: icon(href2, "inline") },
+ field1: { html: onewayField.label() },
+ field2: { html: maxspeedField.label() }
+ }), { duration: 0 });
+ });
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function play() {
+ dispatch10.call("done");
+ reveal(".ideditor", helpHtml("intro.navigation.play", { next: _t("intro.points.title") }), {
+ tooltipBox: ".intro-nav-wrap .chapter-point",
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ reveal(".ideditor");
+ }
+ });
+ }
+ chapter.enter = function() {
+ dragMap();
+ };
+ chapter.exit = function() {
+ timeouts.forEach(window.clearTimeout);
+ context.on("enter.intro exit.intro", null);
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ context.container().select(".search-header input").on("keydown.intro keyup.intro", null);
+ };
+ chapter.restart = function() {
+ chapter.exit();
+ chapter.enter();
+ };
+ return utilRebind(chapter, dispatch10, "on");
+ }
+
+ // modules/ui/intro/point.js
+ function uiIntroPoint(context, reveal) {
+ var dispatch10 = dispatch_default("done");
+ var timeouts = [];
+ var intersection = [-85.63279, 41.94394];
+ var building = [-85.632422, 41.944045];
+ var cafePreset = _mainPresetIndex.item("amenity/cafe");
+ var _pointID = null;
+ var chapter = {
+ title: "intro.points.title"
+ };
+ function timeout2(f2, t) {
+ timeouts.push(window.setTimeout(f2, t));
+ }
+ function eventCancel(d3_event) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ }
+ function addPoint() {
+ context.enter(modeBrowse(context));
+ context.history().reset("initial");
+ var msec = transitionTime(intersection, context.map().center());
+ if (msec) {
+ reveal(null, null, { duration: 0 });
+ }
+ context.map().centerZoomEase(intersection, 19, msec);
+ timeout2(function() {
+ var tooltip = reveal("button.add-point", helpHtml("intro.points.points_info") + "{br}" + helpHtml("intro.points.add_point"));
+ _pointID = null;
+ tooltip.selectAll(".popover-inner").insert("svg", "span").attr("class", "tooltip-illustration").append("use").attr("xlink:href", "#iD-graphic-points");
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "add-point")
+ return;
+ continueTo(placePoint);
+ });
+ }, msec + 100);
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function placePoint() {
+ if (context.mode().id !== "add-point") {
+ return chapter.restart();
+ }
+ var pointBox2 = pad(building, 150, context);
+ var textId = context.lastPointerType() === "mouse" ? "place_point" : "place_point_touch";
+ reveal(pointBox2, helpHtml("intro.points." + textId));
+ context.map().on("move.intro drawn.intro", function() {
+ pointBox2 = pad(building, 150, context);
+ reveal(pointBox2, helpHtml("intro.points." + textId), { duration: 0 });
+ });
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "select")
+ return chapter.restart();
+ _pointID = context.mode().selectedIDs()[0];
+ continueTo(searchPreset);
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function searchPreset() {
+ if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
+ return addPoint();
+ }
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
+ reveal(".preset-search-input", helpHtml("intro.points.search_cafe", { preset: cafePreset.name() }));
+ context.on("enter.intro", function(mode) {
+ if (!_pointID || !context.hasEntity(_pointID)) {
+ return continueTo(addPoint);
+ }
+ var ids = context.selectedIDs();
+ if (mode.id !== "select" || !ids.length || ids[0] !== _pointID) {
+ context.enter(modeSelect(context, [_pointID]));
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
+ reveal(".preset-search-input", helpHtml("intro.points.search_cafe", { preset: cafePreset.name() }));
+ context.history().on("change.intro", null);
+ }
+ });
+ function checkPresetSearch() {
+ var first = context.container().select(".preset-list-item:first-child");
+ if (first.classed("preset-amenity-cafe")) {
+ context.container().select(".preset-search-input").on("keydown.intro", eventCancel, true).on("keyup.intro", null);
+ reveal(first.select(".preset-list-button").node(), helpHtml("intro.points.choose_cafe", { preset: cafePreset.name() }), { duration: 300 });
+ context.history().on("change.intro", function() {
+ continueTo(aboutFeatureEditor);
+ });
+ }
+ }
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ context.history().on("change.intro", null);
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
+ nextStep();
+ }
+ }
+ function aboutFeatureEditor() {
+ if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
+ return addPoint();
+ }
+ timeout2(function() {
+ reveal(".entity-editor-pane", helpHtml("intro.points.feature_editor"), {
+ tooltipClass: "intro-points-describe",
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ continueTo(addName);
+ }
+ });
+ }, 400);
+ context.on("exit.intro", function() {
+ continueTo(reselectPoint);
+ });
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function addName() {
+ if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
+ return addPoint();
+ }
+ context.container().select(".inspector-wrap .panewrap").style("right", "0%");
+ var addNameString = helpHtml("intro.points.fields_info") + "{br}" + helpHtml("intro.points.add_name");
+ timeout2(function() {
+ var entity = context.entity(_pointID);
+ if (entity.tags.name) {
+ var tooltip = reveal(".entity-editor-pane", addNameString, {
+ tooltipClass: "intro-points-describe",
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ continueTo(addCloseEditor);
+ }
+ });
+ tooltip.select(".instruction").style("display", "none");
+ } else {
+ reveal(".entity-editor-pane", addNameString, { tooltipClass: "intro-points-describe" });
+ }
+ }, 400);
+ context.history().on("change.intro", function() {
+ continueTo(addCloseEditor);
+ });
+ context.on("exit.intro", function() {
+ continueTo(reselectPoint);
+ });
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function addCloseEditor() {
+ context.container().select(".inspector-wrap .panewrap").style("right", "0%");
+ var selector = ".entity-editor-pane button.close svg use";
+ var href = select_default2(selector).attr("href") || "#iD-icon-close";
+ context.on("exit.intro", function() {
+ continueTo(reselectPoint);
+ });
+ reveal(".entity-editor-pane", helpHtml("intro.points.add_close", { button: { html: icon(href, "inline") } }));
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function reselectPoint() {
+ if (!_pointID)
+ return chapter.restart();
+ var entity = context.hasEntity(_pointID);
+ if (!entity)
+ return chapter.restart();
+ var oldPreset = _mainPresetIndex.match(entity, context.graph());
+ context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
+ context.enter(modeBrowse(context));
+ var msec = transitionTime(entity.loc, context.map().center());
+ if (msec) {
+ reveal(null, null, { duration: 0 });
+ }
+ context.map().centerEase(entity.loc, msec);
+ timeout2(function() {
+ var box = pointBox(entity.loc, context);
+ reveal(box, helpHtml("intro.points.reselect"), { duration: 600 });
+ timeout2(function() {
+ context.map().on("move.intro drawn.intro", function() {
+ var entity2 = context.hasEntity(_pointID);
+ if (!entity2)
+ return chapter.restart();
+ var box2 = pointBox(entity2.loc, context);
+ reveal(box2, helpHtml("intro.points.reselect"), { duration: 0 });
+ });
+ }, 600);
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "select")
+ return;
+ continueTo(updatePoint);
+ });
+ }, msec + 100);
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function updatePoint() {
+ if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
+ return continueTo(reselectPoint);
+ }
+ context.container().select(".inspector-wrap .panewrap").style("right", "0%");
+ context.on("exit.intro", function() {
+ continueTo(reselectPoint);
+ });
+ context.history().on("change.intro", function() {
+ continueTo(updateCloseEditor);
+ });
+ timeout2(function() {
+ reveal(".entity-editor-pane", helpHtml("intro.points.update"), { tooltipClass: "intro-points-describe" });
+ }, 400);
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function updateCloseEditor() {
+ if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
+ return continueTo(reselectPoint);
+ }
+ context.container().select(".inspector-wrap .panewrap").style("right", "0%");
+ context.on("exit.intro", function() {
+ continueTo(rightClickPoint);
+ });
+ timeout2(function() {
+ reveal(".entity-editor-pane", helpHtml("intro.points.update_close", { button: { html: icon("#iD-icon-close", "inline") } }));
+ }, 500);
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function rightClickPoint() {
+ if (!_pointID)
+ return chapter.restart();
+ var entity = context.hasEntity(_pointID);
+ if (!entity)
+ return chapter.restart();
+ context.enter(modeBrowse(context));
+ var box = pointBox(entity.loc, context);
+ var textId = context.lastPointerType() === "mouse" ? "rightclick" : "edit_menu_touch";
+ reveal(box, helpHtml("intro.points." + textId), { duration: 600 });
+ timeout2(function() {
+ context.map().on("move.intro", function() {
+ var entity2 = context.hasEntity(_pointID);
+ if (!entity2)
+ return chapter.restart();
+ var box2 = pointBox(entity2.loc, context);
+ reveal(box2, helpHtml("intro.points." + textId), { duration: 0 });
+ });
+ }, 600);
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "select")
+ return;
+ var ids = context.selectedIDs();
+ if (ids.length !== 1 || ids[0] !== _pointID)
+ return;
+ timeout2(function() {
+ var node = selectMenuItem(context, "delete").node();
+ if (!node)
+ return;
+ continueTo(enterDelete);
+ }, 50);
+ });
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ context.map().on("move.intro", null);
+ nextStep();
+ }
+ }
+ function enterDelete() {
+ if (!_pointID)
+ return chapter.restart();
+ var entity = context.hasEntity(_pointID);
+ if (!entity)
+ return chapter.restart();
+ var node = selectMenuItem(context, "delete").node();
+ if (!node) {
+ return continueTo(rightClickPoint);
+ }
+ reveal(".edit-menu", helpHtml("intro.points.delete"), { padding: 50 });
+ timeout2(function() {
+ context.map().on("move.intro", function() {
+ reveal(".edit-menu", helpHtml("intro.points.delete"), { duration: 0, padding: 50 });
+ });
+ }, 300);
+ context.on("exit.intro", function() {
+ if (!_pointID)
+ return chapter.restart();
+ var entity2 = context.hasEntity(_pointID);
+ if (entity2)
+ return continueTo(rightClickPoint);
+ });
+ context.history().on("change.intro", function(changed) {
+ if (changed.deleted().length) {
+ continueTo(undo);
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro", null);
+ context.history().on("change.intro", null);
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function undo() {
+ context.history().on("change.intro", function() {
+ continueTo(play);
+ });
+ reveal(".top-toolbar button.undo-button", helpHtml("intro.points.undo"));
+ function continueTo(nextStep) {
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function play() {
+ dispatch10.call("done");
+ reveal(".ideditor", helpHtml("intro.points.play", { next: _t("intro.areas.title") }), {
+ tooltipBox: ".intro-nav-wrap .chapter-area",
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ reveal(".ideditor");
+ }
+ });
+ }
+ chapter.enter = function() {
+ addPoint();
+ };
+ chapter.exit = function() {
+ timeouts.forEach(window.clearTimeout);
+ context.on("enter.intro exit.intro", null);
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
+ };
+ chapter.restart = function() {
+ chapter.exit();
+ chapter.enter();
+ };
+ return utilRebind(chapter, dispatch10, "on");
+ }
+
+ // modules/ui/intro/area.js
+ function uiIntroArea(context, reveal) {
+ var dispatch10 = dispatch_default("done");
+ var playground = [-85.63552, 41.94159];
+ var playgroundPreset = _mainPresetIndex.item("leisure/playground");
+ var nameField = _mainPresetIndex.field("name");
+ var descriptionField = _mainPresetIndex.field("description");
+ var timeouts = [];
+ var _areaID;
+ var chapter = {
+ title: "intro.areas.title"
+ };
+ function timeout2(f2, t) {
+ timeouts.push(window.setTimeout(f2, t));
+ }
+ function eventCancel(d3_event) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ }
+ function revealPlayground(center, text2, options2) {
+ var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
+ var box = pad(center, padding, context);
+ reveal(box, text2, options2);
+ }
+ function addArea() {
+ context.enter(modeBrowse(context));
+ context.history().reset("initial");
+ _areaID = null;
+ var msec = transitionTime(playground, context.map().center());
+ if (msec) {
+ reveal(null, null, { duration: 0 });
+ }
+ context.map().centerZoomEase(playground, 19, msec);
+ timeout2(function() {
+ var tooltip = reveal("button.add-area", helpHtml("intro.areas.add_playground"));
+ tooltip.selectAll(".popover-inner").insert("svg", "span").attr("class", "tooltip-illustration").append("use").attr("xlink:href", "#iD-graphic-areas");
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "add-area")
+ return;
+ continueTo(startPlayground);
+ });
+ }, msec + 100);
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function startPlayground() {
+ if (context.mode().id !== "add-area") {
+ return chapter.restart();
+ }
+ _areaID = null;
+ context.map().zoomEase(19.5, 500);
+ timeout2(function() {
+ var textId = context.lastPointerType() === "mouse" ? "starting_node_click" : "starting_node_tap";
+ var startDrawString = helpHtml("intro.areas.start_playground") + helpHtml("intro.areas." + textId);
+ revealPlayground(playground, startDrawString, { duration: 250 });
+ timeout2(function() {
+ context.map().on("move.intro drawn.intro", function() {
+ revealPlayground(playground, startDrawString, { duration: 0 });
+ });
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "draw-area")
+ return chapter.restart();
+ continueTo(continuePlayground);
+ });
+ }, 250);
+ }, 550);
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function continuePlayground() {
+ if (context.mode().id !== "draw-area") {
+ return chapter.restart();
+ }
+ _areaID = null;
+ revealPlayground(playground, helpHtml("intro.areas.continue_playground"), { duration: 250 });
+ timeout2(function() {
+ context.map().on("move.intro drawn.intro", function() {
+ revealPlayground(playground, helpHtml("intro.areas.continue_playground"), { duration: 0 });
+ });
+ }, 250);
+ context.on("enter.intro", function(mode) {
+ if (mode.id === "draw-area") {
+ var entity = context.hasEntity(context.selectedIDs()[0]);
+ if (entity && entity.nodes.length >= 6) {
+ return continueTo(finishPlayground);
+ } else {
+ return;
+ }
+ } else if (mode.id === "select") {
+ _areaID = context.selectedIDs()[0];
+ return continueTo(searchPresets);
+ } else {
+ return chapter.restart();
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function finishPlayground() {
+ if (context.mode().id !== "draw-area") {
+ return chapter.restart();
+ }
+ _areaID = null;
+ var finishString = helpHtml("intro.areas.finish_area_" + (context.lastPointerType() === "mouse" ? "click" : "tap")) + helpHtml("intro.areas.finish_playground");
+ revealPlayground(playground, finishString, { duration: 250 });
+ timeout2(function() {
+ context.map().on("move.intro drawn.intro", function() {
+ revealPlayground(playground, finishString, { duration: 0 });
+ });
+ }, 250);
+ context.on("enter.intro", function(mode) {
+ if (mode.id === "draw-area") {
+ return;
+ } else if (mode.id === "select") {
+ _areaID = context.selectedIDs()[0];
+ return continueTo(searchPresets);
+ } else {
+ return chapter.restart();
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function searchPresets() {
+ if (!_areaID || !context.hasEntity(_areaID)) {
+ return addArea();
+ }
+ var ids = context.selectedIDs();
+ if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
+ context.enter(modeSelect(context, [_areaID]));
+ }
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ timeout2(function() {
+ context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
+ context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
+ reveal(".preset-search-input", helpHtml("intro.areas.search_playground", { preset: playgroundPreset.name() }));
+ }, 400);
+ context.on("enter.intro", function(mode) {
+ if (!_areaID || !context.hasEntity(_areaID)) {
+ return continueTo(addArea);
+ }
+ var ids2 = context.selectedIDs();
+ if (mode.id !== "select" || !ids2.length || ids2[0] !== _areaID) {
+ context.enter(modeSelect(context, [_areaID]));
+ context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
+ reveal(".preset-search-input", helpHtml("intro.areas.search_playground", { preset: playgroundPreset.name() }));
+ context.history().on("change.intro", null);
+ }
+ });
+ function checkPresetSearch() {
+ var first = context.container().select(".preset-list-item:first-child");
+ if (first.classed("preset-leisure-playground")) {
+ reveal(first.select(".preset-list-button").node(), helpHtml("intro.areas.choose_playground", { preset: playgroundPreset.name() }), { duration: 300 });
+ context.container().select(".preset-search-input").on("keydown.intro", eventCancel, true).on("keyup.intro", null);
+ context.history().on("change.intro", function() {
+ continueTo(clickAddField);
+ });
+ }
+ }
+ function continueTo(nextStep) {
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ context.on("enter.intro", null);
+ context.history().on("change.intro", null);
+ context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
+ nextStep();
+ }
+ }
+ function clickAddField() {
+ if (!_areaID || !context.hasEntity(_areaID)) {
+ return addArea();
+ }
+ var ids = context.selectedIDs();
+ if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
+ return searchPresets();
+ }
+ if (!context.container().select(".form-field-description").empty()) {
+ return continueTo(describePlayground);
+ }
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ timeout2(function() {
+ context.container().select(".inspector-wrap .panewrap").style("right", "0%");
+ var entity = context.entity(_areaID);
+ if (entity.tags.description) {
+ return continueTo(play);
+ }
+ var box = context.container().select(".more-fields").node().getBoundingClientRect();
+ if (box.top > 300) {
+ var pane = context.container().select(".entity-editor-pane .inspector-body");
+ var start2 = pane.node().scrollTop;
+ var end = start2 + (box.top - 300);
+ pane.transition().duration(250).tween("scroll.inspector", function() {
+ var node = this;
+ var i2 = number_default(start2, end);
+ return function(t) {
+ node.scrollTop = i2(t);
+ };
+ });
+ }
+ timeout2(function() {
+ reveal(".more-fields .combobox-input", helpHtml("intro.areas.add_field", {
+ name: { html: nameField.label() },
+ description: { html: descriptionField.label() }
+ }), { duration: 300 });
+ context.container().select(".more-fields .combobox-input").on("click.intro", function() {
+ var watcher;
+ watcher = window.setInterval(function() {
+ if (!context.container().select("div.combobox").empty()) {
+ window.clearInterval(watcher);
+ continueTo(chooseDescriptionField);
+ }
+ }, 300);
+ });
+ }, 300);
+ }, 400);
+ context.on("exit.intro", function() {
+ return continueTo(searchPresets);
+ });
+ function continueTo(nextStep) {
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ context.container().select(".more-fields .combobox-input").on("click.intro", null);
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function chooseDescriptionField() {
+ if (!_areaID || !context.hasEntity(_areaID)) {
+ return addArea();
+ }
+ var ids = context.selectedIDs();
+ if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
+ return searchPresets();
+ }
+ if (!context.container().select(".form-field-description").empty()) {
+ return continueTo(describePlayground);
+ }
+ if (context.container().select("div.combobox").empty()) {
+ return continueTo(clickAddField);
+ }
+ var watcher;
+ watcher = window.setInterval(function() {
+ if (context.container().select("div.combobox").empty()) {
+ window.clearInterval(watcher);
+ timeout2(function() {
+ if (context.container().select(".form-field-description").empty()) {
+ continueTo(retryChooseDescription);
+ } else {
+ continueTo(describePlayground);
+ }
+ }, 300);
+ }
+ }, 300);
+ reveal("div.combobox", helpHtml("intro.areas.choose_field", { field: { html: descriptionField.label() } }), { duration: 300 });
+ context.on("exit.intro", function() {
+ return continueTo(searchPresets);
+ });
+ function continueTo(nextStep) {
+ if (watcher)
+ window.clearInterval(watcher);
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function describePlayground() {
+ if (!_areaID || !context.hasEntity(_areaID)) {
+ return addArea();
+ }
+ var ids = context.selectedIDs();
+ if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
+ return searchPresets();
+ }
+ context.container().select(".inspector-wrap .panewrap").style("right", "0%");
+ if (context.container().select(".form-field-description").empty()) {
+ return continueTo(retryChooseDescription);
+ }
+ context.on("exit.intro", function() {
+ continueTo(play);
+ });
+ reveal(".entity-editor-pane", helpHtml("intro.areas.describe_playground", { button: { html: icon("#iD-icon-close", "inline") } }), { duration: 300 });
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function retryChooseDescription() {
+ if (!_areaID || !context.hasEntity(_areaID)) {
+ return addArea();
+ }
+ var ids = context.selectedIDs();
+ if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
+ return searchPresets();
+ }
+ context.container().select(".inspector-wrap .panewrap").style("right", "0%");
+ reveal(".entity-editor-pane", helpHtml("intro.areas.retry_add_field", { field: { html: descriptionField.label() } }), {
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ continueTo(clickAddField);
+ }
+ });
+ context.on("exit.intro", function() {
+ return continueTo(searchPresets);
+ });
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function play() {
+ dispatch10.call("done");
+ reveal(".ideditor", helpHtml("intro.areas.play", { next: _t("intro.lines.title") }), {
+ tooltipBox: ".intro-nav-wrap .chapter-line",
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ reveal(".ideditor");
+ }
+ });
+ }
+ chapter.enter = function() {
+ addArea();
+ };
+ chapter.exit = function() {
+ timeouts.forEach(window.clearTimeout);
+ context.on("enter.intro exit.intro", null);
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
+ context.container().select(".more-fields .combobox-input").on("click.intro", null);
+ };
+ chapter.restart = function() {
+ chapter.exit();
+ chapter.enter();
+ };
+ return utilRebind(chapter, dispatch10, "on");
+ }
+
+ // modules/ui/intro/line.js
+ function uiIntroLine(context, reveal) {
+ var dispatch10 = dispatch_default("done");
+ var timeouts = [];
+ var _tulipRoadID = null;
+ var flowerRoadID = "w646";
+ var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
+ var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
+ var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
+ var roadCategory = _mainPresetIndex.item("category-road_minor");
+ var residentialPreset = _mainPresetIndex.item("highway/residential");
+ var woodRoadID = "w525";
+ var woodRoadEndID = "n2862";
+ var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
+ var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
+ var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
+ var washingtonStreetID = "w522";
+ var twelfthAvenueID = "w1";
+ var eleventhAvenueEndID = "n3550";
+ var twelfthAvenueEndID = "n5";
+ var _washingtonSegmentID = null;
+ var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
+ var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
+ var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
+ var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
+ var chapter = {
+ title: "intro.lines.title"
+ };
+ function timeout2(f2, t) {
+ timeouts.push(window.setTimeout(f2, t));
+ }
+ function eventCancel(d3_event) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ }
+ function addLine() {
+ context.enter(modeBrowse(context));
+ context.history().reset("initial");
+ var msec = transitionTime(tulipRoadStart, context.map().center());
+ if (msec) {
+ reveal(null, null, { duration: 0 });
+ }
+ context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
+ timeout2(function() {
+ var tooltip = reveal("button.add-line", helpHtml("intro.lines.add_line"));
+ tooltip.selectAll(".popover-inner").insert("svg", "span").attr("class", "tooltip-illustration").append("use").attr("xlink:href", "#iD-graphic-lines");
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "add-line")
+ return;
+ continueTo(startLine);
+ });
+ }, msec + 100);
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function startLine() {
+ if (context.mode().id !== "add-line")
+ return chapter.restart();
+ _tulipRoadID = null;
+ var padding = 70 * Math.pow(2, context.map().zoom() - 18);
+ var box = pad(tulipRoadStart, padding, context);
+ box.height = box.height + 100;
+ var textId = context.lastPointerType() === "mouse" ? "start_line" : "start_line_tap";
+ var startLineString = helpHtml("intro.lines.missing_road") + "{br}" + helpHtml("intro.lines.line_draw_info") + helpHtml("intro.lines." + textId);
+ reveal(box, startLineString);
+ context.map().on("move.intro drawn.intro", function() {
+ padding = 70 * Math.pow(2, context.map().zoom() - 18);
+ box = pad(tulipRoadStart, padding, context);
+ box.height = box.height + 100;
+ reveal(box, startLineString, { duration: 0 });
+ });
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "draw-line")
+ return chapter.restart();
+ continueTo(drawLine);
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function drawLine() {
+ if (context.mode().id !== "draw-line")
+ return chapter.restart();
+ _tulipRoadID = context.mode().selectedIDs()[0];
+ context.map().centerEase(tulipRoadMidpoint, 500);
+ timeout2(function() {
+ var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
+ var box = pad(tulipRoadMidpoint, padding, context);
+ box.height = box.height * 2;
+ reveal(box, helpHtml("intro.lines.intersect", { name: _t("intro.graph.name.flower-street") }));
+ context.map().on("move.intro drawn.intro", function() {
+ padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
+ box = pad(tulipRoadMidpoint, padding, context);
+ box.height = box.height * 2;
+ reveal(box, helpHtml("intro.lines.intersect", { name: _t("intro.graph.name.flower-street") }), { duration: 0 });
+ });
+ }, 550);
+ context.history().on("change.intro", function() {
+ if (isLineConnected()) {
+ continueTo(continueLine);
+ }
+ });
+ context.on("enter.intro", function(mode) {
+ if (mode.id === "draw-line") {
+ return;
+ } else if (mode.id === "select") {
+ continueTo(retryIntersect);
+ return;
+ } else {
+ return chapter.restart();
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function isLineConnected() {
+ var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
+ if (!entity)
+ return false;
+ var drawNodes = context.graph().childNodes(entity);
+ return drawNodes.some(function(node) {
+ return context.graph().parentWays(node).some(function(parent) {
+ return parent.id === flowerRoadID;
+ });
+ });
+ }
+ function retryIntersect() {
+ select_default2(window).on("pointerdown.intro mousedown.intro", eventCancel, true);
+ var box = pad(tulipRoadIntersection, 80, context);
+ reveal(box, helpHtml("intro.lines.retry_intersect", { name: _t("intro.graph.name.flower-street") }));
+ timeout2(chapter.restart, 3e3);
+ }
+ function continueLine() {
+ if (context.mode().id !== "draw-line")
+ return chapter.restart();
+ var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
+ if (!entity)
+ return chapter.restart();
+ context.map().centerEase(tulipRoadIntersection, 500);
+ var continueLineText = helpHtml("intro.lines.continue_line") + "{br}" + helpHtml("intro.lines.finish_line_" + (context.lastPointerType() === "mouse" ? "click" : "tap")) + helpHtml("intro.lines.finish_road");
+ reveal(".surface", continueLineText);
+ context.on("enter.intro", function(mode) {
+ if (mode.id === "draw-line") {
+ return;
+ } else if (mode.id === "select") {
+ return continueTo(chooseCategoryRoad);
+ } else {
+ return chapter.restart();
+ }
+ });
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function chooseCategoryRoad() {
+ if (context.mode().id !== "select")
+ return chapter.restart();
+ context.on("exit.intro", function() {
+ return chapter.restart();
+ });
+ var button = context.container().select(".preset-category-road_minor .preset-list-button");
+ if (button.empty())
+ return chapter.restart();
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ timeout2(function() {
+ context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
+ reveal(button.node(), helpHtml("intro.lines.choose_category_road", { category: roadCategory.name() }));
+ button.on("click.intro", function() {
+ continueTo(choosePresetResidential);
+ });
+ }, 400);
+ function continueTo(nextStep) {
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ context.container().select(".preset-list-button").on("click.intro", null);
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function choosePresetResidential() {
+ if (context.mode().id !== "select")
+ return chapter.restart();
+ context.on("exit.intro", function() {
+ return chapter.restart();
+ });
+ var subgrid = context.container().select(".preset-category-road_minor .subgrid");
+ if (subgrid.empty())
+ return chapter.restart();
+ subgrid.selectAll(":not(.preset-highway-residential) .preset-list-button").on("click.intro", function() {
+ continueTo(retryPresetResidential);
+ });
+ subgrid.selectAll(".preset-highway-residential .preset-list-button").on("click.intro", function() {
+ continueTo(nameRoad);
+ });
+ timeout2(function() {
+ reveal(subgrid.node(), helpHtml("intro.lines.choose_preset_residential", { preset: residentialPreset.name() }), { tooltipBox: ".preset-highway-residential .preset-list-button", duration: 300 });
+ }, 300);
+ function continueTo(nextStep) {
+ context.container().select(".preset-list-button").on("click.intro", null);
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function retryPresetResidential() {
+ if (context.mode().id !== "select")
+ return chapter.restart();
+ context.on("exit.intro", function() {
+ return chapter.restart();
+ });
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ timeout2(function() {
+ var button = context.container().select(".entity-editor-pane .preset-list-button");
+ reveal(button.node(), helpHtml("intro.lines.retry_preset_residential", { preset: residentialPreset.name() }));
+ button.on("click.intro", function() {
+ continueTo(chooseCategoryRoad);
+ });
+ }, 500);
+ function continueTo(nextStep) {
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ context.container().select(".preset-list-button").on("click.intro", null);
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function nameRoad() {
+ context.on("exit.intro", function() {
+ continueTo(didNameRoad);
+ });
+ timeout2(function() {
+ reveal(".entity-editor-pane", helpHtml("intro.lines.name_road", { button: { html: icon("#iD-icon-close", "inline") } }), { tooltipClass: "intro-lines-name_road" });
+ }, 500);
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function didNameRoad() {
+ context.history().checkpoint("doneAddLine");
+ timeout2(function() {
+ reveal(".surface", helpHtml("intro.lines.did_name_road"), {
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ continueTo(updateLine);
+ }
+ });
+ }, 500);
+ function continueTo(nextStep) {
+ nextStep();
+ }
+ }
+ function updateLine() {
+ context.history().reset("doneAddLine");
+ if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+ return chapter.restart();
+ }
+ var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
+ if (msec) {
+ reveal(null, null, { duration: 0 });
+ }
+ context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
+ timeout2(function() {
+ var padding = 250 * Math.pow(2, context.map().zoom() - 19);
+ var box = pad(woodRoadDragMidpoint, padding, context);
+ var advance = function() {
+ continueTo(addNode);
+ };
+ reveal(box, helpHtml("intro.lines.update_line"), { buttonText: _t.html("intro.ok"), buttonCallback: advance });
+ context.map().on("move.intro drawn.intro", function() {
+ var padding2 = 250 * Math.pow(2, context.map().zoom() - 19);
+ var box2 = pad(woodRoadDragMidpoint, padding2, context);
+ reveal(box2, helpHtml("intro.lines.update_line"), { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: advance });
+ });
+ }, msec + 100);
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ nextStep();
+ }
+ }
+ function addNode() {
+ context.history().reset("doneAddLine");
+ if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+ return chapter.restart();
+ }
+ var padding = 40 * Math.pow(2, context.map().zoom() - 19);
+ var box = pad(woodRoadAddNode, padding, context);
+ var addNodeString = helpHtml("intro.lines.add_node" + (context.lastPointerType() === "mouse" ? "" : "_touch"));
+ reveal(box, addNodeString);
+ context.map().on("move.intro drawn.intro", function() {
+ var padding2 = 40 * Math.pow(2, context.map().zoom() - 19);
+ var box2 = pad(woodRoadAddNode, padding2, context);
+ reveal(box2, addNodeString, { duration: 0 });
+ });
+ context.history().on("change.intro", function(changed) {
+ if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+ return continueTo(updateLine);
+ }
+ if (changed.created().length === 1) {
+ timeout2(function() {
+ continueTo(startDragEndpoint);
+ }, 500);
+ }
+ });
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "select") {
+ continueTo(updateLine);
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function startDragEndpoint() {
+ if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+ return continueTo(updateLine);
+ }
+ var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+ var box = pad(woodRoadDragEndpoint, padding, context);
+ var startDragString = helpHtml("intro.lines.start_drag_endpoint" + (context.lastPointerType() === "mouse" ? "" : "_touch")) + helpHtml("intro.lines.drag_to_intersection");
+ reveal(box, startDragString);
+ context.map().on("move.intro drawn.intro", function() {
+ if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+ return continueTo(updateLine);
+ }
+ var padding2 = 100 * Math.pow(2, context.map().zoom() - 19);
+ var box2 = pad(woodRoadDragEndpoint, padding2, context);
+ reveal(box2, startDragString, { duration: 0 });
+ var entity = context.entity(woodRoadEndID);
+ if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
+ continueTo(finishDragEndpoint);
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ nextStep();
+ }
+ }
+ function finishDragEndpoint() {
+ if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+ return continueTo(updateLine);
+ }
+ var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+ var box = pad(woodRoadDragEndpoint, padding, context);
+ var finishDragString = helpHtml("intro.lines.spot_looks_good") + helpHtml("intro.lines.finish_drag_endpoint" + (context.lastPointerType() === "mouse" ? "" : "_touch"));
+ reveal(box, finishDragString);
+ context.map().on("move.intro drawn.intro", function() {
+ if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+ return continueTo(updateLine);
+ }
+ var padding2 = 100 * Math.pow(2, context.map().zoom() - 19);
+ var box2 = pad(woodRoadDragEndpoint, padding2, context);
+ reveal(box2, finishDragString, { duration: 0 });
+ var entity = context.entity(woodRoadEndID);
+ if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
+ continueTo(startDragEndpoint);
+ }
+ });
+ context.on("enter.intro", function() {
+ continueTo(startDragMidpoint);
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function startDragMidpoint() {
+ if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+ return continueTo(updateLine);
+ }
+ if (context.selectedIDs().indexOf(woodRoadID) === -1) {
+ context.enter(modeSelect(context, [woodRoadID]));
+ }
+ var padding = 80 * Math.pow(2, context.map().zoom() - 19);
+ var box = pad(woodRoadDragMidpoint, padding, context);
+ reveal(box, helpHtml("intro.lines.start_drag_midpoint"));
+ context.map().on("move.intro drawn.intro", function() {
+ if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+ return continueTo(updateLine);
+ }
+ var padding2 = 80 * Math.pow(2, context.map().zoom() - 19);
+ var box2 = pad(woodRoadDragMidpoint, padding2, context);
+ reveal(box2, helpHtml("intro.lines.start_drag_midpoint"), { duration: 0 });
+ });
+ context.history().on("change.intro", function(changed) {
+ if (changed.created().length === 1) {
+ continueTo(continueDragMidpoint);
+ }
+ });
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "select") {
+ context.enter(modeSelect(context, [woodRoadID]));
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function continueDragMidpoint() {
+ if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+ return continueTo(updateLine);
+ }
+ var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+ var box = pad(woodRoadDragEndpoint, padding, context);
+ box.height += 400;
+ var advance = function() {
+ context.history().checkpoint("doneUpdateLine");
+ continueTo(deleteLines);
+ };
+ reveal(box, helpHtml("intro.lines.continue_drag_midpoint"), { buttonText: _t.html("intro.ok"), buttonCallback: advance });
+ context.map().on("move.intro drawn.intro", function() {
+ if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+ return continueTo(updateLine);
+ }
+ var padding2 = 100 * Math.pow(2, context.map().zoom() - 19);
+ var box2 = pad(woodRoadDragEndpoint, padding2, context);
+ box2.height += 400;
+ reveal(box2, helpHtml("intro.lines.continue_drag_midpoint"), { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: advance });
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ nextStep();
+ }
+ }
+ function deleteLines() {
+ context.history().reset("doneUpdateLine");
+ context.enter(modeBrowse(context));
+ if (!context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+ return chapter.restart();
+ }
+ var msec = transitionTime(deleteLinesLoc, context.map().center());
+ if (msec) {
+ reveal(null, null, { duration: 0 });
+ }
+ context.map().centerZoomEase(deleteLinesLoc, 18, msec);
+ timeout2(function() {
+ var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+ var box = pad(deleteLinesLoc, padding, context);
+ box.top -= 200;
+ box.height += 400;
+ var advance = function() {
+ continueTo(rightClickIntersection);
+ };
+ reveal(box, helpHtml("intro.lines.delete_lines", { street: _t("intro.graph.name.12th-avenue") }), { buttonText: _t.html("intro.ok"), buttonCallback: advance });
+ context.map().on("move.intro drawn.intro", function() {
+ var padding2 = 200 * Math.pow(2, context.map().zoom() - 18);
+ var box2 = pad(deleteLinesLoc, padding2, context);
+ box2.top -= 200;
+ box2.height += 400;
+ reveal(box2, helpHtml("intro.lines.delete_lines", { street: _t("intro.graph.name.12th-avenue") }), { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: advance });
+ });
+ context.history().on("change.intro", function() {
+ timeout2(function() {
+ continueTo(deleteLines);
+ }, 500);
+ });
+ }, msec + 100);
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function rightClickIntersection() {
+ context.history().reset("doneUpdateLine");
+ context.enter(modeBrowse(context));
+ context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
+ var rightClickString = helpHtml("intro.lines.split_street", {
+ street1: _t("intro.graph.name.11th-avenue"),
+ street2: _t("intro.graph.name.washington-street")
+ }) + helpHtml("intro.lines." + (context.lastPointerType() === "mouse" ? "rightclick_intersection" : "edit_menu_intersection_touch"));
+ timeout2(function() {
+ var padding = 60 * Math.pow(2, context.map().zoom() - 18);
+ var box = pad(eleventhAvenueEnd, padding, context);
+ reveal(box, rightClickString);
+ context.map().on("move.intro drawn.intro", function() {
+ var padding2 = 60 * Math.pow(2, context.map().zoom() - 18);
+ var box2 = pad(eleventhAvenueEnd, padding2, context);
+ reveal(box2, rightClickString, { duration: 0 });
+ });
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "select")
+ return;
+ var ids = context.selectedIDs();
+ if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID)
+ return;
+ timeout2(function() {
+ var node = selectMenuItem(context, "split").node();
+ if (!node)
+ return;
+ continueTo(splitIntersection);
+ }, 50);
+ });
+ context.history().on("change.intro", function() {
+ timeout2(function() {
+ continueTo(deleteLines);
+ }, 300);
+ });
+ }, 600);
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function splitIntersection() {
+ if (!context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+ return continueTo(deleteLines);
+ }
+ var node = selectMenuItem(context, "split").node();
+ if (!node) {
+ return continueTo(rightClickIntersection);
+ }
+ var wasChanged = false;
+ _washingtonSegmentID = null;
+ reveal(".edit-menu", helpHtml("intro.lines.split_intersection", { street: _t("intro.graph.name.washington-street") }), { padding: 50 });
+ context.map().on("move.intro drawn.intro", function() {
+ var node2 = selectMenuItem(context, "split").node();
+ if (!wasChanged && !node2) {
+ return continueTo(rightClickIntersection);
+ }
+ reveal(".edit-menu", helpHtml("intro.lines.split_intersection", { street: _t("intro.graph.name.washington-street") }), { duration: 0, padding: 50 });
+ });
+ context.history().on("change.intro", function(changed) {
+ wasChanged = true;
+ timeout2(function() {
+ if (context.history().undoAnnotation() === _t("operations.split.annotation.line", { n: 1 })) {
+ _washingtonSegmentID = changed.created()[0].id;
+ continueTo(didSplit);
+ } else {
+ _washingtonSegmentID = null;
+ continueTo(retrySplit);
+ }
+ }, 300);
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function retrySplit() {
+ context.enter(modeBrowse(context));
+ context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
+ var advance = function() {
+ continueTo(rightClickIntersection);
+ };
+ var padding = 60 * Math.pow(2, context.map().zoom() - 18);
+ var box = pad(eleventhAvenueEnd, padding, context);
+ reveal(box, helpHtml("intro.lines.retry_split"), { buttonText: _t.html("intro.ok"), buttonCallback: advance });
+ context.map().on("move.intro drawn.intro", function() {
+ var padding2 = 60 * Math.pow(2, context.map().zoom() - 18);
+ var box2 = pad(eleventhAvenueEnd, padding2, context);
+ reveal(box2, helpHtml("intro.lines.retry_split"), { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: advance });
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ nextStep();
+ }
+ }
+ function didSplit() {
+ if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+ return continueTo(rightClickIntersection);
+ }
+ var ids = context.selectedIDs();
+ var string = "intro.lines.did_split_" + (ids.length > 1 ? "multi" : "single");
+ var street = _t("intro.graph.name.washington-street");
+ var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+ var box = pad(twelfthAvenue, padding, context);
+ box.width = box.width / 2;
+ reveal(box, helpHtml(string, { street1: street, street2: street }), { duration: 500 });
+ timeout2(function() {
+ context.map().centerZoomEase(twelfthAvenue, 18, 500);
+ context.map().on("move.intro drawn.intro", function() {
+ var padding2 = 200 * Math.pow(2, context.map().zoom() - 18);
+ var box2 = pad(twelfthAvenue, padding2, context);
+ box2.width = box2.width / 2;
+ reveal(box2, helpHtml(string, { street1: street, street2: street }), { duration: 0 });
+ });
+ }, 600);
+ context.on("enter.intro", function() {
+ var ids2 = context.selectedIDs();
+ if (ids2.length === 1 && ids2[0] === _washingtonSegmentID) {
+ continueTo(multiSelect);
+ }
+ });
+ context.history().on("change.intro", function() {
+ if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+ return continueTo(rightClickIntersection);
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function multiSelect() {
+ if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+ return continueTo(rightClickIntersection);
+ }
+ var ids = context.selectedIDs();
+ var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
+ var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
+ if (hasWashington && hasTwelfth) {
+ return continueTo(multiRightClick);
+ } else if (!hasWashington && !hasTwelfth) {
+ return continueTo(didSplit);
+ }
+ context.map().centerZoomEase(twelfthAvenue, 18, 500);
+ timeout2(function() {
+ var selected, other, padding, box;
+ if (hasWashington) {
+ selected = _t("intro.graph.name.washington-street");
+ other = _t("intro.graph.name.12th-avenue");
+ padding = 60 * Math.pow(2, context.map().zoom() - 18);
+ box = pad(twelfthAvenueEnd, padding, context);
+ box.width *= 3;
+ } else {
+ selected = _t("intro.graph.name.12th-avenue");
+ other = _t("intro.graph.name.washington-street");
+ padding = 200 * Math.pow(2, context.map().zoom() - 18);
+ box = pad(twelfthAvenue, padding, context);
+ box.width /= 2;
+ }
+ reveal(box, helpHtml("intro.lines.multi_select", { selected, other1: other }) + " " + helpHtml("intro.lines.add_to_selection_" + (context.lastPointerType() === "mouse" ? "click" : "touch"), { selected, other2: other }));
+ context.map().on("move.intro drawn.intro", function() {
+ if (hasWashington) {
+ selected = _t("intro.graph.name.washington-street");
+ other = _t("intro.graph.name.12th-avenue");
+ padding = 60 * Math.pow(2, context.map().zoom() - 18);
+ box = pad(twelfthAvenueEnd, padding, context);
+ box.width *= 3;
+ } else {
+ selected = _t("intro.graph.name.12th-avenue");
+ other = _t("intro.graph.name.washington-street");
+ padding = 200 * Math.pow(2, context.map().zoom() - 18);
+ box = pad(twelfthAvenue, padding, context);
+ box.width /= 2;
+ }
+ reveal(box, helpHtml("intro.lines.multi_select", { selected, other1: other }) + " " + helpHtml("intro.lines.add_to_selection_" + (context.lastPointerType() === "mouse" ? "click" : "touch"), { selected, other2: other }), { duration: 0 });
+ });
+ context.on("enter.intro", function() {
+ continueTo(multiSelect);
+ });
+ context.history().on("change.intro", function() {
+ if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+ return continueTo(rightClickIntersection);
+ }
+ });
+ }, 600);
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function multiRightClick() {
+ if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+ return continueTo(rightClickIntersection);
+ }
+ var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+ var box = pad(twelfthAvenue, padding, context);
+ var rightClickString = helpHtml("intro.lines.multi_select_success") + helpHtml("intro.lines.multi_" + (context.lastPointerType() === "mouse" ? "rightclick" : "edit_menu_touch"));
+ reveal(box, rightClickString);
+ context.map().on("move.intro drawn.intro", function() {
+ var padding2 = 200 * Math.pow(2, context.map().zoom() - 18);
+ var box2 = pad(twelfthAvenue, padding2, context);
+ reveal(box2, rightClickString, { duration: 0 });
+ });
+ context.ui().editMenu().on("toggled.intro", function(open) {
+ if (!open)
+ return;
+ timeout2(function() {
+ var ids = context.selectedIDs();
+ if (ids.length === 2 && ids.indexOf(twelfthAvenueID) !== -1 && ids.indexOf(_washingtonSegmentID) !== -1) {
+ var node = selectMenuItem(context, "delete").node();
+ if (!node)
+ return;
+ continueTo(multiDelete);
+ } else if (ids.length === 1 && ids.indexOf(_washingtonSegmentID) !== -1) {
+ return continueTo(multiSelect);
+ } else {
+ return continueTo(didSplit);
+ }
+ }, 300);
+ });
+ context.history().on("change.intro", function() {
+ if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+ return continueTo(rightClickIntersection);
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.ui().editMenu().on("toggled.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function multiDelete() {
+ if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+ return continueTo(rightClickIntersection);
+ }
+ var node = selectMenuItem(context, "delete").node();
+ if (!node)
+ return continueTo(multiRightClick);
+ reveal(".edit-menu", helpHtml("intro.lines.multi_delete"), { padding: 50 });
+ context.map().on("move.intro drawn.intro", function() {
+ reveal(".edit-menu", helpHtml("intro.lines.multi_delete"), { duration: 0, padding: 50 });
+ });
+ context.on("exit.intro", function() {
+ if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
+ return continueTo(multiSelect);
+ }
+ });
+ context.history().on("change.intro", function() {
+ if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
+ continueTo(retryDelete);
+ } else {
+ continueTo(play);
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("exit.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function retryDelete() {
+ context.enter(modeBrowse(context));
+ var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+ var box = pad(twelfthAvenue, padding, context);
+ reveal(box, helpHtml("intro.lines.retry_delete"), {
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ continueTo(multiSelect);
+ }
+ });
+ function continueTo(nextStep) {
+ nextStep();
+ }
+ }
+ function play() {
+ dispatch10.call("done");
+ reveal(".ideditor", helpHtml("intro.lines.play", { next: _t("intro.buildings.title") }), {
+ tooltipBox: ".intro-nav-wrap .chapter-building",
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ reveal(".ideditor");
+ }
+ });
+ }
+ chapter.enter = function() {
+ addLine();
+ };
+ chapter.exit = function() {
+ timeouts.forEach(window.clearTimeout);
+ select_default2(window).on("pointerdown.intro mousedown.intro", null, true);
+ context.on("enter.intro exit.intro", null);
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ context.container().select(".preset-list-button").on("click.intro", null);
+ };
+ chapter.restart = function() {
+ chapter.exit();
+ chapter.enter();
+ };
+ return utilRebind(chapter, dispatch10, "on");
+ }
+
+ // modules/ui/intro/building.js
+ function uiIntroBuilding(context, reveal) {
+ var dispatch10 = dispatch_default("done");
+ var house = [-85.62815, 41.95638];
+ var tank = [-85.62732, 41.95347];
+ var buildingCatetory = _mainPresetIndex.item("category-building");
+ var housePreset = _mainPresetIndex.item("building/house");
+ var tankPreset = _mainPresetIndex.item("man_made/storage_tank");
+ var timeouts = [];
+ var _houseID = null;
+ var _tankID = null;
+ var chapter = {
+ title: "intro.buildings.title"
+ };
+ function timeout2(f2, t) {
+ timeouts.push(window.setTimeout(f2, t));
+ }
+ function eventCancel(d3_event) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ }
+ function revealHouse(center, text2, options2) {
+ var padding = 160 * Math.pow(2, context.map().zoom() - 20);
+ var box = pad(center, padding, context);
+ reveal(box, text2, options2);
+ }
+ function revealTank(center, text2, options2) {
+ var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
+ var box = pad(center, padding, context);
+ reveal(box, text2, options2);
+ }
+ function addHouse() {
+ context.enter(modeBrowse(context));
+ context.history().reset("initial");
+ _houseID = null;
+ var msec = transitionTime(house, context.map().center());
+ if (msec) {
+ reveal(null, null, { duration: 0 });
+ }
+ context.map().centerZoomEase(house, 19, msec);
+ timeout2(function() {
+ var tooltip = reveal("button.add-area", helpHtml("intro.buildings.add_building"));
+ tooltip.selectAll(".popover-inner").insert("svg", "span").attr("class", "tooltip-illustration").append("use").attr("xlink:href", "#iD-graphic-buildings");
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "add-area")
+ return;
+ continueTo(startHouse);
+ });
+ }, msec + 100);
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function startHouse() {
+ if (context.mode().id !== "add-area") {
+ return continueTo(addHouse);
+ }
+ _houseID = null;
+ context.map().zoomEase(20, 500);
+ timeout2(function() {
+ var startString = helpHtml("intro.buildings.start_building") + helpHtml("intro.buildings.building_corner_" + (context.lastPointerType() === "mouse" ? "click" : "tap"));
+ revealHouse(house, startString);
+ context.map().on("move.intro drawn.intro", function() {
+ revealHouse(house, startString, { duration: 0 });
+ });
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "draw-area")
+ return chapter.restart();
+ continueTo(continueHouse);
+ });
+ }, 550);
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function continueHouse() {
+ if (context.mode().id !== "draw-area") {
+ return continueTo(addHouse);
+ }
+ _houseID = null;
+ var continueString = helpHtml("intro.buildings.continue_building") + "{br}" + helpHtml("intro.areas.finish_area_" + (context.lastPointerType() === "mouse" ? "click" : "tap")) + helpHtml("intro.buildings.finish_building");
+ revealHouse(house, continueString);
+ context.map().on("move.intro drawn.intro", function() {
+ revealHouse(house, continueString, { duration: 0 });
+ });
+ context.on("enter.intro", function(mode) {
+ if (mode.id === "draw-area") {
+ return;
+ } else if (mode.id === "select") {
+ var graph = context.graph();
+ var way = context.entity(context.selectedIDs()[0]);
+ var nodes = graph.childNodes(way);
+ var points = utilArrayUniq(nodes).map(function(n2) {
+ return context.projection(n2.loc);
+ });
+ if (isMostlySquare(points)) {
+ _houseID = way.id;
+ return continueTo(chooseCategoryBuilding);
+ } else {
+ return continueTo(retryHouse);
+ }
+ } else {
+ return chapter.restart();
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function retryHouse() {
+ var onClick = function() {
+ continueTo(addHouse);
+ };
+ revealHouse(house, helpHtml("intro.buildings.retry_building"), { buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ context.map().on("move.intro drawn.intro", function() {
+ revealHouse(house, helpHtml("intro.buildings.retry_building"), { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick });
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ nextStep();
+ }
+ }
+ function chooseCategoryBuilding() {
+ if (!_houseID || !context.hasEntity(_houseID)) {
+ return addHouse();
+ }
+ var ids = context.selectedIDs();
+ if (context.mode().id !== "select" || !ids.length || ids[0] !== _houseID) {
+ context.enter(modeSelect(context, [_houseID]));
+ }
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ timeout2(function() {
+ context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
+ var button = context.container().select(".preset-category-building .preset-list-button");
+ reveal(button.node(), helpHtml("intro.buildings.choose_category_building", { category: buildingCatetory.name() }));
+ button.on("click.intro", function() {
+ button.on("click.intro", null);
+ continueTo(choosePresetHouse);
+ });
+ }, 400);
+ context.on("enter.intro", function(mode) {
+ if (!_houseID || !context.hasEntity(_houseID)) {
+ return continueTo(addHouse);
+ }
+ var ids2 = context.selectedIDs();
+ if (mode.id !== "select" || !ids2.length || ids2[0] !== _houseID) {
+ return continueTo(chooseCategoryBuilding);
+ }
+ });
+ function continueTo(nextStep) {
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ context.container().select(".preset-list-button").on("click.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function choosePresetHouse() {
+ if (!_houseID || !context.hasEntity(_houseID)) {
+ return addHouse();
+ }
+ var ids = context.selectedIDs();
+ if (context.mode().id !== "select" || !ids.length || ids[0] !== _houseID) {
+ context.enter(modeSelect(context, [_houseID]));
+ }
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ timeout2(function() {
+ context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
+ var button = context.container().select(".preset-building-house .preset-list-button");
+ reveal(button.node(), helpHtml("intro.buildings.choose_preset_house", { preset: housePreset.name() }), { duration: 300 });
+ button.on("click.intro", function() {
+ button.on("click.intro", null);
+ continueTo(closeEditorHouse);
+ });
+ }, 400);
+ context.on("enter.intro", function(mode) {
+ if (!_houseID || !context.hasEntity(_houseID)) {
+ return continueTo(addHouse);
+ }
+ var ids2 = context.selectedIDs();
+ if (mode.id !== "select" || !ids2.length || ids2[0] !== _houseID) {
+ return continueTo(chooseCategoryBuilding);
+ }
+ });
+ function continueTo(nextStep) {
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ context.container().select(".preset-list-button").on("click.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function closeEditorHouse() {
+ if (!_houseID || !context.hasEntity(_houseID)) {
+ return addHouse();
+ }
+ var ids = context.selectedIDs();
+ if (context.mode().id !== "select" || !ids.length || ids[0] !== _houseID) {
+ context.enter(modeSelect(context, [_houseID]));
+ }
+ context.history().checkpoint("hasHouse");
+ context.on("exit.intro", function() {
+ continueTo(rightClickHouse);
+ });
+ timeout2(function() {
+ reveal(".entity-editor-pane", helpHtml("intro.buildings.close", { button: { html: icon("#iD-icon-close", "inline") } }));
+ }, 500);
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function rightClickHouse() {
+ if (!_houseID)
+ return chapter.restart();
+ context.enter(modeBrowse(context));
+ context.history().reset("hasHouse");
+ var zoom = context.map().zoom();
+ if (zoom < 20) {
+ zoom = 20;
+ }
+ context.map().centerZoomEase(house, zoom, 500);
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "select")
+ return;
+ var ids = context.selectedIDs();
+ if (ids.length !== 1 || ids[0] !== _houseID)
+ return;
+ timeout2(function() {
+ var node = selectMenuItem(context, "orthogonalize").node();
+ if (!node)
+ return;
+ continueTo(clickSquare);
+ }, 50);
+ });
+ context.map().on("move.intro drawn.intro", function() {
+ var rightclickString = helpHtml("intro.buildings." + (context.lastPointerType() === "mouse" ? "rightclick_building" : "edit_menu_building_touch"));
+ revealHouse(house, rightclickString, { duration: 0 });
+ });
+ context.history().on("change.intro", function() {
+ continueTo(rightClickHouse);
+ });
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function clickSquare() {
+ if (!_houseID)
+ return chapter.restart();
+ var entity = context.hasEntity(_houseID);
+ if (!entity)
+ return continueTo(rightClickHouse);
+ var node = selectMenuItem(context, "orthogonalize").node();
+ if (!node) {
+ return continueTo(rightClickHouse);
+ }
+ var wasChanged = false;
+ reveal(".edit-menu", helpHtml("intro.buildings.square_building"), { padding: 50 });
+ context.on("enter.intro", function(mode) {
+ if (mode.id === "browse") {
+ continueTo(rightClickHouse);
+ } else if (mode.id === "move" || mode.id === "rotate") {
+ continueTo(retryClickSquare);
+ }
+ });
+ context.map().on("move.intro", function() {
+ var node2 = selectMenuItem(context, "orthogonalize").node();
+ if (!wasChanged && !node2) {
+ return continueTo(rightClickHouse);
+ }
+ reveal(".edit-menu", helpHtml("intro.buildings.square_building"), { duration: 0, padding: 50 });
+ });
+ context.history().on("change.intro", function() {
+ wasChanged = true;
+ context.history().on("change.intro", null);
+ timeout2(function() {
+ if (context.history().undoAnnotation() === _t("operations.orthogonalize.annotation.feature", { n: 1 })) {
+ continueTo(doneSquare);
+ } else {
+ continueTo(retryClickSquare);
+ }
+ }, 500);
+ });
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ context.map().on("move.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function retryClickSquare() {
+ context.enter(modeBrowse(context));
+ revealHouse(house, helpHtml("intro.buildings.retry_square"), {
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ continueTo(rightClickHouse);
+ }
+ });
+ function continueTo(nextStep) {
+ nextStep();
+ }
+ }
+ function doneSquare() {
+ context.history().checkpoint("doneSquare");
+ revealHouse(house, helpHtml("intro.buildings.done_square"), {
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ continueTo(addTank);
+ }
+ });
+ function continueTo(nextStep) {
+ nextStep();
+ }
+ }
+ function addTank() {
+ context.enter(modeBrowse(context));
+ context.history().reset("doneSquare");
+ _tankID = null;
+ var msec = transitionTime(tank, context.map().center());
+ if (msec) {
+ reveal(null, null, { duration: 0 });
+ }
+ context.map().centerZoomEase(tank, 19.5, msec);
+ timeout2(function() {
+ reveal("button.add-area", helpHtml("intro.buildings.add_tank"));
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "add-area")
+ return;
+ continueTo(startTank);
+ });
+ }, msec + 100);
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function startTank() {
+ if (context.mode().id !== "add-area") {
+ return continueTo(addTank);
+ }
+ _tankID = null;
+ timeout2(function() {
+ var startString = helpHtml("intro.buildings.start_tank") + helpHtml("intro.buildings.tank_edge_" + (context.lastPointerType() === "mouse" ? "click" : "tap"));
+ revealTank(tank, startString);
+ context.map().on("move.intro drawn.intro", function() {
+ revealTank(tank, startString, { duration: 0 });
+ });
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "draw-area")
+ return chapter.restart();
+ continueTo(continueTank);
+ });
+ }, 550);
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function continueTank() {
+ if (context.mode().id !== "draw-area") {
+ return continueTo(addTank);
+ }
+ _tankID = null;
+ var continueString = helpHtml("intro.buildings.continue_tank") + "{br}" + helpHtml("intro.areas.finish_area_" + (context.lastPointerType() === "mouse" ? "click" : "tap")) + helpHtml("intro.buildings.finish_tank");
+ revealTank(tank, continueString);
+ context.map().on("move.intro drawn.intro", function() {
+ revealTank(tank, continueString, { duration: 0 });
+ });
+ context.on("enter.intro", function(mode) {
+ if (mode.id === "draw-area") {
+ return;
+ } else if (mode.id === "select") {
+ _tankID = context.selectedIDs()[0];
+ return continueTo(searchPresetTank);
+ } else {
+ return continueTo(addTank);
+ }
+ });
+ function continueTo(nextStep) {
+ context.map().on("move.intro drawn.intro", null);
+ context.on("enter.intro", null);
+ nextStep();
+ }
+ }
+ function searchPresetTank() {
+ if (!_tankID || !context.hasEntity(_tankID)) {
+ return addTank();
+ }
+ var ids = context.selectedIDs();
+ if (context.mode().id !== "select" || !ids.length || ids[0] !== _tankID) {
+ context.enter(modeSelect(context, [_tankID]));
+ }
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ timeout2(function() {
+ context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
+ context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
+ reveal(".preset-search-input", helpHtml("intro.buildings.search_tank", { preset: tankPreset.name() }));
+ }, 400);
+ context.on("enter.intro", function(mode) {
+ if (!_tankID || !context.hasEntity(_tankID)) {
+ return continueTo(addTank);
+ }
+ var ids2 = context.selectedIDs();
+ if (mode.id !== "select" || !ids2.length || ids2[0] !== _tankID) {
+ context.enter(modeSelect(context, [_tankID]));
+ context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
+ context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
+ context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
+ reveal(".preset-search-input", helpHtml("intro.buildings.search_tank", { preset: tankPreset.name() }));
+ context.history().on("change.intro", null);
+ }
+ });
+ function checkPresetSearch() {
+ var first = context.container().select(".preset-list-item:first-child");
+ if (first.classed("preset-man_made-storage_tank")) {
+ reveal(first.select(".preset-list-button").node(), helpHtml("intro.buildings.choose_tank", { preset: tankPreset.name() }), { duration: 300 });
+ context.container().select(".preset-search-input").on("keydown.intro", eventCancel, true).on("keyup.intro", null);
+ context.history().on("change.intro", function() {
+ continueTo(closeEditorTank);
+ });
+ }
+ }
+ function continueTo(nextStep) {
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ context.on("enter.intro", null);
+ context.history().on("change.intro", null);
+ context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
+ nextStep();
+ }
+ }
+ function closeEditorTank() {
+ if (!_tankID || !context.hasEntity(_tankID)) {
+ return addTank();
+ }
+ var ids = context.selectedIDs();
+ if (context.mode().id !== "select" || !ids.length || ids[0] !== _tankID) {
+ context.enter(modeSelect(context, [_tankID]));
+ }
+ context.history().checkpoint("hasTank");
+ context.on("exit.intro", function() {
+ continueTo(rightClickTank);
+ });
+ timeout2(function() {
+ reveal(".entity-editor-pane", helpHtml("intro.buildings.close", { button: { html: icon("#iD-icon-close", "inline") } }));
+ }, 500);
+ function continueTo(nextStep) {
+ context.on("exit.intro", null);
+ nextStep();
+ }
+ }
+ function rightClickTank() {
+ if (!_tankID)
+ return continueTo(addTank);
+ context.enter(modeBrowse(context));
+ context.history().reset("hasTank");
+ context.map().centerEase(tank, 500);
+ timeout2(function() {
+ context.on("enter.intro", function(mode) {
+ if (mode.id !== "select")
+ return;
+ var ids = context.selectedIDs();
+ if (ids.length !== 1 || ids[0] !== _tankID)
+ return;
+ timeout2(function() {
+ var node = selectMenuItem(context, "circularize").node();
+ if (!node)
+ return;
+ continueTo(clickCircle);
+ }, 50);
+ });
+ var rightclickString = helpHtml("intro.buildings." + (context.lastPointerType() === "mouse" ? "rightclick_tank" : "edit_menu_tank_touch"));
+ revealTank(tank, rightclickString);
+ context.map().on("move.intro drawn.intro", function() {
+ revealTank(tank, rightclickString, { duration: 0 });
+ });
+ context.history().on("change.intro", function() {
+ continueTo(rightClickTank);
+ });
+ }, 600);
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function clickCircle() {
+ if (!_tankID)
+ return chapter.restart();
+ var entity = context.hasEntity(_tankID);
+ if (!entity)
+ return continueTo(rightClickTank);
+ var node = selectMenuItem(context, "circularize").node();
+ if (!node) {
+ return continueTo(rightClickTank);
+ }
+ var wasChanged = false;
+ reveal(".edit-menu", helpHtml("intro.buildings.circle_tank"), { padding: 50 });
+ context.on("enter.intro", function(mode) {
+ if (mode.id === "browse") {
+ continueTo(rightClickTank);
+ } else if (mode.id === "move" || mode.id === "rotate") {
+ continueTo(retryClickCircle);
+ }
+ });
+ context.map().on("move.intro", function() {
+ var node2 = selectMenuItem(context, "circularize").node();
+ if (!wasChanged && !node2) {
+ return continueTo(rightClickTank);
+ }
+ reveal(".edit-menu", helpHtml("intro.buildings.circle_tank"), { duration: 0, padding: 50 });
+ });
+ context.history().on("change.intro", function() {
+ wasChanged = true;
+ context.history().on("change.intro", null);
+ timeout2(function() {
+ if (context.history().undoAnnotation() === _t("operations.circularize.annotation.feature", { n: 1 })) {
+ continueTo(play);
+ } else {
+ continueTo(retryClickCircle);
+ }
+ }, 500);
+ });
+ function continueTo(nextStep) {
+ context.on("enter.intro", null);
+ context.map().on("move.intro", null);
+ context.history().on("change.intro", null);
+ nextStep();
+ }
+ }
+ function retryClickCircle() {
+ context.enter(modeBrowse(context));
+ revealTank(tank, helpHtml("intro.buildings.retry_circle"), {
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ continueTo(rightClickTank);
+ }
+ });
+ function continueTo(nextStep) {
+ nextStep();
+ }
+ }
+ function play() {
+ dispatch10.call("done");
+ reveal(".ideditor", helpHtml("intro.buildings.play", { next: _t("intro.startediting.title") }), {
+ tooltipBox: ".intro-nav-wrap .chapter-startEditing",
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ reveal(".ideditor");
+ }
+ });
+ }
+ chapter.enter = function() {
+ addHouse();
+ };
+ chapter.exit = function() {
+ timeouts.forEach(window.clearTimeout);
+ context.on("enter.intro exit.intro", null);
+ context.map().on("move.intro drawn.intro", null);
+ context.history().on("change.intro", null);
+ context.container().select(".inspector-wrap").on("wheel.intro", null);
+ context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
+ context.container().select(".more-fields .combobox-input").on("click.intro", null);
+ };
+ chapter.restart = function() {
+ chapter.exit();
+ chapter.enter();
+ };
+ return utilRebind(chapter, dispatch10, "on");
+ }
+
+ // modules/ui/intro/start_editing.js
+ function uiIntroStartEditing(context, reveal) {
+ var dispatch10 = dispatch_default("done", "startEditing");
+ var modalSelection = select_default2(null);
+ var chapter = {
+ title: "intro.startediting.title"
+ };
+ function showHelp() {
+ reveal(".map-control.help-control", helpHtml("intro.startediting.help"), {
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ shortcuts();
+ }
+ });
+ }
+ function shortcuts() {
+ reveal(".map-control.help-control", helpHtml("intro.startediting.shortcuts"), {
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ showSave();
+ }
+ });
+ }
+ function showSave() {
+ context.container().selectAll(".shaded").remove();
+ reveal(".top-toolbar button.save", helpHtml("intro.startediting.save"), {
+ buttonText: _t.html("intro.ok"),
+ buttonCallback: function() {
+ showStart();
+ }
+ });
+ }
+ function showStart() {
+ context.container().selectAll(".shaded").remove();
+ modalSelection = uiModal(context.container());
+ modalSelection.select(".modal").attr("class", "modal-splash modal");
+ modalSelection.selectAll(".close").remove();
+ var startbutton = modalSelection.select(".content").attr("class", "fillL").append("button").attr("class", "modal-section huge-modal-button").on("click", function() {
+ modalSelection.remove();
+ });
+ startbutton.append("svg").attr("class", "illustration").append("use").attr("xlink:href", "#iD-logo-walkthrough");
+ startbutton.append("h2").call(_t.append("intro.startediting.start"));
+ dispatch10.call("startEditing");
+ }
+ chapter.enter = function() {
+ showHelp();
+ };
+ chapter.exit = function() {
+ modalSelection.remove();
+ context.container().selectAll(".shaded").remove();
+ };
+ return utilRebind(chapter, dispatch10, "on");
+ }
+
+ // modules/ui/intro/intro.js
+ var chapterUi = {
+ welcome: uiIntroWelcome,
+ navigation: uiIntroNavigation,
+ point: uiIntroPoint,
+ area: uiIntroArea,
+ line: uiIntroLine,
+ building: uiIntroBuilding,
+ startEditing: uiIntroStartEditing
+ };
+ var chapterFlow = [
+ "welcome",
+ "navigation",
+ "point",
+ "area",
+ "line",
+ "building",
+ "startEditing"
+ ];
+ function uiIntro(context) {
+ const INTRO_IMAGERY = "EsriWorldImageryClarity";
+ let _introGraph = {};
+ let _currChapter;
+ function intro(selection2) {
+ _mainFileFetcher.get("intro_graph").then((dataIntroGraph) => {
+ for (let id2 in dataIntroGraph) {
+ if (!_introGraph[id2]) {
+ _introGraph[id2] = osmEntity(localize(dataIntroGraph[id2]));
+ }
+ }
+ selection2.call(startIntro);
+ }).catch(function() {
+ });
+ }
+ function startIntro(selection2) {
+ context.enter(modeBrowse(context));
+ let osm = context.connection();
+ let history = context.history().toJSON();
+ let hash = window.location.hash;
+ let center = context.map().center();
+ let zoom = context.map().zoom();
+ let background = context.background().baseLayerSource();
+ let overlays = context.background().overlayLayerSources();
+ let opacity = context.container().selectAll(".main-map .layer-background").style("opacity");
+ let caches = osm && osm.caches();
+ let baseEntities = context.history().graph().base().entities;
+ context.ui().sidebar.expand();
+ context.container().selectAll("button.sidebar-toggle").classed("disabled", true);
+ context.inIntro(true);
+ if (osm) {
+ osm.toggle(false).reset();
+ }
+ context.history().reset();
+ context.history().merge(Object.values(coreGraph().load(_introGraph).entities));
+ context.history().checkpoint("initial");
+ let imagery = context.background().findSource(INTRO_IMAGERY);
+ if (imagery) {
+ context.background().baseLayerSource(imagery);
+ } else {
+ context.background().bing();
+ }
+ overlays.forEach((d) => context.background().toggleOverlayLayer(d));
+ let layers = context.layers();
+ layers.all().forEach((item) => {
+ if (typeof item.layer.enabled === "function") {
+ item.layer.enabled(item.id === "osm");
+ }
+ });
+ context.container().selectAll(".main-map .layer-background").style("opacity", 1);
+ let curtain = uiCurtain(context.container().node());
+ selection2.call(curtain);
+ corePreferences("walkthrough_started", "yes");
+ let storedProgress = corePreferences("walkthrough_progress") || "";
+ let progress = storedProgress.split(";").filter(Boolean);
+ let chapters = chapterFlow.map((chapter, i2) => {
+ let s = chapterUi[chapter](context, curtain.reveal).on("done", () => {
+ buttons.filter((d) => d.title === s.title).classed("finished", true);
+ if (i2 < chapterFlow.length - 1) {
+ const next = chapterFlow[i2 + 1];
+ context.container().select(`button.chapter-${next}`).classed("next", true);
+ }
+ progress.push(chapter);
+ corePreferences("walkthrough_progress", utilArrayUniq(progress).join(";"));
+ });
+ return s;
+ });
+ chapters[chapters.length - 1].on("startEditing", () => {
+ progress.push("startEditing");
+ corePreferences("walkthrough_progress", utilArrayUniq(progress).join(";"));
+ let incomplete = utilArrayDifference(chapterFlow, progress);
+ if (!incomplete.length) {
+ corePreferences("walkthrough_completed", "yes");
+ }
+ curtain.remove();
+ navwrap.remove();
+ context.container().selectAll(".main-map .layer-background").style("opacity", opacity);
+ context.container().selectAll("button.sidebar-toggle").classed("disabled", false);
+ if (osm) {
+ osm.toggle(true).reset().caches(caches);
+ }
+ context.history().reset().merge(Object.values(baseEntities));
+ context.background().baseLayerSource(background);
+ overlays.forEach((d) => context.background().toggleOverlayLayer(d));
+ if (history) {
+ context.history().fromJSON(history, false);
+ }
+ context.map().centerZoom(center, zoom);
+ window.location.replace(hash);
+ context.inIntro(false);
+ });
+ let navwrap = selection2.append("div").attr("class", "intro-nav-wrap fillD");
+ navwrap.append("svg").attr("class", "intro-nav-wrap-logo").append("use").attr("xlink:href", "#iD-logo-walkthrough");
+ let buttonwrap = navwrap.append("div").attr("class", "joined").selectAll("button.chapter");
+ let buttons = buttonwrap.data(chapters).enter().append("button").attr("class", (d, i2) => `chapter chapter-${chapterFlow[i2]}`).on("click", enterChapter);
+ buttons.append("span").html((d) => _t.html(d.title));
+ buttons.append("span").attr("class", "status").call(svgIcon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward", "inline"));
+ enterChapter(null, chapters[0]);
+ function enterChapter(d3_event, newChapter) {
+ if (_currChapter) {
+ _currChapter.exit();
+ }
+ context.enter(modeBrowse(context));
+ _currChapter = newChapter;
+ _currChapter.enter();
+ buttons.classed("next", false).classed("active", (d) => d.title === _currChapter.title);
+ }
+ }
+ return intro;
+ }
+
+ // modules/ui/issues_info.js
+ function uiIssuesInfo(context) {
+ var warningsItem = {
+ id: "warnings",
+ count: 0,
+ iconID: "iD-icon-alert",
+ descriptionID: "issues.warnings_and_errors"
+ };
+ var resolvedItem = {
+ id: "resolved",
+ count: 0,
+ iconID: "iD-icon-apply",
+ descriptionID: "issues.user_resolved_issues"
+ };
+ function update(selection2) {
+ var shownItems = [];
+ var liveIssues = context.validator().getIssues({
+ what: corePreferences("validate-what") || "edited",
+ where: corePreferences("validate-where") || "all"
+ });
+ if (liveIssues.length) {
+ warningsItem.count = liveIssues.length;
+ shownItems.push(warningsItem);
+ }
+ if (corePreferences("validate-what") === "all") {
+ var resolvedIssues = context.validator().getResolvedIssues();
+ if (resolvedIssues.length) {
+ resolvedItem.count = resolvedIssues.length;
+ shownItems.push(resolvedItem);
+ }
+ }
+ var chips = selection2.selectAll(".chip").data(shownItems, function(d) {
+ return d.id;
+ });
+ chips.exit().remove();
+ var enter = chips.enter().append("a").attr("class", function(d) {
+ return "chip " + d.id + "-count";
+ }).attr("href", "#").each(function(d) {
+ var chipSelection = select_default2(this);
+ var tooltipBehavior = uiTooltip().placement("top").title(_t.html(d.descriptionID));
+ chipSelection.call(tooltipBehavior).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ tooltipBehavior.hide(select_default2(this));
+ context.ui().togglePanes(context.container().select(".map-panes .issues-pane"));
+ });
+ chipSelection.call(svgIcon("#" + d.iconID));
+ });
+ enter.append("span").attr("class", "count");
+ enter.merge(chips).selectAll("span.count").text(function(d) {
+ return d.count.toString();
+ });
+ }
+ return function(selection2) {
+ update(selection2);
+ context.validator().on("validated.infobox", function() {
+ update(selection2);
+ });
+ };
+ }
+
+ // modules/ui/map_in_map.js
+ function uiMapInMap(context) {
+ function mapInMap(selection2) {
+ var backgroundLayer = rendererTileLayer(context);
+ var overlayLayers = {};
+ var projection2 = geoRawMercator();
+ var dataLayer = svgData(projection2, context).showLabels(false);
+ var debugLayer = svgDebug(projection2, context);
+ var zoom = zoom_default2().scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)]).on("start", zoomStarted).on("zoom", zoomed).on("end", zoomEnded);
+ var wrap2 = select_default2(null);
+ var tiles = select_default2(null);
+ var viewport = select_default2(null);
+ var _isTransformed = false;
+ var _isHidden = true;
+ var _skipEvents = false;
+ var _gesture = null;
+ var _zDiff = 6;
+ var _dMini;
+ var _cMini;
+ var _tStart;
+ var _tCurr;
+ var _timeoutID;
+ function zoomStarted() {
+ if (_skipEvents)
+ return;
+ _tStart = _tCurr = projection2.transform();
+ _gesture = null;
+ }
+ function zoomed(d3_event) {
+ if (_skipEvents)
+ return;
+ var x = d3_event.transform.x;
+ var y = d3_event.transform.y;
+ var k = d3_event.transform.k;
+ var isZooming = k !== _tStart.k;
+ var isPanning = x !== _tStart.x || y !== _tStart.y;
+ if (!isZooming && !isPanning) {
+ return;
+ }
+ if (!_gesture) {
+ _gesture = isZooming ? "zoom" : "pan";
+ }
+ var tMini = projection2.transform();
+ var tX, tY, scale;
+ if (_gesture === "zoom") {
+ scale = k / tMini.k;
+ tX = (_cMini[0] / scale - _cMini[0]) * scale;
+ tY = (_cMini[1] / scale - _cMini[1]) * scale;
+ } else {
+ k = tMini.k;
+ scale = 1;
+ tX = x - tMini.x;
+ tY = y - tMini.y;
+ }
+ utilSetTransform(tiles, tX, tY, scale);
+ utilSetTransform(viewport, 0, 0, scale);
+ _isTransformed = true;
+ _tCurr = identity2.translate(x, y).scale(k);
+ var zMain = geoScaleToZoom(context.projection.scale());
+ var zMini = geoScaleToZoom(k);
+ _zDiff = zMain - zMini;
+ queueRedraw();
+ }
+ function zoomEnded() {
+ if (_skipEvents)
+ return;
+ if (_gesture !== "pan")
+ return;
+ updateProjection();
+ _gesture = null;
+ context.map().center(projection2.invert(_cMini));
+ }
+ function updateProjection() {
+ var loc = context.map().center();
+ var tMain = context.projection.transform();
+ var zMain = geoScaleToZoom(tMain.k);
+ var zMini = Math.max(zMain - _zDiff, 0.5);
+ var kMini = geoZoomToScale(zMini);
+ projection2.translate([tMain.x, tMain.y]).scale(kMini);
+ var point = projection2(loc);
+ var mouse = _gesture === "pan" ? geoVecSubtract([_tCurr.x, _tCurr.y], [_tStart.x, _tStart.y]) : [0, 0];
+ var xMini = _cMini[0] - point[0] + tMain.x + mouse[0];
+ var yMini = _cMini[1] - point[1] + tMain.y + mouse[1];
+ projection2.translate([xMini, yMini]).clipExtent([[0, 0], _dMini]);
+ _tCurr = projection2.transform();
+ if (_isTransformed) {
+ utilSetTransform(tiles, 0, 0);
+ utilSetTransform(viewport, 0, 0);
+ _isTransformed = false;
+ }
+ zoom.scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
+ _skipEvents = true;
+ wrap2.call(zoom.transform, _tCurr);
+ _skipEvents = false;
+ }
+ function redraw() {
+ clearTimeout(_timeoutID);
+ if (_isHidden)
+ return;
+ updateProjection();
+ var zMini = geoScaleToZoom(projection2.scale());
+ tiles = wrap2.selectAll(".map-in-map-tiles").data([0]);
+ tiles = tiles.enter().append("div").attr("class", "map-in-map-tiles").merge(tiles);
+ backgroundLayer.source(context.background().baseLayerSource()).projection(projection2).dimensions(_dMini);
+ var background = tiles.selectAll(".map-in-map-background").data([0]);
+ background.enter().append("div").attr("class", "map-in-map-background").merge(background).call(backgroundLayer);
+ var overlaySources = context.background().overlayLayerSources();
+ var activeOverlayLayers = [];
+ for (var i2 = 0; i2 < overlaySources.length; i2++) {
+ if (overlaySources[i2].validZoom(zMini)) {
+ if (!overlayLayers[i2])
+ overlayLayers[i2] = rendererTileLayer(context);
+ activeOverlayLayers.push(overlayLayers[i2].source(overlaySources[i2]).projection(projection2).dimensions(_dMini));
+ }
+ }
+ var overlay = tiles.selectAll(".map-in-map-overlay").data([0]);
+ overlay = overlay.enter().append("div").attr("class", "map-in-map-overlay").merge(overlay);
+ var overlays = overlay.selectAll("div").data(activeOverlayLayers, function(d) {
+ return d.source().name();
+ });
+ overlays.exit().remove();
+ overlays = overlays.enter().append("div").merge(overlays).each(function(layer) {
+ select_default2(this).call(layer);
+ });
+ var dataLayers = tiles.selectAll(".map-in-map-data").data([0]);
+ dataLayers.exit().remove();
+ dataLayers = dataLayers.enter().append("svg").attr("class", "map-in-map-data").merge(dataLayers).call(dataLayer).call(debugLayer);
+ if (_gesture !== "pan") {
+ var getPath = path_default(projection2);
+ var bbox = { type: "Polygon", coordinates: [context.map().extent().polygon()] };
+ viewport = wrap2.selectAll(".map-in-map-viewport").data([0]);
+ viewport = viewport.enter().append("svg").attr("class", "map-in-map-viewport").merge(viewport);
+ var path = viewport.selectAll(".map-in-map-bbox").data([bbox]);
+ path.enter().append("path").attr("class", "map-in-map-bbox").merge(path).attr("d", getPath).classed("thick", function(d) {
+ return getPath.area(d) < 30;
+ });
+ }
+ }
+ function queueRedraw() {
+ clearTimeout(_timeoutID);
+ _timeoutID = setTimeout(function() {
+ redraw();
+ }, 750);
+ }
+ function toggle(d3_event) {
+ if (d3_event)
+ d3_event.preventDefault();
+ _isHidden = !_isHidden;
+ context.container().select(".minimap-toggle-item").classed("active", !_isHidden).select("input").property("checked", !_isHidden);
+ if (_isHidden) {
+ wrap2.style("display", "block").style("opacity", "1").transition().duration(200).style("opacity", "0").on("end", function() {
+ selection2.selectAll(".map-in-map").style("display", "none");
+ });
+ } else {
+ wrap2.style("display", "block").style("opacity", "0").transition().duration(200).style("opacity", "1").on("end", function() {
+ redraw();
+ });
+ }
+ }
+ uiMapInMap.toggle = toggle;
+ wrap2 = selection2.selectAll(".map-in-map").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", "map-in-map").style("display", _isHidden ? "none" : "block").call(zoom).on("dblclick.zoom", null).merge(wrap2);
+ _dMini = [200, 150];
+ _cMini = geoVecScale(_dMini, 0.5);
+ context.map().on("drawn.map-in-map", function(drawn) {
+ if (drawn.full === true) {
+ redraw();
+ }
+ });
+ redraw();
+ context.keybinding().on(_t("background.minimap.key"), toggle);
+ }
+ return mapInMap;
+ }
+
+ // modules/ui/notice.js
+ function uiNotice(context) {
+ return function(selection2) {
+ var div = selection2.append("div").attr("class", "notice");
+ var button = div.append("button").attr("class", "zoom-to notice fillD").on("click", function() {
+ context.map().zoomEase(context.minEditableZoom());
+ }).on("wheel", function(d3_event) {
+ var e22 = new WheelEvent(d3_event.type, d3_event);
+ context.surface().node().dispatchEvent(e22);
+ });
+ button.call(svgIcon("#iD-icon-plus", "pre-text")).append("span").attr("class", "label").call(_t.append("zoom_in_edit"));
+ function disableTooHigh() {
+ var canEdit = context.map().zoom() >= context.minEditableZoom();
+ div.style("display", canEdit ? "none" : "block");
+ }
+ context.map().on("move.notice", debounce_default(disableTooHigh, 500));
+ disableTooHigh();
+ };
+ }
+
+ // modules/ui/photoviewer.js
+ function uiPhotoviewer(context) {
+ var dispatch10 = dispatch_default("resize");
+ var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ function photoviewer(selection2) {
+ selection2.append("button").attr("class", "thumb-hide").attr("title", _t("icons.close")).on("click", function() {
+ if (services.streetside) {
+ services.streetside.hideViewer(context);
+ }
+ if (services.mapillary) {
+ services.mapillary.hideViewer(context);
+ }
+ if (services.kartaview) {
+ services.kartaview.hideViewer(context);
+ }
+ }).append("div").call(svgIcon("#iD-icon-close"));
+ function preventDefault(d3_event) {
+ d3_event.preventDefault();
+ }
+ selection2.append("button").attr("class", "resize-handle-xy").on("touchstart touchdown touchend", preventDefault).on(_pointerPrefix + "down", buildResizeListener(selection2, "resize", dispatch10, { resizeOnX: true, resizeOnY: true }));
+ selection2.append("button").attr("class", "resize-handle-x").on("touchstart touchdown touchend", preventDefault).on(_pointerPrefix + "down", buildResizeListener(selection2, "resize", dispatch10, { resizeOnX: true }));
+ selection2.append("button").attr("class", "resize-handle-y").on("touchstart touchdown touchend", preventDefault).on(_pointerPrefix + "down", buildResizeListener(selection2, "resize", dispatch10, { resizeOnY: true }));
+ function buildResizeListener(target, eventName, dispatch11, options2) {
+ var resizeOnX = !!options2.resizeOnX;
+ var resizeOnY = !!options2.resizeOnY;
+ var minHeight = options2.minHeight || 240;
+ var minWidth = options2.minWidth || 320;
+ var pointerId;
+ var startX;
+ var startY;
+ var startWidth;
+ var startHeight;
+ function startResize(d3_event) {
+ if (pointerId !== (d3_event.pointerId || "mouse"))
+ return;
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ var mapSize = context.map().dimensions();
+ if (resizeOnX) {
+ var maxWidth = mapSize[0];
+ var newWidth = clamp3(startWidth + d3_event.clientX - startX, minWidth, maxWidth);
+ target.style("width", newWidth + "px");
+ }
+ if (resizeOnY) {
+ var maxHeight = mapSize[1] - 90;
+ var newHeight = clamp3(startHeight + startY - d3_event.clientY, minHeight, maxHeight);
+ target.style("height", newHeight + "px");
+ }
+ dispatch11.call(eventName, target, utilGetDimensions(target, true));
+ }
+ function clamp3(num, min3, max3) {
+ return Math.max(min3, Math.min(num, max3));
+ }
+ function stopResize(d3_event) {
+ if (pointerId !== (d3_event.pointerId || "mouse"))
+ return;
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ select_default2(window).on("." + eventName, null);
+ }
+ return function initResize(d3_event) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ pointerId = d3_event.pointerId || "mouse";
+ startX = d3_event.clientX;
+ startY = d3_event.clientY;
+ var targetRect = target.node().getBoundingClientRect();
+ startWidth = targetRect.width;
+ startHeight = targetRect.height;
+ select_default2(window).on(_pointerPrefix + "move." + eventName, startResize, false).on(_pointerPrefix + "up." + eventName, stopResize, false);
+ if (_pointerPrefix === "pointer") {
+ select_default2(window).on("pointercancel." + eventName, stopResize, false);
+ }
+ };
+ }
+ }
+ photoviewer.onMapResize = function() {
+ var photoviewer2 = context.container().select(".photoviewer");
+ var content = context.container().select(".main-content");
+ var mapDimensions = utilGetDimensions(content, true);
+ var photoDimensions = utilGetDimensions(photoviewer2, true);
+ if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > mapDimensions[1] - 90) {
+ var setPhotoDimensions = [
+ Math.min(photoDimensions[0], mapDimensions[0]),
+ Math.min(photoDimensions[1], mapDimensions[1] - 90)
+ ];
+ photoviewer2.style("width", setPhotoDimensions[0] + "px").style("height", setPhotoDimensions[1] + "px");
+ dispatch10.call("resize", photoviewer2, setPhotoDimensions);
+ }
+ };
+ return utilRebind(photoviewer, dispatch10, "on");
+ }
+
+ // modules/ui/restore.js
+ function uiRestore(context) {
+ return function(selection2) {
+ if (!context.history().hasRestorableChanges())
+ return;
+ let modalSelection = uiModal(selection2, true);
+ modalSelection.select(".modal").attr("class", "modal fillL");
+ let introModal = modalSelection.select(".content");
+ introModal.append("div").attr("class", "modal-section").append("h3").call(_t.append("restore.heading"));
+ introModal.append("div").attr("class", "modal-section").append("p").call(_t.append("restore.description"));
+ let buttonWrap = introModal.append("div").attr("class", "modal-actions");
+ let restore = buttonWrap.append("button").attr("class", "restore").on("click", () => {
+ context.history().restore();
+ modalSelection.remove();
+ });
+ restore.append("svg").attr("class", "logo logo-restore").append("use").attr("xlink:href", "#iD-logo-restore");
+ restore.append("div").call(_t.append("restore.restore"));
+ let reset = buttonWrap.append("button").attr("class", "reset").on("click", () => {
+ context.history().clearSaved();
+ modalSelection.remove();
+ });
+ reset.append("svg").attr("class", "logo logo-reset").append("use").attr("xlink:href", "#iD-logo-reset");
+ reset.append("div").call(_t.append("restore.reset"));
+ restore.node().focus();
+ };
+ }
+
+ // modules/ui/scale.js
+ function uiScale(context) {
+ var projection2 = context.projection, isImperial = !_mainLocalizer.usesMetric(), maxLength = 180, tickHeight = 8;
+ function scaleDefs(loc1, loc2) {
+ var lat = (loc2[1] + loc1[1]) / 2, conversion = isImperial ? 3.28084 : 1, dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion, scale = { dist: 0, px: 0, text: "" }, buckets, i2, val, dLon;
+ if (isImperial) {
+ buckets = [528e4, 528e3, 52800, 5280, 500, 50, 5, 1];
+ } else {
+ buckets = [5e6, 5e5, 5e4, 5e3, 500, 50, 5, 1];
+ }
+ for (i2 = 0; i2 < buckets.length; i2++) {
+ val = buckets[i2];
+ if (dist >= val) {
+ scale.dist = Math.floor(dist / val) * val;
+ break;
+ } else {
+ scale.dist = +dist.toFixed(2);
+ }
+ }
+ dLon = geoMetersToLon(scale.dist / conversion, lat);
+ scale.px = Math.round(projection2([loc1[0] + dLon, loc1[1]])[0]);
+ scale.text = displayLength(scale.dist / conversion, isImperial);
+ return scale;
+ }
+ function update(selection2) {
+ var dims = context.map().dimensions(), loc1 = projection2.invert([0, dims[1]]), loc2 = projection2.invert([maxLength, dims[1]]), scale = scaleDefs(loc1, loc2);
+ selection2.select(".scale-path").attr("d", "M0.5,0.5v" + tickHeight + "h" + scale.px + "v-" + tickHeight);
+ selection2.select(".scale-text").style(_mainLocalizer.textDirection() === "ltr" ? "left" : "right", scale.px + 16 + "px").text(scale.text);
+ }
+ return function(selection2) {
+ function switchUnits() {
+ isImperial = !isImperial;
+ selection2.call(update);
+ }
+ var scalegroup = selection2.append("svg").attr("class", "scale").on("click", switchUnits).append("g").attr("transform", "translate(10,11)");
+ scalegroup.append("path").attr("class", "scale-path");
+ selection2.append("div").attr("class", "scale-text");
+ selection2.call(update);
+ context.map().on("move.scale", function() {
+ update(selection2);
+ });
+ };
+ }
+
+ // modules/ui/shortcuts.js
+ function uiShortcuts(context) {
+ var detected = utilDetect();
+ var _activeTab = 0;
+ var _modalSelection;
+ var _selection = select_default2(null);
+ var _dataShortcuts;
+ function shortcutsModal(_modalSelection2) {
+ _modalSelection2.select(".modal").classed("modal-shortcuts", true);
+ var content = _modalSelection2.select(".content");
+ content.append("div").attr("class", "modal-section header").append("h2").call(_t.append("shortcuts.title"));
+ _mainFileFetcher.get("shortcuts").then(function(data) {
+ _dataShortcuts = data;
+ content.call(render);
+ }).catch(function() {
+ });
+ }
+ function render(selection2) {
+ if (!_dataShortcuts)
+ return;
+ var wrapper = selection2.selectAll(".wrapper").data([0]);
+ var wrapperEnter = wrapper.enter().append("div").attr("class", "wrapper modal-section");
+ var tabsBar = wrapperEnter.append("div").attr("class", "tabs-bar");
+ var shortcutsList = wrapperEnter.append("div").attr("class", "shortcuts-list");
+ wrapper = wrapper.merge(wrapperEnter);
+ var tabs = tabsBar.selectAll(".tab").data(_dataShortcuts);
+ var tabsEnter = tabs.enter().append("a").attr("class", "tab").attr("href", "#").on("click", function(d3_event, d) {
+ d3_event.preventDefault();
+ var i2 = _dataShortcuts.indexOf(d);
+ _activeTab = i2;
+ render(selection2);
+ });
+ tabsEnter.append("span").html(function(d) {
+ return _t.html(d.text);
+ });
+ wrapper.selectAll(".tab").classed("active", function(d, i2) {
+ return i2 === _activeTab;
+ });
+ var shortcuts = shortcutsList.selectAll(".shortcut-tab").data(_dataShortcuts);
+ var shortcutsEnter = shortcuts.enter().append("div").attr("class", function(d) {
+ return "shortcut-tab shortcut-tab-" + d.tab;
+ });
+ var columnsEnter = shortcutsEnter.selectAll(".shortcut-column").data(function(d) {
+ return d.columns;
+ }).enter().append("table").attr("class", "shortcut-column");
+ var rowsEnter = columnsEnter.selectAll(".shortcut-row").data(function(d) {
+ return d.rows;
+ }).enter().append("tr").attr("class", "shortcut-row");
+ var sectionRows = rowsEnter.filter(function(d) {
+ return !d.shortcuts;
+ });
+ sectionRows.append("td");
+ sectionRows.append("td").attr("class", "shortcut-section").append("h3").html(function(d) {
+ return _t.html(d.text);
+ });
+ var shortcutRows = rowsEnter.filter(function(d) {
+ return d.shortcuts;
+ });
+ var shortcutKeys = shortcutRows.append("td").attr("class", "shortcut-keys");
+ var modifierKeys = shortcutKeys.filter(function(d) {
+ return d.modifiers;
+ });
+ modifierKeys.selectAll("kbd.modifier").data(function(d) {
+ if (detected.os === "win" && d.text === "shortcuts.editing.commands.redo") {
+ return ["\u2318"];
+ } else if (detected.os !== "mac" && d.text === "shortcuts.browsing.display_options.fullscreen") {
+ return [];
+ } else {
+ return d.modifiers;
+ }
+ }).enter().each(function() {
+ var selection3 = select_default2(this);
+ selection3.append("kbd").attr("class", "modifier").text(function(d) {
+ return uiCmd.display(d);
+ });
+ selection3.append("span").text("+");
+ });
+ shortcutKeys.selectAll("kbd.shortcut").data(function(d) {
+ var arr = d.shortcuts;
+ if (detected.os === "win" && d.text === "shortcuts.editing.commands.redo") {
+ arr = ["Y"];
+ } else if (detected.os !== "mac" && d.text === "shortcuts.browsing.display_options.fullscreen") {
+ arr = ["F11"];
+ }
+ arr = arr.map(function(s) {
+ return uiCmd.display(s.indexOf(".") !== -1 ? _t(s) : s);
+ });
+ return utilArrayUniq(arr).map(function(s) {
+ return {
+ shortcut: s,
+ separator: d.separator,
+ suffix: d.suffix
+ };
+ });
+ }).enter().each(function(d, i2, nodes) {
+ var selection3 = select_default2(this);
+ var click = d.shortcut.toLowerCase().match(/(.*).click/);
+ if (click && click[1]) {
+ selection3.call(svgIcon("#iD-walkthrough-mouse-" + click[1], "operation"));
+ } else if (d.shortcut.toLowerCase() === "long-press") {
+ selection3.call(svgIcon("#iD-walkthrough-longpress", "longpress operation"));
+ } else if (d.shortcut.toLowerCase() === "tap") {
+ selection3.call(svgIcon("#iD-walkthrough-tap", "tap operation"));
+ } else {
+ selection3.append("kbd").attr("class", "shortcut").text(function(d2) {
+ return d2.shortcut;
+ });
+ }
+ if (i2 < nodes.length - 1) {
+ selection3.append("span").html(d.separator || "\xA0" + _t.html("shortcuts.or") + "\xA0");
+ } else if (i2 === nodes.length - 1 && d.suffix) {
+ selection3.append("span").text(d.suffix);
+ }
+ });
+ shortcutKeys.filter(function(d) {
+ return d.gesture;
+ }).each(function() {
+ var selection3 = select_default2(this);
+ selection3.append("span").text("+");
+ selection3.append("span").attr("class", "gesture").html(function(d) {
+ return _t.html(d.gesture);
+ });
+ });
+ shortcutRows.append("td").attr("class", "shortcut-desc").html(function(d) {
+ return d.text ? _t.html(d.text) : "\xA0";
+ });
+ wrapper.selectAll(".shortcut-tab").style("display", function(d, i2) {
+ return i2 === _activeTab ? "flex" : "none";
+ });
+ }
+ return function(selection2, show) {
+ _selection = selection2;
+ if (show) {
+ _modalSelection = uiModal(selection2);
+ _modalSelection.call(shortcutsModal);
+ } else {
+ context.keybinding().on([_t("shortcuts.toggle.key"), "?"], function() {
+ if (context.container().selectAll(".modal-shortcuts").size()) {
+ if (_modalSelection) {
+ _modalSelection.close();
+ _modalSelection = null;
+ }
+ } else {
+ _modalSelection = uiModal(_selection);
+ _modalSelection.call(shortcutsModal);
+ }
+ });
+ }
+ };
+ }
+
+ // modules/ui/data_header.js
+ function uiDataHeader() {
+ var _datum;
+ function dataHeader(selection2) {
+ var header = selection2.selectAll(".data-header").data(_datum ? [_datum] : [], function(d) {
+ return d.__featurehash__;
+ });
+ header.exit().remove();
+ var headerEnter = header.enter().append("div").attr("class", "data-header");
+ var iconEnter = headerEnter.append("div").attr("class", "data-header-icon");
+ iconEnter.append("div").attr("class", "preset-icon-28").call(svgIcon("#iD-icon-data", "note-fill"));
+ headerEnter.append("div").attr("class", "data-header-label").call(_t.append("map_data.layers.custom.title"));
+ }
+ dataHeader.datum = function(val) {
+ if (!arguments.length)
+ return _datum;
+ _datum = val;
+ return this;
+ };
+ return dataHeader;
+ }
+
+ // modules/ui/combobox.js
+ var _comboHideTimerID;
+ function uiCombobox(context, klass) {
+ var dispatch10 = dispatch_default("accept", "cancel");
+ var container = context.container();
+ var _suggestions = [];
+ var _data = [];
+ var _fetched = {};
+ var _selected = null;
+ var _canAutocomplete = true;
+ var _caseSensitive = false;
+ var _cancelFetch = false;
+ var _minItems = 2;
+ var _tDown = 0;
+ var _mouseEnterHandler, _mouseLeaveHandler;
+ var _fetcher = function(val, cb) {
+ cb(_data.filter(function(d) {
+ var terms = d.terms || [];
+ terms.push(d.value);
+ return terms.some(function(term) {
+ return term.toString().toLowerCase().indexOf(val.toLowerCase()) !== -1;
+ });
+ }));
+ };
+ var combobox = function(input, attachTo) {
+ if (!input || input.empty())
+ return;
+ input.classed("combobox-input", true).on("focus.combo-input", focus).on("blur.combo-input", blur).on("keydown.combo-input", keydown).on("keyup.combo-input", keyup).on("input.combo-input", change).on("mousedown.combo-input", mousedown).each(function() {
+ var parent = this.parentNode;
+ var sibling = this.nextSibling;
+ select_default2(parent).selectAll(".combobox-caret").filter(function(d) {
+ return d === input.node();
+ }).data([input.node()]).enter().insert("div", function() {
+ return sibling;
+ }).attr("class", "combobox-caret").on("mousedown.combo-caret", function(d3_event) {
+ d3_event.preventDefault();
+ input.node().focus();
+ mousedown(d3_event);
+ }).on("mouseup.combo-caret", function(d3_event) {
+ d3_event.preventDefault();
+ mouseup(d3_event);
+ });
+ });
+ function mousedown(d3_event) {
+ if (d3_event.button !== 0)
+ return;
+ if (input.classed("disabled"))
+ return;
+ _tDown = +new Date();
+ var start2 = input.property("selectionStart");
+ var end = input.property("selectionEnd");
+ if (start2 !== end) {
+ var val = utilGetSetValue(input);
+ input.node().setSelectionRange(val.length, val.length);
+ return;
+ }
+ input.on("mouseup.combo-input", mouseup);
+ }
+ function mouseup(d3_event) {
+ input.on("mouseup.combo-input", null);
+ if (d3_event.button !== 0)
+ return;
+ if (input.classed("disabled"))
+ return;
+ if (input.node() !== document.activeElement)
+ return;
+ var start2 = input.property("selectionStart");
+ var end = input.property("selectionEnd");
+ if (start2 !== end)
+ return;
+ var combo = container.selectAll(".combobox");
+ if (combo.empty() || combo.datum() !== input.node()) {
+ var tOrig = _tDown;
+ window.setTimeout(function() {
+ if (tOrig !== _tDown)
+ return;
+ fetchComboData("", function() {
+ show();
+ render();
+ });
+ }, 250);
+ } else {
+ hide();
+ }
+ }
+ function focus() {
+ fetchComboData("");
+ }
+ function blur() {
+ _comboHideTimerID = window.setTimeout(hide, 75);
+ }
+ function show() {
+ hide();
+ container.insert("div", ":first-child").datum(input.node()).attr("class", "combobox" + (klass ? " combobox-" + klass : "")).style("position", "absolute").style("display", "block").style("left", "0px").on("mousedown.combo-container", function(d3_event) {
+ d3_event.preventDefault();
+ });
+ container.on("scroll.combo-scroll", render, true);
+ }
+ function hide() {
+ if (_comboHideTimerID) {
+ window.clearTimeout(_comboHideTimerID);
+ _comboHideTimerID = void 0;
+ }
+ container.selectAll(".combobox").remove();
+ container.on("scroll.combo-scroll", null);
+ }
+ function keydown(d3_event) {
+ var shown = !container.selectAll(".combobox").empty();
+ var tagName = input.node() ? input.node().tagName.toLowerCase() : "";
+ switch (d3_event.keyCode) {
+ case 8:
+ case 46:
+ d3_event.stopPropagation();
+ _selected = null;
+ render();
+ input.on("input.combo-input", function() {
+ var start2 = input.property("selectionStart");
+ input.node().setSelectionRange(start2, start2);
+ input.on("input.combo-input", change);
+ });
+ break;
+ case 9:
+ accept(d3_event);
+ break;
+ case 13:
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ break;
+ case 38:
+ if (tagName === "textarea" && !shown)
+ return;
+ d3_event.preventDefault();
+ if (tagName === "input" && !shown) {
+ show();
+ }
+ nav(-1);
+ break;
+ case 40:
+ if (tagName === "textarea" && !shown)
+ return;
+ d3_event.preventDefault();
+ if (tagName === "input" && !shown) {
+ show();
+ }
+ nav(1);
+ break;
+ }
+ }
+ function keyup(d3_event) {
+ switch (d3_event.keyCode) {
+ case 27:
+ cancel();
+ break;
+ case 13:
+ accept(d3_event);
+ break;
+ }
+ }
+ function change() {
+ fetchComboData(value(), function() {
+ _selected = null;
+ var val = input.property("value");
+ if (_suggestions.length) {
+ if (input.property("selectionEnd") === val.length) {
+ _selected = tryAutocomplete();
+ }
+ if (!_selected) {
+ _selected = val;
+ }
+ }
+ if (val.length) {
+ var combo = container.selectAll(".combobox");
+ if (combo.empty()) {
+ show();
+ }
+ } else {
+ hide();
+ }
+ render();
+ });
+ }
+ function nav(dir) {
+ if (_suggestions.length) {
+ var index = -1;
+ for (var i2 = 0; i2 < _suggestions.length; i2++) {
+ if (_selected && _suggestions[i2].value === _selected) {
+ index = i2;
+ break;
+ }
+ }
+ index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
+ _selected = _suggestions[index].value;
+ input.property("value", _selected);
+ }
+ render();
+ ensureVisible();
+ }
+ function ensureVisible() {
+ var combo = container.selectAll(".combobox");
+ if (combo.empty())
+ return;
+ var containerRect = container.node().getBoundingClientRect();
+ var comboRect = combo.node().getBoundingClientRect();
+ if (comboRect.bottom > containerRect.bottom) {
+ var node = attachTo ? attachTo.node() : input.node();
+ node.scrollIntoView({ behavior: "instant", block: "center" });
+ render();
+ }
+ var selected = combo.selectAll(".combobox-option.selected").node();
+ if (selected) {
+ selected.scrollIntoView({ behavior: "smooth", block: "nearest" });
+ }
+ }
+ function value() {
+ var value2 = input.property("value");
+ var start2 = input.property("selectionStart");
+ var end = input.property("selectionEnd");
+ if (start2 && end) {
+ value2 = value2.substring(0, start2);
+ }
+ return value2;
+ }
+ function fetchComboData(v, cb) {
+ _cancelFetch = false;
+ _fetcher.call(input, v, function(results) {
+ if (_cancelFetch)
+ return;
+ _suggestions = results;
+ results.forEach(function(d) {
+ _fetched[d.value] = d;
+ });
+ if (cb) {
+ cb();
+ }
+ });
+ }
+ function tryAutocomplete() {
+ if (!_canAutocomplete)
+ return;
+ var val = _caseSensitive ? value() : value().toLowerCase();
+ if (!val)
+ return;
+ if (!isNaN(parseFloat(val)) && isFinite(val))
+ return;
+ var bestIndex = -1;
+ for (var i2 = 0; i2 < _suggestions.length; i2++) {
+ var suggestion = _suggestions[i2].value;
+ var compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
+ if (compare === val) {
+ bestIndex = i2;
+ break;
+ } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
+ bestIndex = i2;
+ }
+ }
+ if (bestIndex !== -1) {
+ var bestVal = _suggestions[bestIndex].value;
+ input.property("value", bestVal);
+ input.node().setSelectionRange(val.length, bestVal.length);
+ return bestVal;
+ }
+ }
+ function render() {
+ if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
+ hide();
+ return;
+ }
+ var shown = !container.selectAll(".combobox").empty();
+ if (!shown)
+ return;
+ var combo = container.selectAll(".combobox");
+ var options2 = combo.selectAll(".combobox-option").data(_suggestions, function(d) {
+ return d.value;
+ });
+ options2.exit().remove();
+ options2.enter().append("a").attr("class", function(d) {
+ return "combobox-option " + (d.klass || "");
+ }).attr("title", function(d) {
+ return d.title;
+ }).html(function(d) {
+ return d.display || d.value;
+ }).on("mouseenter", _mouseEnterHandler).on("mouseleave", _mouseLeaveHandler).merge(options2).classed("selected", function(d) {
+ return d.value === _selected;
+ }).on("click.combo-option", accept).order();
+ var node = attachTo ? attachTo.node() : input.node();
+ var containerRect = container.node().getBoundingClientRect();
+ var rect = node.getBoundingClientRect();
+ combo.style("left", rect.left + 5 - containerRect.left + "px").style("width", rect.width - 10 + "px").style("top", rect.height + rect.top - containerRect.top + "px");
+ }
+ function accept(d3_event, d) {
+ _cancelFetch = true;
+ var thiz = input.node();
+ if (d) {
+ utilGetSetValue(input, d.value);
+ utilTriggerEvent(input, "change");
+ }
+ var val = utilGetSetValue(input);
+ thiz.setSelectionRange(val.length, val.length);
+ d = _fetched[val];
+ dispatch10.call("accept", thiz, d, val);
+ hide();
+ }
+ function cancel() {
+ _cancelFetch = true;
+ var thiz = input.node();
+ var val = utilGetSetValue(input);
+ var start2 = input.property("selectionStart");
+ var end = input.property("selectionEnd");
+ val = val.slice(0, start2) + val.slice(end);
+ utilGetSetValue(input, val);
+ thiz.setSelectionRange(val.length, val.length);
+ dispatch10.call("cancel", thiz);
+ hide();
+ }
+ };
+ combobox.canAutocomplete = function(val) {
+ if (!arguments.length)
+ return _canAutocomplete;
+ _canAutocomplete = val;
+ return combobox;
+ };
+ combobox.caseSensitive = function(val) {
+ if (!arguments.length)
+ return _caseSensitive;
+ _caseSensitive = val;
+ return combobox;
+ };
+ combobox.data = function(val) {
+ if (!arguments.length)
+ return _data;
+ _data = val;
+ return combobox;
+ };
+ combobox.fetcher = function(val) {
+ if (!arguments.length)
+ return _fetcher;
+ _fetcher = val;
+ return combobox;
+ };
+ combobox.minItems = function(val) {
+ if (!arguments.length)
+ return _minItems;
+ _minItems = val;
+ return combobox;
+ };
+ combobox.itemsMouseEnter = function(val) {
+ if (!arguments.length)
+ return _mouseEnterHandler;
+ _mouseEnterHandler = val;
+ return combobox;
+ };
+ combobox.itemsMouseLeave = function(val) {
+ if (!arguments.length)
+ return _mouseLeaveHandler;
+ _mouseLeaveHandler = val;
+ return combobox;
+ };
+ return utilRebind(combobox, dispatch10, "on");
+ }
+ uiCombobox.off = function(input, context) {
+ input.on("focus.combo-input", null).on("blur.combo-input", null).on("keydown.combo-input", null).on("keyup.combo-input", null).on("input.combo-input", null).on("mousedown.combo-input", null).on("mouseup.combo-input", null);
+ context.container().on("scroll.combo-scroll", null);
+ };
+
+ // modules/ui/disclosure.js
+ function uiDisclosure(context, key, expandedDefault) {
+ var dispatch10 = dispatch_default("toggled");
+ var _expanded;
+ var _label = utilFunctor("");
+ var _updatePreference = true;
+ var _content = function() {
+ };
+ var disclosure = function(selection2) {
+ if (_expanded === void 0 || _expanded === null) {
+ var preference = corePreferences("disclosure." + key + ".expanded");
+ _expanded = preference === null ? !!expandedDefault : preference === "true";
+ }
+ var hideToggle = selection2.selectAll(".hide-toggle-" + key).data([0]);
+ var hideToggleEnter = hideToggle.enter().append("h3").append("a").attr("role", "button").attr("href", "#").attr("class", "hide-toggle hide-toggle-" + key).call(svgIcon("", "pre-text", "hide-toggle-icon"));
+ hideToggleEnter.append("span").attr("class", "hide-toggle-text");
+ hideToggle = hideToggleEnter.merge(hideToggle);
+ hideToggle.on("click", toggle).attr("title", _t(`icons.${_expanded ? "collapse" : "expand"}`)).attr("aria-expanded", _expanded).classed("expanded", _expanded);
+ hideToggle.selectAll(".hide-toggle-text").html(_label());
+ hideToggle.selectAll(".hide-toggle-icon").attr("xlink:href", _expanded ? "#iD-icon-down" : _mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward");
+ var wrap2 = selection2.selectAll(".disclosure-wrap").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", "disclosure-wrap disclosure-wrap-" + key).merge(wrap2).classed("hide", !_expanded);
+ if (_expanded) {
+ wrap2.call(_content);
+ }
+ function toggle(d3_event) {
+ d3_event.preventDefault();
+ _expanded = !_expanded;
+ if (_updatePreference) {
+ corePreferences("disclosure." + key + ".expanded", _expanded);
+ }
+ hideToggle.classed("expanded", _expanded).attr("aria-expanded", _expanded).attr("title", _t(`icons.${_expanded ? "collapse" : "expand"}`));
+ hideToggle.selectAll(".hide-toggle-icon").attr("xlink:href", _expanded ? "#iD-icon-down" : _mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward");
+ wrap2.call(uiToggle(_expanded));
+ if (_expanded) {
+ wrap2.call(_content);
+ }
+ dispatch10.call("toggled", this, _expanded);
+ }
+ };
+ disclosure.label = function(val) {
+ if (!arguments.length)
+ return _label;
+ _label = utilFunctor(val);
+ return disclosure;
+ };
+ disclosure.expanded = function(val) {
+ if (!arguments.length)
+ return _expanded;
+ _expanded = val;
+ return disclosure;
+ };
+ disclosure.updatePreference = function(val) {
+ if (!arguments.length)
+ return _updatePreference;
+ _updatePreference = val;
+ return disclosure;
+ };
+ disclosure.content = function(val) {
+ if (!arguments.length)
+ return _content;
+ _content = val;
+ return disclosure;
+ };
+ return utilRebind(disclosure, dispatch10, "on");
+ }
+
+ // modules/ui/section.js
+ function uiSection(id2, context) {
+ var _classes = utilFunctor("");
+ var _shouldDisplay;
+ var _content;
+ var _disclosure;
+ var _label;
+ var _expandedByDefault = utilFunctor(true);
+ var _disclosureContent;
+ var _disclosureExpanded;
+ var _containerSelection = select_default2(null);
+ var section = {
+ id: id2
+ };
+ section.classes = function(val) {
+ if (!arguments.length)
+ return _classes;
+ _classes = utilFunctor(val);
+ return section;
+ };
+ section.label = function(val) {
+ if (!arguments.length)
+ return _label;
+ _label = utilFunctor(val);
+ return section;
+ };
+ section.expandedByDefault = function(val) {
+ if (!arguments.length)
+ return _expandedByDefault;
+ _expandedByDefault = utilFunctor(val);
+ return section;
+ };
+ section.shouldDisplay = function(val) {
+ if (!arguments.length)
+ return _shouldDisplay;
+ _shouldDisplay = utilFunctor(val);
+ return section;
+ };
+ section.content = function(val) {
+ if (!arguments.length)
+ return _content;
+ _content = val;
+ return section;
+ };
+ section.disclosureContent = function(val) {
+ if (!arguments.length)
+ return _disclosureContent;
+ _disclosureContent = val;
+ return section;
+ };
+ section.disclosureExpanded = function(val) {
+ if (!arguments.length)
+ return _disclosureExpanded;
+ _disclosureExpanded = val;
+ return section;
+ };
+ section.render = function(selection2) {
+ _containerSelection = selection2.selectAll(".section-" + id2).data([0]);
+ var sectionEnter = _containerSelection.enter().append("div").attr("class", "section section-" + id2 + " " + (_classes && _classes() || ""));
+ _containerSelection = sectionEnter.merge(_containerSelection);
+ _containerSelection.call(renderContent);
+ };
+ section.reRender = function() {
+ _containerSelection.call(renderContent);
+ };
+ section.selection = function() {
+ return _containerSelection;
+ };
+ section.disclosure = function() {
+ return _disclosure;
+ };
+ function renderContent(selection2) {
+ if (_shouldDisplay) {
+ var shouldDisplay = _shouldDisplay();
+ selection2.classed("hide", !shouldDisplay);
+ if (!shouldDisplay) {
+ selection2.html("");
+ return;
+ }
+ }
+ if (_disclosureContent) {
+ if (!_disclosure) {
+ _disclosure = uiDisclosure(context, id2.replace(/-/g, "_"), _expandedByDefault()).label(_label || "").content(_disclosureContent);
+ }
+ if (_disclosureExpanded !== void 0) {
+ _disclosure.expanded(_disclosureExpanded);
+ _disclosureExpanded = void 0;
+ }
+ selection2.call(_disclosure);
+ return;
+ }
+ if (_content) {
+ selection2.call(_content);
+ }
+ }
+ return section;
+ }
+
+ // modules/ui/tag_reference.js
+ function uiTagReference(what) {
+ var wikibase = what.qid ? services.wikidata : services.osmWikibase;
+ var tagReference = {};
+ var _button = select_default2(null);
+ var _body = select_default2(null);
+ var _loaded;
+ var _showing;
+ function load() {
+ if (!wikibase)
+ return;
+ _button.classed("tag-reference-loading", true);
+ wikibase.getDocs(what, gotDocs);
+ }
+ function gotDocs(err, docs) {
+ _body.html("");
+ if (!docs || !docs.title) {
+ _body.append("p").attr("class", "tag-reference-description").call(_t.append("inspector.no_documentation_key"));
+ done();
+ return;
+ }
+ if (docs.imageURL) {
+ _body.append("img").attr("class", "tag-reference-wiki-image").attr("alt", docs.description).attr("src", docs.imageURL).on("load", function() {
+ done();
+ }).on("error", function() {
+ select_default2(this).remove();
+ done();
+ });
+ } else {
+ done();
+ }
+ var tagReferenceDescription = _body.append("p").attr("class", "tag-reference-description").append("span");
+ if (docs.description) {
+ tagReferenceDescription = tagReferenceDescription.attr("class", "localized-text").attr("lang", docs.descriptionLocaleCode || "und").text(docs.description);
+ } else {
+ tagReferenceDescription = tagReferenceDescription.call(_t.append("inspector.no_documentation_key"));
+ }
+ tagReferenceDescription.append("a").attr("class", "tag-reference-edit").attr("target", "_blank").attr("title", _t("inspector.edit_reference")).attr("href", docs.editURL).call(svgIcon("#iD-icon-edit", "inline"));
+ if (docs.wiki) {
+ _body.append("a").attr("class", "tag-reference-link").attr("target", "_blank").attr("href", docs.wiki.url).call(svgIcon("#iD-icon-out-link", "inline")).append("span").call(_t.append(docs.wiki.text));
+ }
+ if (what.key === "comment") {
+ _body.append("a").attr("class", "tag-reference-comment-link").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", _t("commit.about_changeset_comments_link")).append("span").call(_t.append("commit.about_changeset_comments"));
+ }
+ }
+ function done() {
+ _loaded = true;
+ _button.classed("tag-reference-loading", false);
+ _body.classed("expanded", true).transition().duration(200).style("max-height", "200px").style("opacity", "1");
+ _showing = true;
+ _button.selectAll("svg.icon use").each(function() {
+ var iconUse = select_default2(this);
+ if (iconUse.attr("href") === "#iD-icon-info") {
+ iconUse.attr("href", "#iD-icon-info-filled");
+ }
+ });
+ }
+ function hide() {
+ _body.transition().duration(200).style("max-height", "0px").style("opacity", "0").on("end", function() {
+ _body.classed("expanded", false);
+ });
+ _showing = false;
+ _button.selectAll("svg.icon use").each(function() {
+ var iconUse = select_default2(this);
+ if (iconUse.attr("href") === "#iD-icon-info-filled") {
+ iconUse.attr("href", "#iD-icon-info");
+ }
+ });
+ }
+ tagReference.button = function(selection2, klass, iconName) {
+ _button = selection2.selectAll(".tag-reference-button").data([0]);
+ _button = _button.enter().append("button").attr("class", "tag-reference-button " + (klass || "")).attr("title", _t("icons.information")).call(svgIcon("#iD-icon-" + (iconName || "inspect"))).merge(_button);
+ _button.on("click", function(d3_event) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ this.blur();
+ if (_showing) {
+ hide();
+ } else if (_loaded) {
+ done();
+ } else {
+ load();
+ }
+ });
+ };
+ tagReference.body = function(selection2) {
+ var itemID = what.qid || what.key + "-" + (what.value || "");
+ _body = selection2.selectAll(".tag-reference-body").data([itemID], function(d) {
+ return d;
+ });
+ _body.exit().remove();
+ _body = _body.enter().append("div").attr("class", "tag-reference-body").style("max-height", "0").style("opacity", "0").merge(_body);
+ if (_showing === false) {
+ hide();
+ }
+ };
+ tagReference.showing = function(val) {
+ if (!arguments.length)
+ return _showing;
+ _showing = val;
+ return tagReference;
+ };
+ return tagReference;
+ }
+
+ // modules/ui/field_help.js
+ function uiFieldHelp(context, fieldName) {
+ var fieldHelp = {};
+ var _inspector = select_default2(null);
+ var _wrap = select_default2(null);
+ var _body = select_default2(null);
+ var fieldHelpKeys = {
+ restrictions: [
+ ["about", [
+ "about",
+ "from_via_to",
+ "maxdist",
+ "maxvia"
+ ]],
+ ["inspecting", [
+ "about",
+ "from_shadow",
+ "allow_shadow",
+ "restrict_shadow",
+ "only_shadow",
+ "restricted",
+ "only"
+ ]],
+ ["modifying", [
+ "about",
+ "indicators",
+ "allow_turn",
+ "restrict_turn",
+ "only_turn"
+ ]],
+ ["tips", [
+ "simple",
+ "simple_example",
+ "indirect",
+ "indirect_example",
+ "indirect_noedit"
+ ]]
+ ]
+ };
+ var fieldHelpHeadings = {};
+ var replacements = {
+ distField: { html: _t.html("restriction.controls.distance") },
+ viaField: { html: _t.html("restriction.controls.via") },
+ fromShadow: { html: icon("#iD-turn-shadow", "inline shadow from") },
+ allowShadow: { html: icon("#iD-turn-shadow", "inline shadow allow") },
+ restrictShadow: { html: icon("#iD-turn-shadow", "inline shadow restrict") },
+ onlyShadow: { html: icon("#iD-turn-shadow", "inline shadow only") },
+ allowTurn: { html: icon("#iD-turn-yes", "inline turn") },
+ restrictTurn: { html: icon("#iD-turn-no", "inline turn") },
+ onlyTurn: { html: icon("#iD-turn-only", "inline turn") }
+ };
+ var docs = fieldHelpKeys[fieldName].map(function(key) {
+ var helpkey = "help.field." + fieldName + "." + key[0];
+ var text2 = key[1].reduce(function(all, part) {
+ var subkey = helpkey + "." + part;
+ var depth = fieldHelpHeadings[subkey];
+ var hhh = depth ? Array(depth + 1).join("#") + " " : "";
+ return all + hhh + _t.html(subkey, replacements) + "\n\n";
+ }, "");
+ return {
+ key: helpkey,
+ title: _t.html(helpkey + ".title"),
+ html: marked(text2.trim())
+ };
+ });
+ function show() {
+ updatePosition();
+ _body.classed("hide", false).style("opacity", "0").transition().duration(200).style("opacity", "1");
+ }
+ function hide() {
+ _body.classed("hide", true).transition().duration(200).style("opacity", "0").on("end", function() {
+ _body.classed("hide", true);
+ });
+ }
+ function clickHelp(index) {
+ var d = docs[index];
+ var tkeys = fieldHelpKeys[fieldName][index][1];
+ _body.selectAll(".field-help-nav-item").classed("active", function(d2, i2) {
+ return i2 === index;
+ });
+ var content = _body.selectAll(".field-help-content").html(d.html);
+ content.selectAll("p").attr("class", function(d2, i2) {
+ return tkeys[i2];
+ });
+ if (d.key === "help.field.restrictions.inspecting") {
+ content.insert("img", "p.from_shadow").attr("class", "field-help-image cf").attr("src", context.imagePath("tr_inspect.gif"));
+ } else if (d.key === "help.field.restrictions.modifying") {
+ content.insert("img", "p.allow_turn").attr("class", "field-help-image cf").attr("src", context.imagePath("tr_modify.gif"));
+ }
+ }
+ fieldHelp.button = function(selection2) {
+ if (_body.empty())
+ return;
+ var button = selection2.selectAll(".field-help-button").data([0]);
+ button.enter().append("button").attr("class", "field-help-button").call(svgIcon("#iD-icon-help")).merge(button).on("click", function(d3_event) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ if (_body.classed("hide")) {
+ show();
+ } else {
+ hide();
+ }
+ });
+ };
+ function updatePosition() {
+ var wrap2 = _wrap.node();
+ var inspector = _inspector.node();
+ var wRect = wrap2.getBoundingClientRect();
+ var iRect = inspector.getBoundingClientRect();
+ _body.style("top", wRect.top + inspector.scrollTop - iRect.top + "px");
+ }
+ fieldHelp.body = function(selection2) {
+ _wrap = selection2.selectAll(".form-field-input-wrap");
+ if (_wrap.empty())
+ return;
+ _inspector = context.container().select(".sidebar .entity-editor-pane .inspector-body");
+ if (_inspector.empty())
+ return;
+ _body = _inspector.selectAll(".field-help-body").data([0]);
+ var enter = _body.enter().append("div").attr("class", "field-help-body hide");
+ var titleEnter = enter.append("div").attr("class", "field-help-title cf");
+ titleEnter.append("h2").attr("class", _mainLocalizer.textDirection() === "rtl" ? "fr" : "fl").call(_t.append("help.field." + fieldName + ".title"));
+ titleEnter.append("button").attr("class", "fr close").attr("title", _t("icons.close")).on("click", function(d3_event) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ hide();
+ }).call(svgIcon("#iD-icon-close"));
+ var navEnter = enter.append("div").attr("class", "field-help-nav cf");
+ var titles = docs.map(function(d) {
+ return d.title;
+ });
+ navEnter.selectAll(".field-help-nav-item").data(titles).enter().append("div").attr("class", "field-help-nav-item").html(function(d) {
+ return d;
+ }).on("click", function(d3_event, d) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ clickHelp(titles.indexOf(d));
+ });
+ enter.append("div").attr("class", "field-help-content");
+ _body = _body.merge(enter);
+ clickHelp(0);
+ };
+ return fieldHelp;
+ }
+
+ // modules/ui/fields/check.js
+ function uiFieldCheck(field, context) {
+ var dispatch10 = dispatch_default("change");
+ var options2 = field.options;
+ var values = [];
+ var texts = [];
+ var _tags;
+ var input = select_default2(null);
+ var text2 = select_default2(null);
+ var label = select_default2(null);
+ var reverser = select_default2(null);
+ var _impliedYes;
+ var _entityIDs = [];
+ var _value;
+ if (options2) {
+ for (var i2 in options2) {
+ var v = options2[i2];
+ values.push(v === "undefined" ? void 0 : v);
+ texts.push(field.t.html("options." + v, { "default": v }));
+ }
+ } else {
+ values = [void 0, "yes"];
+ texts = [_t.html("inspector.unknown"), _t.html("inspector.check.yes")];
+ if (field.type !== "defaultCheck") {
+ values.push("no");
+ texts.push(_t.html("inspector.check.no"));
+ }
+ }
+ function checkImpliedYes() {
+ _impliedYes = field.id === "oneway_yes";
+ if (field.id === "oneway") {
+ var entity = context.entity(_entityIDs[0]);
+ for (var key in entity.tags) {
+ if (key in osmOneWayTags && entity.tags[key] in osmOneWayTags[key]) {
+ _impliedYes = true;
+ texts[0] = _t.html("_tagging.presets.fields.oneway_yes.options.undefined");
+ break;
+ }
+ }
+ }
+ }
+ function reverserHidden() {
+ if (!context.container().select("div.inspector-hover").empty())
+ return true;
+ return !(_value === "yes" || _impliedYes && !_value);
+ }
+ function reverserSetText(selection2) {
+ var entity = _entityIDs.length && context.hasEntity(_entityIDs[0]);
+ if (reverserHidden() || !entity)
+ return selection2;
+ var first = entity.first();
+ var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
+ var pseudoDirection = first < last;
+ var icon2 = pseudoDirection ? "#iD-icon-forward" : "#iD-icon-backward";
+ selection2.selectAll(".reverser-span").html("").call(_t.append("inspector.check.reverser")).call(svgIcon(icon2, "inline"));
+ return selection2;
+ }
+ var check = function(selection2) {
+ checkImpliedYes();
+ label = selection2.selectAll(".form-field-input-wrap").data([0]);
+ var enter = label.enter().append("label").attr("class", "form-field-input-wrap form-field-input-check");
+ enter.append("input").property("indeterminate", field.type !== "defaultCheck").attr("type", "checkbox").attr("id", field.domId);
+ enter.append("span").html(texts[0]).attr("class", "value");
+ if (field.type === "onewayCheck") {
+ enter.append("button").attr("class", "reverser" + (reverserHidden() ? " hide" : "")).append("span").attr("class", "reverser-span");
+ }
+ label = label.merge(enter);
+ input = label.selectAll("input");
+ text2 = label.selectAll("span.value");
+ input.on("click", function(d3_event) {
+ d3_event.stopPropagation();
+ var t = {};
+ if (Array.isArray(_tags[field.key])) {
+ if (values.indexOf("yes") !== -1) {
+ t[field.key] = "yes";
+ } else {
+ t[field.key] = values[0];
+ }
+ } else {
+ t[field.key] = values[(values.indexOf(_value) + 1) % values.length];
+ }
+ if (t[field.key] === "reversible" || t[field.key] === "alternating") {
+ t[field.key] = values[0];
+ }
+ dispatch10.call("change", this, t);
+ });
+ if (field.type === "onewayCheck") {
+ reverser = label.selectAll(".reverser");
+ reverser.call(reverserSetText).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ context.perform(function(graph) {
+ for (var i3 in _entityIDs) {
+ graph = actionReverse(_entityIDs[i3])(graph);
+ }
+ return graph;
+ }, _t("operations.reverse.annotation.line", { n: 1 }));
+ context.validator().validate();
+ select_default2(this).call(reverserSetText);
+ });
+ }
+ };
+ check.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ return check;
+ };
+ check.tags = function(tags) {
+ _tags = tags;
+ function isChecked(val) {
+ return val !== "no" && val !== "" && val !== void 0 && val !== null;
+ }
+ function textFor(val) {
+ if (val === "")
+ val = void 0;
+ var index = values.indexOf(val);
+ return index !== -1 ? texts[index] : '"' + val + '"';
+ }
+ checkImpliedYes();
+ var isMixed = Array.isArray(tags[field.key]);
+ _value = !isMixed && tags[field.key] && tags[field.key].toLowerCase();
+ if (field.type === "onewayCheck" && (_value === "1" || _value === "-1")) {
+ _value = "yes";
+ }
+ input.property("indeterminate", isMixed || field.type !== "defaultCheck" && !_value).property("checked", isChecked(_value));
+ text2.html(isMixed ? _t.html("inspector.multiple_values") : textFor(_value)).classed("mixed", isMixed);
+ label.classed("set", !!_value);
+ if (field.type === "onewayCheck") {
+ reverser.classed("hide", reverserHidden()).call(reverserSetText);
+ }
+ };
+ check.focus = function() {
+ input.node().focus();
+ };
+ return utilRebind(check, dispatch10, "on");
+ }
+
+ // modules/ui/fields/combo.js
+ function uiFieldCombo(field, context) {
+ var dispatch10 = dispatch_default("change");
+ var _isMulti = field.type === "multiCombo" || field.type === "manyCombo";
+ var _isNetwork = field.type === "networkCombo";
+ var _isSemi = field.type === "semiCombo";
+ var _optarray = field.options;
+ var _showTagInfoSuggestions = field.type !== "manyCombo" && field.autoSuggestions !== false;
+ var _allowCustomValues = field.type !== "manyCombo" && field.customValues !== false;
+ var _snake_case = field.snake_case || field.snake_case === void 0;
+ var _combobox = uiCombobox(context, "combo-" + field.safeid).caseSensitive(field.caseSensitive).minItems(_isMulti || _isSemi ? 1 : 2);
+ var _container = select_default2(null);
+ var _inputWrap = select_default2(null);
+ var _input = select_default2(null);
+ var _comboData = [];
+ var _multiData = [];
+ var _entityIDs = [];
+ var _tags;
+ var _countryCode;
+ var _staticPlaceholder;
+ var _dataDeprecated = [];
+ _mainFileFetcher.get("deprecated").then(function(d) {
+ _dataDeprecated = d;
+ }).catch(function() {
+ });
+ if (_isMulti && field.key && /[^:]$/.test(field.key)) {
+ field.key += ":";
+ }
+ function snake(s) {
+ return s.replace(/\s+/g, "_").toLowerCase();
+ }
+ function clean2(s) {
+ return s.split(";").map(function(s2) {
+ return s2.trim();
+ }).join(";");
+ }
+ function tagValue(dval) {
+ dval = clean2(dval || "");
+ var found = _comboData.find(function(o) {
+ return o.key && clean2(o.value) === dval;
+ });
+ if (found)
+ return found.key;
+ if (field.type === "typeCombo" && !dval) {
+ return "yes";
+ }
+ return (_snake_case ? snake(dval) : dval) || void 0;
+ }
+ function displayValue(tval) {
+ tval = tval || "";
+ if (field.hasTextForStringId("options." + tval)) {
+ return field.t("options." + tval, { default: tval });
+ }
+ if (field.type === "typeCombo" && tval.toLowerCase() === "yes") {
+ return "";
+ }
+ return tval;
+ }
+ function objectDifference(a, b) {
+ return a.filter(function(d1) {
+ return !b.some(function(d2) {
+ return !d2.isMixed && d1.value === d2.value;
+ });
+ });
+ }
+ function initCombo(selection2, attachTo) {
+ if (!_allowCustomValues) {
+ selection2.attr("readonly", "readonly");
+ }
+ if (_showTagInfoSuggestions && services.taginfo) {
+ selection2.call(_combobox.fetcher(setTaginfoValues), attachTo);
+ setTaginfoValues("", setPlaceholder);
+ } else {
+ selection2.call(_combobox, attachTo);
+ setStaticValues(setPlaceholder);
+ }
+ }
+ function setStaticValues(callback) {
+ if (!_optarray)
+ return;
+ _comboData = _optarray.map(function(v) {
+ return {
+ key: v,
+ value: field.t("options." + v, { default: v }),
+ title: v,
+ display: field.t.html("options." + v, { default: v }),
+ klass: field.hasTextForStringId("options." + v) ? "" : "raw-option"
+ };
+ });
+ _combobox.data(objectDifference(_comboData, _multiData));
+ if (callback)
+ callback(_comboData);
+ }
+ function setTaginfoValues(q, callback) {
+ var fn = _isMulti ? "multikeys" : "values";
+ var query = (_isMulti ? field.key : "") + q;
+ var hasCountryPrefix = _isNetwork && _countryCode && _countryCode.indexOf(q.toLowerCase()) === 0;
+ if (hasCountryPrefix) {
+ query = _countryCode + ":";
+ }
+ var params = {
+ debounce: q !== "",
+ key: field.key,
+ query
+ };
+ if (_entityIDs.length) {
+ params.geometry = context.graph().geometry(_entityIDs[0]);
+ }
+ services.taginfo[fn](params, function(err, data) {
+ if (err)
+ return;
+ data = data.filter(function(d) {
+ if (field.type === "typeCombo" && d.value === "yes") {
+ return false;
+ }
+ return !d.count || d.count > 10;
+ });
+ var deprecatedValues = osmEntity.deprecatedTagValuesByKey(_dataDeprecated)[field.key];
+ if (deprecatedValues) {
+ data = data.filter(function(d) {
+ return deprecatedValues.indexOf(d.value) === -1;
+ });
+ }
+ if (hasCountryPrefix) {
+ data = data.filter(function(d) {
+ return d.value.toLowerCase().indexOf(_countryCode + ":") === 0;
+ });
+ }
+ _container.classed("empty-combobox", data.length === 0);
+ _comboData = data.map(function(d) {
+ var k = d.value;
+ if (_isMulti)
+ k = k.replace(field.key, "");
+ var label = field.t("options." + k, { default: k });
+ return {
+ key: k,
+ value: label,
+ display: field.t.html("options." + k, { default: k }),
+ title: d.title || label,
+ klass: field.hasTextForStringId("options." + k) ? "" : "raw-option"
+ };
+ });
+ _comboData = objectDifference(_comboData, _multiData);
+ if (callback)
+ callback(_comboData);
+ });
+ }
+ function setPlaceholder(values) {
+ if (_isMulti || _isSemi) {
+ _staticPlaceholder = field.placeholder() || _t("inspector.add");
+ } else {
+ var vals = values.map(function(d) {
+ return d.value;
+ }).filter(function(s) {
+ return s.length < 20;
+ });
+ var placeholders = vals.length > 1 ? vals : values.map(function(d) {
+ return d.key;
+ });
+ _staticPlaceholder = field.placeholder() || placeholders.slice(0, 3).join(", ");
+ }
+ if (!/(…|\.\.\.)$/.test(_staticPlaceholder)) {
+ _staticPlaceholder += "\u2026";
+ }
+ var ph;
+ if (!_isMulti && !_isSemi && _tags && Array.isArray(_tags[field.key])) {
+ ph = _t("inspector.multiple_values");
+ } else {
+ ph = _staticPlaceholder;
+ }
+ _container.selectAll("input").attr("placeholder", ph);
+ }
+ function change() {
+ var t = {};
+ var val;
+ if (_isMulti || _isSemi) {
+ val = tagValue(utilGetSetValue(_input).replace(/,/g, ";")) || "";
+ _container.classed("active", false);
+ utilGetSetValue(_input, "");
+ var vals = val.split(";").filter(Boolean);
+ if (!vals.length)
+ return;
+ if (_isMulti) {
+ utilArrayUniq(vals).forEach(function(v) {
+ var key = (field.key || "") + v;
+ if (_tags) {
+ var old = _tags[key];
+ if (typeof old === "string" && old.toLowerCase() !== "no")
+ return;
+ }
+ key = context.cleanTagKey(key);
+ field.keys.push(key);
+ t[key] = "yes";
+ });
+ } else if (_isSemi) {
+ var arr = _multiData.map(function(d) {
+ return d.key;
+ });
+ arr = arr.concat(vals);
+ t[field.key] = context.cleanTagValue(utilArrayUniq(arr).filter(Boolean).join(";"));
+ }
+ window.setTimeout(function() {
+ _input.node().focus();
+ }, 10);
+ } else {
+ var rawValue = utilGetSetValue(_input);
+ if (!rawValue && Array.isArray(_tags[field.key]))
+ return;
+ val = context.cleanTagValue(tagValue(rawValue));
+ t[field.key] = val || void 0;
+ }
+ dispatch10.call("change", this, t);
+ }
+ function removeMultikey(d3_event, d) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ var t = {};
+ if (_isMulti) {
+ t[d.key] = void 0;
+ } else if (_isSemi) {
+ var arr = _multiData.map(function(md) {
+ return md.key === d.key ? null : md.key;
+ }).filter(Boolean);
+ arr = utilArrayUniq(arr);
+ t[field.key] = arr.length ? arr.join(";") : void 0;
+ }
+ dispatch10.call("change", this, t);
+ }
+ function combo(selection2) {
+ _container = selection2.selectAll(".form-field-input-wrap").data([0]);
+ var type3 = _isMulti || _isSemi ? "multicombo" : "combo";
+ _container = _container.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + type3).merge(_container);
+ if (_isMulti || _isSemi) {
+ _container = _container.selectAll(".chiplist").data([0]);
+ var listClass = "chiplist";
+ if (field.key === "destination" || field.key === "via") {
+ listClass += " full-line-chips";
+ }
+ _container = _container.enter().append("ul").attr("class", listClass).on("click", function() {
+ window.setTimeout(function() {
+ _input.node().focus();
+ }, 10);
+ }).merge(_container);
+ _inputWrap = _container.selectAll(".input-wrap").data([0]);
+ _inputWrap = _inputWrap.enter().append("li").attr("class", "input-wrap").merge(_inputWrap);
+ _input = _inputWrap.selectAll("input").data([0]);
+ } else {
+ _input = _container.selectAll("input").data([0]);
+ }
+ _input = _input.enter().append("input").attr("type", "text").attr("id", field.domId).call(utilNoAuto).call(initCombo, selection2).merge(_input);
+ if (_isNetwork) {
+ var extent = combinedEntityExtent();
+ var countryCode = extent && iso1A2Code(extent.center());
+ _countryCode = countryCode && countryCode.toLowerCase();
+ }
+ _input.on("change", change).on("blur", change);
+ _input.on("keydown.field", function(d3_event) {
+ switch (d3_event.keyCode) {
+ case 13:
+ _input.node().blur();
+ d3_event.stopPropagation();
+ break;
+ }
+ });
+ if (_isMulti || _isSemi) {
+ _combobox.on("accept", function() {
+ _input.node().blur();
+ _input.node().focus();
+ });
+ _input.on("focus", function() {
+ _container.classed("active", true);
+ });
+ }
+ }
+ combo.tags = function(tags) {
+ _tags = tags;
+ if (_isMulti || _isSemi) {
+ _multiData = [];
+ var maxLength;
+ if (_isMulti) {
+ for (var k in tags) {
+ if (field.key && k.indexOf(field.key) !== 0)
+ continue;
+ if (!field.key && field.keys.indexOf(k) === -1)
+ continue;
+ var v = tags[k];
+ if (!v || typeof v === "string" && v.toLowerCase() === "no")
+ continue;
+ var suffix = field.key ? k.substr(field.key.length) : k;
+ _multiData.push({
+ key: k,
+ value: displayValue(suffix),
+ isMixed: Array.isArray(v)
+ });
+ }
+ if (field.key) {
+ field.keys = _multiData.map(function(d) {
+ return d.key;
+ });
+ maxLength = context.maxCharsForTagKey() - utilUnicodeCharsCount(field.key);
+ } else {
+ maxLength = context.maxCharsForTagKey();
+ }
+ } else if (_isSemi) {
+ var allValues = [];
+ var commonValues;
+ if (Array.isArray(tags[field.key])) {
+ tags[field.key].forEach(function(tagVal) {
+ var thisVals = utilArrayUniq((tagVal || "").split(";")).filter(Boolean);
+ allValues = allValues.concat(thisVals);
+ if (!commonValues) {
+ commonValues = thisVals;
+ } else {
+ commonValues = commonValues.filter((value) => thisVals.includes(value));
+ }
+ });
+ allValues = utilArrayUniq(allValues).filter(Boolean);
+ } else {
+ allValues = utilArrayUniq((tags[field.key] || "").split(";")).filter(Boolean);
+ commonValues = allValues;
+ }
+ _multiData = allValues.map(function(v2) {
+ return {
+ key: v2,
+ value: displayValue(v2),
+ isMixed: !commonValues.includes(v2)
+ };
+ });
+ var currLength = utilUnicodeCharsCount(commonValues.join(";"));
+ maxLength = context.maxCharsForTagValue() - currLength;
+ if (currLength > 0) {
+ maxLength -= 1;
+ }
+ }
+ maxLength = Math.max(0, maxLength);
+ var allowDragAndDrop = _isSemi && !Array.isArray(tags[field.key]);
+ var available = objectDifference(_comboData, _multiData);
+ _combobox.data(available);
+ var hideAdd = !_allowCustomValues && !available.length || maxLength <= 0;
+ _container.selectAll(".chiplist .input-wrap").style("display", hideAdd ? "none" : null);
+ var chips = _container.selectAll(".chip").data(_multiData);
+ chips.exit().remove();
+ var enter = chips.enter().insert("li", ".input-wrap").attr("class", "chip");
+ enter.append("span");
+ enter.append("a");
+ chips = chips.merge(enter).order().classed("raw-value", function(d) {
+ var k2 = d.key;
+ if (_isMulti)
+ k2 = k2.replace(field.key, "");
+ return !field.hasTextForStringId("options." + k2);
+ }).classed("draggable", allowDragAndDrop).classed("mixed", function(d) {
+ return d.isMixed;
+ }).attr("title", function(d) {
+ return d.isMixed ? _t("inspector.unshared_value_tooltip") : null;
+ });
+ if (allowDragAndDrop) {
+ registerDragAndDrop(chips);
+ }
+ chips.select("span").text(function(d) {
+ return d.value;
+ });
+ chips.select("a").attr("href", "#").on("click", removeMultikey).attr("class", "remove").text("\xD7");
+ } else {
+ var isMixed = Array.isArray(tags[field.key]);
+ var mixedValues = isMixed && tags[field.key].map(function(val) {
+ return displayValue(val);
+ }).filter(Boolean);
+ var showsValue = !isMixed && tags[field.key] && !(field.type === "typeCombo" && tags[field.key] === "yes");
+ var isRawValue = showsValue && !field.hasTextForStringId("options." + tags[field.key]);
+ var isKnownValue = showsValue && !isRawValue;
+ var isReadOnly = !_allowCustomValues || isKnownValue;
+ utilGetSetValue(_input, !isMixed ? displayValue(tags[field.key]) : "").classed("raw-value", isRawValue).classed("known-value", isKnownValue).attr("readonly", isReadOnly ? "readonly" : void 0).attr("title", isMixed ? mixedValues.join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : _staticPlaceholder || "").classed("mixed", isMixed).on("keydown.deleteCapture", function(d3_event) {
+ if (isReadOnly && isKnownValue && (d3_event.keyCode === utilKeybinding.keyCodes["\u232B"] || d3_event.keyCode === utilKeybinding.keyCodes["\u2326"])) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ var t = {};
+ t[field.key] = void 0;
+ dispatch10.call("change", this, t);
+ }
+ });
+ }
+ };
+ function registerDragAndDrop(selection2) {
+ var dragOrigin, targetIndex;
+ selection2.call(drag_default().on("start", function(d3_event) {
+ dragOrigin = {
+ x: d3_event.x,
+ y: d3_event.y
+ };
+ targetIndex = null;
+ }).on("drag", function(d3_event) {
+ var x = d3_event.x - dragOrigin.x, y = d3_event.y - dragOrigin.y;
+ if (!select_default2(this).classed("dragging") && Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5)
+ return;
+ var index = selection2.nodes().indexOf(this);
+ select_default2(this).classed("dragging", true);
+ targetIndex = null;
+ var targetIndexOffsetTop = null;
+ var draggedTagWidth = select_default2(this).node().offsetWidth;
+ if (field.key === "destination" || field.key === "via") {
+ _container.selectAll(".chip").style("transform", function(d2, index2) {
+ var node = select_default2(this).node();
+ if (index === index2) {
+ return "translate(" + x + "px, " + y + "px)";
+ } else if (index2 > index && d3_event.y > node.offsetTop) {
+ if (targetIndex === null || index2 > targetIndex) {
+ targetIndex = index2;
+ }
+ return "translateY(-100%)";
+ } else if (index2 < index && d3_event.y < node.offsetTop + node.offsetHeight) {
+ if (targetIndex === null || index2 < targetIndex) {
+ targetIndex = index2;
+ }
+ return "translateY(100%)";
+ }
+ return null;
+ });
+ } else {
+ _container.selectAll(".chip").each(function(d2, index2) {
+ var node = select_default2(this).node();
+ if (index !== index2 && d3_event.x < node.offsetLeft + node.offsetWidth + 5 && d3_event.x > node.offsetLeft && d3_event.y < node.offsetTop + node.offsetHeight && d3_event.y > node.offsetTop) {
+ targetIndex = index2;
+ targetIndexOffsetTop = node.offsetTop;
+ }
+ }).style("transform", function(d2, index2) {
+ var node = select_default2(this).node();
+ if (index === index2) {
+ return "translate(" + x + "px, " + y + "px)";
+ }
+ if (node.offsetTop === targetIndexOffsetTop) {
+ if (index2 < index && index2 >= targetIndex) {
+ return "translateX(" + draggedTagWidth + "px)";
+ } else if (index2 > index && index2 <= targetIndex) {
+ return "translateX(-" + draggedTagWidth + "px)";
+ }
+ }
+ return null;
+ });
+ }
+ }).on("end", function() {
+ if (!select_default2(this).classed("dragging")) {
+ return;
+ }
+ var index = selection2.nodes().indexOf(this);
+ select_default2(this).classed("dragging", false);
+ _container.selectAll(".chip").style("transform", null);
+ if (typeof targetIndex === "number") {
+ var element = _multiData[index];
+ _multiData.splice(index, 1);
+ _multiData.splice(targetIndex, 0, element);
+ var t = {};
+ if (_multiData.length) {
+ t[field.key] = _multiData.map(function(element2) {
+ return element2.key;
+ }).join(";");
+ } else {
+ t[field.key] = void 0;
+ }
+ dispatch10.call("change", this, t);
+ }
+ dragOrigin = void 0;
+ targetIndex = void 0;
+ }));
+ }
+ combo.focus = function() {
+ _input.node().focus();
+ };
+ combo.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ return combo;
+ };
+ function combinedEntityExtent() {
+ return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
+ }
+ return utilRebind(combo, dispatch10, "on");
+ }
+
+ // modules/ui/fields/input.js
+ function uiFieldText(field, context) {
+ var dispatch10 = dispatch_default("change");
+ var input = select_default2(null);
+ var outlinkButton = select_default2(null);
+ var wrap2 = select_default2(null);
+ var _entityIDs = [];
+ var _tags;
+ var _phoneFormats = {};
+ if (field.type === "tel") {
+ _mainFileFetcher.get("phone_formats").then(function(d) {
+ _phoneFormats = d;
+ updatePhonePlaceholder();
+ }).catch(function() {
+ });
+ }
+ function calcLocked() {
+ var isLocked = (field.id === "brand" || field.id === "network" || field.id === "operator" || field.id === "flag") && _entityIDs.length && _entityIDs.some(function(entityID) {
+ var entity = context.graph().hasEntity(entityID);
+ if (!entity)
+ return false;
+ if (entity.tags.wikidata)
+ return true;
+ var preset = _mainPresetIndex.match(entity, context.graph());
+ var isSuggestion = preset && preset.suggestion;
+ var which = field.id;
+ return isSuggestion && !!entity.tags[which] && !!entity.tags[which + ":wikidata"];
+ });
+ field.locked(isLocked);
+ }
+ function i2(selection2) {
+ calcLocked();
+ var isLocked = field.locked();
+ wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
+ input = wrap2.selectAll("input").data([0]);
+ input = input.enter().append("input").attr("type", field.type === "identifier" ? "text" : field.type).attr("id", field.domId).classed(field.type, true).call(utilNoAuto).merge(input);
+ input.classed("disabled", !!isLocked).attr("readonly", isLocked || null).on("input", change(true)).on("blur", change()).on("change", change());
+ if (field.type === "tel") {
+ updatePhonePlaceholder();
+ } else if (field.type === "number") {
+ var rtl = _mainLocalizer.textDirection() === "rtl";
+ input.attr("type", "text");
+ var inc = field.increment;
+ var buttons = wrap2.selectAll(".increment, .decrement").data(rtl ? [inc, -inc] : [-inc, inc]);
+ buttons.enter().append("button").attr("class", function(d) {
+ var which = d > 0 ? "increment" : "decrement";
+ return "form-field-button " + which;
+ }).attr("title", function(d) {
+ var which = d > 0 ? "increment" : "decrement";
+ return _t(`inspector.${which}`);
+ }).merge(buttons).on("click", function(d3_event, d) {
+ d3_event.preventDefault();
+ var raw_vals = input.node().value || "0";
+ var vals = raw_vals.split(";");
+ vals = vals.map(function(v) {
+ var num = parseFloat(v.trim(), 10);
+ return isFinite(num) ? clamped(num + d) : v.trim();
+ });
+ input.node().value = vals.join(";");
+ change()();
+ });
+ } else if (field.type === "identifier" && field.urlFormat && field.pattern) {
+ input.attr("type", "text");
+ outlinkButton = wrap2.selectAll(".foreign-id-permalink").data([0]);
+ outlinkButton.enter().append("button").call(svgIcon("#iD-icon-out-link")).attr("class", "form-field-button foreign-id-permalink").attr("title", function() {
+ var domainResults = /^https?:\/\/(.{1,}?)\//.exec(field.urlFormat);
+ if (domainResults.length >= 2 && domainResults[1]) {
+ var domain2 = domainResults[1];
+ return _t("icons.view_on", { domain: domain2 });
+ }
+ return "";
+ }).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ var value = validIdentifierValueForLink();
+ if (value) {
+ var url = field.urlFormat.replace(/{value}/, encodeURIComponent(value));
+ window.open(url, "_blank");
+ }
+ }).merge(outlinkButton);
+ } else if (field.type === "url") {
+ input.attr("type", "text");
+ outlinkButton = wrap2.selectAll(".foreign-id-permalink").data([0]);
+ outlinkButton.enter().append("button").call(svgIcon("#iD-icon-out-link")).attr("class", "form-field-button foreign-id-permalink").attr("title", () => _t("icons.visit_website")).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ const value = validIdentifierValueForLink();
+ if (value)
+ window.open(value, "_blank");
+ }).merge(outlinkButton);
+ } else if (field.key.split(":").includes("colour")) {
+ input.attr("type", "text");
+ updateColourPreview();
+ }
+ }
+ function isColourValid(colour) {
+ if (!colour.match(/^(#([0-9a-fA-F]{3}){1,2}|\w+)$/)) {
+ return false;
+ } else if (!CSS.supports("color", colour) || ["unset", "inherit", "initial", "revert"].includes(colour)) {
+ return false;
+ }
+ return true;
+ }
+ function updateColourPreview() {
+ wrap2.selectAll(".colour-preview").remove();
+ const colour = utilGetSetValue(input);
+ if (!isColourValid(colour) && colour !== "")
+ return;
+ var colourSelector = wrap2.selectAll(".colour-selector").data([0]);
+ outlinkButton = wrap2.selectAll(".colour-preview").data([colour]);
+ colourSelector.enter().append("input").attr("type", "color").attr("class", "form-field-button colour-selector").attr("value", colour).on("input", debounce_default(function(d3_event) {
+ d3_event.preventDefault();
+ var colour2 = this.value;
+ if (!isColourValid(colour2))
+ return;
+ utilGetSetValue(input, this.value);
+ change()();
+ updateColourPreview();
+ }, 100));
+ outlinkButton = outlinkButton.enter().append("div").attr("class", "form-field-button colour-preview").append("div").style("background-color", (d) => d).attr("class", "colour-box");
+ if (colour === "") {
+ outlinkButton = outlinkButton.call(svgIcon("#iD-icon-edit"));
+ }
+ outlinkButton.on("click", () => wrap2.select(".colour-selector").node().click()).merge(outlinkButton);
+ }
+ function updatePhonePlaceholder() {
+ if (input.empty() || !Object.keys(_phoneFormats).length)
+ return;
+ var extent = combinedEntityExtent();
+ var countryCode = extent && iso1A2Code(extent.center());
+ var format2 = countryCode && _phoneFormats[countryCode.toLowerCase()];
+ if (format2)
+ input.attr("placeholder", format2);
+ }
+ function validIdentifierValueForLink() {
+ const value = utilGetSetValue(input).trim();
+ if (field.type === "url" && value) {
+ try {
+ return new URL(value).href;
+ } catch (e) {
+ return null;
+ }
+ }
+ if (field.type === "identifier" && field.pattern) {
+ return value && value.match(new RegExp(field.pattern))[0];
+ }
+ return null;
+ }
+ function clamped(num) {
+ if (field.minValue !== void 0) {
+ num = Math.max(num, field.minValue);
+ }
+ if (field.maxValue !== void 0) {
+ num = Math.min(num, field.maxValue);
+ }
+ return num;
+ }
+ function change(onInput) {
+ return function() {
+ var t = {};
+ var val = utilGetSetValue(input);
+ if (!onInput)
+ val = context.cleanTagValue(val);
+ if (!val && Array.isArray(_tags[field.key]))
+ return;
+ if (!onInput) {
+ if (field.type === "number" && val) {
+ var vals = val.split(";");
+ vals = vals.map(function(v) {
+ var num = parseFloat(v.trim(), 10);
+ return isFinite(num) ? clamped(num) : v.trim();
+ });
+ val = vals.join(";");
+ }
+ utilGetSetValue(input, val);
+ }
+ t[field.key] = val || void 0;
+ dispatch10.call("change", this, t, onInput);
+ };
+ }
+ i2.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ return i2;
+ };
+ i2.tags = function(tags) {
+ _tags = tags;
+ var isMixed = Array.isArray(tags[field.key]);
+ utilGetSetValue(input, !isMixed && tags[field.key] ? tags[field.key] : "").attr("title", isMixed ? tags[field.key].filter(Boolean).join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder() || _t("inspector.unknown")).classed("mixed", isMixed);
+ if (field.key.split(":").includes("colour"))
+ updateColourPreview();
+ if (outlinkButton && !outlinkButton.empty()) {
+ var disabled = !validIdentifierValueForLink();
+ outlinkButton.classed("disabled", disabled);
+ }
+ };
+ i2.focus = function() {
+ var node = input.node();
+ if (node)
+ node.focus();
+ };
+ function combinedEntityExtent() {
+ return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
+ }
+ return utilRebind(i2, dispatch10, "on");
+ }
+
+ // modules/ui/fields/access.js
+ function uiFieldAccess(field, context) {
+ var dispatch10 = dispatch_default("change");
+ var items = select_default2(null);
+ var _tags;
+ function access(selection2) {
+ var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
+ var list = wrap2.selectAll("ul").data([0]);
+ list = list.enter().append("ul").attr("class", "rows").merge(list);
+ items = list.selectAll("li").data(field.keys);
+ var enter = items.enter().append("li").attr("class", function(d) {
+ return "labeled-input preset-access-" + d;
+ });
+ enter.append("span").attr("class", "label preset-label-access").attr("for", function(d) {
+ return "preset-input-access-" + d;
+ }).html(function(d) {
+ return field.t.html("types." + d);
+ });
+ enter.append("div").attr("class", "preset-input-access-wrap").append("input").attr("type", "text").attr("class", function(d) {
+ return "preset-input-access preset-input-access-" + d;
+ }).call(utilNoAuto).each(function(d) {
+ select_default2(this).call(uiCombobox(context, "access-" + d).data(access.options(d)));
+ });
+ items = items.merge(enter);
+ wrap2.selectAll(".preset-input-access").on("change", change).on("blur", change);
+ }
+ function change(d3_event, d) {
+ var tag = {};
+ var value = context.cleanTagValue(utilGetSetValue(select_default2(this)));
+ if (!value && typeof _tags[d] !== "string")
+ return;
+ tag[d] = value || void 0;
+ dispatch10.call("change", this, tag);
+ }
+ access.options = function(type3) {
+ var options2 = [
+ "yes",
+ "no",
+ "designated",
+ "permissive",
+ "destination",
+ "customers",
+ "private",
+ "permit",
+ "unknown"
+ ];
+ if (type3 === "access") {
+ options2 = options2.filter((v) => v !== "yes" && v !== "designated");
+ }
+ if (type3 === "bicycle") {
+ options2.splice(options2.length - 4, 0, "dismount");
+ }
+ return options2.map(function(option) {
+ return {
+ title: field.t("options." + option + ".description"),
+ value: option
+ };
+ });
+ };
+ var placeholdersByHighway = {
+ footway: {
+ foot: "designated",
+ motor_vehicle: "no"
+ },
+ steps: {
+ foot: "yes",
+ motor_vehicle: "no",
+ bicycle: "no",
+ horse: "no"
+ },
+ pedestrian: {
+ foot: "yes",
+ motor_vehicle: "no"
+ },
+ cycleway: {
+ motor_vehicle: "no",
+ bicycle: "designated"
+ },
+ bridleway: {
+ motor_vehicle: "no",
+ horse: "designated"
+ },
+ path: {
+ foot: "yes",
+ motor_vehicle: "no",
+ bicycle: "yes",
+ horse: "yes"
+ },
+ motorway: {
+ foot: "no",
+ motor_vehicle: "yes",
+ bicycle: "no",
+ horse: "no"
+ },
+ trunk: {
+ motor_vehicle: "yes"
+ },
+ primary: {
+ foot: "yes",
+ motor_vehicle: "yes",
+ bicycle: "yes",
+ horse: "yes"
+ },
+ secondary: {
+ foot: "yes",
+ motor_vehicle: "yes",
+ bicycle: "yes",
+ horse: "yes"
+ },
+ tertiary: {
+ foot: "yes",
+ motor_vehicle: "yes",
+ bicycle: "yes",
+ horse: "yes"
+ },
+ residential: {
+ foot: "yes",
+ motor_vehicle: "yes",
+ bicycle: "yes",
+ horse: "yes"
+ },
+ unclassified: {
+ foot: "yes",
+ motor_vehicle: "yes",
+ bicycle: "yes",
+ horse: "yes"
+ },
+ service: {
+ foot: "yes",
+ motor_vehicle: "yes",
+ bicycle: "yes",
+ horse: "yes"
+ },
+ motorway_link: {
+ foot: "no",
+ motor_vehicle: "yes",
+ bicycle: "no",
+ horse: "no"
+ },
+ trunk_link: {
+ motor_vehicle: "yes"
+ },
+ primary_link: {
+ foot: "yes",
+ motor_vehicle: "yes",
+ bicycle: "yes",
+ horse: "yes"
+ },
+ secondary_link: {
+ foot: "yes",
+ motor_vehicle: "yes",
+ bicycle: "yes",
+ horse: "yes"
+ },
+ tertiary_link: {
+ foot: "yes",
+ motor_vehicle: "yes",
+ bicycle: "yes",
+ horse: "yes"
+ },
+ construction: {
+ access: "no"
+ }
+ };
+ access.tags = function(tags) {
+ _tags = tags;
+ utilGetSetValue(items.selectAll(".preset-input-access"), function(d) {
+ return typeof tags[d] === "string" ? tags[d] : "";
+ }).classed("mixed", function(d) {
+ return tags[d] && Array.isArray(tags[d]);
+ }).attr("title", function(d) {
+ return tags[d] && Array.isArray(tags[d]) && tags[d].filter(Boolean).join("\n");
+ }).attr("placeholder", function(d) {
+ if (tags[d] && Array.isArray(tags[d])) {
+ return _t("inspector.multiple_values");
+ }
+ if (d === "bicycle" || d === "motor_vehicle") {
+ if (tags.vehicle && typeof tags.vehicle === "string") {
+ return tags.vehicle;
+ }
+ }
+ if (tags.access && typeof tags.access === "string") {
+ return tags.access;
+ }
+ if (tags.highway) {
+ if (typeof tags.highway === "string") {
+ if (placeholdersByHighway[tags.highway] && placeholdersByHighway[tags.highway][d]) {
+ return placeholdersByHighway[tags.highway][d];
+ }
+ } else {
+ var impliedAccesses = tags.highway.filter(Boolean).map(function(highwayVal) {
+ return placeholdersByHighway[highwayVal] && placeholdersByHighway[highwayVal][d];
+ }).filter(Boolean);
+ if (impliedAccesses.length === tags.highway.length && new Set(impliedAccesses).size === 1) {
+ return impliedAccesses[0];
+ }
+ }
+ }
+ if (d === "access") {
+ return "yes";
+ }
+ return field.placeholder();
+ });
+ };
+ access.focus = function() {
+ items.selectAll(".preset-input-access").node().focus();
+ };
+ return utilRebind(access, dispatch10, "on");
+ }
+
+ // modules/ui/fields/address.js
+ function uiFieldAddress(field, context) {
+ var dispatch10 = dispatch_default("change");
+ var _selection = select_default2(null);
+ var _wrap = select_default2(null);
+ var addrField = _mainPresetIndex.field("address");
+ var _entityIDs = [];
+ var _tags;
+ var _countryCode;
+ var _addressFormats = [{
+ format: [
+ ["housenumber", "street"],
+ ["city", "postcode"]
+ ]
+ }];
+ _mainFileFetcher.get("address_formats").then(function(d) {
+ _addressFormats = d;
+ if (!_selection.empty()) {
+ _selection.call(address);
+ }
+ }).catch(function() {
+ });
+ function getNearStreets() {
+ var extent = combinedEntityExtent();
+ var l = extent.center();
+ var box = geoExtent(l).padByMeters(200);
+ var streets = context.history().intersects(box).filter(isAddressable).map(function(d) {
+ var loc = context.projection([
+ (extent[0][0] + extent[1][0]) / 2,
+ (extent[0][1] + extent[1][1]) / 2
+ ]);
+ var choice = geoChooseEdge(context.graph().childNodes(d), loc, context.projection);
+ return {
+ title: d.tags.name,
+ value: d.tags.name,
+ dist: choice.distance
+ };
+ }).sort(function(a, b) {
+ return a.dist - b.dist;
+ });
+ return utilArrayUniqBy(streets, "value");
+ function isAddressable(d) {
+ return d.tags.highway && d.tags.name && d.type === "way";
+ }
+ }
+ function getNearCities() {
+ var extent = combinedEntityExtent();
+ var l = extent.center();
+ var box = geoExtent(l).padByMeters(200);
+ var cities = context.history().intersects(box).filter(isAddressable).map(function(d) {
+ return {
+ title: d.tags["addr:city"] || d.tags.name,
+ value: d.tags["addr:city"] || d.tags.name,
+ dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
+ };
+ }).sort(function(a, b) {
+ return a.dist - b.dist;
+ });
+ return utilArrayUniqBy(cities, "value");
+ function isAddressable(d) {
+ if (d.tags.name) {
+ if (d.tags.admin_level === "8" && d.tags.boundary === "administrative")
+ return true;
+ if (d.tags.border_type === "city")
+ return true;
+ if (d.tags.place === "city" || d.tags.place === "town" || d.tags.place === "village")
+ return true;
+ }
+ if (d.tags["addr:city"])
+ return true;
+ return false;
+ }
+ }
+ function getNearValues(key) {
+ var extent = combinedEntityExtent();
+ var l = extent.center();
+ var box = geoExtent(l).padByMeters(200);
+ var results = context.history().intersects(box).filter(function hasTag(d) {
+ return _entityIDs.indexOf(d.id) === -1 && d.tags[key];
+ }).map(function(d) {
+ return {
+ title: d.tags[key],
+ value: d.tags[key],
+ dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
+ };
+ }).sort(function(a, b) {
+ return a.dist - b.dist;
+ });
+ return utilArrayUniqBy(results, "value");
+ }
+ function updateForCountryCode() {
+ if (!_countryCode)
+ return;
+ var addressFormat;
+ for (var i2 = 0; i2 < _addressFormats.length; i2++) {
+ var format2 = _addressFormats[i2];
+ if (!format2.countryCodes) {
+ addressFormat = format2;
+ } else if (format2.countryCodes.indexOf(_countryCode) !== -1) {
+ addressFormat = format2;
+ break;
+ }
+ }
+ var dropdowns = addressFormat.dropdowns || [
+ "city",
+ "county",
+ "country",
+ "district",
+ "hamlet",
+ "neighbourhood",
+ "place",
+ "postcode",
+ "province",
+ "quarter",
+ "state",
+ "street",
+ "subdistrict",
+ "suburb"
+ ];
+ var widths = addressFormat.widths || {
+ housenumber: 1 / 3,
+ street: 2 / 3,
+ city: 2 / 3,
+ state: 1 / 4,
+ postcode: 1 / 3
+ };
+ function row(r) {
+ var total = r.reduce(function(sum, key) {
+ return sum + (widths[key] || 0.5);
+ }, 0);
+ return r.map(function(key) {
+ return {
+ id: key,
+ width: (widths[key] || 0.5) / total
+ };
+ });
+ }
+ var rows = _wrap.selectAll(".addr-row").data(addressFormat.format, function(d) {
+ return d.toString();
+ });
+ rows.exit().remove();
+ rows.enter().append("div").attr("class", "addr-row").selectAll("input").data(row).enter().append("input").property("type", "text").call(updatePlaceholder).attr("class", function(d) {
+ return "addr-" + d.id;
+ }).call(utilNoAuto).each(addDropdown).style("width", function(d) {
+ return d.width * 100 + "%";
+ });
+ function addDropdown(d) {
+ if (dropdowns.indexOf(d.id) === -1)
+ return;
+ var nearValues = d.id === "street" ? getNearStreets : d.id === "city" ? getNearCities : getNearValues;
+ select_default2(this).call(uiCombobox(context, "address-" + d.id).minItems(1).caseSensitive(true).fetcher(function(value, callback) {
+ callback(nearValues("addr:" + d.id));
+ }));
+ }
+ _wrap.selectAll("input").on("blur", change()).on("change", change());
+ _wrap.selectAll("input:not(.combobox-input)").on("input", change(true));
+ if (_tags)
+ updateTags(_tags);
+ }
+ function address(selection2) {
+ _selection = selection2;
+ _wrap = selection2.selectAll(".form-field-input-wrap").data([0]);
+ _wrap = _wrap.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(_wrap);
+ var extent = combinedEntityExtent();
+ if (extent) {
+ var countryCode;
+ if (context.inIntro()) {
+ countryCode = _t("intro.graph.countrycode");
+ } else {
+ var center = extent.center();
+ countryCode = iso1A2Code(center);
+ }
+ if (countryCode) {
+ _countryCode = countryCode.toLowerCase();
+ updateForCountryCode();
+ }
+ }
+ }
+ function change(onInput) {
+ return function() {
+ var tags = {};
+ _wrap.selectAll("input").each(function(subfield) {
+ var key = field.key + ":" + subfield.id;
+ var value = this.value;
+ if (!onInput)
+ value = context.cleanTagValue(value);
+ if (Array.isArray(_tags[key]) && !value)
+ return;
+ tags[key] = value || void 0;
+ });
+ dispatch10.call("change", this, tags, onInput);
+ };
+ }
+ function updatePlaceholder(inputSelection) {
+ return inputSelection.attr("placeholder", function(subfield) {
+ if (_tags && Array.isArray(_tags[field.key + ":" + subfield.id])) {
+ return _t("inspector.multiple_values");
+ }
+ if (_countryCode) {
+ var localkey = subfield.id + "!" + _countryCode;
+ var tkey = addrField.hasTextForStringId("placeholders." + localkey) ? localkey : subfield.id;
+ return addrField.t("placeholders." + tkey);
+ }
+ });
+ }
+ function updateTags(tags) {
+ utilGetSetValue(_wrap.selectAll("input"), function(subfield) {
+ var val = tags[field.key + ":" + subfield.id];
+ return typeof val === "string" ? val : "";
+ }).attr("title", function(subfield) {
+ var val = tags[field.key + ":" + subfield.id];
+ return val && Array.isArray(val) ? val.filter(Boolean).join("\n") : void 0;
+ }).classed("mixed", function(subfield) {
+ return Array.isArray(tags[field.key + ":" + subfield.id]);
+ }).call(updatePlaceholder);
+ }
+ function combinedEntityExtent() {
+ return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
+ }
+ address.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ return address;
+ };
+ address.tags = function(tags) {
+ _tags = tags;
+ updateTags(tags);
+ };
+ address.focus = function() {
+ var node = _wrap.selectAll("input").node();
+ if (node)
+ node.focus();
+ };
+ return utilRebind(address, dispatch10, "on");
+ }
+
+ // modules/ui/fields/cycleway.js
+ function uiFieldCycleway(field, context) {
+ var dispatch10 = dispatch_default("change");
+ var items = select_default2(null);
+ var wrap2 = select_default2(null);
+ var _tags;
+ function cycleway(selection2) {
+ function stripcolon(s) {
+ return s.replace(":", "");
+ }
+ wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
+ var div = wrap2.selectAll("ul").data([0]);
+ div = div.enter().append("ul").attr("class", "rows").merge(div);
+ var keys = ["cycleway:left", "cycleway:right"];
+ items = div.selectAll("li").data(keys);
+ var enter = items.enter().append("li").attr("class", function(d) {
+ return "labeled-input preset-cycleway-" + stripcolon(d);
+ });
+ enter.append("span").attr("class", "label preset-label-cycleway").attr("for", function(d) {
+ return "preset-input-cycleway-" + stripcolon(d);
+ }).html(function(d) {
+ return field.t.html("types." + d);
+ });
+ enter.append("div").attr("class", "preset-input-cycleway-wrap").append("input").attr("type", "text").attr("class", function(d) {
+ return "preset-input-cycleway preset-input-" + stripcolon(d);
+ }).call(utilNoAuto).each(function(d) {
+ select_default2(this).call(uiCombobox(context, "cycleway-" + stripcolon(d)).data(cycleway.options(d)));
+ });
+ items = items.merge(enter);
+ wrap2.selectAll(".preset-input-cycleway").on("change", change).on("blur", change);
+ }
+ function change(d3_event, key) {
+ var newValue = context.cleanTagValue(utilGetSetValue(select_default2(this)));
+ if (!newValue && (Array.isArray(_tags.cycleway) || Array.isArray(_tags[key])))
+ return;
+ if (newValue === "none" || newValue === "") {
+ newValue = void 0;
+ }
+ var otherKey = key === "cycleway:left" ? "cycleway:right" : "cycleway:left";
+ var otherValue = typeof _tags.cycleway === "string" ? _tags.cycleway : _tags[otherKey];
+ if (otherValue && Array.isArray(otherValue)) {
+ otherValue = otherValue[0];
+ }
+ if (otherValue === "none" || otherValue === "") {
+ otherValue = void 0;
+ }
+ var tag = {};
+ if (newValue === otherValue) {
+ tag = {
+ cycleway: newValue,
+ "cycleway:left": void 0,
+ "cycleway:right": void 0
+ };
+ } else {
+ tag = {
+ cycleway: void 0
+ };
+ tag[key] = newValue;
+ tag[otherKey] = otherValue;
+ }
+ dispatch10.call("change", this, tag);
+ }
+ cycleway.options = function() {
+ return field.options.map(function(option) {
+ return {
+ title: field.t("options." + option + ".description"),
+ value: option
+ };
+ });
+ };
+ cycleway.tags = function(tags) {
+ _tags = tags;
+ var commonValue = typeof tags.cycleway === "string" && tags.cycleway;
+ utilGetSetValue(items.selectAll(".preset-input-cycleway"), function(d) {
+ if (commonValue)
+ return commonValue;
+ return !tags.cycleway && typeof tags[d] === "string" ? tags[d] : "";
+ }).attr("title", function(d) {
+ if (Array.isArray(tags.cycleway) || Array.isArray(tags[d])) {
+ var vals = [];
+ if (Array.isArray(tags.cycleway)) {
+ vals = vals.concat(tags.cycleway);
+ }
+ if (Array.isArray(tags[d])) {
+ vals = vals.concat(tags[d]);
+ }
+ return vals.filter(Boolean).join("\n");
+ }
+ return null;
+ }).attr("placeholder", function(d) {
+ if (Array.isArray(tags.cycleway) || Array.isArray(tags[d])) {
+ return _t("inspector.multiple_values");
+ }
+ return field.placeholder();
+ }).classed("mixed", function(d) {
+ return Array.isArray(tags.cycleway) || Array.isArray(tags[d]);
+ });
+ };
+ cycleway.focus = function() {
+ var node = wrap2.selectAll("input").node();
+ if (node)
+ node.focus();
+ };
+ return utilRebind(cycleway, dispatch10, "on");
+ }
+
+ // modules/ui/fields/lanes.js
+ function uiFieldLanes(field, context) {
+ var dispatch10 = dispatch_default("change");
+ var LANE_WIDTH = 40;
+ var LANE_HEIGHT = 200;
+ var _entityIDs = [];
+ function lanes(selection2) {
+ var lanesData = context.entity(_entityIDs[0]).lanes();
+ if (!context.container().select(".inspector-wrap.inspector-hidden").empty() || !selection2.node().parentNode) {
+ selection2.call(lanes.off);
+ return;
+ }
+ var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
+ var surface = wrap2.selectAll(".surface").data([0]);
+ var d = utilGetDimensions(wrap2);
+ var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
+ surface = surface.enter().append("svg").attr("width", d[0]).attr("height", 300).attr("class", "surface").merge(surface);
+ var lanesSelection = surface.selectAll(".lanes").data([0]);
+ lanesSelection = lanesSelection.enter().append("g").attr("class", "lanes").merge(lanesSelection);
+ lanesSelection.attr("transform", function() {
+ return "translate(" + freeSpace / 2 + ", 0)";
+ });
+ var lane = lanesSelection.selectAll(".lane").data(lanesData.lanes);
+ lane.exit().remove();
+ var enter = lane.enter().append("g").attr("class", "lane");
+ enter.append("g").append("rect").attr("y", 50).attr("width", LANE_WIDTH).attr("height", LANE_HEIGHT);
+ enter.append("g").attr("class", "forward").append("text").attr("y", 40).attr("x", 14).text("\u25B2");
+ enter.append("g").attr("class", "bothways").append("text").attr("y", 40).attr("x", 14).text("\u25B2\u25BC");
+ enter.append("g").attr("class", "backward").append("text").attr("y", 40).attr("x", 14).text("\u25BC");
+ lane = lane.merge(enter);
+ lane.attr("transform", function(d2) {
+ return "translate(" + LANE_WIDTH * d2.index * 1.5 + ", 0)";
+ });
+ lane.select(".forward").style("visibility", function(d2) {
+ return d2.direction === "forward" ? "visible" : "hidden";
+ });
+ lane.select(".bothways").style("visibility", function(d2) {
+ return d2.direction === "bothways" ? "visible" : "hidden";
+ });
+ lane.select(".backward").style("visibility", function(d2) {
+ return d2.direction === "backward" ? "visible" : "hidden";
+ });
+ }
+ lanes.entityIDs = function(val) {
+ _entityIDs = val;
+ };
+ lanes.tags = function() {
+ };
+ lanes.focus = function() {
+ };
+ lanes.off = function() {
+ };
+ return utilRebind(lanes, dispatch10, "on");
+ }
+ uiFieldLanes.supportsMultiselection = false;
+
+ // modules/ui/fields/localized.js
+ var _languagesArray = [];
+ function uiFieldLocalized(field, context) {
+ var dispatch10 = dispatch_default("change", "input");
+ var wikipedia = services.wikipedia;
+ var input = select_default2(null);
+ var localizedInputs = select_default2(null);
+ var _countryCode;
+ var _tags;
+ _mainFileFetcher.get("languages").then(loadLanguagesArray).catch(function() {
+ });
+ var _territoryLanguages = {};
+ _mainFileFetcher.get("territory_languages").then(function(d) {
+ _territoryLanguages = d;
+ }).catch(function() {
+ });
+ var langCombo = uiCombobox(context, "localized-lang").fetcher(fetchLanguages).minItems(0);
+ var _selection = select_default2(null);
+ var _multilingual = [];
+ var _buttonTip = uiTooltip().title(_t.html("translate.translate")).placement("left");
+ var _wikiTitles;
+ var _entityIDs = [];
+ function loadLanguagesArray(dataLanguages) {
+ if (_languagesArray.length !== 0)
+ return;
+ var replacements = {
+ sr: "sr-Cyrl",
+ "sr-Cyrl": false
+ };
+ for (var code in dataLanguages) {
+ if (replacements[code] === false)
+ continue;
+ var metaCode = code;
+ if (replacements[code])
+ metaCode = replacements[code];
+ _languagesArray.push({
+ localName: _mainLocalizer.languageName(metaCode, { localOnly: true }),
+ nativeName: dataLanguages[metaCode].nativeName,
+ code,
+ label: _mainLocalizer.languageName(metaCode)
+ });
+ }
+ }
+ function calcLocked() {
+ var isLocked = field.id === "name" && _entityIDs.length && _entityIDs.some(function(entityID) {
+ var entity = context.graph().hasEntity(entityID);
+ if (!entity)
+ return false;
+ if (entity.tags.wikidata)
+ return true;
+ if (entity.tags["name:etymology:wikidata"])
+ return true;
+ var preset = _mainPresetIndex.match(entity, context.graph());
+ if (preset) {
+ var isSuggestion = preset.suggestion;
+ var fields = preset.fields();
+ var showsBrandField = fields.some(function(d) {
+ return d.id === "brand";
+ });
+ var showsOperatorField = fields.some(function(d) {
+ return d.id === "operator";
+ });
+ var setsName = preset.addTags.name;
+ var setsBrandWikidata = preset.addTags["brand:wikidata"];
+ var setsOperatorWikidata = preset.addTags["operator:wikidata"];
+ return isSuggestion && setsName && (setsBrandWikidata && !showsBrandField || setsOperatorWikidata && !showsOperatorField);
+ }
+ return false;
+ });
+ field.locked(isLocked);
+ }
+ function calcMultilingual(tags) {
+ var existingLangsOrdered = _multilingual.map(function(item2) {
+ return item2.lang;
+ });
+ var existingLangs = new Set(existingLangsOrdered.filter(Boolean));
+ for (var k in tags) {
+ var m = k.match(/^(.*):([a-z]{2,3}(?:-[A-Z][a-z]{3})?(?:-[A-Z]{2})?)$/);
+ if (m && m[1] === field.key && m[2]) {
+ var item = { lang: m[2], value: tags[k] };
+ if (existingLangs.has(item.lang)) {
+ _multilingual[existingLangsOrdered.indexOf(item.lang)].value = item.value;
+ existingLangs.delete(item.lang);
+ } else {
+ _multilingual.push(item);
+ }
+ }
+ }
+ _multilingual.forEach(function(item2) {
+ if (item2.lang && existingLangs.has(item2.lang)) {
+ item2.value = "";
+ }
+ });
+ }
+ function localized(selection2) {
+ _selection = selection2;
+ calcLocked();
+ var isLocked = field.locked();
+ var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
+ input = wrap2.selectAll(".localized-main").data([0]);
+ input = input.enter().append("input").attr("type", "text").attr("id", field.domId).attr("class", "localized-main").call(utilNoAuto).merge(input);
+ input.classed("disabled", !!isLocked).attr("readonly", isLocked || null).on("input", change(true)).on("blur", change()).on("change", change());
+ var translateButton = wrap2.selectAll(".localized-add").data([0]);
+ translateButton = translateButton.enter().append("button").attr("class", "localized-add form-field-button").attr("aria-label", _t("icons.plus")).call(svgIcon("#iD-icon-plus")).merge(translateButton);
+ translateButton.classed("disabled", !!isLocked).call(isLocked ? _buttonTip.destroy : _buttonTip).on("click", addNew);
+ if (_tags && !_multilingual.length) {
+ calcMultilingual(_tags);
+ }
+ localizedInputs = selection2.selectAll(".localized-multilingual").data([0]);
+ localizedInputs = localizedInputs.enter().append("div").attr("class", "localized-multilingual").merge(localizedInputs);
+ localizedInputs.call(renderMultilingual);
+ localizedInputs.selectAll("button, input").classed("disabled", !!isLocked).attr("readonly", isLocked || null);
+ selection2.selectAll(".combobox-caret").classed("nope", true);
+ function addNew(d3_event) {
+ d3_event.preventDefault();
+ if (field.locked())
+ return;
+ var defaultLang = _mainLocalizer.languageCode().toLowerCase();
+ var langExists = _multilingual.find(function(datum2) {
+ return datum2.lang === defaultLang;
+ });
+ var isLangEn = defaultLang.indexOf("en") > -1;
+ if (isLangEn || langExists) {
+ defaultLang = "";
+ langExists = _multilingual.find(function(datum2) {
+ return datum2.lang === defaultLang;
+ });
+ }
+ if (!langExists) {
+ _multilingual.unshift({ lang: defaultLang, value: "" });
+ localizedInputs.call(renderMultilingual);
+ }
+ }
+ function change(onInput) {
+ return function(d3_event) {
+ if (field.locked()) {
+ d3_event.preventDefault();
+ return;
+ }
+ var val = utilGetSetValue(select_default2(this));
+ if (!onInput)
+ val = context.cleanTagValue(val);
+ if (!val && Array.isArray(_tags[field.key]))
+ return;
+ var t = {};
+ t[field.key] = val || void 0;
+ dispatch10.call("change", this, t, onInput);
+ };
+ }
+ }
+ function key(lang) {
+ return field.key + ":" + lang;
+ }
+ function changeLang(d3_event, d) {
+ var tags = {};
+ var lang = utilGetSetValue(select_default2(this)).toLowerCase();
+ var language = _languagesArray.find(function(d2) {
+ return d2.label.toLowerCase() === lang || d2.localName && d2.localName.toLowerCase() === lang || d2.nativeName && d2.nativeName.toLowerCase() === lang;
+ });
+ if (language)
+ lang = language.code;
+ if (d.lang && d.lang !== lang) {
+ tags[key(d.lang)] = void 0;
+ }
+ var newKey = lang && context.cleanTagKey(key(lang));
+ var value = utilGetSetValue(select_default2(this.parentNode).selectAll(".localized-value"));
+ if (newKey && value) {
+ tags[newKey] = value;
+ } else if (newKey && _wikiTitles && _wikiTitles[d.lang]) {
+ tags[newKey] = _wikiTitles[d.lang];
+ }
+ d.lang = lang;
+ dispatch10.call("change", this, tags);
+ }
+ function changeValue(d3_event, d) {
+ if (!d.lang)
+ return;
+ var value = context.cleanTagValue(utilGetSetValue(select_default2(this))) || void 0;
+ if (!value && Array.isArray(d.value))
+ return;
+ var t = {};
+ t[key(d.lang)] = value;
+ d.value = value;
+ dispatch10.call("change", this, t);
+ }
+ function fetchLanguages(value, cb) {
+ var v = value.toLowerCase();
+ var langCodes = [_mainLocalizer.localeCode(), _mainLocalizer.languageCode()];
+ if (_countryCode && _territoryLanguages[_countryCode]) {
+ langCodes = langCodes.concat(_territoryLanguages[_countryCode]);
+ }
+ var langItems = [];
+ langCodes.forEach(function(code) {
+ var langItem = _languagesArray.find(function(item) {
+ return item.code === code;
+ });
+ if (langItem)
+ langItems.push(langItem);
+ });
+ langItems = utilArrayUniq(langItems.concat(_languagesArray));
+ cb(langItems.filter(function(d) {
+ return d.label.toLowerCase().indexOf(v) >= 0 || d.localName && d.localName.toLowerCase().indexOf(v) >= 0 || d.nativeName && d.nativeName.toLowerCase().indexOf(v) >= 0 || d.code.toLowerCase().indexOf(v) >= 0;
+ }).map(function(d) {
+ return { value: d.label };
+ }));
+ }
+ function renderMultilingual(selection2) {
+ var entries = selection2.selectAll("div.entry").data(_multilingual, function(d) {
+ return d.lang;
+ });
+ entries.exit().style("top", "0").style("max-height", "240px").transition().duration(200).style("opacity", "0").style("max-height", "0px").remove();
+ var entriesEnter = entries.enter().append("div").attr("class", "entry").each(function(_, index) {
+ var wrap2 = select_default2(this);
+ var domId = utilUniqueDomId(index);
+ var label = wrap2.append("label").attr("class", "field-label").attr("for", domId);
+ var text2 = label.append("span").attr("class", "label-text");
+ text2.append("span").attr("class", "label-textvalue").call(_t.append("translate.localized_translation_label"));
+ text2.append("span").attr("class", "label-textannotation");
+ label.append("button").attr("class", "remove-icon-multilingual").attr("title", _t("icons.remove")).on("click", function(d3_event, d) {
+ if (field.locked())
+ return;
+ d3_event.preventDefault();
+ _multilingual.splice(_multilingual.indexOf(d), 1);
+ var langKey = d.lang && key(d.lang);
+ if (langKey && langKey in _tags) {
+ delete _tags[langKey];
+ var t = {};
+ t[langKey] = void 0;
+ dispatch10.call("change", this, t);
+ return;
+ }
+ renderMultilingual(selection2);
+ }).call(svgIcon("#iD-operation-delete"));
+ wrap2.append("input").attr("class", "localized-lang").attr("id", domId).attr("type", "text").attr("placeholder", _t("translate.localized_translation_language")).on("blur", changeLang).on("change", changeLang).call(langCombo);
+ wrap2.append("input").attr("type", "text").attr("class", "localized-value").on("blur", changeValue).on("change", changeValue);
+ });
+ entriesEnter.style("margin-top", "0px").style("max-height", "0px").style("opacity", "0").transition().duration(200).style("margin-top", "10px").style("max-height", "240px").style("opacity", "1").on("end", function() {
+ select_default2(this).style("max-height", "").style("overflow", "visible");
+ });
+ entries = entries.merge(entriesEnter);
+ entries.order();
+ entries.classed("present", true);
+ utilGetSetValue(entries.select(".localized-lang"), function(d) {
+ var langItem = _languagesArray.find(function(item) {
+ return item.code === d.lang;
+ });
+ if (langItem)
+ return langItem.label;
+ return d.lang;
+ });
+ utilGetSetValue(entries.select(".localized-value"), function(d) {
+ return typeof d.value === "string" ? d.value : "";
+ }).attr("title", function(d) {
+ return Array.isArray(d.value) ? d.value.filter(Boolean).join("\n") : null;
+ }).attr("placeholder", function(d) {
+ return Array.isArray(d.value) ? _t("inspector.multiple_values") : _t("translate.localized_translation_name");
+ }).classed("mixed", function(d) {
+ return Array.isArray(d.value);
+ });
+ }
+ localized.tags = function(tags) {
+ _tags = tags;
+ if (typeof tags.wikipedia === "string" && !_wikiTitles) {
+ _wikiTitles = {};
+ var wm = tags.wikipedia.match(/([^:]+):(.+)/);
+ if (wm && wm[0] && wm[1]) {
+ wikipedia.translations(wm[1], wm[2], function(err, d) {
+ if (err || !d)
+ return;
+ _wikiTitles = d;
+ });
+ }
+ }
+ var isMixed = Array.isArray(tags[field.key]);
+ utilGetSetValue(input, typeof tags[field.key] === "string" ? tags[field.key] : "").attr("title", isMixed ? tags[field.key].filter(Boolean).join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder()).classed("mixed", isMixed);
+ calcMultilingual(tags);
+ _selection.call(localized);
+ };
+ localized.focus = function() {
+ input.node().focus();
+ };
+ localized.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ _multilingual = [];
+ loadCountryCode();
+ return localized;
+ };
+ function loadCountryCode() {
+ var extent = combinedEntityExtent();
+ var countryCode = extent && iso1A2Code(extent.center());
+ _countryCode = countryCode && countryCode.toLowerCase();
+ }
+ function combinedEntityExtent() {
+ return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
+ }
+ return utilRebind(localized, dispatch10, "on");
+ }
+
+ // modules/ui/fields/roadheight.js
+ function uiFieldRoadheight(field, context) {
+ var dispatch10 = dispatch_default("change");
+ var primaryUnitInput = select_default2(null);
+ var primaryInput = select_default2(null);
+ var secondaryInput = select_default2(null);
+ var secondaryUnitInput = select_default2(null);
+ var _entityIDs = [];
+ var _tags;
+ var _isImperial;
+ var primaryUnits = [
+ {
+ value: "m",
+ title: _t("inspector.roadheight.meter")
+ },
+ {
+ value: "ft",
+ title: _t("inspector.roadheight.foot")
+ }
+ ];
+ var unitCombo = uiCombobox(context, "roadheight-unit").data(primaryUnits);
+ function roadheight(selection2) {
+ var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
+ primaryInput = wrap2.selectAll("input.roadheight-number").data([0]);
+ primaryInput = primaryInput.enter().append("input").attr("type", "text").attr("class", "roadheight-number").attr("id", field.domId).call(utilNoAuto).merge(primaryInput);
+ primaryInput.on("change", change).on("blur", change);
+ var loc = combinedEntityExtent().center();
+ _isImperial = roadHeightUnit(loc) === "ft";
+ primaryUnitInput = wrap2.selectAll("input.roadheight-unit").data([0]);
+ primaryUnitInput = primaryUnitInput.enter().append("input").attr("type", "text").attr("class", "roadheight-unit").call(unitCombo).merge(primaryUnitInput);
+ primaryUnitInput.on("blur", changeUnits).on("change", changeUnits);
+ secondaryInput = wrap2.selectAll("input.roadheight-secondary-number").data([0]);
+ secondaryInput = secondaryInput.enter().append("input").attr("type", "text").attr("class", "roadheight-secondary-number").call(utilNoAuto).merge(secondaryInput);
+ secondaryInput.on("change", change).on("blur", change);
+ secondaryUnitInput = wrap2.selectAll("input.roadheight-secondary-unit").data([0]);
+ secondaryUnitInput = secondaryUnitInput.enter().append("input").attr("type", "text").call(utilNoAuto).classed("disabled", true).classed("roadheight-secondary-unit", true).attr("readonly", "readonly").merge(secondaryUnitInput);
+ function changeUnits() {
+ _isImperial = utilGetSetValue(primaryUnitInput) === "ft";
+ utilGetSetValue(primaryUnitInput, _isImperial ? "ft" : "m");
+ setUnitSuggestions();
+ change();
+ }
+ }
+ function setUnitSuggestions() {
+ utilGetSetValue(primaryUnitInput, _isImperial ? "ft" : "m");
+ }
+ function change() {
+ var tag = {};
+ var primaryValue = utilGetSetValue(primaryInput).trim();
+ var secondaryValue = utilGetSetValue(secondaryInput).trim();
+ if (!primaryValue && !secondaryValue && Array.isArray(_tags[field.key]))
+ return;
+ if (!primaryValue && !secondaryValue) {
+ tag[field.key] = void 0;
+ } else if (isNaN(primaryValue) || isNaN(secondaryValue) || !_isImperial) {
+ tag[field.key] = context.cleanTagValue(primaryValue);
+ } else {
+ if (primaryValue !== "") {
+ primaryValue = context.cleanTagValue(primaryValue + "'");
+ }
+ if (secondaryValue !== "") {
+ secondaryValue = context.cleanTagValue(secondaryValue + '"');
+ }
+ tag[field.key] = primaryValue + secondaryValue;
+ }
+ dispatch10.call("change", this, tag);
+ }
+ roadheight.tags = function(tags) {
+ _tags = tags;
+ var primaryValue = tags[field.key];
+ var secondaryValue;
+ var isMixed = Array.isArray(primaryValue);
+ if (!isMixed) {
+ if (primaryValue && (primaryValue.indexOf("'") >= 0 || primaryValue.indexOf('"') >= 0)) {
+ secondaryValue = primaryValue.match(/(-?[\d.]+)"/);
+ if (secondaryValue !== null) {
+ secondaryValue = secondaryValue[1];
+ }
+ primaryValue = primaryValue.match(/(-?[\d.]+)'/);
+ if (primaryValue !== null) {
+ primaryValue = primaryValue[1];
+ }
+ _isImperial = true;
+ } else if (primaryValue) {
+ _isImperial = false;
+ }
+ }
+ setUnitSuggestions();
+ utilGetSetValue(primaryInput, typeof primaryValue === "string" ? primaryValue : "").attr("title", isMixed ? primaryValue.filter(Boolean).join("\n") : null).attr("placeholder", isMixed ? _t("inspector.multiple_values") : _t("inspector.unknown")).classed("mixed", isMixed);
+ utilGetSetValue(secondaryInput, typeof secondaryValue === "string" ? secondaryValue : "").attr("placeholder", isMixed ? _t("inspector.multiple_values") : _isImperial ? "0" : null).classed("mixed", isMixed).classed("disabled", !_isImperial).attr("readonly", _isImperial ? null : "readonly");
+ secondaryUnitInput.attr("value", _isImperial ? _t("inspector.roadheight.inch") : null);
+ };
+ roadheight.focus = function() {
+ primaryInput.node().focus();
+ };
+ roadheight.entityIDs = function(val) {
+ _entityIDs = val;
+ };
+ function combinedEntityExtent() {
+ return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
+ }
+ return utilRebind(roadheight, dispatch10, "on");
+ }
+
+ // modules/ui/fields/roadspeed.js
+ function uiFieldRoadspeed(field, context) {
+ var dispatch10 = dispatch_default("change");
+ var unitInput = select_default2(null);
+ var input = select_default2(null);
+ var _entityIDs = [];
+ var _tags;
+ var _isImperial;
+ var speedCombo = uiCombobox(context, "roadspeed");
+ var unitCombo = uiCombobox(context, "roadspeed-unit").data(["km/h", "mph"].map(comboValues));
+ var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
+ var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
+ function roadspeed(selection2) {
+ var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
+ input = wrap2.selectAll("input.roadspeed-number").data([0]);
+ input = input.enter().append("input").attr("type", "text").attr("class", "roadspeed-number").attr("id", field.domId).call(utilNoAuto).call(speedCombo).merge(input);
+ input.on("change", change).on("blur", change);
+ var loc = combinedEntityExtent().center();
+ _isImperial = roadSpeedUnit(loc) === "mph";
+ unitInput = wrap2.selectAll("input.roadspeed-unit").data([0]);
+ unitInput = unitInput.enter().append("input").attr("type", "text").attr("class", "roadspeed-unit").attr("aria-label", _t("inspector.speed_unit")).call(unitCombo).merge(unitInput);
+ unitInput.on("blur", changeUnits).on("change", changeUnits);
+ function changeUnits() {
+ _isImperial = utilGetSetValue(unitInput) === "mph";
+ utilGetSetValue(unitInput, _isImperial ? "mph" : "km/h");
+ setUnitSuggestions();
+ change();
+ }
+ }
+ function setUnitSuggestions() {
+ speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
+ utilGetSetValue(unitInput, _isImperial ? "mph" : "km/h");
+ }
+ function comboValues(d) {
+ return {
+ value: d.toString(),
+ title: d.toString()
+ };
+ }
+ function change() {
+ var tag = {};
+ var value = utilGetSetValue(input).trim();
+ if (!value && Array.isArray(_tags[field.key]))
+ return;
+ if (!value) {
+ tag[field.key] = void 0;
+ } else if (isNaN(value) || !_isImperial) {
+ tag[field.key] = context.cleanTagValue(value);
+ } else {
+ tag[field.key] = context.cleanTagValue(value + " mph");
+ }
+ dispatch10.call("change", this, tag);
+ }
+ roadspeed.tags = function(tags) {
+ _tags = tags;
+ var value = tags[field.key];
+ var isMixed = Array.isArray(value);
+ if (!isMixed) {
+ if (value && value.indexOf("mph") >= 0) {
+ value = parseInt(value, 10).toString();
+ _isImperial = true;
+ } else if (value) {
+ _isImperial = false;
+ }
+ }
+ setUnitSuggestions();
+ utilGetSetValue(input, typeof value === "string" ? value : "").attr("title", isMixed ? value.filter(Boolean).join("\n") : null).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder()).classed("mixed", isMixed);
+ };
+ roadspeed.focus = function() {
+ input.node().focus();
+ };
+ roadspeed.entityIDs = function(val) {
+ _entityIDs = val;
+ };
+ function combinedEntityExtent() {
+ return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
+ }
+ return utilRebind(roadspeed, dispatch10, "on");
+ }
+
+ // modules/ui/fields/radio.js
+ function uiFieldRadio(field, context) {
+ var dispatch10 = dispatch_default("change");
+ var placeholder = select_default2(null);
+ var wrap2 = select_default2(null);
+ var labels = select_default2(null);
+ var radios = select_default2(null);
+ var radioData = (field.options || field.keys).slice();
+ var typeField;
+ var layerField;
+ var _oldType = {};
+ var _entityIDs = [];
+ function selectedKey() {
+ var node = wrap2.selectAll(".form-field-input-radio label.active input");
+ return !node.empty() && node.datum();
+ }
+ function radio(selection2) {
+ selection2.classed("preset-radio", true);
+ wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
+ var enter = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-radio");
+ enter.append("span").attr("class", "placeholder");
+ wrap2 = wrap2.merge(enter);
+ placeholder = wrap2.selectAll(".placeholder");
+ labels = wrap2.selectAll("label").data(radioData);
+ enter = labels.enter().append("label");
+ enter.append("input").attr("type", "radio").attr("name", field.id).attr("value", function(d) {
+ return field.t("options." + d, { "default": d });
+ }).attr("checked", false);
+ enter.append("span").html(function(d) {
+ return field.t.html("options." + d, { "default": d });
+ });
+ labels = labels.merge(enter);
+ radios = labels.selectAll("input").on("change", changeRadio);
+ }
+ function structureExtras(selection2, tags) {
+ var selected = selectedKey() || tags.layer !== void 0;
+ var type3 = _mainPresetIndex.field(selected);
+ var layer = _mainPresetIndex.field("layer");
+ var showLayer = selected === "bridge" || selected === "tunnel" || tags.layer !== void 0;
+ var extrasWrap = selection2.selectAll(".structure-extras-wrap").data(selected ? [0] : []);
+ extrasWrap.exit().remove();
+ extrasWrap = extrasWrap.enter().append("div").attr("class", "structure-extras-wrap").merge(extrasWrap);
+ var list = extrasWrap.selectAll("ul").data([0]);
+ list = list.enter().append("ul").attr("class", "rows").merge(list);
+ if (type3) {
+ if (!typeField || typeField.id !== selected) {
+ typeField = uiField(context, type3, _entityIDs, { wrap: false }).on("change", changeType);
+ }
+ typeField.tags(tags);
+ } else {
+ typeField = null;
+ }
+ var typeItem = list.selectAll(".structure-type-item").data(typeField ? [typeField] : [], function(d) {
+ return d.id;
+ });
+ typeItem.exit().remove();
+ var typeEnter = typeItem.enter().insert("li", ":first-child").attr("class", "labeled-input structure-type-item");
+ typeEnter.append("span").attr("class", "label structure-label-type").attr("for", "preset-input-" + selected).call(_t.append("inspector.radio.structure.type"));
+ typeEnter.append("div").attr("class", "structure-input-type-wrap");
+ typeItem = typeItem.merge(typeEnter);
+ if (typeField) {
+ typeItem.selectAll(".structure-input-type-wrap").call(typeField.render);
+ }
+ if (layer && showLayer) {
+ if (!layerField) {
+ layerField = uiField(context, layer, _entityIDs, { wrap: false }).on("change", changeLayer);
+ }
+ layerField.tags(tags);
+ field.keys = utilArrayUnion(field.keys, ["layer"]);
+ } else {
+ layerField = null;
+ field.keys = field.keys.filter(function(k) {
+ return k !== "layer";
+ });
+ }
+ var layerItem = list.selectAll(".structure-layer-item").data(layerField ? [layerField] : []);
+ layerItem.exit().remove();
+ var layerEnter = layerItem.enter().append("li").attr("class", "labeled-input structure-layer-item");
+ layerEnter.append("span").attr("class", "label structure-label-layer").attr("for", "preset-input-layer").call(_t.append("inspector.radio.structure.layer"));
+ layerEnter.append("div").attr("class", "structure-input-layer-wrap");
+ layerItem = layerItem.merge(layerEnter);
+ if (layerField) {
+ layerItem.selectAll(".structure-input-layer-wrap").call(layerField.render);
+ }
+ }
+ function changeType(t, onInput) {
+ var key = selectedKey();
+ if (!key)
+ return;
+ var val = t[key];
+ if (val !== "no") {
+ _oldType[key] = val;
+ }
+ if (field.type === "structureRadio") {
+ if (val === "no" || key !== "bridge" && key !== "tunnel" || key === "tunnel" && val === "building_passage") {
+ t.layer = void 0;
+ }
+ if (t.layer === void 0) {
+ if (key === "bridge" && val !== "no") {
+ t.layer = "1";
+ }
+ if (key === "tunnel" && val !== "no" && val !== "building_passage") {
+ t.layer = "-1";
+ }
+ }
+ }
+ dispatch10.call("change", this, t, onInput);
+ }
+ function changeLayer(t, onInput) {
+ if (t.layer === "0") {
+ t.layer = void 0;
+ }
+ dispatch10.call("change", this, t, onInput);
+ }
+ function changeRadio() {
+ var t = {};
+ var activeKey;
+ if (field.key) {
+ t[field.key] = void 0;
+ }
+ radios.each(function(d) {
+ var active = select_default2(this).property("checked");
+ if (active)
+ activeKey = d;
+ if (field.key) {
+ if (active)
+ t[field.key] = d;
+ } else {
+ var val = _oldType[activeKey] || "yes";
+ t[d] = active ? val : void 0;
+ }
+ });
+ if (field.type === "structureRadio") {
+ if (activeKey === "bridge") {
+ t.layer = "1";
+ } else if (activeKey === "tunnel" && t.tunnel !== "building_passage") {
+ t.layer = "-1";
+ } else {
+ t.layer = void 0;
+ }
+ }
+ dispatch10.call("change", this, t);
+ }
+ radio.tags = function(tags) {
+ function isOptionChecked(d) {
+ if (field.key) {
+ return tags[field.key] === d;
+ }
+ return !!(typeof tags[d] === "string" && tags[d].toLowerCase() !== "no");
+ }
+ function isMixed(d) {
+ if (field.key) {
+ return Array.isArray(tags[field.key]) && tags[field.key].includes(d);
+ }
+ return Array.isArray(tags[d]);
+ }
+ radios.property("checked", function(d) {
+ return isOptionChecked(d) && (field.key || field.options.filter(isOptionChecked).length === 1);
+ });
+ labels.classed("active", function(d) {
+ if (field.key) {
+ return Array.isArray(tags[field.key]) && tags[field.key].includes(d) || tags[field.key] === d;
+ }
+ return Array.isArray(tags[d]) && tags[d].some((v) => typeof v === "string" && v.toLowerCase() !== "no") || !!(typeof tags[d] === "string" && tags[d].toLowerCase() !== "no");
+ }).classed("mixed", isMixed).attr("title", function(d) {
+ return isMixed(d) ? _t("inspector.unshared_value_tooltip") : null;
+ });
+ var selection2 = radios.filter(function() {
+ return this.checked;
+ });
+ if (selection2.empty()) {
+ placeholder.text("");
+ placeholder.call(_t.append("inspector.none"));
+ } else {
+ placeholder.text(selection2.attr("value"));
+ _oldType[selection2.datum()] = tags[selection2.datum()];
+ }
+ if (field.type === "structureRadio") {
+ if (!!tags.waterway && !_oldType.tunnel) {
+ _oldType.tunnel = "culvert";
+ }
+ wrap2.call(structureExtras, tags);
+ }
+ };
+ radio.focus = function() {
+ radios.node().focus();
+ };
+ radio.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ _oldType = {};
+ return radio;
+ };
+ radio.isAllowed = function() {
+ return _entityIDs.length === 1;
+ };
+ return utilRebind(radio, dispatch10, "on");
+ }
+
+ // modules/ui/fields/restrictions.js
+ function uiFieldRestrictions(field, context) {
+ var dispatch10 = dispatch_default("change");
+ var breathe = behaviorBreathe(context);
+ corePreferences("turn-restriction-via-way", null);
+ var storedViaWay = corePreferences("turn-restriction-via-way0");
+ var storedDistance = corePreferences("turn-restriction-distance");
+ var _maxViaWay = storedViaWay !== null ? +storedViaWay : 0;
+ var _maxDistance = storedDistance ? +storedDistance : 30;
+ var _initialized2 = false;
+ var _parent = select_default2(null);
+ var _container = select_default2(null);
+ var _oldTurns;
+ var _graph;
+ var _vertexID;
+ var _intersection;
+ var _fromWayID;
+ var _lastXPos;
+ function restrictions(selection2) {
+ _parent = selection2;
+ if (_vertexID && (context.graph() !== _graph || !_intersection)) {
+ _graph = context.graph();
+ _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
+ }
+ var isOK = _intersection && _intersection.vertices.length && _intersection.vertices.filter(function(vertex) {
+ return vertex.id === _vertexID;
+ }).length && _intersection.ways.length > 2 && _intersection.ways.filter(function(way) {
+ return way.__to;
+ }).length > 1;
+ select_default2(selection2.node().parentNode).classed("hide", !isOK);
+ if (!isOK || !context.container().select(".inspector-wrap.inspector-hidden").empty() || !selection2.node().parentNode || !selection2.node().parentNode.parentNode) {
+ selection2.call(restrictions.off);
+ return;
+ }
+ var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
+ var container = wrap2.selectAll(".restriction-container").data([0]);
+ var containerEnter = container.enter().append("div").attr("class", "restriction-container");
+ containerEnter.append("div").attr("class", "restriction-help");
+ _container = containerEnter.merge(container).call(renderViewer);
+ var controls = wrap2.selectAll(".restriction-controls").data([0]);
+ controls.enter().append("div").attr("class", "restriction-controls-container").append("div").attr("class", "restriction-controls").merge(controls).call(renderControls);
+ }
+ function renderControls(selection2) {
+ var distControl = selection2.selectAll(".restriction-distance").data([0]);
+ distControl.exit().remove();
+ var distControlEnter = distControl.enter().append("div").attr("class", "restriction-control restriction-distance");
+ distControlEnter.append("span").attr("class", "restriction-control-label restriction-distance-label").call(_t.append("restriction.controls.distance", { suffix: ":" }));
+ distControlEnter.append("input").attr("class", "restriction-distance-input").attr("type", "range").attr("min", "20").attr("max", "50").attr("step", "5");
+ distControlEnter.append("span").attr("class", "restriction-distance-text");
+ selection2.selectAll(".restriction-distance-input").property("value", _maxDistance).on("input", function() {
+ var val = select_default2(this).property("value");
+ _maxDistance = +val;
+ _intersection = null;
+ _container.selectAll(".layer-osm .layer-turns *").remove();
+ corePreferences("turn-restriction-distance", _maxDistance);
+ _parent.call(restrictions);
+ });
+ selection2.selectAll(".restriction-distance-text").call(displayMaxDistance(_maxDistance));
+ var viaControl = selection2.selectAll(".restriction-via-way").data([0]);
+ viaControl.exit().remove();
+ var viaControlEnter = viaControl.enter().append("div").attr("class", "restriction-control restriction-via-way");
+ viaControlEnter.append("span").attr("class", "restriction-control-label restriction-via-way-label").call(_t.append("restriction.controls.via", { suffix: ":" }));
+ viaControlEnter.append("input").attr("class", "restriction-via-way-input").attr("type", "range").attr("min", "0").attr("max", "2").attr("step", "1");
+ viaControlEnter.append("span").attr("class", "restriction-via-way-text");
+ selection2.selectAll(".restriction-via-way-input").property("value", _maxViaWay).on("input", function() {
+ var val = select_default2(this).property("value");
+ _maxViaWay = +val;
+ _container.selectAll(".layer-osm .layer-turns *").remove();
+ corePreferences("turn-restriction-via-way0", _maxViaWay);
+ _parent.call(restrictions);
+ });
+ selection2.selectAll(".restriction-via-way-text").call(displayMaxVia(_maxViaWay));
+ }
+ function renderViewer(selection2) {
+ if (!_intersection)
+ return;
+ var vgraph = _intersection.graph;
+ var filter2 = utilFunctor(true);
+ var projection2 = geoRawMercator();
+ var sdims = utilGetDimensions(context.container().select(".sidebar"));
+ var d = [sdims[0] - 50, 370];
+ var c = geoVecScale(d, 0.5);
+ var z = 22;
+ projection2.scale(geoZoomToScale(z));
+ var extent = geoExtent();
+ for (var i2 = 0; i2 < _intersection.vertices.length; i2++) {
+ extent._extend(_intersection.vertices[i2].extent());
+ }
+ var padTop = 35;
+ if (_intersection.vertices.length > 1) {
+ var hPadding = Math.min(160, Math.max(110, d[0] * 0.4));
+ var vPadding = 160;
+ var tl = projection2([extent[0][0], extent[1][1]]);
+ var br = projection2([extent[1][0], extent[0][1]]);
+ var hFactor = (br[0] - tl[0]) / (d[0] - hPadding);
+ var vFactor = (br[1] - tl[1]) / (d[1] - vPadding - padTop);
+ var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
+ var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
+ z = z - Math.max(hZoomDiff, vZoomDiff);
+ projection2.scale(geoZoomToScale(z));
+ }
+ var extentCenter = projection2(extent.center());
+ extentCenter[1] = extentCenter[1] - padTop / 2;
+ projection2.translate(geoVecSubtract(c, extentCenter)).clipExtent([[0, 0], d]);
+ var drawLayers = svgLayers(projection2, context).only(["osm", "touch"]).dimensions(d);
+ var drawVertices = svgVertices(projection2, context);
+ var drawLines = svgLines(projection2, context);
+ var drawTurns = svgTurns(projection2, context);
+ var firstTime = selection2.selectAll(".surface").empty();
+ selection2.call(drawLayers);
+ var surface = selection2.selectAll(".surface").classed("tr", true);
+ if (firstTime) {
+ _initialized2 = true;
+ surface.call(breathe);
+ }
+ if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
+ _fromWayID = null;
+ _oldTurns = null;
+ }
+ surface.call(utilSetDimensions, d).call(drawVertices, vgraph, _intersection.vertices, filter2, extent, z).call(drawLines, vgraph, _intersection.ways, filter2).call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
+ surface.on("click.restrictions", click).on("mouseover.restrictions", mouseover);
+ surface.selectAll(".selected").classed("selected", false);
+ surface.selectAll(".related").classed("related", false);
+ var way;
+ if (_fromWayID) {
+ way = vgraph.entity(_fromWayID);
+ surface.selectAll("." + _fromWayID).classed("selected", true).classed("related", true);
+ }
+ document.addEventListener("resizeWindow", function() {
+ utilSetDimensions(_container, null);
+ redraw(1);
+ }, false);
+ updateHints(null);
+ function click(d3_event) {
+ surface.call(breathe.off).call(breathe);
+ var datum2 = d3_event.target.__data__;
+ var entity = datum2 && datum2.properties && datum2.properties.entity;
+ if (entity) {
+ datum2 = entity;
+ }
+ if (datum2 instanceof osmWay && (datum2.__from || datum2.__via)) {
+ _fromWayID = datum2.id;
+ _oldTurns = null;
+ redraw();
+ } else if (datum2 instanceof osmTurn) {
+ var actions, extraActions, turns, i3;
+ var restrictionType = osmInferRestriction(vgraph, datum2, projection2);
+ if (datum2.restrictionID && !datum2.direct) {
+ return;
+ } else if (datum2.restrictionID && !datum2.only) {
+ var seen = {};
+ var datumOnly = JSON.parse(JSON.stringify(datum2));
+ datumOnly.only = true;
+ restrictionType = restrictionType.replace(/^no/, "only");
+ turns = _intersection.turns(_fromWayID, 2);
+ extraActions = [];
+ _oldTurns = [];
+ for (i3 = 0; i3 < turns.length; i3++) {
+ var turn = turns[i3];
+ if (seen[turn.restrictionID])
+ continue;
+ if (turn.direct && turn.path[1] === datum2.path[1]) {
+ seen[turns[i3].restrictionID] = true;
+ turn.restrictionType = osmInferRestriction(vgraph, turn, projection2);
+ _oldTurns.push(turn);
+ extraActions.push(actionUnrestrictTurn(turn));
+ }
+ }
+ actions = _intersection.actions.concat(extraActions, [
+ actionRestrictTurn(datumOnly, restrictionType),
+ _t("operations.restriction.annotation.create")
+ ]);
+ } else if (datum2.restrictionID) {
+ turns = _oldTurns || [];
+ extraActions = [];
+ for (i3 = 0; i3 < turns.length; i3++) {
+ if (turns[i3].key !== datum2.key) {
+ extraActions.push(actionRestrictTurn(turns[i3], turns[i3].restrictionType));
+ }
+ }
+ _oldTurns = null;
+ actions = _intersection.actions.concat(extraActions, [
+ actionUnrestrictTurn(datum2),
+ _t("operations.restriction.annotation.delete")
+ ]);
+ } else {
+ actions = _intersection.actions.concat([
+ actionRestrictTurn(datum2, restrictionType),
+ _t("operations.restriction.annotation.create")
+ ]);
+ }
+ context.perform.apply(context, actions);
+ var s = surface.selectAll("." + datum2.key);
+ datum2 = s.empty() ? null : s.datum();
+ updateHints(datum2);
+ } else {
+ _fromWayID = null;
+ _oldTurns = null;
+ redraw();
+ }
+ }
+ function mouseover(d3_event) {
+ var datum2 = d3_event.target.__data__;
+ updateHints(datum2);
+ }
+ _lastXPos = _lastXPos || sdims[0];
+ function redraw(minChange) {
+ var xPos = -1;
+ if (minChange) {
+ xPos = utilGetDimensions(context.container().select(".sidebar"))[0];
+ }
+ if (!minChange || minChange && Math.abs(xPos - _lastXPos) >= minChange) {
+ if (context.hasEntity(_vertexID)) {
+ _lastXPos = xPos;
+ _container.call(renderViewer);
+ }
+ }
+ }
+ function highlightPathsFrom(wayID) {
+ surface.selectAll(".related").classed("related", false).classed("allow", false).classed("restrict", false).classed("only", false);
+ surface.selectAll("." + wayID).classed("related", true);
+ if (wayID) {
+ var turns = _intersection.turns(wayID, _maxViaWay);
+ for (var i3 = 0; i3 < turns.length; i3++) {
+ var turn = turns[i3];
+ var ids = [turn.to.way];
+ var klass = turn.no ? "restrict" : turn.only ? "only" : "allow";
+ if (turn.only || turns.length === 1) {
+ if (turn.via.ways) {
+ ids = ids.concat(turn.via.ways);
+ }
+ } else if (turn.to.way === wayID) {
+ continue;
+ }
+ surface.selectAll(utilEntitySelector(ids)).classed("related", true).classed("allow", klass === "allow").classed("restrict", klass === "restrict").classed("only", klass === "only");
+ }
+ }
+ }
+ function updateHints(datum2) {
+ var help = _container.selectAll(".restriction-help").html("");
+ var placeholders = {};
+ ["from", "via", "to"].forEach(function(k) {
+ placeholders[k] = { html: '<span class="qualifier">' + _t("restriction.help." + k) + "</span>" };
+ });
+ var entity = datum2 && datum2.properties && datum2.properties.entity;
+ if (entity) {
+ datum2 = entity;
+ }
+ if (_fromWayID) {
+ way = vgraph.entity(_fromWayID);
+ surface.selectAll("." + _fromWayID).classed("selected", true).classed("related", true);
+ }
+ if (datum2 instanceof osmWay && datum2.__from) {
+ way = datum2;
+ highlightPathsFrom(_fromWayID ? null : way.id);
+ surface.selectAll("." + way.id).classed("related", true);
+ var clickSelect = !_fromWayID || _fromWayID !== way.id;
+ help.append("div").html(_t.html("restriction.help." + (clickSelect ? "select_from_name" : "from_name"), {
+ from: placeholders.from,
+ fromName: displayName(way.id, vgraph)
+ }));
+ } else if (datum2 instanceof osmTurn) {
+ var restrictionType = osmInferRestriction(vgraph, datum2, projection2);
+ var turnType = restrictionType.replace(/^(only|no)\_/, "");
+ var indirect = datum2.direct === false ? _t.html("restriction.help.indirect") : "";
+ var klass, turnText, nextText;
+ if (datum2.no) {
+ klass = "restrict";
+ turnText = _t.html("restriction.help.turn.no_" + turnType, { indirect: { html: indirect } });
+ nextText = _t.html("restriction.help.turn.only_" + turnType, { indirect: "" });
+ } else if (datum2.only) {
+ klass = "only";
+ turnText = _t.html("restriction.help.turn.only_" + turnType, { indirect: { html: indirect } });
+ nextText = _t.html("restriction.help.turn.allowed_" + turnType, { indirect: "" });
+ } else {
+ klass = "allow";
+ turnText = _t.html("restriction.help.turn.allowed_" + turnType, { indirect: { html: indirect } });
+ nextText = _t.html("restriction.help.turn.no_" + turnType, { indirect: "" });
+ }
+ help.append("div").attr("class", "qualifier " + klass).html(turnText);
+ help.append("div").html(_t.html("restriction.help.from_name_to_name", {
+ from: placeholders.from,
+ fromName: displayName(datum2.from.way, vgraph),
+ to: placeholders.to,
+ toName: displayName(datum2.to.way, vgraph)
+ }));
+ if (datum2.via.ways && datum2.via.ways.length) {
+ var names = [];
+ for (var i3 = 0; i3 < datum2.via.ways.length; i3++) {
+ var prev = names[names.length - 1];
+ var curr = displayName(datum2.via.ways[i3], vgraph);
+ if (!prev || curr !== prev) {
+ names.push(curr);
+ }
+ }
+ help.append("div").html(_t.html("restriction.help.via_names", {
+ via: placeholders.via,
+ viaNames: names.join(", ")
+ }));
+ }
+ if (!indirect) {
+ help.append("div").html(_t.html("restriction.help.toggle", { turn: { html: nextText.trim() } }));
+ }
+ highlightPathsFrom(null);
+ var alongIDs = datum2.path.slice();
+ surface.selectAll(utilEntitySelector(alongIDs)).classed("related", true).classed("allow", klass === "allow").classed("restrict", klass === "restrict").classed("only", klass === "only");
+ } else {
+ highlightPathsFrom(null);
+ if (_fromWayID) {
+ help.append("div").html(_t.html("restriction.help.from_name", {
+ from: placeholders.from,
+ fromName: displayName(_fromWayID, vgraph)
+ }));
+ } else {
+ help.append("div").html(_t.html("restriction.help.select_from", {
+ from: placeholders.from
+ }));
+ }
+ }
+ }
+ }
+ function displayMaxDistance(maxDist) {
+ return (selection2) => {
+ var isImperial = !_mainLocalizer.usesMetric();
+ var opts;
+ if (isImperial) {
+ var distToFeet = {
+ 20: 70,
+ 25: 85,
+ 30: 100,
+ 35: 115,
+ 40: 130,
+ 45: 145,
+ 50: 160
+ }[maxDist];
+ opts = { distance: _t("units.feet", { quantity: distToFeet }) };
+ } else {
+ opts = { distance: _t("units.meters", { quantity: maxDist }) };
+ }
+ return selection2.html("").call(_t.append("restriction.controls.distance_up_to", opts));
+ };
+ }
+ function displayMaxVia(maxVia) {
+ return (selection2) => {
+ selection2 = selection2.html("");
+ return maxVia === 0 ? selection2.call(_t.append("restriction.controls.via_node_only")) : maxVia === 1 ? selection2.call(_t.append("restriction.controls.via_up_to_one")) : selection2.call(_t.append("restriction.controls.via_up_to_two"));
+ };
+ }
+ function displayName(entityID, graph) {
+ var entity = graph.entity(entityID);
+ var name2 = utilDisplayName(entity) || "";
+ var matched = _mainPresetIndex.match(entity, graph);
+ var type3 = matched && matched.name() || utilDisplayType(entity.id);
+ return name2 || type3;
+ }
+ restrictions.entityIDs = function(val) {
+ _intersection = null;
+ _fromWayID = null;
+ _oldTurns = null;
+ _vertexID = val[0];
+ };
+ restrictions.tags = function() {
+ };
+ restrictions.focus = function() {
+ };
+ restrictions.off = function(selection2) {
+ if (!_initialized2)
+ return;
+ selection2.selectAll(".surface").call(breathe.off).on("click.restrictions", null).on("mouseover.restrictions", null);
+ select_default2(window).on("resize.restrictions", null);
+ };
+ return utilRebind(restrictions, dispatch10, "on");
+ }
+ uiFieldRestrictions.supportsMultiselection = false;
+
+ // modules/ui/fields/textarea.js
+ function uiFieldTextarea(field, context) {
+ var dispatch10 = dispatch_default("change");
+ var input = select_default2(null);
+ var _tags;
+ function textarea(selection2) {
+ var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
+ input = wrap2.selectAll("textarea").data([0]);
+ input = input.enter().append("textarea").attr("id", field.domId).call(utilNoAuto).on("input", change(true)).on("blur", change()).on("change", change()).merge(input);
+ }
+ function change(onInput) {
+ return function() {
+ var val = utilGetSetValue(input);
+ if (!onInput)
+ val = context.cleanTagValue(val);
+ if (!val && Array.isArray(_tags[field.key]))
+ return;
+ var t = {};
+ t[field.key] = val || void 0;
+ dispatch10.call("change", this, t, onInput);
+ };
+ }
+ textarea.tags = function(tags) {
+ _tags = tags;
+ var isMixed = Array.isArray(tags[field.key]);
+ utilGetSetValue(input, !isMixed && tags[field.key] ? tags[field.key] : "").attr("title", isMixed ? tags[field.key].filter(Boolean).join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder() || _t("inspector.unknown")).classed("mixed", isMixed);
+ };
+ textarea.focus = function() {
+ input.node().focus();
+ };
+ return utilRebind(textarea, dispatch10, "on");
+ }
+
+ // modules/ui/fields/wikidata.js
+ function uiFieldWikidata(field, context) {
+ var wikidata = services.wikidata;
+ var dispatch10 = dispatch_default("change");
+ var _selection = select_default2(null);
+ var _searchInput = select_default2(null);
+ var _qid = null;
+ var _wikidataEntity = null;
+ var _wikiURL = "";
+ var _entityIDs = [];
+ var _wikipediaKey = field.keys && field.keys.find(function(key) {
+ return key.includes("wikipedia");
+ }), _hintKey = field.key === "wikidata" ? "name" : field.key.split(":")[0];
+ var combobox = uiCombobox(context, "combo-" + field.safeid).caseSensitive(true).minItems(1);
+ function wiki(selection2) {
+ _selection = selection2;
+ var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
+ var list = wrap2.selectAll("ul").data([0]);
+ list = list.enter().append("ul").attr("class", "rows").merge(list);
+ var searchRow = list.selectAll("li.wikidata-search").data([0]);
+ var searchRowEnter = searchRow.enter().append("li").attr("class", "wikidata-search");
+ searchRowEnter.append("input").attr("type", "text").attr("id", field.domId).style("flex", "1").call(utilNoAuto).on("focus", function() {
+ var node = select_default2(this).node();
+ node.setSelectionRange(0, node.value.length);
+ }).on("blur", function() {
+ setLabelForEntity();
+ }).call(combobox.fetcher(fetchWikidataItems));
+ combobox.on("accept", function(d) {
+ if (d) {
+ _qid = d.id;
+ change();
+ }
+ }).on("cancel", function() {
+ setLabelForEntity();
+ });
+ searchRowEnter.append("button").attr("class", "form-field-button wiki-link").attr("title", _t("icons.view_on", { domain: "wikidata.org" })).call(svgIcon("#iD-icon-out-link")).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ if (_wikiURL)
+ window.open(_wikiURL, "_blank");
+ });
+ searchRow = searchRow.merge(searchRowEnter);
+ _searchInput = searchRow.select("input");
+ var wikidataProperties = ["description", "identifier"];
+ var items = list.selectAll("li.labeled-input").data(wikidataProperties);
+ var enter = items.enter().append("li").attr("class", function(d) {
+ return "labeled-input preset-wikidata-" + d;
+ });
+ enter.append("span").attr("class", "label").html(function(d) {
+ return _t.html("wikidata." + d);
+ });
+ enter.append("input").attr("type", "text").call(utilNoAuto).classed("disabled", "true").attr("readonly", "true");
+ enter.append("button").attr("class", "form-field-button").attr("title", _t("icons.copy")).call(svgIcon("#iD-operation-copy")).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ select_default2(this.parentNode).select("input").node().select();
+ document.execCommand("copy");
+ });
+ }
+ function fetchWikidataItems(q, callback) {
+ if (!q && _hintKey) {
+ for (var i2 in _entityIDs) {
+ var entity = context.hasEntity(_entityIDs[i2]);
+ if (entity.tags[_hintKey]) {
+ q = entity.tags[_hintKey];
+ break;
+ }
+ }
+ }
+ wikidata.itemsForSearchQuery(q, function(err, data) {
+ if (err)
+ return;
+ for (var i3 in data) {
+ data[i3].value = data[i3].label + " (" + data[i3].id + ")";
+ data[i3].title = data[i3].description;
+ }
+ if (callback)
+ callback(data);
+ });
+ }
+ function change() {
+ var syncTags = {};
+ syncTags[field.key] = _qid;
+ dispatch10.call("change", this, syncTags);
+ var initGraph = context.graph();
+ var initEntityIDs = _entityIDs;
+ wikidata.entityByQID(_qid, function(err, entity) {
+ if (err)
+ return;
+ if (context.graph() !== initGraph)
+ return;
+ if (!entity.sitelinks)
+ return;
+ var langs = wikidata.languagesToQuery();
+ ["labels", "descriptions"].forEach(function(key) {
+ if (!entity[key])
+ return;
+ var valueLangs = Object.keys(entity[key]);
+ if (valueLangs.length === 0)
+ return;
+ var valueLang = valueLangs[0];
+ if (langs.indexOf(valueLang) === -1) {
+ langs.push(valueLang);
+ }
+ });
+ var newWikipediaValue;
+ if (_wikipediaKey) {
+ var foundPreferred;
+ for (var i2 in langs) {
+ var lang = langs[i2];
+ var siteID = lang.replace("-", "_") + "wiki";
+ if (entity.sitelinks[siteID]) {
+ foundPreferred = true;
+ newWikipediaValue = lang + ":" + entity.sitelinks[siteID].title;
+ break;
+ }
+ }
+ if (!foundPreferred) {
+ var wikiSiteKeys = Object.keys(entity.sitelinks).filter(function(site) {
+ return site.endsWith("wiki");
+ });
+ if (wikiSiteKeys.length === 0) {
+ newWikipediaValue = null;
+ } else {
+ var wikiLang = wikiSiteKeys[0].slice(0, -4).replace("_", "-");
+ var wikiTitle = entity.sitelinks[wikiSiteKeys[0]].title;
+ newWikipediaValue = wikiLang + ":" + wikiTitle;
+ }
+ }
+ }
+ if (newWikipediaValue) {
+ newWikipediaValue = context.cleanTagValue(newWikipediaValue);
+ }
+ if (typeof newWikipediaValue === "undefined")
+ return;
+ var actions = initEntityIDs.map(function(entityID) {
+ var entity2 = context.hasEntity(entityID);
+ if (!entity2)
+ return null;
+ var currTags = Object.assign({}, entity2.tags);
+ if (newWikipediaValue === null) {
+ if (!currTags[_wikipediaKey])
+ return null;
+ delete currTags[_wikipediaKey];
+ } else {
+ currTags[_wikipediaKey] = newWikipediaValue;
+ }
+ return actionChangeTags(entityID, currTags);
+ }).filter(Boolean);
+ if (!actions.length)
+ return;
+ context.overwrite(function actionUpdateWikipediaTags(graph) {
+ actions.forEach(function(action) {
+ graph = action(graph);
+ });
+ return graph;
+ }, context.history().undoAnnotation());
+ });
+ }
+ function setLabelForEntity() {
+ var label = "";
+ if (_wikidataEntity) {
+ label = entityPropertyForDisplay(_wikidataEntity, "labels");
+ if (label.length === 0) {
+ label = _wikidataEntity.id.toString();
+ }
+ }
+ utilGetSetValue(_searchInput, label);
+ }
+ wiki.tags = function(tags) {
+ var isMixed = Array.isArray(tags[field.key]);
+ _searchInput.attr("title", isMixed ? tags[field.key].filter(Boolean).join("\n") : null).attr("placeholder", isMixed ? _t("inspector.multiple_values") : "").classed("mixed", isMixed);
+ _qid = typeof tags[field.key] === "string" && tags[field.key] || "";
+ if (!/^Q[0-9]*$/.test(_qid)) {
+ unrecognized();
+ return;
+ }
+ _wikiURL = "https://wikidata.org/wiki/" + _qid;
+ wikidata.entityByQID(_qid, function(err, entity) {
+ if (err) {
+ unrecognized();
+ return;
+ }
+ _wikidataEntity = entity;
+ setLabelForEntity();
+ var description2 = entityPropertyForDisplay(entity, "descriptions");
+ _selection.select("button.wiki-link").classed("disabled", false);
+ _selection.select(".preset-wikidata-description").style("display", function() {
+ return description2.length > 0 ? "flex" : "none";
+ }).select("input").attr("value", description2);
+ _selection.select(".preset-wikidata-identifier").style("display", function() {
+ return entity.id ? "flex" : "none";
+ }).select("input").attr("value", entity.id);
+ });
+ function unrecognized() {
+ _wikidataEntity = null;
+ setLabelForEntity();
+ _selection.select(".preset-wikidata-description").style("display", "none");
+ _selection.select(".preset-wikidata-identifier").style("display", "none");
+ _selection.select("button.wiki-link").classed("disabled", true);
+ if (_qid && _qid !== "") {
+ _wikiURL = "https://wikidata.org/wiki/Special:Search?search=" + _qid;
+ } else {
+ _wikiURL = "";
+ }
+ }
+ };
+ function entityPropertyForDisplay(wikidataEntity, propKey) {
+ if (!wikidataEntity[propKey])
+ return "";
+ var propObj = wikidataEntity[propKey];
+ var langKeys = Object.keys(propObj);
+ if (langKeys.length === 0)
+ return "";
+ var langs = wikidata.languagesToQuery();
+ for (var i2 in langs) {
+ var lang = langs[i2];
+ var valueObj = propObj[lang];
+ if (valueObj && valueObj.value && valueObj.value.length > 0)
+ return valueObj.value;
+ }
+ return propObj[langKeys[0]].value;
+ }
+ wiki.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ return wiki;
+ };
+ wiki.focus = function() {
+ _searchInput.node().focus();
+ };
+ return utilRebind(wiki, dispatch10, "on");
+ }
+
+ // modules/ui/fields/wikipedia.js
+ function uiFieldWikipedia(field, context) {
+ const dispatch10 = dispatch_default("change");
+ const wikipedia = services.wikipedia;
+ const wikidata = services.wikidata;
+ let _langInput = select_default2(null);
+ let _titleInput = select_default2(null);
+ let _wikiURL = "";
+ let _entityIDs;
+ let _tags;
+ let _dataWikipedia = [];
+ _mainFileFetcher.get("wmf_sitematrix").then((d) => {
+ _dataWikipedia = d;
+ if (_tags)
+ updateForTags(_tags);
+ }).catch(() => {
+ });
+ const langCombo = uiCombobox(context, "wikipedia-lang").fetcher((value, callback) => {
+ const v = value.toLowerCase();
+ callback(_dataWikipedia.filter((d) => {
+ return d[0].toLowerCase().indexOf(v) >= 0 || d[1].toLowerCase().indexOf(v) >= 0 || d[2].toLowerCase().indexOf(v) >= 0;
+ }).map((d) => ({ value: d[1] })));
+ });
+ const titleCombo = uiCombobox(context, "wikipedia-title").fetcher((value, callback) => {
+ if (!value) {
+ value = "";
+ for (let i2 in _entityIDs) {
+ let entity = context.hasEntity(_entityIDs[i2]);
+ if (entity.tags.name) {
+ value = entity.tags.name;
+ break;
+ }
+ }
+ }
+ const searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
+ searchfn(language()[2], value, (query, data) => {
+ callback(data.map((d) => ({ value: d })));
+ });
+ });
+ function wiki(selection2) {
+ let wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
+ wrap2 = wrap2.enter().append("div").attr("class", `form-field-input-wrap form-field-input-${field.type}`).merge(wrap2);
+ let langContainer = wrap2.selectAll(".wiki-lang-container").data([0]);
+ langContainer = langContainer.enter().append("div").attr("class", "wiki-lang-container").merge(langContainer);
+ _langInput = langContainer.selectAll("input.wiki-lang").data([0]);
+ _langInput = _langInput.enter().append("input").attr("type", "text").attr("class", "wiki-lang").attr("placeholder", _t("translate.localized_translation_language")).call(utilNoAuto).call(langCombo).merge(_langInput);
+ _langInput.on("blur", changeLang).on("change", changeLang);
+ let titleContainer = wrap2.selectAll(".wiki-title-container").data([0]);
+ titleContainer = titleContainer.enter().append("div").attr("class", "wiki-title-container").merge(titleContainer);
+ _titleInput = titleContainer.selectAll("input.wiki-title").data([0]);
+ _titleInput = _titleInput.enter().append("input").attr("type", "text").attr("class", "wiki-title").attr("id", field.domId).call(utilNoAuto).call(titleCombo).merge(_titleInput);
+ _titleInput.on("blur", function() {
+ change(true);
+ }).on("change", function() {
+ change(false);
+ });
+ let link2 = titleContainer.selectAll(".wiki-link").data([0]);
+ link2 = link2.enter().append("button").attr("class", "form-field-button wiki-link").attr("title", _t("icons.view_on", { domain: "wikipedia.org" })).call(svgIcon("#iD-icon-out-link")).merge(link2);
+ link2.on("click", (d3_event) => {
+ d3_event.preventDefault();
+ if (_wikiURL)
+ window.open(_wikiURL, "_blank");
+ });
+ }
+ function defaultLanguageInfo(skipEnglishFallback) {
+ const langCode = _mainLocalizer.languageCode().toLowerCase();
+ for (let i2 in _dataWikipedia) {
+ let d = _dataWikipedia[i2];
+ if (d[2] === langCode)
+ return d;
+ }
+ return skipEnglishFallback ? ["", "", ""] : ["English", "English", "en"];
+ }
+ function language(skipEnglishFallback) {
+ const value = utilGetSetValue(_langInput).toLowerCase();
+ for (let i2 in _dataWikipedia) {
+ let d = _dataWikipedia[i2];
+ if (d[0].toLowerCase() === value || d[1].toLowerCase() === value || d[2] === value)
+ return d;
+ }
+ return defaultLanguageInfo(skipEnglishFallback);
+ }
+ function changeLang() {
+ utilGetSetValue(_langInput, language()[1]);
+ change(true);
+ }
+ function change(skipWikidata) {
+ let value = utilGetSetValue(_titleInput);
+ const m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
+ const langInfo = m && _dataWikipedia.find((d) => m[1] === d[2]);
+ let syncTags = {};
+ if (langInfo) {
+ const nativeLangName = langInfo[1];
+ value = decodeURIComponent(m[2]).replace(/_/g, " ");
+ if (m[3]) {
+ let anchor;
+ anchor = decodeURIComponent(m[3]);
+ value += "#" + anchor.replace(/_/g, " ");
+ }
+ value = value.slice(0, 1).toUpperCase() + value.slice(1);
+ utilGetSetValue(_langInput, nativeLangName);
+ utilGetSetValue(_titleInput, value);
+ }
+ if (value) {
+ syncTags.wikipedia = context.cleanTagValue(language()[2] + ":" + value);
+ } else {
+ syncTags.wikipedia = void 0;
+ }
+ dispatch10.call("change", this, syncTags);
+ if (skipWikidata || !value || !language()[2])
+ return;
+ const initGraph = context.graph();
+ const initEntityIDs = _entityIDs;
+ wikidata.itemsByTitle(language()[2], value, (err, data) => {
+ if (err || !data || !Object.keys(data).length)
+ return;
+ if (context.graph() !== initGraph)
+ return;
+ const qids = Object.keys(data);
+ const value2 = qids && qids.find((id2) => id2.match(/^Q\d+$/));
+ let actions = initEntityIDs.map((entityID) => {
+ let entity = context.entity(entityID).tags;
+ let currTags = Object.assign({}, entity);
+ if (currTags.wikidata !== value2) {
+ currTags.wikidata = value2;
+ return actionChangeTags(entityID, currTags);
+ }
+ return null;
+ }).filter(Boolean);
+ if (!actions.length)
+ return;
+ context.overwrite(function actionUpdateWikidataTags(graph) {
+ actions.forEach(function(action) {
+ graph = action(graph);
+ });
+ return graph;
+ }, context.history().undoAnnotation());
+ });
+ }
+ wiki.tags = (tags) => {
+ _tags = tags;
+ updateForTags(tags);
+ };
+ function updateForTags(tags) {
+ const value = typeof tags[field.key] === "string" ? tags[field.key] : "";
+ const m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
+ const tagLang = m && m[1];
+ const tagArticleTitle = m && m[2];
+ let anchor = m && m[3];
+ const tagLangInfo = tagLang && _dataWikipedia.find((d) => tagLang === d[2]);
+ if (tagLangInfo) {
+ const nativeLangName = tagLangInfo[1];
+ utilGetSetValue(_langInput, nativeLangName);
+ utilGetSetValue(_titleInput, tagArticleTitle + (anchor ? "#" + anchor : ""));
+ if (anchor) {
+ try {
+ anchor = encodeURIComponent(anchor.replace(/ /g, "_")).replace(/%/g, ".");
+ } catch (e) {
+ anchor = anchor.replace(/ /g, "_");
+ }
+ }
+ _wikiURL = "https://" + tagLang + ".wikipedia.org/wiki/" + tagArticleTitle.replace(/ /g, "_") + (anchor ? "#" + anchor : "");
+ } else {
+ utilGetSetValue(_titleInput, value);
+ if (value && value !== "") {
+ utilGetSetValue(_langInput, "");
+ const defaultLangInfo = defaultLanguageInfo();
+ _wikiURL = `https://${defaultLangInfo[2]}.wikipedia.org/w/index.php?fulltext=1&search=${value}`;
+ } else {
+ const shownOrDefaultLangInfo = language(true);
+ utilGetSetValue(_langInput, shownOrDefaultLangInfo[1]);
+ _wikiURL = "";
+ }
+ }
+ }
+ wiki.entityIDs = (val) => {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ return wiki;
+ };
+ wiki.focus = () => {
+ _titleInput.node().focus();
+ };
+ return utilRebind(wiki, dispatch10, "on");
+ }
+ uiFieldWikipedia.supportsMultiselection = false;
+
+ // modules/ui/fields/index.js
+ var uiFields = {
+ access: uiFieldAccess,
+ address: uiFieldAddress,
+ check: uiFieldCheck,
+ combo: uiFieldCombo,
+ cycleway: uiFieldCycleway,
+ defaultCheck: uiFieldCheck,
+ email: uiFieldText,
+ identifier: uiFieldText,
+ lanes: uiFieldLanes,
+ localized: uiFieldLocalized,
+ roadheight: uiFieldRoadheight,
+ roadspeed: uiFieldRoadspeed,
+ manyCombo: uiFieldCombo,
+ multiCombo: uiFieldCombo,
+ networkCombo: uiFieldCombo,
+ number: uiFieldText,
+ onewayCheck: uiFieldCheck,
+ radio: uiFieldRadio,
+ restrictions: uiFieldRestrictions,
+ semiCombo: uiFieldCombo,
+ structureRadio: uiFieldRadio,
+ tel: uiFieldText,
+ text: uiFieldText,
+ textarea: uiFieldTextarea,
+ typeCombo: uiFieldCombo,
+ url: uiFieldText,
+ wikidata: uiFieldWikidata,
+ wikipedia: uiFieldWikipedia
+ };
+
+ // modules/ui/field.js
+ function uiField(context, presetField2, entityIDs, options2) {
+ options2 = Object.assign({
+ show: true,
+ wrap: true,
+ remove: true,
+ revert: true,
+ info: true
+ }, options2);
+ var dispatch10 = dispatch_default("change", "revert");
+ var field = Object.assign({}, presetField2);
+ field.domId = utilUniqueDomId("form-field-" + field.safeid);
+ var _show = options2.show;
+ var _state = "";
+ var _tags = {};
+ var _entityExtent;
+ if (entityIDs && entityIDs.length) {
+ _entityExtent = entityIDs.reduce(function(extent, entityID) {
+ var entity = context.graph().entity(entityID);
+ return extent.extend(entity.extent(context.graph()));
+ }, geoExtent());
+ }
+ var _locked = false;
+ var _lockedTip = uiTooltip().title(_t.html("inspector.lock.suggestion", { label: field.label })).placement("bottom");
+ field.keys = field.keys || [field.key];
+ if (_show && !field.impl) {
+ createField();
+ }
+ function createField() {
+ field.impl = uiFields[field.type](field, context).on("change", function(t, onInput) {
+ dispatch10.call("change", field, t, onInput);
+ });
+ if (entityIDs) {
+ field.entityIDs = entityIDs;
+ if (field.impl.entityIDs) {
+ field.impl.entityIDs(entityIDs);
+ }
+ }
+ }
+ function isModified() {
+ if (!entityIDs || !entityIDs.length)
+ return false;
+ return entityIDs.some(function(entityID) {
+ var original = context.graph().base().entities[entityID];
+ var latest = context.graph().entity(entityID);
+ return field.keys.some(function(key) {
+ return original ? latest.tags[key] !== original.tags[key] : latest.tags[key];
+ });
+ });
+ }
+ function tagsContainFieldKey() {
+ return field.keys.some(function(key) {
+ if (field.type === "multiCombo") {
+ for (var tagKey in _tags) {
+ if (tagKey.indexOf(key) === 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+ return _tags[key] !== void 0;
+ });
+ }
+ function revert(d3_event, d) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ if (!entityIDs || _locked)
+ return;
+ dispatch10.call("revert", d, d.keys);
+ }
+ function remove2(d3_event, d) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ if (_locked)
+ return;
+ var t = {};
+ d.keys.forEach(function(key) {
+ t[key] = void 0;
+ });
+ dispatch10.call("change", d, t);
+ }
+ field.render = function(selection2) {
+ var container = selection2.selectAll(".form-field").data([field]);
+ var enter = container.enter().append("div").attr("class", function(d) {
+ return "form-field form-field-" + d.safeid;
+ }).classed("nowrap", !options2.wrap);
+ if (options2.wrap) {
+ var labelEnter = enter.append("label").attr("class", "field-label").attr("for", function(d) {
+ return d.domId;
+ });
+ var textEnter = labelEnter.append("span").attr("class", "label-text");
+ textEnter.append("span").attr("class", "label-textvalue").html(function(d) {
+ return d.label();
+ });
+ textEnter.append("span").attr("class", "label-textannotation");
+ if (options2.remove) {
+ labelEnter.append("button").attr("class", "remove-icon").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete"));
+ }
+ if (options2.revert) {
+ labelEnter.append("button").attr("class", "modified-icon").attr("title", _t("icons.undo")).call(svgIcon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-redo" : "#iD-icon-undo"));
+ }
+ }
+ container = container.merge(enter);
+ container.select(".field-label > .remove-icon").on("click", remove2);
+ container.select(".field-label > .modified-icon").on("click", revert);
+ container.each(function(d) {
+ var selection3 = select_default2(this);
+ if (!d.impl) {
+ createField();
+ }
+ var reference, help;
+ if (options2.wrap && field.type === "restrictions") {
+ help = uiFieldHelp(context, "restrictions");
+ }
+ if (options2.wrap && options2.info) {
+ var referenceKey = d.key || "";
+ if (d.type === "multiCombo") {
+ referenceKey = referenceKey.replace(/:$/, "");
+ }
+ reference = uiTagReference(d.reference || { key: referenceKey }, context);
+ if (_state === "hover") {
+ reference.showing(false);
+ }
+ }
+ selection3.call(d.impl);
+ if (help) {
+ selection3.call(help.body).select(".field-label").call(help.button);
+ }
+ if (reference) {
+ selection3.call(reference.body).select(".field-label").call(reference.button);
+ }
+ d.impl.tags(_tags);
+ });
+ container.classed("locked", _locked).classed("modified", isModified()).classed("present", tagsContainFieldKey());
+ var annotation = container.selectAll(".field-label .label-textannotation");
+ var icon2 = annotation.selectAll(".icon").data(_locked ? [0] : []);
+ icon2.exit().remove();
+ icon2.enter().append("svg").attr("class", "icon").append("use").attr("xlink:href", "#fas-lock");
+ container.call(_locked ? _lockedTip : _lockedTip.destroy);
+ };
+ field.state = function(val) {
+ if (!arguments.length)
+ return _state;
+ _state = val;
+ return field;
+ };
+ field.tags = function(val) {
+ if (!arguments.length)
+ return _tags;
+ _tags = val;
+ if (tagsContainFieldKey() && !_show) {
+ _show = true;
+ if (!field.impl) {
+ createField();
+ }
+ }
+ return field;
+ };
+ field.locked = function(val) {
+ if (!arguments.length)
+ return _locked;
+ _locked = val;
+ return field;
+ };
+ field.show = function() {
+ _show = true;
+ if (!field.impl) {
+ createField();
+ }
+ if (field.default && field.key && _tags[field.key] !== field.default) {
+ var t = {};
+ t[field.key] = field.default;
+ dispatch10.call("change", this, t);
+ }
+ };
+ field.isShown = function() {
+ return _show;
+ };
+ field.isAllowed = function() {
+ if (entityIDs && entityIDs.length > 1 && uiFields[field.type].supportsMultiselection === false)
+ return false;
+ if (field.geometry && !entityIDs.every(function(entityID) {
+ return field.matchGeometry(context.graph().geometry(entityID));
+ }))
+ return false;
+ if (entityIDs && _entityExtent && field.locationSetID) {
+ var validLocations = _mainLocations.locationsAt(_entityExtent.center());
+ if (!validLocations[field.locationSetID])
+ return false;
+ }
+ var prerequisiteTag = field.prerequisiteTag;
+ if (entityIDs && !tagsContainFieldKey() && prerequisiteTag) {
+ if (!entityIDs.every(function(entityID) {
+ var entity = context.graph().entity(entityID);
+ if (prerequisiteTag.key) {
+ var value = entity.tags[prerequisiteTag.key];
+ if (!value)
+ return false;
+ if (prerequisiteTag.valueNot) {
+ return prerequisiteTag.valueNot !== value;
+ }
+ if (prerequisiteTag.value) {
+ return prerequisiteTag.value === value;
+ }
+ } else if (prerequisiteTag.keyNot) {
+ if (entity.tags[prerequisiteTag.keyNot])
+ return false;
+ }
+ return true;
+ }))
+ return false;
+ }
+ return true;
+ };
+ field.focus = function() {
+ if (field.impl) {
+ field.impl.focus();
+ }
+ };
+ return utilRebind(field, dispatch10, "on");
+ }
+
+ // modules/ui/form_fields.js
+ function uiFormFields(context) {
+ var moreCombo = uiCombobox(context, "more-fields").minItems(1);
+ var _fieldsArr = [];
+ var _lastPlaceholder = "";
+ var _state = "";
+ var _klass = "";
+ function formFields(selection2) {
+ var allowedFields = _fieldsArr.filter(function(field) {
+ return field.isAllowed();
+ });
+ var shown = allowedFields.filter(function(field) {
+ return field.isShown();
+ });
+ var notShown = allowedFields.filter(function(field) {
+ return !field.isShown();
+ });
+ var container = selection2.selectAll(".form-fields-container").data([0]);
+ container = container.enter().append("div").attr("class", "form-fields-container " + (_klass || "")).merge(container);
+ var fields = container.selectAll(".wrap-form-field").data(shown, function(d) {
+ return d.id + (d.entityIDs ? d.entityIDs.join() : "");
+ });
+ fields.exit().remove();
+ var enter = fields.enter().append("div").attr("class", function(d) {
+ return "wrap-form-field wrap-form-field-" + d.safeid;
+ });
+ fields = fields.merge(enter);
+ fields.order().each(function(d) {
+ select_default2(this).call(d.render);
+ });
+ var titles = [];
+ var moreFields = notShown.map(function(field) {
+ var title = field.title();
+ titles.push(title);
+ var terms = field.terms();
+ if (field.key)
+ terms.push(field.key);
+ if (field.keys)
+ terms = terms.concat(field.keys);
+ return {
+ display: field.label(),
+ value: title,
+ title,
+ field,
+ terms
+ };
+ });
+ var placeholder = titles.slice(0, 3).join(", ") + (titles.length > 3 ? "\u2026" : "");
+ var more = selection2.selectAll(".more-fields").data(_state === "hover" || moreFields.length === 0 ? [] : [0]);
+ more.exit().remove();
+ var moreEnter = more.enter().append("div").attr("class", "more-fields").append("label");
+ moreEnter.append("span").call(_t.append("inspector.add_fields"));
+ more = moreEnter.merge(more);
+ var input = more.selectAll(".value").data([0]);
+ input.exit().remove();
+ input = input.enter().append("input").attr("class", "value").attr("type", "text").attr("placeholder", placeholder).call(utilNoAuto).merge(input);
+ input.call(utilGetSetValue, "").call(moreCombo.data(moreFields).on("accept", function(d) {
+ if (!d)
+ return;
+ var field = d.field;
+ field.show();
+ selection2.call(formFields);
+ field.focus();
+ }));
+ if (_lastPlaceholder !== placeholder) {
+ input.attr("placeholder", placeholder);
+ _lastPlaceholder = placeholder;
+ }
+ }
+ formFields.fieldsArr = function(val) {
+ if (!arguments.length)
+ return _fieldsArr;
+ _fieldsArr = val || [];
+ return formFields;
+ };
+ formFields.state = function(val) {
+ if (!arguments.length)
+ return _state;
+ _state = val;
+ return formFields;
+ };
+ formFields.klass = function(val) {
+ if (!arguments.length)
+ return _klass;
+ _klass = val;
+ return formFields;
+ };
+ return formFields;
+ }
+
+ // modules/ui/changeset_editor.js
+ function uiChangesetEditor(context) {
+ var dispatch10 = dispatch_default("change");
+ var formFields = uiFormFields(context);
+ var commentCombo = uiCombobox(context, "comment").caseSensitive(true);
+ var _fieldsArr;
+ var _tags;
+ var _changesetID;
+ function changesetEditor(selection2) {
+ render(selection2);
+ }
+ function render(selection2) {
+ var initial = false;
+ if (!_fieldsArr) {
+ initial = true;
+ var presets = _mainPresetIndex;
+ _fieldsArr = [
+ uiField(context, presets.field("comment"), null, { show: true, revert: false }),
+ uiField(context, presets.field("source"), null, { show: false, revert: false }),
+ uiField(context, presets.field("hashtags"), null, { show: false, revert: false })
+ ];
+ _fieldsArr.forEach(function(field) {
+ field.on("change", function(t, onInput) {
+ dispatch10.call("change", field, void 0, t, onInput);
+ });
+ });
+ }
+ _fieldsArr.forEach(function(field) {
+ field.tags(_tags);
+ });
+ selection2.call(formFields.fieldsArr(_fieldsArr));
+ if (initial) {
+ var commentField = selection2.select(".form-field-comment textarea");
+ var commentNode = commentField.node();
+ if (commentNode) {
+ commentNode.focus();
+ commentNode.select();
+ }
+ utilTriggerEvent(commentField, "blur");
+ var osm = context.connection();
+ if (osm) {
+ osm.userChangesets(function(err, changesets) {
+ if (err)
+ return;
+ var comments = changesets.map(function(changeset) {
+ var comment = changeset.tags.comment;
+ return comment ? { title: comment, value: comment } : null;
+ }).filter(Boolean);
+ commentField.call(commentCombo.data(utilArrayUniqBy(comments, "title")));
+ });
+ }
+ }
+ var hasGoogle = _tags.comment.match(/google/i);
+ var commentWarning = selection2.select(".form-field-comment").selectAll(".comment-warning").data(hasGoogle ? [0] : []);
+ commentWarning.exit().transition().duration(200).style("opacity", 0).remove();
+ var commentEnter = commentWarning.enter().insert("div", ".tag-reference-body").attr("class", "field-warning comment-warning").style("opacity", 0);
+ commentEnter.append("a").attr("target", "_blank").call(svgIcon("#iD-icon-alert", "inline")).attr("href", _t("commit.google_warning_link")).append("span").call(_t.append("commit.google_warning"));
+ commentEnter.transition().duration(200).style("opacity", 1);
+ }
+ changesetEditor.tags = function(_) {
+ if (!arguments.length)
+ return _tags;
+ _tags = _;
+ return changesetEditor;
+ };
+ changesetEditor.changesetID = function(_) {
+ if (!arguments.length)
+ return _changesetID;
+ if (_changesetID === _)
+ return changesetEditor;
+ _changesetID = _;
+ _fieldsArr = null;
+ return changesetEditor;
+ };
+ return utilRebind(changesetEditor, dispatch10, "on");
+ }
+
+ // modules/ui/commit.js
+ var import_fast_deep_equal9 = __toESM(require_fast_deep_equal());
+
+ // modules/util/jxon.js
+ var JXON = new function() {
+ var sValueProp = "keyValue", sAttributesProp = "keyAttributes", sAttrPref = "@", aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
+ function parseText(sValue) {
+ if (rIsNull.test(sValue)) {
+ return null;
+ }
+ if (rIsBool.test(sValue)) {
+ return sValue.toLowerCase() === "true";
+ }
+ if (isFinite(sValue)) {
+ return parseFloat(sValue);
+ }
+ if (isFinite(Date.parse(sValue))) {
+ return new Date(sValue);
+ }
+ return sValue;
+ }
+ function EmptyTree() {
+ }
+ EmptyTree.prototype.toString = function() {
+ return "null";
+ };
+ EmptyTree.prototype.valueOf = function() {
+ return null;
+ };
+ function objectify(vValue) {
+ return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
+ }
+ function createObjTree(oParentNode, nVerb, bFreeze, bNesteAttr) {
+ var nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(), bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
+ var sProp, vContent, nLength = 0, sCollectedTxt = "", vResult = bHighVerb ? {} : true;
+ if (bChildren) {
+ for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
+ oNode = oParentNode.childNodes.item(nItem);
+ if (oNode.nodeType === 4) {
+ sCollectedTxt += oNode.nodeValue;
+ } else if (oNode.nodeType === 3) {
+ sCollectedTxt += oNode.nodeValue.trim();
+ } else if (oNode.nodeType === 1 && !oNode.prefix) {
+ aCache.push(oNode);
+ }
+ }
+ }
+ var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
+ if (!bHighVerb && (bChildren || bAttributes)) {
+ vResult = nVerb === 0 ? objectify(vBuiltVal) : {};
+ }
+ for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
+ sProp = aCache[nElId].nodeName.toLowerCase();
+ vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
+ if (vResult.hasOwnProperty(sProp)) {
+ if (vResult[sProp].constructor !== Array) {
+ vResult[sProp] = [vResult[sProp]];
+ }
+ vResult[sProp].push(vContent);
+ } else {
+ vResult[sProp] = vContent;
+ nLength++;
+ }
+ }
+ if (bAttributes) {
+ var nAttrLen = oParentNode.attributes.length, sAPrefix = bNesteAttr ? "" : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
+ for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
+ oAttrib = oParentNode.attributes.item(nAttrib);
+ oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
+ }
+ if (bNesteAttr) {
+ if (bFreeze) {
+ Object.freeze(oAttrParent);
+ }
+ vResult[sAttributesProp] = oAttrParent;
+ nLength -= nAttrLen - 1;
+ }
+ }
+ if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
+ vResult[sValueProp] = vBuiltVal;
+ } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
+ vResult = vBuiltVal;
+ }
+ if (bFreeze && (bHighVerb || nLength > 0)) {
+ Object.freeze(vResult);
+ }
+ aCache.length = nLevelStart;
+ return vResult;
+ }
+ function loadObjTree(oXMLDoc, oParentEl, oParentObj) {
+ var vValue, oChild;
+ if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
+ oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString()));
+ } else if (oParentObj.constructor === Date) {
+ oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));
+ }
+ for (var sName in oParentObj) {
+ vValue = oParentObj[sName];
+ if (isFinite(sName) || vValue instanceof Function) {
+ continue;
+ }
+ if (sName === sValueProp) {
+ if (vValue !== null && vValue !== true) {
+ oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue)));
+ }
+ } else if (sName === sAttributesProp) {
+ for (var sAttrib in vValue) {
+ oParentEl.setAttribute(sAttrib, vValue[sAttrib]);
+ }
+ } else if (sName.charAt(0) === sAttrPref) {
+ oParentEl.setAttribute(sName.slice(1), vValue);
+ } else if (vValue.constructor === Array) {
+ for (var nItem = 0; nItem < vValue.length; nItem++) {
+ oChild = oXMLDoc.createElement(sName);
+ loadObjTree(oXMLDoc, oChild, vValue[nItem]);
+ oParentEl.appendChild(oChild);
+ }
+ } else {
+ oChild = oXMLDoc.createElement(sName);
+ if (vValue instanceof Object) {
+ loadObjTree(oXMLDoc, oChild, vValue);
+ } else if (vValue !== null && vValue !== true) {
+ oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
+ }
+ oParentEl.appendChild(oChild);
+ }
+ }
+ }
+ this.build = function(oXMLParent, nVerbosity, bFreeze, bNesteAttributes) {
+ var _nVerb = arguments.length > 1 && typeof nVerbosity === "number" ? nVerbosity & 3 : 1;
+ return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);
+ };
+ this.unbuild = function(oObjTree) {
+ var oNewDoc = document.implementation.createDocument("", "", null);
+ loadObjTree(oNewDoc, oNewDoc, oObjTree);
+ return oNewDoc;
+ };
+ this.stringify = function(oObjTree) {
+ return new XMLSerializer().serializeToString(JXON.unbuild(oObjTree));
+ };
+ }();
+
+ // modules/ui/sections/changes.js
+ function uiSectionChanges(context) {
+ var _discardTags = {};
+ _mainFileFetcher.get("discarded").then(function(d) {
+ _discardTags = d;
+ }).catch(function() {
+ });
+ var section = uiSection("changes-list", context).label(function() {
+ var history = context.history();
+ var summary = history.difference().summary();
+ return _t.html("inspector.title_count", { title: { html: _t.html("commit.changes") }, count: summary.length });
+ }).disclosureContent(renderDisclosureContent);
+ function renderDisclosureContent(selection2) {
+ var history = context.history();
+ var summary = history.difference().summary();
+ var container = selection2.selectAll(".commit-section").data([0]);
+ var containerEnter = container.enter().append("div").attr("class", "commit-section");
+ containerEnter.append("ul").attr("class", "changeset-list");
+ container = containerEnter.merge(container);
+ var items = container.select("ul").selectAll("li").data(summary);
+ var itemsEnter = items.enter().append("li").attr("class", "change-item");
+ var buttons = itemsEnter.append("button").on("mouseover", mouseover).on("mouseout", mouseout).on("click", click);
+ buttons.each(function(d) {
+ select_default2(this).call(svgIcon("#iD-icon-" + d.entity.geometry(d.graph), "pre-text " + d.changeType));
+ });
+ buttons.append("span").attr("class", "change-type").html(function(d) {
+ return _t.html("commit." + d.changeType) + " ";
+ });
+ buttons.append("strong").attr("class", "entity-type").text(function(d) {
+ var matched = _mainPresetIndex.match(d.entity, d.graph);
+ return matched && matched.name() || utilDisplayType(d.entity.id);
+ });
+ buttons.append("span").attr("class", "entity-name").text(function(d) {
+ var name2 = utilDisplayName(d.entity) || "", string = "";
+ if (name2 !== "") {
+ string += ":";
+ }
+ return string += " " + name2;
+ });
+ items = itemsEnter.merge(items);
+ var changeset = new osmChangeset().update({ id: void 0 });
+ var changes = history.changes(actionDiscardTags(history.difference(), _discardTags));
+ delete changeset.id;
+ var data = JXON.stringify(changeset.osmChangeJXON(changes));
+ var blob = new Blob([data], { type: "text/xml;charset=utf-8;" });
+ var fileName = "changes.osc";
+ var linkEnter = container.selectAll(".download-changes").data([0]).enter().append("a").attr("class", "download-changes");
+ linkEnter.attr("href", window.URL.createObjectURL(blob)).attr("download", fileName);
+ linkEnter.call(svgIcon("#iD-icon-load", "inline")).append("span").call(_t.append("commit.download_changes"));
+ function mouseover(d) {
+ if (d.entity) {
+ context.surface().selectAll(utilEntityOrMemberSelector([d.entity.id], context.graph())).classed("hover", true);
+ }
+ }
+ function mouseout() {
+ context.surface().selectAll(".hover").classed("hover", false);
+ }
+ function click(d3_event, change) {
+ if (change.changeType !== "deleted") {
+ var entity = change.entity;
+ context.map().zoomToEase(entity);
+ context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph())).classed("hover", true);
+ }
+ }
+ }
+ return section;
+ }
+
+ // modules/ui/commit_warnings.js
+ function uiCommitWarnings(context) {
+ function commitWarnings(selection2) {
+ var issuesBySeverity = context.validator().getIssuesBySeverity({ what: "edited", where: "all", includeDisabledRules: true });
+ for (var severity in issuesBySeverity) {
+ var issues = issuesBySeverity[severity];
+ if (severity !== "error") {
+ issues = issues.filter(function(issue) {
+ return issue.type !== "help_request";
+ });
+ }
+ var section = severity + "-section";
+ var issueItem = severity + "-item";
+ var container = selection2.selectAll("." + section).data(issues.length ? [0] : []);
+ container.exit().remove();
+ var containerEnter = container.enter().append("div").attr("class", "modal-section " + section + " fillL2");
+ containerEnter.append("h3").html(severity === "warning" ? _t.html("commit.warnings") : _t.html("commit.errors"));
+ containerEnter.append("ul").attr("class", "changeset-list");
+ container = containerEnter.merge(container);
+ var items = container.select("ul").selectAll("li").data(issues, function(d) {
+ return d.key;
+ });
+ items.exit().remove();
+ var itemsEnter = items.enter().append("li").attr("class", issueItem);
+ var buttons = itemsEnter.append("button").on("mouseover", function(d3_event, d) {
+ if (d.entityIds) {
+ context.surface().selectAll(utilEntityOrMemberSelector(d.entityIds, context.graph())).classed("hover", true);
+ }
+ }).on("mouseout", function() {
+ context.surface().selectAll(".hover").classed("hover", false);
+ }).on("click", function(d3_event, d) {
+ context.validator().focusIssue(d);
+ });
+ buttons.call(svgIcon("#iD-icon-alert", "pre-text"));
+ buttons.append("strong").attr("class", "issue-message");
+ buttons.filter(function(d) {
+ return d.tooltip;
+ }).call(uiTooltip().title(function(d) {
+ return d.tooltip;
+ }).placement("top"));
+ items = itemsEnter.merge(items);
+ items.selectAll(".issue-message").html(function(d) {
+ return d.message(context);
+ });
+ }
+ }
+ return commitWarnings;
+ }
+
+ // modules/ui/commit.js
+ var readOnlyTags = [
+ /^changesets_count$/,
+ /^created_by$/,
+ /^ideditor:/,
+ /^imagery_used$/,
+ /^host$/,
+ /^locale$/,
+ /^warnings:/,
+ /^resolved:/,
+ /^closed:note$/,
+ /^closed:keepright$/,
+ /^closed:improveosm:/,
+ /^closed:osmose:/
+ ];
+ var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
+ function uiCommit(context) {
+ var dispatch10 = dispatch_default("cancel");
+ var _userDetails2;
+ var _selection;
+ var changesetEditor = uiChangesetEditor(context).on("change", changeTags);
+ var rawTagEditor = uiSectionRawTagEditor("changeset-tag-editor", context).on("change", changeTags).readOnlyTags(readOnlyTags);
+ var commitChanges = uiSectionChanges(context);
+ var commitWarnings = uiCommitWarnings(context);
+ function commit(selection2) {
+ _selection = selection2;
+ if (!context.changeset)
+ initChangeset();
+ loadDerivedChangesetTags();
+ selection2.call(render);
+ }
+ function initChangeset() {
+ var commentDate = +corePreferences("commentDate") || 0;
+ var currDate = Date.now();
+ var cutoff = 2 * 86400 * 1e3;
+ if (commentDate > currDate || currDate - commentDate > cutoff) {
+ corePreferences("comment", null);
+ corePreferences("hashtags", null);
+ corePreferences("source", null);
+ }
+ if (context.defaultChangesetComment()) {
+ corePreferences("comment", context.defaultChangesetComment());
+ corePreferences("commentDate", Date.now());
+ }
+ if (context.defaultChangesetSource()) {
+ corePreferences("source", context.defaultChangesetSource());
+ corePreferences("commentDate", Date.now());
+ }
+ if (context.defaultChangesetHashtags()) {
+ corePreferences("hashtags", context.defaultChangesetHashtags());
+ corePreferences("commentDate", Date.now());
+ }
+ var detected = utilDetect();
+ var tags = {
+ comment: corePreferences("comment") || "",
+ created_by: context.cleanTagValue("iD " + context.version),
+ host: context.cleanTagValue(detected.host),
+ locale: context.cleanTagValue(_mainLocalizer.localeCode())
+ };
+ findHashtags(tags, true);
+ var hashtags = corePreferences("hashtags");
+ if (hashtags) {
+ tags.hashtags = hashtags;
+ }
+ var source = corePreferences("source");
+ if (source) {
+ tags.source = source;
+ }
+ var photoOverlaysUsed = context.history().photoOverlaysUsed();
+ if (photoOverlaysUsed.length) {
+ var sources = (tags.source || "").split(";");
+ if (sources.indexOf("streetlevel imagery") === -1) {
+ sources.push("streetlevel imagery");
+ }
+ photoOverlaysUsed.forEach(function(photoOverlay) {
+ if (sources.indexOf(photoOverlay) === -1) {
+ sources.push(photoOverlay);
+ }
+ });
+ tags.source = context.cleanTagValue(sources.join(";"));
+ }
+ context.changeset = new osmChangeset({ tags });
+ }
+ function loadDerivedChangesetTags() {
+ var osm = context.connection();
+ if (!osm)
+ return;
+ var tags = Object.assign({}, context.changeset.tags);
+ var imageryUsed = context.cleanTagValue(context.history().imageryUsed().join(";"));
+ tags.imagery_used = imageryUsed || "None";
+ var osmClosed = osm.getClosedIDs();
+ var itemType;
+ if (osmClosed.length) {
+ tags["closed:note"] = context.cleanTagValue(osmClosed.join(";"));
+ }
+ if (services.keepRight) {
+ var krClosed = services.keepRight.getClosedIDs();
+ if (krClosed.length) {
+ tags["closed:keepright"] = context.cleanTagValue(krClosed.join(";"));
+ }
+ }
+ if (services.improveOSM) {
+ var iOsmClosed = services.improveOSM.getClosedCounts();
+ for (itemType in iOsmClosed) {
+ tags["closed:improveosm:" + itemType] = context.cleanTagValue(iOsmClosed[itemType].toString());
+ }
+ }
+ if (services.osmose) {
+ var osmoseClosed = services.osmose.getClosedCounts();
+ for (itemType in osmoseClosed) {
+ tags["closed:osmose:" + itemType] = context.cleanTagValue(osmoseClosed[itemType].toString());
+ }
+ }
+ for (var key in tags) {
+ if (key.match(/(^warnings:)|(^resolved:)/)) {
+ delete tags[key];
+ }
+ }
+ function addIssueCounts(issues, prefix) {
+ var issuesByType = utilArrayGroupBy(issues, "type");
+ for (var issueType in issuesByType) {
+ var issuesOfType = issuesByType[issueType];
+ if (issuesOfType[0].subtype) {
+ var issuesBySubtype = utilArrayGroupBy(issuesOfType, "subtype");
+ for (var issueSubtype in issuesBySubtype) {
+ var issuesOfSubtype = issuesBySubtype[issueSubtype];
+ tags[prefix + ":" + issueType + ":" + issueSubtype] = context.cleanTagValue(issuesOfSubtype.length.toString());
+ }
+ } else {
+ tags[prefix + ":" + issueType] = context.cleanTagValue(issuesOfType.length.toString());
+ }
+ }
+ }
+ var warnings = context.validator().getIssuesBySeverity({ what: "edited", where: "all", includeIgnored: true, includeDisabledRules: true }).warning.filter(function(issue) {
+ return issue.type !== "help_request";
+ });
+ addIssueCounts(warnings, "warnings");
+ var resolvedIssues = context.validator().getResolvedIssues();
+ addIssueCounts(resolvedIssues, "resolved");
+ context.changeset = context.changeset.update({ tags });
+ }
+ function render(selection2) {
+ var osm = context.connection();
+ if (!osm)
+ return;
+ var header = selection2.selectAll(".header").data([0]);
+ var headerTitle = header.enter().append("div").attr("class", "header fillL");
+ headerTitle.append("div").append("h2").call(_t.append("commit.title"));
+ headerTitle.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() {
+ dispatch10.call("cancel", this);
+ }).call(svgIcon("#iD-icon-close"));
+ var body = selection2.selectAll(".body").data([0]);
+ body = body.enter().append("div").attr("class", "body").merge(body);
+ var changesetSection = body.selectAll(".changeset-editor").data([0]);
+ changesetSection = changesetSection.enter().append("div").attr("class", "modal-section changeset-editor").merge(changesetSection);
+ changesetSection.call(changesetEditor.changesetID(context.changeset.id).tags(context.changeset.tags));
+ body.call(commitWarnings);
+ var saveSection = body.selectAll(".save-section").data([0]);
+ saveSection = saveSection.enter().append("div").attr("class", "modal-section save-section fillL").merge(saveSection);
+ var prose = saveSection.selectAll(".commit-info").data([0]);
+ if (prose.enter().size()) {
+ _userDetails2 = null;
+ }
+ prose = prose.enter().append("p").attr("class", "commit-info").call(_t.append("commit.upload_explanation")).merge(prose);
+ osm.userDetails(function(err, user) {
+ if (err)
+ return;
+ if (_userDetails2 === user)
+ return;
+ _userDetails2 = user;
+ var userLink = select_default2(document.createElement("div"));
+ if (user.image_url) {
+ userLink.append("img").attr("src", user.image_url).attr("class", "icon pre-text user-icon");
+ }
+ userLink.append("a").attr("class", "user-info").text(user.display_name).attr("href", osm.userURL(user.display_name)).attr("target", "_blank");
+ prose.html(_t.html("commit.upload_explanation_with_user", { user: { html: userLink.html() } }));
+ });
+ var requestReview = saveSection.selectAll(".request-review").data([0]);
+ var requestReviewEnter = requestReview.enter().append("div").attr("class", "request-review");
+ var requestReviewDomId = utilUniqueDomId("commit-input-request-review");
+ var labelEnter = requestReviewEnter.append("label").attr("for", requestReviewDomId);
+ if (!labelEnter.empty()) {
+ labelEnter.call(uiTooltip().title(_t.html("commit.request_review_info")).placement("top"));
+ }
+ labelEnter.append("input").attr("type", "checkbox").attr("id", requestReviewDomId);
+ labelEnter.append("span").call(_t.append("commit.request_review"));
+ requestReview = requestReview.merge(requestReviewEnter);
+ var requestReviewInput = requestReview.selectAll("input").property("checked", isReviewRequested(context.changeset.tags)).on("change", toggleRequestReview);
+ var buttonSection = saveSection.selectAll(".buttons").data([0]);
+ var buttonEnter = buttonSection.enter().append("div").attr("class", "buttons fillL");
+ buttonEnter.append("button").attr("class", "secondary-action button cancel-button").append("span").attr("class", "label").call(_t.append("commit.cancel"));
+ var uploadButton = buttonEnter.append("button").attr("class", "action button save-button");
+ uploadButton.append("span").attr("class", "label").call(_t.append("commit.save"));
+ var uploadBlockerTooltipText = getUploadBlockerMessage();
+ buttonSection = buttonSection.merge(buttonEnter);
+ buttonSection.selectAll(".cancel-button").on("click.cancel", function() {
+ dispatch10.call("cancel", this);
+ });
+ buttonSection.selectAll(".save-button").classed("disabled", uploadBlockerTooltipText !== null).on("click.save", function() {
+ if (!select_default2(this).classed("disabled")) {
+ this.blur();
+ for (var key in context.changeset.tags) {
+ if (!key)
+ delete context.changeset.tags[key];
+ }
+ context.uploader().save(context.changeset);
+ }
+ });
+ uiTooltip().destroyAny(buttonSection.selectAll(".save-button"));
+ if (uploadBlockerTooltipText) {
+ buttonSection.selectAll(".save-button").call(uiTooltip().title(uploadBlockerTooltipText).placement("top"));
+ }
+ var tagSection = body.selectAll(".tag-section.raw-tag-editor").data([0]);
+ tagSection = tagSection.enter().append("div").attr("class", "modal-section tag-section raw-tag-editor").merge(tagSection);
+ tagSection.call(rawTagEditor.tags(Object.assign({}, context.changeset.tags)).render);
+ var changesSection = body.selectAll(".commit-changes-section").data([0]);
+ changesSection = changesSection.enter().append("div").attr("class", "modal-section commit-changes-section").merge(changesSection);
+ changesSection.call(commitChanges.render);
+ function toggleRequestReview() {
+ var rr = requestReviewInput.property("checked");
+ updateChangeset({ review_requested: rr ? "yes" : void 0 });
+ tagSection.call(rawTagEditor.tags(Object.assign({}, context.changeset.tags)).render);
+ }
+ }
+ function getUploadBlockerMessage() {
+ var errors = context.validator().getIssuesBySeverity({ what: "edited", where: "all" }).error;
+ if (errors.length) {
+ return _t("commit.outstanding_errors_message", { count: errors.length });
+ } else {
+ var hasChangesetComment = context.changeset && context.changeset.tags.comment && context.changeset.tags.comment.trim().length;
+ if (!hasChangesetComment) {
+ return _t("commit.comment_needed_message");
+ }
+ }
+ return null;
+ }
+ function changeTags(_, changed, onInput) {
+ if (changed.hasOwnProperty("comment")) {
+ if (changed.comment === void 0) {
+ changed.comment = "";
+ }
+ if (!onInput) {
+ corePreferences("comment", changed.comment);
+ corePreferences("commentDate", Date.now());
+ }
+ }
+ if (changed.hasOwnProperty("source")) {
+ if (changed.source === void 0) {
+ corePreferences("source", null);
+ } else if (!onInput) {
+ corePreferences("source", changed.source);
+ corePreferences("commentDate", Date.now());
+ }
+ }
+ updateChangeset(changed, onInput);
+ if (_selection) {
+ _selection.call(render);
+ }
+ }
+ function findHashtags(tags, commentOnly) {
+ var detectedHashtags = commentHashtags();
+ if (detectedHashtags.length) {
+ corePreferences("hashtags", null);
+ }
+ if (!detectedHashtags.length || !commentOnly) {
+ detectedHashtags = detectedHashtags.concat(hashtagHashtags());
+ }
+ var allLowerCase = /* @__PURE__ */ new Set();
+ return detectedHashtags.filter(function(hashtag) {
+ var lowerCase = hashtag.toLowerCase();
+ if (!allLowerCase.has(lowerCase)) {
+ allLowerCase.add(lowerCase);
+ return true;
+ }
+ return false;
+ });
+ function commentHashtags() {
+ var matches = (tags.comment || "").replace(/http\S*/g, "").match(hashtagRegex);
+ return matches || [];
+ }
+ function hashtagHashtags() {
+ var matches = (tags.hashtags || "").split(/[,;\s]+/).map(function(s) {
+ if (s[0] !== "#") {
+ s = "#" + s;
+ }
+ var matched = s.match(hashtagRegex);
+ return matched && matched[0];
+ }).filter(Boolean);
+ return matches || [];
+ }
+ }
+ function isReviewRequested(tags) {
+ var rr = tags.review_requested;
+ if (rr === void 0)
+ return false;
+ rr = rr.trim().toLowerCase();
+ return !(rr === "" || rr === "no");
+ }
+ function updateChangeset(changed, onInput) {
+ var tags = Object.assign({}, context.changeset.tags);
+ Object.keys(changed).forEach(function(k) {
+ var v = changed[k];
+ k = context.cleanTagKey(k);
+ if (readOnlyTags.indexOf(k) !== -1)
+ return;
+ if (v === void 0) {
+ delete tags[k];
+ } else if (onInput) {
+ tags[k] = v;
+ } else {
+ tags[k] = context.cleanTagValue(v);
+ }
+ });
+ if (!onInput) {
+ var commentOnly = changed.hasOwnProperty("comment") && changed.comment !== "";
+ var arr = findHashtags(tags, commentOnly);
+ if (arr.length) {
+ tags.hashtags = context.cleanTagValue(arr.join(";"));
+ corePreferences("hashtags", tags.hashtags);
+ } else {
+ delete tags.hashtags;
+ corePreferences("hashtags", null);
+ }
+ }
+ if (_userDetails2 && _userDetails2.changesets_count !== void 0) {
+ var changesetsCount = parseInt(_userDetails2.changesets_count, 10) + 1;
+ tags.changesets_count = String(changesetsCount);
+ if (changesetsCount <= 100) {
+ var s;
+ s = corePreferences("walkthrough_completed");
+ if (s) {
+ tags["ideditor:walkthrough_completed"] = s;
+ }
+ s = corePreferences("walkthrough_progress");
+ if (s) {
+ tags["ideditor:walkthrough_progress"] = s;
+ }
+ s = corePreferences("walkthrough_started");
+ if (s) {
+ tags["ideditor:walkthrough_started"] = s;
+ }
+ }
+ } else {
+ delete tags.changesets_count;
+ }
+ if (!(0, import_fast_deep_equal9.default)(context.changeset.tags, tags)) {
+ context.changeset = context.changeset.update({ tags });
+ }
+ }
+ commit.reset = function() {
+ context.changeset = null;
+ };
+ return utilRebind(commit, dispatch10, "on");
+ }
+
+ // modules/ui/confirm.js
+ function uiConfirm(selection2) {
+ var modalSelection = uiModal(selection2);
+ modalSelection.select(".modal").classed("modal-alert", true);
+ var section = modalSelection.select(".content");
+ section.append("div").attr("class", "modal-section header");
+ section.append("div").attr("class", "modal-section message-text");
+ var buttons = section.append("div").attr("class", "modal-section buttons cf");
+ modalSelection.okButton = function() {
+ buttons.append("button").attr("class", "button ok-button action").on("click.confirm", function() {
+ modalSelection.remove();
+ }).call(_t.append("confirm.okay")).node().focus();
+ return modalSelection;
+ };
+ return modalSelection;
+ }
+
+ // modules/ui/conflicts.js
+ function uiConflicts(context) {
+ var dispatch10 = dispatch_default("cancel", "save");
+ var keybinding = utilKeybinding("conflicts");
+ var _origChanges;
+ var _conflictList;
+ var _shownConflictIndex;
+ function keybindingOn() {
+ select_default2(document).call(keybinding.on("\u238B", cancel, true));
+ }
+ function keybindingOff() {
+ select_default2(document).call(keybinding.unbind);
+ }
+ function tryAgain() {
+ keybindingOff();
+ dispatch10.call("save");
+ }
+ function cancel() {
+ keybindingOff();
+ dispatch10.call("cancel");
+ }
+ function conflicts(selection2) {
+ keybindingOn();
+ var headerEnter = selection2.selectAll(".header").data([0]).enter().append("div").attr("class", "header fillL");
+ headerEnter.append("button").attr("class", "fr").attr("title", _t("icons.close")).on("click", cancel).call(svgIcon("#iD-icon-close"));
+ headerEnter.append("h2").call(_t.append("save.conflict.header"));
+ var bodyEnter = selection2.selectAll(".body").data([0]).enter().append("div").attr("class", "body fillL");
+ var conflictsHelpEnter = bodyEnter.append("div").attr("class", "conflicts-help").call(_t.append("save.conflict.help"));
+ var changeset = new osmChangeset();
+ delete changeset.id;
+ var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
+ var blob = new Blob([data], { type: "text/xml;charset=utf-8;" });
+ var fileName = "changes.osc";
+ var linkEnter = conflictsHelpEnter.selectAll(".download-changes").append("a").attr("class", "download-changes");
+ linkEnter.attr("href", window.URL.createObjectURL(blob)).attr("download", fileName);
+ linkEnter.call(svgIcon("#iD-icon-load", "inline")).append("span").call(_t.append("save.conflict.download_changes"));
+ bodyEnter.append("div").attr("class", "conflict-container fillL3").call(showConflict, 0);
+ bodyEnter.append("div").attr("class", "conflicts-done").attr("opacity", 0).style("display", "none").call(_t.append("save.conflict.done"));
+ var buttonsEnter = bodyEnter.append("div").attr("class", "buttons col12 joined conflicts-buttons");
+ buttonsEnter.append("button").attr("disabled", _conflictList.length > 1).attr("class", "action conflicts-button col6").call(_t.append("save.title")).on("click.try_again", tryAgain);
+ buttonsEnter.append("button").attr("class", "secondary-action conflicts-button col6").call(_t.append("confirm.cancel")).on("click.cancel", cancel);
+ }
+ function showConflict(selection2, index) {
+ index = utilWrap(index, _conflictList.length);
+ _shownConflictIndex = index;
+ var parent = select_default2(selection2.node().parentNode);
+ if (index === _conflictList.length - 1) {
+ window.setTimeout(function() {
+ parent.select(".conflicts-button").attr("disabled", null);
+ parent.select(".conflicts-done").transition().attr("opacity", 1).style("display", "block");
+ }, 250);
+ }
+ var conflict = selection2.selectAll(".conflict").data([_conflictList[index]]);
+ conflict.exit().remove();
+ var conflictEnter = conflict.enter().append("div").attr("class", "conflict");
+ conflictEnter.append("h4").attr("class", "conflict-count").call(_t.append("save.conflict.count", { num: index + 1, total: _conflictList.length }));
+ conflictEnter.append("a").attr("class", "conflict-description").attr("href", "#").text(function(d) {
+ return d.name;
+ }).on("click", function(d3_event, d) {
+ d3_event.preventDefault();
+ zoomToEntity(d.id);
+ });
+ var details = conflictEnter.append("div").attr("class", "conflict-detail-container");
+ details.append("ul").attr("class", "conflict-detail-list").selectAll("li").data(function(d) {
+ return d.details || [];
+ }).enter().append("li").attr("class", "conflict-detail-item").html(function(d) {
+ return d;
+ });
+ details.append("div").attr("class", "conflict-choices").call(addChoices);
+ details.append("div").attr("class", "conflict-nav-buttons joined cf").selectAll("button").data(["previous", "next"]).enter().append("button").html(function(d) {
+ return _t.html("save.conflict." + d);
+ }).attr("class", "conflict-nav-button action col6").attr("disabled", function(d, i2) {
+ return i2 === 0 && index === 0 || i2 === 1 && index === _conflictList.length - 1 || null;
+ }).on("click", function(d3_event, d) {
+ d3_event.preventDefault();
+ var container = parent.selectAll(".conflict-container");
+ var sign2 = d === "previous" ? -1 : 1;
+ container.selectAll(".conflict").remove();
+ container.call(showConflict, index + sign2);
+ });
+ }
+ function addChoices(selection2) {
+ var choices = selection2.append("ul").attr("class", "layer-list").selectAll("li").data(function(d) {
+ return d.choices || [];
+ });
+ var choicesEnter = choices.enter().append("li").attr("class", "layer");
+ var labelEnter = choicesEnter.append("label");
+ labelEnter.append("input").attr("type", "radio").attr("name", function(d) {
+ return d.id;
+ }).on("change", function(d3_event, d) {
+ var ul = this.parentNode.parentNode.parentNode;
+ ul.__data__.chosen = d.id;
+ choose(d3_event, ul, d);
+ });
+ labelEnter.append("span").text(function(d) {
+ return d.text;
+ });
+ choicesEnter.merge(choices).each(function(d) {
+ var ul = this.parentNode;
+ if (ul.__data__.chosen === d.id) {
+ choose(null, ul, d);
+ }
+ });
+ }
+ function choose(d3_event, ul, datum2) {
+ if (d3_event)
+ d3_event.preventDefault();
+ select_default2(ul).selectAll("li").classed("active", function(d) {
+ return d === datum2;
+ }).selectAll("input").property("checked", function(d) {
+ return d === datum2;
+ });
+ var extent = geoExtent();
+ var entity;
+ entity = context.graph().hasEntity(datum2.id);
+ if (entity)
+ extent._extend(entity.extent(context.graph()));
+ datum2.action();
+ entity = context.graph().hasEntity(datum2.id);
+ if (entity)
+ extent._extend(entity.extent(context.graph()));
+ zoomToEntity(datum2.id, extent);
+ }
+ function zoomToEntity(id2, extent) {
+ context.surface().selectAll(".hover").classed("hover", false);
+ var entity = context.graph().hasEntity(id2);
+ if (entity) {
+ if (extent) {
+ context.map().trimmedExtent(extent);
+ } else {
+ context.map().zoomToEase(entity);
+ }
+ context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph())).classed("hover", true);
+ }
+ }
+ conflicts.conflictList = function(_) {
+ if (!arguments.length)
+ return _conflictList;
+ _conflictList = _;
+ return conflicts;
+ };
+ conflicts.origChanges = function(_) {
+ if (!arguments.length)
+ return _origChanges;
+ _origChanges = _;
+ return conflicts;
+ };
+ conflicts.shownEntityIds = function() {
+ if (_conflictList && typeof _shownConflictIndex === "number") {
+ return [_conflictList[_shownConflictIndex].id];
+ }
+ return [];
+ };
+ return utilRebind(conflicts, dispatch10, "on");
+ }
+
+ // modules/ui/entity_editor.js
+ var import_fast_deep_equal10 = __toESM(require_fast_deep_equal());
+
+ // modules/ui/sections/entity_issues.js
+ function uiSectionEntityIssues(context) {
+ var preference = corePreferences("entity-issues.reference.expanded");
+ var _expanded = preference === null ? true : preference === "true";
+ var _entityIDs = [];
+ var _issues = [];
+ var _activeIssueID;
+ var section = uiSection("entity-issues", context).shouldDisplay(function() {
+ return _issues.length > 0;
+ }).label(function() {
+ return _t.html("inspector.title_count", { title: { html: _t.html("issues.list_title") }, count: _issues.length });
+ }).disclosureContent(renderDisclosureContent);
+ context.validator().on("validated.entity_issues", function() {
+ reloadIssues();
+ section.reRender();
+ }).on("focusedIssue.entity_issues", function(issue) {
+ makeActiveIssue(issue.id);
+ });
+ function reloadIssues() {
+ _issues = context.validator().getSharedEntityIssues(_entityIDs, { includeDisabledRules: true });
+ }
+ function makeActiveIssue(issueID) {
+ _activeIssueID = issueID;
+ section.selection().selectAll(".issue-container").classed("active", function(d) {
+ return d.id === _activeIssueID;
+ });
+ }
+ function renderDisclosureContent(selection2) {
+ selection2.classed("grouped-items-area", true);
+ _activeIssueID = _issues.length > 0 ? _issues[0].id : null;
+ var containers = selection2.selectAll(".issue-container").data(_issues, function(d) {
+ return d.key;
+ });
+ containers.exit().remove();
+ var containersEnter = containers.enter().append("div").attr("class", "issue-container");
+ var itemsEnter = containersEnter.append("div").attr("class", function(d) {
+ return "issue severity-" + d.severity;
+ }).on("mouseover.highlight", function(d3_event, d) {
+ var ids = d.entityIds.filter(function(e) {
+ return _entityIDs.indexOf(e) === -1;
+ });
+ utilHighlightEntities(ids, true, context);
+ }).on("mouseout.highlight", function(d3_event, d) {
+ var ids = d.entityIds.filter(function(e) {
+ return _entityIDs.indexOf(e) === -1;
+ });
+ utilHighlightEntities(ids, false, context);
+ });
+ var labelsEnter = itemsEnter.append("div").attr("class", "issue-label");
+ var textEnter = labelsEnter.append("button").attr("class", "issue-text").on("click", function(d3_event, d) {
+ makeActiveIssue(d.id);
+ var extent = d.extent(context.graph());
+ if (extent) {
+ var setZoom = Math.max(context.map().zoom(), 19);
+ context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
+ }
+ });
+ textEnter.each(function(d) {
+ var iconName = "#iD-icon-" + (d.severity === "warning" ? "alert" : "error");
+ select_default2(this).call(svgIcon(iconName, "issue-icon"));
+ });
+ textEnter.append("span").attr("class", "issue-message");
+ var infoButton = labelsEnter.append("button").attr("class", "issue-info-button").attr("title", _t("icons.information")).call(svgIcon("#iD-icon-inspect"));
+ infoButton.on("click", function(d3_event) {
+ d3_event.stopPropagation();
+ d3_event.preventDefault();
+ this.blur();
+ var container = select_default2(this.parentNode.parentNode.parentNode);
+ var info = container.selectAll(".issue-info");
+ var isExpanded = info.classed("expanded");
+ _expanded = !isExpanded;
+ corePreferences("entity-issues.reference.expanded", _expanded);
+ if (isExpanded) {
+ info.transition().duration(200).style("max-height", "0px").style("opacity", "0").on("end", function() {
+ info.classed("expanded", false);
+ });
+ } else {
+ info.classed("expanded", true).transition().duration(200).style("max-height", "200px").style("opacity", "1").on("end", function() {
+ info.style("max-height", null);
+ });
+ }
+ });
+ itemsEnter.append("ul").attr("class", "issue-fix-list");
+ containersEnter.append("div").attr("class", "issue-info" + (_expanded ? " expanded" : "")).style("max-height", _expanded ? null : "0").style("opacity", _expanded ? "1" : "0").each(function(d) {
+ if (typeof d.reference === "function") {
+ select_default2(this).call(d.reference);
+ } else {
+ select_default2(this).call(_t.append("inspector.no_documentation_key"));
+ }
+ });
+ containers = containers.merge(containersEnter).classed("active", function(d) {
+ return d.id === _activeIssueID;
+ });
+ containers.selectAll(".issue-message").html(function(d) {
+ return d.message(context);
+ });
+ var fixLists = containers.selectAll(".issue-fix-list");
+ var fixes = fixLists.selectAll(".issue-fix-item").data(function(d) {
+ return d.fixes ? d.fixes(context) : [];
+ }, function(fix) {
+ return fix.id;
+ });
+ fixes.exit().remove();
+ var fixesEnter = fixes.enter().append("li").attr("class", "issue-fix-item");
+ var buttons = fixesEnter.append("button").on("click", function(d3_event, d) {
+ if (select_default2(this).attr("disabled") || !d.onClick)
+ return;
+ if (d.issue.dateLastRanFix && new Date() - d.issue.dateLastRanFix < 1e3)
+ return;
+ d.issue.dateLastRanFix = new Date();
+ utilHighlightEntities(d.issue.entityIds.concat(d.entityIds), false, context);
+ new Promise(function(resolve, reject) {
+ d.onClick(context, resolve, reject);
+ if (d.onClick.length <= 1) {
+ resolve();
+ }
+ }).then(function() {
+ context.validator().validate();
+ });
+ }).on("mouseover.highlight", function(d3_event, d) {
+ utilHighlightEntities(d.entityIds, true, context);
+ }).on("mouseout.highlight", function(d3_event, d) {
+ utilHighlightEntities(d.entityIds, false, context);
+ });
+ buttons.each(function(d) {
+ var iconName = d.icon || "iD-icon-wrench";
+ if (iconName.startsWith("maki")) {
+ iconName += "-15";
+ }
+ select_default2(this).call(svgIcon("#" + iconName, "fix-icon"));
+ });
+ buttons.append("span").attr("class", "fix-message").html(function(d) {
+ return d.title;
+ });
+ fixesEnter.merge(fixes).selectAll("button").classed("actionable", function(d) {
+ return d.onClick;
+ }).attr("disabled", function(d) {
+ return d.onClick ? null : "true";
+ }).attr("title", function(d) {
+ if (d.disabledReason) {
+ return d.disabledReason;
+ }
+ return null;
+ });
+ }
+ section.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ if (!_entityIDs || !val || !utilArrayIdentical(_entityIDs, val)) {
+ _entityIDs = val;
+ _activeIssueID = null;
+ reloadIssues();
+ }
+ return section;
+ };
+ return section;
+ }
+
+ // modules/ui/preset_icon.js
+ function uiPresetIcon() {
+ let _preset;
+ let _geometry;
+ function presetIcon(selection2) {
+ selection2.each(render);
+ }
+ function getIcon(p, geom) {
+ if (p.icon)
+ return p.icon;
+ if (geom === "line")
+ return "iD-other-line";
+ if (geom === "vertex")
+ return p.isFallback() ? "" : "temaki-vertex";
+ return "maki-marker-stroked";
+ }
+ function renderPointBorder(container, drawPoint) {
+ let pointBorder = container.selectAll(".preset-icon-point-border").data(drawPoint ? [0] : []);
+ pointBorder.exit().remove();
+ let pointBorderEnter = pointBorder.enter();
+ const w = 40;
+ const h = 40;
+ pointBorderEnter.append("svg").attr("class", "preset-icon-fill preset-icon-point-border").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`).append("path").attr("transform", "translate(11.5, 8)").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");
+ pointBorder = pointBorderEnter.merge(pointBorder);
+ }
+ function renderCategoryBorder(container, category) {
+ let categoryBorder = container.selectAll(".preset-icon-category-border").data(category ? [0] : []);
+ categoryBorder.exit().remove();
+ let categoryBorderEnter = categoryBorder.enter();
+ const d = 60;
+ let svgEnter = categoryBorderEnter.append("svg").attr("class", "preset-icon-fill preset-icon-category-border").attr("width", d).attr("height", d).attr("viewBox", `0 0 ${d} ${d}`);
+ svgEnter.append("path").attr("class", "area").attr("d", "M9.5,7.5 L25.5,7.5 L28.5,12.5 L49.5,12.5 C51.709139,12.5 53.5,14.290861 53.5,16.5 L53.5,43.5 C53.5,45.709139 51.709139,47.5 49.5,47.5 L10.5,47.5 C8.290861,47.5 6.5,45.709139 6.5,43.5 L6.5,12.5 L9.5,7.5 Z");
+ categoryBorder = categoryBorderEnter.merge(categoryBorder);
+ if (category) {
+ categoryBorder.selectAll("path").attr("class", `area ${category.id}`);
+ }
+ }
+ function renderCircleFill(container, drawVertex) {
+ let vertexFill = container.selectAll(".preset-icon-fill-vertex").data(drawVertex ? [0] : []);
+ vertexFill.exit().remove();
+ let vertexFillEnter = vertexFill.enter();
+ const w = 60;
+ const h = 60;
+ const d = 40;
+ vertexFillEnter.append("svg").attr("class", "preset-icon-fill preset-icon-fill-vertex").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`).append("circle").attr("cx", w / 2).attr("cy", h / 2).attr("r", d / 2);
+ vertexFill = vertexFillEnter.merge(vertexFill);
+ }
+ function renderSquareFill(container, drawArea, tagClasses) {
+ let fill = container.selectAll(".preset-icon-fill-area").data(drawArea ? [0] : []);
+ fill.exit().remove();
+ let fillEnter = fill.enter();
+ const d = 60;
+ const w = d;
+ const h = d;
+ const l = d * 2 / 3;
+ const c1 = (w - l) / 2;
+ const c2 = c1 + l;
+ fillEnter = fillEnter.append("svg").attr("class", "preset-icon-fill preset-icon-fill-area").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`);
+ ["fill", "stroke"].forEach((klass) => {
+ fillEnter.append("path").attr("d", `M${c1} ${c1} L${c1} ${c2} L${c2} ${c2} L${c2} ${c1} Z`).attr("class", `area ${klass}`);
+ });
+ const rVertex = 2.5;
+ [[c1, c1], [c1, c2], [c2, c2], [c2, c1]].forEach((point) => {
+ fillEnter.append("circle").attr("class", "vertex").attr("cx", point[0]).attr("cy", point[1]).attr("r", rVertex);
+ });
+ const rMidpoint = 1.25;
+ [[c1, w / 2], [c2, w / 2], [h / 2, c1], [h / 2, c2]].forEach((point) => {
+ fillEnter.append("circle").attr("class", "midpoint").attr("cx", point[0]).attr("cy", point[1]).attr("r", rMidpoint);
+ });
+ fill = fillEnter.merge(fill);
+ fill.selectAll("path.stroke").attr("class", `area stroke ${tagClasses}`);
+ fill.selectAll("path.fill").attr("class", `area fill ${tagClasses}`);
+ }
+ function renderLine(container, drawLine, tagClasses) {
+ let line = container.selectAll(".preset-icon-line").data(drawLine ? [0] : []);
+ line.exit().remove();
+ let lineEnter = line.enter();
+ const d = 60;
+ const w = d;
+ const h = d;
+ const y = Math.round(d * 0.72);
+ const l = Math.round(d * 0.6);
+ const r = 2.5;
+ const x12 = (w - l) / 2;
+ const x2 = x12 + l;
+ lineEnter = lineEnter.append("svg").attr("class", "preset-icon-line").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`);
+ ["casing", "stroke"].forEach((klass) => {
+ lineEnter.append("path").attr("d", `M${x12} ${y} L${x2} ${y}`).attr("class", `line ${klass}`);
+ });
+ [[x12 - 1, y], [x2 + 1, y]].forEach((point) => {
+ lineEnter.append("circle").attr("class", "vertex").attr("cx", point[0]).attr("cy", point[1]).attr("r", r);
+ });
+ line = lineEnter.merge(line);
+ line.selectAll("path.stroke").attr("class", `line stroke ${tagClasses}`);
+ line.selectAll("path.casing").attr("class", `line casing ${tagClasses}`);
+ }
+ function renderRoute(container, drawRoute, p) {
+ let route = container.selectAll(".preset-icon-route").data(drawRoute ? [0] : []);
+ route.exit().remove();
+ let routeEnter = route.enter();
+ const d = 60;
+ const w = d;
+ const h = d;
+ const y12 = Math.round(d * 0.8);
+ const y2 = Math.round(d * 0.68);
+ const l = Math.round(d * 0.6);
+ const r = 2;
+ const x12 = (w - l) / 2;
+ const x2 = x12 + l / 3;
+ const x3 = x2 + l / 3;
+ const x4 = x3 + l / 3;
+ routeEnter = routeEnter.append("svg").attr("class", "preset-icon-route").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`);
+ ["casing", "stroke"].forEach((klass) => {
+ routeEnter.append("path").attr("d", `M${x12} ${y12} L${x2} ${y2}`).attr("class", `segment0 line ${klass}`);
+ routeEnter.append("path").attr("d", `M${x2} ${y2} L${x3} ${y12}`).attr("class", `segment1 line ${klass}`);
+ routeEnter.append("path").attr("d", `M${x3} ${y12} L${x4} ${y2}`).attr("class", `segment2 line ${klass}`);
+ });
+ [[x12, y12], [x2, y2], [x3, y12], [x4, y2]].forEach((point) => {
+ routeEnter.append("circle").attr("class", "vertex").attr("cx", point[0]).attr("cy", point[1]).attr("r", r);
+ });
+ route = routeEnter.merge(route);
+ if (drawRoute) {
+ let routeType = p.tags.type === "waterway" ? "waterway" : p.tags.route;
+ const segmentPresetIDs = routeSegments[routeType];
+ for (let i2 in segmentPresetIDs) {
+ const segmentPreset = _mainPresetIndex.item(segmentPresetIDs[i2]);
+ const segmentTagClasses = svgTagClasses().getClassesString(segmentPreset.tags, "");
+ route.selectAll(`path.stroke.segment${i2}`).attr("class", `segment${i2} line stroke ${segmentTagClasses}`);
+ route.selectAll(`path.casing.segment${i2}`).attr("class", `segment${i2} line casing ${segmentTagClasses}`);
+ }
+ }
+ }
+ function renderSvgIcon(container, picon, geom, isFramed, category, tagClasses) {
+ const isMaki = picon && /^maki-/.test(picon);
+ const isTemaki = picon && /^temaki-/.test(picon);
+ const isFa = picon && /^fa[srb]-/.test(picon);
+ const isiDIcon = picon && !(isMaki || isTemaki || isFa);
+ let icon2 = container.selectAll(".preset-icon").data(picon ? [0] : []);
+ icon2.exit().remove();
+ icon2 = icon2.enter().append("div").attr("class", "preset-icon").call(svgIcon("")).merge(icon2);
+ icon2.attr("class", "preset-icon " + (geom ? geom + "-geom" : "")).classed("category", category).classed("framed", isFramed).classed("preset-icon-iD", isiDIcon);
+ icon2.selectAll("svg").attr("class", "icon " + picon + " " + (!isiDIcon && geom !== "line" ? "" : tagClasses));
+ icon2.selectAll("use").attr("href", "#" + picon);
+ }
+ function renderImageIcon(container, imageURL) {
+ let imageIcon = container.selectAll("img.image-icon").data(imageURL ? [0] : []);
+ imageIcon.exit().remove();
+ imageIcon = imageIcon.enter().append("img").attr("class", "image-icon").on("load", () => container.classed("showing-img", true)).on("error", () => container.classed("showing-img", false)).merge(imageIcon);
+ imageIcon.attr("src", imageURL);
+ }
+ const routeSegments = {
+ bicycle: ["highway/cycleway", "highway/cycleway", "highway/cycleway"],
+ bus: ["highway/unclassified", "highway/secondary", "highway/primary"],
+ trolleybus: ["highway/unclassified", "highway/secondary", "highway/primary"],
+ detour: ["highway/tertiary", "highway/residential", "highway/unclassified"],
+ ferry: ["route/ferry", "route/ferry", "route/ferry"],
+ foot: ["highway/footway", "highway/footway", "highway/footway"],
+ hiking: ["highway/path", "highway/path", "highway/path"],
+ horse: ["highway/bridleway", "highway/bridleway", "highway/bridleway"],
+ light_rail: ["railway/light_rail", "railway/light_rail", "railway/light_rail"],
+ monorail: ["railway/monorail", "railway/monorail", "railway/monorail"],
+ mtb: ["highway/path", "highway/track", "highway/bridleway"],
+ pipeline: ["man_made/pipeline", "man_made/pipeline", "man_made/pipeline"],
+ piste: ["piste/downhill", "piste/hike", "piste/nordic"],
+ power: ["power/line", "power/line", "power/line"],
+ road: ["highway/secondary", "highway/primary", "highway/trunk"],
+ subway: ["railway/subway", "railway/subway", "railway/subway"],
+ train: ["railway/rail", "railway/rail", "railway/rail"],
+ tram: ["railway/tram", "railway/tram", "railway/tram"],
+ waterway: ["waterway/stream", "waterway/stream", "waterway/stream"]
+ };
+ function render() {
+ let p = _preset.apply(this, arguments);
+ let geom = _geometry ? _geometry.apply(this, arguments) : null;
+ if (geom === "relation" && p.tags && (p.tags.type === "route" && p.tags.route && routeSegments[p.tags.route] || p.tags.type === "waterway")) {
+ geom = "route";
+ }
+ const showThirdPartyIcons = corePreferences("preferences.privacy.thirdpartyicons") || "true";
+ const isFallback = p.isFallback && p.isFallback();
+ const imageURL = showThirdPartyIcons === "true" && p.imageURL;
+ const picon = getIcon(p, geom);
+ const isCategory = !p.setTags;
+ const drawPoint = false;
+ const drawVertex = picon !== null && geom === "vertex" && !isFallback;
+ const drawLine = picon && geom === "line" && !isFallback && !isCategory;
+ const drawArea = picon && geom === "area" && !isFallback && !isCategory;
+ const drawRoute = picon && geom === "route";
+ const isFramed = drawVertex || drawArea || drawLine || drawRoute || isCategory;
+ let tags = !isCategory ? p.setTags({}, geom) : {};
+ for (let k in tags) {
+ if (tags[k] === "*") {
+ tags[k] = "yes";
+ }
+ }
+ let tagClasses = svgTagClasses().getClassesString(tags, "");
+ let selection2 = select_default2(this);
+ let container = selection2.selectAll(".preset-icon-container").data([0]);
+ container = container.enter().append("div").attr("class", "preset-icon-container").merge(container);
+ container.classed("showing-img", !!imageURL).classed("fallback", isFallback);
+ renderCategoryBorder(container, isCategory && p);
+ renderPointBorder(container, drawPoint);
+ renderCircleFill(container, drawVertex);
+ renderSquareFill(container, drawArea, tagClasses);
+ renderLine(container, drawLine, tagClasses);
+ renderRoute(container, drawRoute, p);
+ renderSvgIcon(container, picon, geom, isFramed, isCategory, tagClasses);
+ renderImageIcon(container, imageURL);
+ }
+ presetIcon.preset = function(val) {
+ if (!arguments.length)
+ return _preset;
+ _preset = utilFunctor(val);
+ return presetIcon;
+ };
+ presetIcon.geometry = function(val) {
+ if (!arguments.length)
+ return _geometry;
+ _geometry = utilFunctor(val);
+ return presetIcon;
+ };
+ return presetIcon;
+ }
+
+ // modules/ui/sections/feature_type.js
+ function uiSectionFeatureType(context) {
+ var dispatch10 = dispatch_default("choose");
+ var _entityIDs = [];
+ var _presets = [];
+ var _tagReference;
+ var section = uiSection("feature-type", context).label(_t.html("inspector.feature_type")).disclosureContent(renderDisclosureContent);
+ function renderDisclosureContent(selection2) {
+ selection2.classed("preset-list-item", true);
+ selection2.classed("mixed-types", _presets.length > 1);
+ var presetButtonWrap = selection2.selectAll(".preset-list-button-wrap").data([0]).enter().append("div").attr("class", "preset-list-button-wrap");
+ var presetButton = presetButtonWrap.append("button").attr("class", "preset-list-button preset-reset").call(uiTooltip().title(_t.html("inspector.back_tooltip")).placement("bottom"));
+ presetButton.append("div").attr("class", "preset-icon-container");
+ presetButton.append("div").attr("class", "label").append("div").attr("class", "label-inner");
+ presetButtonWrap.append("div").attr("class", "accessory-buttons");
+ var tagReferenceBodyWrap = selection2.selectAll(".tag-reference-body-wrap").data([0]);
+ tagReferenceBodyWrap = tagReferenceBodyWrap.enter().append("div").attr("class", "tag-reference-body-wrap").merge(tagReferenceBodyWrap);
+ if (_tagReference) {
+ selection2.selectAll(".preset-list-button-wrap .accessory-buttons").style("display", _presets.length === 1 ? null : "none").call(_tagReference.button);
+ tagReferenceBodyWrap.style("display", _presets.length === 1 ? null : "none").call(_tagReference.body);
+ }
+ selection2.selectAll(".preset-reset").on("click", function() {
+ dispatch10.call("choose", this, _presets);
+ }).on("pointerdown pointerup mousedown mouseup", function(d3_event) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ });
+ var geometries = entityGeometries();
+ selection2.select(".preset-list-item button").call(uiPresetIcon().geometry(_presets.length === 1 ? geometries.length === 1 && geometries[0] : null).preset(_presets.length === 1 ? _presets[0] : _mainPresetIndex.item("point")));
+ var names = _presets.length === 1 ? [
+ _presets[0].nameLabel(),
+ _presets[0].subtitleLabel()
+ ].filter(Boolean) : [_t("inspector.multiple_types")];
+ var label = selection2.select(".label-inner");
+ var nameparts = label.selectAll(".namepart").data(names, function(d) {
+ return d;
+ });
+ nameparts.exit().remove();
+ nameparts.enter().append("div").attr("class", "namepart").html(function(d) {
+ return d;
+ });
+ }
+ section.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ return section;
+ };
+ section.presets = function(val) {
+ if (!arguments.length)
+ return _presets;
+ if (!utilArrayIdentical(val, _presets)) {
+ _presets = val;
+ if (_presets.length === 1) {
+ _tagReference = uiTagReference(_presets[0].reference(), context).showing(false);
+ }
+ }
+ return section;
+ };
+ function entityGeometries() {
+ var counts = {};
+ for (var i2 in _entityIDs) {
+ var geometry = context.graph().geometry(_entityIDs[i2]);
+ if (!counts[geometry])
+ counts[geometry] = 0;
+ counts[geometry] += 1;
+ }
+ return Object.keys(counts).sort(function(geom1, geom2) {
+ return counts[geom2] - counts[geom1];
+ });
+ }
+ return utilRebind(section, dispatch10, "on");
+ }
+
+ // modules/ui/sections/preset_fields.js
+ function uiSectionPresetFields(context) {
+ var section = uiSection("preset-fields", context).label(_t.html("inspector.fields")).disclosureContent(renderDisclosureContent);
+ var dispatch10 = dispatch_default("change", "revert");
+ var formFields = uiFormFields(context);
+ var _state;
+ var _fieldsArr;
+ var _presets = [];
+ var _tags;
+ var _entityIDs;
+ function renderDisclosureContent(selection2) {
+ if (!_fieldsArr) {
+ var graph = context.graph();
+ var geometries = Object.keys(_entityIDs.reduce(function(geoms, entityID) {
+ geoms[graph.entity(entityID).geometry(graph)] = true;
+ return geoms;
+ }, {}));
+ var presetsManager = _mainPresetIndex;
+ var allFields = [];
+ var allMoreFields = [];
+ var sharedTotalFields;
+ _presets.forEach(function(preset) {
+ var fields = preset.fields();
+ var moreFields = preset.moreFields();
+ allFields = utilArrayUnion(allFields, fields);
+ allMoreFields = utilArrayUnion(allMoreFields, moreFields);
+ if (!sharedTotalFields) {
+ sharedTotalFields = utilArrayUnion(fields, moreFields);
+ } else {
+ sharedTotalFields = sharedTotalFields.filter(function(field) {
+ return fields.indexOf(field) !== -1 || moreFields.indexOf(field) !== -1;
+ });
+ }
+ });
+ var sharedFields = allFields.filter(function(field) {
+ return sharedTotalFields.indexOf(field) !== -1;
+ });
+ var sharedMoreFields = allMoreFields.filter(function(field) {
+ return sharedTotalFields.indexOf(field) !== -1;
+ });
+ _fieldsArr = [];
+ sharedFields.forEach(function(field) {
+ if (field.matchAllGeometry(geometries)) {
+ _fieldsArr.push(uiField(context, field, _entityIDs));
+ }
+ });
+ var singularEntity = _entityIDs.length === 1 && graph.hasEntity(_entityIDs[0]);
+ if (singularEntity && singularEntity.isHighwayIntersection(graph) && presetsManager.field("restrictions")) {
+ _fieldsArr.push(uiField(context, presetsManager.field("restrictions"), _entityIDs));
+ }
+ var additionalFields = utilArrayUnion(sharedMoreFields, presetsManager.universal());
+ additionalFields.sort(function(field1, field2) {
+ return field1.label().localeCompare(field2.label(), _mainLocalizer.localeCode());
+ });
+ additionalFields.forEach(function(field) {
+ if (sharedFields.indexOf(field) === -1 && field.matchAllGeometry(geometries)) {
+ _fieldsArr.push(uiField(context, field, _entityIDs, { show: false }));
+ }
+ });
+ _fieldsArr.forEach(function(field) {
+ field.on("change", function(t, onInput) {
+ dispatch10.call("change", field, _entityIDs, t, onInput);
+ }).on("revert", function(keys) {
+ dispatch10.call("revert", field, keys);
+ });
+ });
+ }
+ _fieldsArr.forEach(function(field) {
+ field.state(_state).tags(_tags);
+ });
+ selection2.call(formFields.fieldsArr(_fieldsArr).state(_state).klass("grouped-items-area"));
+ selection2.selectAll(".wrap-form-field input").on("keydown", function(d3_event) {
+ if (d3_event.keyCode === 13 && context.container().select(".combobox").empty()) {
+ context.enter(modeBrowse(context));
+ }
+ });
+ }
+ section.presets = function(val) {
+ if (!arguments.length)
+ return _presets;
+ if (!_presets || !val || !utilArrayIdentical(_presets, val)) {
+ _presets = val;
+ _fieldsArr = null;
+ }
+ return section;
+ };
+ section.state = function(val) {
+ if (!arguments.length)
+ return _state;
+ _state = val;
+ return section;
+ };
+ section.tags = function(val) {
+ if (!arguments.length)
+ return _tags;
+ _tags = val;
+ return section;
+ };
+ section.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ if (!val || !_entityIDs || !utilArrayIdentical(_entityIDs, val)) {
+ _entityIDs = val;
+ _fieldsArr = null;
+ }
+ return section;
+ };
+ return utilRebind(section, dispatch10, "on");
+ }
+
+ // modules/ui/sections/raw_member_editor.js
+ function uiSectionRawMemberEditor(context) {
+ var section = uiSection("raw-member-editor", context).shouldDisplay(function() {
+ if (!_entityIDs || _entityIDs.length !== 1)
+ return false;
+ var entity = context.hasEntity(_entityIDs[0]);
+ return entity && entity.type === "relation";
+ }).label(function() {
+ var entity = context.hasEntity(_entityIDs[0]);
+ if (!entity)
+ return "";
+ var gt = entity.members.length > _maxMembers ? ">" : "";
+ var count = gt + entity.members.slice(0, _maxMembers).length;
+ return _t.html("inspector.title_count", { title: { html: _t.html("inspector.members") }, count });
+ }).disclosureContent(renderDisclosureContent);
+ var taginfo = services.taginfo;
+ var _entityIDs;
+ var _maxMembers = 1e3;
+ function downloadMember(d3_event, d) {
+ d3_event.preventDefault();
+ select_default2(this.parentNode).classed("tag-reference-loading", true);
+ context.loadEntity(d.id, function() {
+ section.reRender();
+ });
+ }
+ function zoomToMember(d3_event, d) {
+ d3_event.preventDefault();
+ var entity = context.entity(d.id);
+ context.map().zoomToEase(entity);
+ utilHighlightEntities([d.id], true, context);
+ }
+ function selectMember(d3_event, d) {
+ d3_event.preventDefault();
+ utilHighlightEntities([d.id], false, context);
+ var entity = context.entity(d.id);
+ var mapExtent = context.map().extent();
+ if (!entity.intersects(mapExtent, context.graph())) {
+ context.map().zoomToEase(entity);
+ }
+ context.enter(modeSelect(context, [d.id]));
+ }
+ function changeRole(d3_event, d) {
+ var oldRole = d.role;
+ var newRole = context.cleanRelationRole(select_default2(this).property("value"));
+ if (oldRole !== newRole) {
+ var member = { id: d.id, type: d.type, role: newRole };
+ context.perform(actionChangeMember(d.relation.id, member, d.index), _t("operations.change_role.annotation", {
+ n: 1
+ }));
+ context.validator().validate();
+ }
+ }
+ function deleteMember(d3_event, d) {
+ utilHighlightEntities([d.id], false, context);
+ context.perform(actionDeleteMember(d.relation.id, d.index), _t("operations.delete_member.annotation", {
+ n: 1
+ }));
+ if (!context.hasEntity(d.relation.id)) {
+ context.enter(modeBrowse(context));
+ } else {
+ context.validator().validate();
+ }
+ }
+ function renderDisclosureContent(selection2) {
+ var entityID = _entityIDs[0];
+ var memberships = [];
+ var entity = context.entity(entityID);
+ entity.members.slice(0, _maxMembers).forEach(function(member, index) {
+ memberships.push({
+ index,
+ id: member.id,
+ type: member.type,
+ role: member.role,
+ relation: entity,
+ member: context.hasEntity(member.id),
+ domId: utilUniqueDomId(entityID + "-member-" + index)
+ });
+ });
+ var list = selection2.selectAll(".member-list").data([0]);
+ list = list.enter().append("ul").attr("class", "member-list").merge(list);
+ var items = list.selectAll("li").data(memberships, function(d) {
+ return osmEntity.key(d.relation) + "," + d.index + "," + (d.member ? osmEntity.key(d.member) : "incomplete");
+ });
+ items.exit().each(unbind).remove();
+ var itemsEnter = items.enter().append("li").attr("class", "member-row form-field").classed("member-incomplete", function(d) {
+ return !d.member;
+ });
+ itemsEnter.each(function(d) {
+ var item = select_default2(this);
+ var label = item.append("label").attr("class", "field-label").attr("for", d.domId);
+ if (d.member) {
+ item.on("mouseover", function() {
+ utilHighlightEntities([d.id], true, context);
+ }).on("mouseout", function() {
+ utilHighlightEntities([d.id], false, context);
+ });
+ var labelLink = label.append("span").attr("class", "label-text").append("a").attr("href", "#").on("click", selectMember);
+ labelLink.append("span").attr("class", "member-entity-type").text(function(d2) {
+ var matched = _mainPresetIndex.match(d2.member, context.graph());
+ return matched && matched.name() || utilDisplayType(d2.member.id);
+ });
+ labelLink.append("span").attr("class", "member-entity-name").text(function(d2) {
+ return utilDisplayName(d2.member);
+ });
+ label.append("button").attr("title", _t("icons.remove")).attr("class", "remove member-delete").call(svgIcon("#iD-operation-delete"));
+ label.append("button").attr("class", "member-zoom").attr("title", _t("icons.zoom_to")).call(svgIcon("#iD-icon-framed-dot", "monochrome")).on("click", zoomToMember);
+ } else {
+ var labelText = label.append("span").attr("class", "label-text");
+ labelText.append("span").attr("class", "member-entity-type").call(_t.append("inspector." + d.type, { id: d.id }));
+ labelText.append("span").attr("class", "member-entity-name").call(_t.append("inspector.incomplete", { id: d.id }));
+ label.append("button").attr("class", "member-download").attr("title", _t("icons.download")).call(svgIcon("#iD-icon-load")).on("click", downloadMember);
+ }
+ });
+ var wrapEnter = itemsEnter.append("div").attr("class", "form-field-input-wrap form-field-input-member");
+ wrapEnter.append("input").attr("class", "member-role").attr("id", function(d) {
+ return d.domId;
+ }).property("type", "text").attr("placeholder", _t("inspector.role")).call(utilNoAuto);
+ if (taginfo) {
+ wrapEnter.each(bindTypeahead);
+ }
+ items = items.merge(itemsEnter).order();
+ items.select("input.member-role").property("value", function(d) {
+ return d.role;
+ }).on("blur", changeRole).on("change", changeRole);
+ items.select("button.member-delete").on("click", deleteMember);
+ var dragOrigin, targetIndex;
+ items.call(drag_default().on("start", function(d3_event) {
+ dragOrigin = {
+ x: d3_event.x,
+ y: d3_event.y
+ };
+ targetIndex = null;
+ }).on("drag", function(d3_event) {
+ var x = d3_event.x - dragOrigin.x, y = d3_event.y - dragOrigin.y;
+ if (!select_default2(this).classed("dragging") && Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5)
+ return;
+ var index = items.nodes().indexOf(this);
+ select_default2(this).classed("dragging", true);
+ targetIndex = null;
+ selection2.selectAll("li.member-row").style("transform", function(d2, index2) {
+ var node = select_default2(this).node();
+ if (index === index2) {
+ return "translate(" + x + "px, " + y + "px)";
+ } else if (index2 > index && d3_event.y > node.offsetTop) {
+ if (targetIndex === null || index2 > targetIndex) {
+ targetIndex = index2;
+ }
+ return "translateY(-100%)";
+ } else if (index2 < index && d3_event.y < node.offsetTop + node.offsetHeight) {
+ if (targetIndex === null || index2 < targetIndex) {
+ targetIndex = index2;
+ }
+ return "translateY(100%)";
+ }
+ return null;
+ });
+ }).on("end", function(d3_event, d) {
+ if (!select_default2(this).classed("dragging"))
+ return;
+ var index = items.nodes().indexOf(this);
+ select_default2(this).classed("dragging", false);
+ selection2.selectAll("li.member-row").style("transform", null);
+ if (targetIndex !== null) {
+ context.perform(actionMoveMember(d.relation.id, index, targetIndex), _t("operations.reorder_members.annotation"));
+ context.validator().validate();
+ }
+ }));
+ function bindTypeahead(d) {
+ var row = select_default2(this);
+ var role = row.selectAll("input.member-role");
+ var origValue = role.property("value");
+ function sort(value, data) {
+ var sameletter = [];
+ var other = [];
+ for (var i2 = 0; i2 < data.length; i2++) {
+ if (data[i2].value.substring(0, value.length) === value) {
+ sameletter.push(data[i2]);
+ } else {
+ other.push(data[i2]);
+ }
+ }
+ return sameletter.concat(other);
+ }
+ role.call(uiCombobox(context, "member-role").fetcher(function(role2, callback) {
+ var geometry;
+ if (d.member) {
+ geometry = context.graph().geometry(d.member.id);
+ } else if (d.type === "relation") {
+ geometry = "relation";
+ } else if (d.type === "way") {
+ geometry = "line";
+ } else {
+ geometry = "point";
+ }
+ var rtype = entity.tags.type;
+ taginfo.roles({
+ debounce: true,
+ rtype: rtype || "",
+ geometry,
+ query: role2
+ }, function(err, data) {
+ if (!err)
+ callback(sort(role2, data));
+ });
+ }).on("cancel", function() {
+ role.property("value", origValue);
+ }));
+ }
+ function unbind() {
+ var row = select_default2(this);
+ row.selectAll("input.member-role").call(uiCombobox.off, context);
+ }
+ }
+ section.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ return section;
+ };
+ return section;
+ }
+
+ // modules/actions/delete_members.js
+ function actionDeleteMembers(relationId, memberIndexes) {
+ return function(graph) {
+ memberIndexes.sort((a, b) => b - a);
+ for (var i2 in memberIndexes) {
+ graph = actionDeleteMember(relationId, memberIndexes[i2])(graph);
+ }
+ return graph;
+ };
+ }
+
+ // modules/ui/sections/raw_membership_editor.js
+ function uiSectionRawMembershipEditor(context) {
+ var section = uiSection("raw-membership-editor", context).shouldDisplay(function() {
+ return _entityIDs && _entityIDs.length;
+ }).label(function() {
+ var parents = getSharedParentRelations();
+ var gt = parents.length > _maxMemberships ? ">" : "";
+ var count = gt + parents.slice(0, _maxMemberships).length;
+ return _t.html("inspector.title_count", { title: { html: _t.html("inspector.relations") }, count });
+ }).disclosureContent(renderDisclosureContent);
+ var taginfo = services.taginfo;
+ var nearbyCombo = uiCombobox(context, "parent-relation").minItems(1).fetcher(fetchNearbyRelations).itemsMouseEnter(function(d3_event, d) {
+ if (d.relation)
+ utilHighlightEntities([d.relation.id], true, context);
+ }).itemsMouseLeave(function(d3_event, d) {
+ if (d.relation)
+ utilHighlightEntities([d.relation.id], false, context);
+ });
+ var _inChange = false;
+ var _entityIDs = [];
+ var _showBlank;
+ var _maxMemberships = 1e3;
+ function getSharedParentRelations() {
+ var parents = [];
+ for (var i2 = 0; i2 < _entityIDs.length; i2++) {
+ var entity = context.graph().hasEntity(_entityIDs[i2]);
+ if (!entity)
+ continue;
+ if (i2 === 0) {
+ parents = context.graph().parentRelations(entity);
+ } else {
+ parents = utilArrayIntersection(parents, context.graph().parentRelations(entity));
+ }
+ if (!parents.length)
+ break;
+ }
+ return parents;
+ }
+ function getMemberships() {
+ var memberships = [];
+ var relations = getSharedParentRelations().slice(0, _maxMemberships);
+ var isMultiselect = _entityIDs.length > 1;
+ var i2, relation, membership, index, member, indexedMember;
+ for (i2 = 0; i2 < relations.length; i2++) {
+ relation = relations[i2];
+ membership = {
+ relation,
+ members: [],
+ hash: osmEntity.key(relation)
+ };
+ for (index = 0; index < relation.members.length; index++) {
+ member = relation.members[index];
+ if (_entityIDs.indexOf(member.id) !== -1) {
+ indexedMember = Object.assign({}, member, { index });
+ membership.members.push(indexedMember);
+ membership.hash += "," + index.toString();
+ if (!isMultiselect) {
+ memberships.push(membership);
+ membership = {
+ relation,
+ members: [],
+ hash: osmEntity.key(relation)
+ };
+ }
+ }
+ }
+ if (membership.members.length)
+ memberships.push(membership);
+ }
+ memberships.forEach(function(membership2) {
+ membership2.domId = utilUniqueDomId("membership-" + membership2.relation.id);
+ var roles = [];
+ membership2.members.forEach(function(member2) {
+ if (roles.indexOf(member2.role) === -1)
+ roles.push(member2.role);
+ });
+ membership2.role = roles.length === 1 ? roles[0] : roles;
+ });
+ return memberships;
+ }
+ function selectRelation(d3_event, d) {
+ d3_event.preventDefault();
+ utilHighlightEntities([d.relation.id], false, context);
+ context.enter(modeSelect(context, [d.relation.id]));
+ }
+ function zoomToRelation(d3_event, d) {
+ d3_event.preventDefault();
+ var entity = context.entity(d.relation.id);
+ context.map().zoomToEase(entity);
+ utilHighlightEntities([d.relation.id], true, context);
+ }
+ function changeRole(d3_event, d) {
+ if (d === 0)
+ return;
+ if (_inChange)
+ return;
+ var newRole = context.cleanRelationRole(select_default2(this).property("value"));
+ if (!newRole.trim() && typeof d.role !== "string")
+ return;
+ var membersToUpdate = d.members.filter(function(member) {
+ return member.role !== newRole;
+ });
+ if (membersToUpdate.length) {
+ _inChange = true;
+ context.perform(function actionChangeMemberRoles(graph) {
+ membersToUpdate.forEach(function(member) {
+ var newMember = Object.assign({}, member, { role: newRole });
+ delete newMember.index;
+ graph = actionChangeMember(d.relation.id, newMember, member.index)(graph);
+ });
+ return graph;
+ }, _t("operations.change_role.annotation", {
+ n: membersToUpdate.length
+ }));
+ context.validator().validate();
+ }
+ _inChange = false;
+ }
+ function addMembership(d, role) {
+ this.blur();
+ _showBlank = false;
+ function actionAddMembers(relationId, ids, role2) {
+ return function(graph) {
+ for (var i2 in ids) {
+ var member = { id: ids[i2], type: graph.entity(ids[i2]).type, role: role2 };
+ graph = actionAddMember(relationId, member)(graph);
+ }
+ return graph;
+ };
+ }
+ if (d.relation) {
+ context.perform(actionAddMembers(d.relation.id, _entityIDs, role), _t("operations.add_member.annotation", {
+ n: _entityIDs.length
+ }));
+ context.validator().validate();
+ } else {
+ var relation = osmRelation();
+ context.perform(actionAddEntity(relation), actionAddMembers(relation.id, _entityIDs, role), _t("operations.add.annotation.relation"));
+ context.enter(modeSelect(context, [relation.id]).newFeature(true));
+ }
+ }
+ function deleteMembership(d3_event, d) {
+ this.blur();
+ if (d === 0)
+ return;
+ utilHighlightEntities([d.relation.id], false, context);
+ var indexes = d.members.map(function(member) {
+ return member.index;
+ });
+ context.perform(actionDeleteMembers(d.relation.id, indexes), _t("operations.delete_member.annotation", {
+ n: _entityIDs.length
+ }));
+ context.validator().validate();
+ }
+ function fetchNearbyRelations(q, callback) {
+ var newRelation = {
+ relation: null,
+ value: _t("inspector.new_relation"),
+ display: _t.html("inspector.new_relation")
+ };
+ var entityID = _entityIDs[0];
+ var result = [];
+ var graph = context.graph();
+ function baseDisplayLabel(entity) {
+ var matched = _mainPresetIndex.match(entity, graph);
+ var presetName = matched && matched.name() || _t("inspector.relation");
+ var entityName = utilDisplayName(entity) || "";
+ return presetName + " " + entityName;
+ }
+ var explicitRelation = q && context.hasEntity(q.toLowerCase());
+ if (explicitRelation && explicitRelation.type === "relation" && explicitRelation.id !== entityID) {
+ result.push({
+ relation: explicitRelation,
+ value: baseDisplayLabel(explicitRelation) + " " + explicitRelation.id
+ });
+ } else {
+ context.history().intersects(context.map().extent()).forEach(function(entity) {
+ if (entity.type !== "relation" || entity.id === entityID)
+ return;
+ var value = baseDisplayLabel(entity);
+ if (q && (value + " " + entity.id).toLowerCase().indexOf(q.toLowerCase()) === -1)
+ return;
+ result.push({ relation: entity, value });
+ });
+ result.sort(function(a, b) {
+ return osmRelation.creationOrder(a.relation, b.relation);
+ });
+ var dupeGroups = Object.values(utilArrayGroupBy(result, "value")).filter(function(v) {
+ return v.length > 1;
+ });
+ dupeGroups.forEach(function(group) {
+ group.forEach(function(obj) {
+ obj.value += " " + obj.relation.id;
+ });
+ });
+ }
+ result.forEach(function(obj) {
+ obj.title = obj.value;
+ });
+ result.unshift(newRelation);
+ callback(result);
+ }
+ function renderDisclosureContent(selection2) {
+ var memberships = getMemberships();
+ var list = selection2.selectAll(".member-list").data([0]);
+ list = list.enter().append("ul").attr("class", "member-list").merge(list);
+ var items = list.selectAll("li.member-row-normal").data(memberships, function(d) {
+ return d.hash;
+ });
+ items.exit().each(unbind).remove();
+ var itemsEnter = items.enter().append("li").attr("class", "member-row member-row-normal form-field");
+ itemsEnter.on("mouseover", function(d3_event, d) {
+ utilHighlightEntities([d.relation.id], true, context);
+ }).on("mouseout", function(d3_event, d) {
+ utilHighlightEntities([d.relation.id], false, context);
+ });
+ var labelEnter = itemsEnter.append("label").attr("class", "field-label").attr("for", function(d) {
+ return d.domId;
+ });
+ var labelLink = labelEnter.append("span").attr("class", "label-text").append("a").attr("href", "#").on("click", selectRelation);
+ labelLink.append("span").attr("class", "member-entity-type").text(function(d) {
+ var matched = _mainPresetIndex.match(d.relation, context.graph());
+ return matched && matched.name() || _t.html("inspector.relation");
+ });
+ labelLink.append("span").attr("class", "member-entity-name").text(function(d) {
+ return utilDisplayName(d.relation);
+ });
+ labelEnter.append("button").attr("class", "remove member-delete").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete")).on("click", deleteMembership);
+ labelEnter.append("button").attr("class", "member-zoom").attr("title", _t("icons.zoom_to")).call(svgIcon("#iD-icon-framed-dot", "monochrome")).on("click", zoomToRelation);
+ var wrapEnter = itemsEnter.append("div").attr("class", "form-field-input-wrap form-field-input-member");
+ wrapEnter.append("input").attr("class", "member-role").attr("id", function(d) {
+ return d.domId;
+ }).property("type", "text").property("value", function(d) {
+ return typeof d.role === "string" ? d.role : "";
+ }).attr("title", function(d) {
+ return Array.isArray(d.role) ? d.role.filter(Boolean).join("\n") : d.role;
+ }).attr("placeholder", function(d) {
+ return Array.isArray(d.role) ? _t("inspector.multiple_roles") : _t("inspector.role");
+ }).classed("mixed", function(d) {
+ return Array.isArray(d.role);
+ }).call(utilNoAuto).on("blur", changeRole).on("change", changeRole);
+ if (taginfo) {
+ wrapEnter.each(bindTypeahead);
+ }
+ var newMembership = list.selectAll(".member-row-new").data(_showBlank ? [0] : []);
+ newMembership.exit().remove();
+ var newMembershipEnter = newMembership.enter().append("li").attr("class", "member-row member-row-new form-field");
+ var newLabelEnter = newMembershipEnter.append("label").attr("class", "field-label");
+ newLabelEnter.append("input").attr("placeholder", _t("inspector.choose_relation")).attr("type", "text").attr("class", "member-entity-input").call(utilNoAuto);
+ newLabelEnter.append("button").attr("class", "remove member-delete").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete")).on("click", function() {
+ list.selectAll(".member-row-new").remove();
+ });
+ var newWrapEnter = newMembershipEnter.append("div").attr("class", "form-field-input-wrap form-field-input-member");
+ newWrapEnter.append("input").attr("class", "member-role").property("type", "text").attr("placeholder", _t("inspector.role")).call(utilNoAuto);
+ newMembership = newMembership.merge(newMembershipEnter);
+ newMembership.selectAll(".member-entity-input").on("blur", cancelEntity).call(nearbyCombo.on("accept", acceptEntity).on("cancel", cancelEntity));
+ var addRow = selection2.selectAll(".add-row").data([0]);
+ var addRowEnter = addRow.enter().append("div").attr("class", "add-row");
+ var addRelationButton = addRowEnter.append("button").attr("class", "add-relation").attr("aria-label", _t("inspector.add_to_relation"));
+ addRelationButton.call(svgIcon("#iD-icon-plus", "light"));
+ addRelationButton.call(uiTooltip().title(_t.html("inspector.add_to_relation")).placement(_mainLocalizer.textDirection() === "ltr" ? "right" : "left"));
+ addRowEnter.append("div").attr("class", "space-value");
+ addRowEnter.append("div").attr("class", "space-buttons");
+ addRow = addRow.merge(addRowEnter);
+ addRow.select(".add-relation").on("click", function() {
+ _showBlank = true;
+ section.reRender();
+ list.selectAll(".member-entity-input").node().focus();
+ });
+ function acceptEntity(d) {
+ if (!d) {
+ cancelEntity();
+ return;
+ }
+ if (d.relation)
+ utilHighlightEntities([d.relation.id], false, context);
+ var role = context.cleanRelationRole(list.selectAll(".member-row-new .member-role").property("value"));
+ addMembership(d, role);
+ }
+ function cancelEntity() {
+ var input = newMembership.selectAll(".member-entity-input");
+ input.property("value", "");
+ context.surface().selectAll(".highlighted").classed("highlighted", false);
+ }
+ function bindTypeahead(d) {
+ var row = select_default2(this);
+ var role = row.selectAll("input.member-role");
+ var origValue = role.property("value");
+ function sort(value, data) {
+ var sameletter = [];
+ var other = [];
+ for (var i2 = 0; i2 < data.length; i2++) {
+ if (data[i2].value.substring(0, value.length) === value) {
+ sameletter.push(data[i2]);
+ } else {
+ other.push(data[i2]);
+ }
+ }
+ return sameletter.concat(other);
+ }
+ role.call(uiCombobox(context, "member-role").fetcher(function(role2, callback) {
+ var rtype = d.relation.tags.type;
+ taginfo.roles({
+ debounce: true,
+ rtype: rtype || "",
+ geometry: context.graph().geometry(_entityIDs[0]),
+ query: role2
+ }, function(err, data) {
+ if (!err)
+ callback(sort(role2, data));
+ });
+ }).on("cancel", function() {
+ role.property("value", origValue);
+ }));
+ }
+ function unbind() {
+ var row = select_default2(this);
+ row.selectAll("input.member-role").call(uiCombobox.off, context);
+ }
+ }
+ section.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ _showBlank = false;
+ return section;
+ };
+ return section;
+ }
+
+ // modules/ui/sections/selection_list.js
+ function uiSectionSelectionList(context) {
+ var _selectedIDs = [];
+ var section = uiSection("selected-features", context).shouldDisplay(function() {
+ return _selectedIDs.length > 1;
+ }).label(function() {
+ return _t.html("inspector.title_count", { title: { html: _t.html("inspector.features") }, count: _selectedIDs.length });
+ }).disclosureContent(renderDisclosureContent);
+ context.history().on("change.selectionList", function(difference) {
+ if (difference) {
+ section.reRender();
+ }
+ });
+ section.entityIDs = function(val) {
+ if (!arguments.length)
+ return _selectedIDs;
+ _selectedIDs = val;
+ return section;
+ };
+ function selectEntity(d3_event, entity) {
+ context.enter(modeSelect(context, [entity.id]));
+ }
+ function deselectEntity(d3_event, entity) {
+ var selectedIDs = _selectedIDs.slice();
+ var index = selectedIDs.indexOf(entity.id);
+ if (index > -1) {
+ selectedIDs.splice(index, 1);
+ context.enter(modeSelect(context, selectedIDs));
+ }
+ }
+ function renderDisclosureContent(selection2) {
+ var list = selection2.selectAll(".feature-list").data([0]);
+ list = list.enter().append("ul").attr("class", "feature-list").merge(list);
+ var entities = _selectedIDs.map(function(id2) {
+ return context.hasEntity(id2);
+ }).filter(Boolean);
+ var items = list.selectAll(".feature-list-item").data(entities, osmEntity.key);
+ items.exit().remove();
+ var enter = items.enter().append("li").attr("class", "feature-list-item").each(function(d) {
+ select_default2(this).on("mouseover", function() {
+ utilHighlightEntities([d.id], true, context);
+ }).on("mouseout", function() {
+ utilHighlightEntities([d.id], false, context);
+ });
+ });
+ var label = enter.append("button").attr("class", "label").on("click", selectEntity);
+ label.append("span").attr("class", "entity-geom-icon").call(svgIcon("", "pre-text"));
+ label.append("span").attr("class", "entity-type");
+ label.append("span").attr("class", "entity-name");
+ enter.append("button").attr("class", "close").attr("title", _t("icons.deselect")).on("click", deselectEntity).call(svgIcon("#iD-icon-close"));
+ items = items.merge(enter);
+ items.selectAll(".entity-geom-icon use").attr("href", function() {
+ var entity = this.parentNode.parentNode.__data__;
+ return "#iD-icon-" + entity.geometry(context.graph());
+ });
+ items.selectAll(".entity-type").text(function(entity) {
+ return _mainPresetIndex.match(entity, context.graph()).name();
+ });
+ items.selectAll(".entity-name").text(function(d) {
+ var entity = context.entity(d.id);
+ return utilDisplayName(entity);
+ });
+ }
+ return section;
+ }
+
+ // modules/ui/entity_editor.js
+ function uiEntityEditor(context) {
+ var dispatch10 = dispatch_default("choose");
+ var _state = "select";
+ var _coalesceChanges = false;
+ var _modified = false;
+ var _base;
+ var _entityIDs;
+ var _activePresets = [];
+ var _newFeature;
+ var _sections;
+ function entityEditor(selection2) {
+ var combinedTags = utilCombinedTags(_entityIDs, context.graph());
+ var header = selection2.selectAll(".header").data([0]);
+ var headerEnter = header.enter().append("div").attr("class", "header fillL");
+ var direction = _mainLocalizer.textDirection() === "rtl" ? "forward" : "backward";
+ headerEnter.append("button").attr("class", "preset-reset preset-choose").attr("title", _t(`icons.${direction}`)).call(svgIcon(`#iD-icon-${direction}`));
+ headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() {
+ context.enter(modeBrowse(context));
+ }).call(svgIcon(_modified ? "#iD-icon-apply" : "#iD-icon-close"));
+ headerEnter.append("h2");
+ header = header.merge(headerEnter);
+ header.selectAll("h2").html(_entityIDs.length === 1 ? _t.html("inspector.edit") : _t.html("inspector.edit_features"));
+ header.selectAll(".preset-reset").on("click", function() {
+ dispatch10.call("choose", this, _activePresets);
+ });
+ var body = selection2.selectAll(".inspector-body").data([0]);
+ var bodyEnter = body.enter().append("div").attr("class", "entity-editor inspector-body sep-top");
+ body = body.merge(bodyEnter);
+ if (!_sections) {
+ _sections = [
+ uiSectionSelectionList(context),
+ uiSectionFeatureType(context).on("choose", function(presets) {
+ dispatch10.call("choose", this, presets);
+ }),
+ uiSectionEntityIssues(context),
+ uiSectionPresetFields(context).on("change", changeTags).on("revert", revertTags),
+ uiSectionRawTagEditor("raw-tag-editor", context).on("change", changeTags),
+ uiSectionRawMemberEditor(context),
+ uiSectionRawMembershipEditor(context)
+ ];
+ }
+ _sections.forEach(function(section) {
+ if (section.entityIDs) {
+ section.entityIDs(_entityIDs);
+ }
+ if (section.presets) {
+ section.presets(_activePresets);
+ }
+ if (section.tags) {
+ section.tags(combinedTags);
+ }
+ if (section.state) {
+ section.state(_state);
+ }
+ body.call(section.render);
+ });
+ context.history().on("change.entity-editor", historyChanged);
+ function historyChanged(difference) {
+ if (selection2.selectAll(".entity-editor").empty())
+ return;
+ if (_state === "hide")
+ return;
+ var significant = !difference || difference.didChange.properties || difference.didChange.addition || difference.didChange.deletion;
+ if (!significant)
+ return;
+ _entityIDs = _entityIDs.filter(context.hasEntity);
+ if (!_entityIDs.length)
+ return;
+ var priorActivePreset = _activePresets.length === 1 && _activePresets[0];
+ loadActivePresets();
+ var graph = context.graph();
+ entityEditor.modified(_base !== graph);
+ entityEditor(selection2);
+ if (priorActivePreset && _activePresets.length === 1 && priorActivePreset !== _activePresets[0]) {
+ context.container().selectAll(".entity-editor button.preset-reset .label").style("background-color", "#fff").transition().duration(750).style("background-color", null);
+ }
+ }
+ }
+ function changeTags(entityIDs, changed, onInput) {
+ var actions = [];
+ for (var i2 in entityIDs) {
+ var entityID = entityIDs[i2];
+ var entity = context.entity(entityID);
+ var tags = Object.assign({}, entity.tags);
+ for (var k in changed) {
+ if (!k)
+ continue;
+ var v = changed[k];
+ if (typeof v === "object") {
+ tags[k] = tags[v.oldKey];
+ } else if (v !== void 0 || tags.hasOwnProperty(k)) {
+ tags[k] = v;
+ }
+ }
+ if (!onInput) {
+ tags = utilCleanTags(tags);
+ }
+ if (!(0, import_fast_deep_equal10.default)(entity.tags, tags)) {
+ actions.push(actionChangeTags(entityID, tags));
+ }
+ }
+ if (actions.length) {
+ var combinedAction = function(graph) {
+ actions.forEach(function(action) {
+ graph = action(graph);
+ });
+ return graph;
+ };
+ var annotation = _t("operations.change_tags.annotation");
+ if (_coalesceChanges) {
+ context.overwrite(combinedAction, annotation);
+ } else {
+ context.perform(combinedAction, annotation);
+ _coalesceChanges = !!onInput;
+ }
+ }
+ if (!onInput) {
+ context.validator().validate();
+ }
+ }
+ function revertTags(keys) {
+ var actions = [];
+ for (var i2 in _entityIDs) {
+ var entityID = _entityIDs[i2];
+ var original = context.graph().base().entities[entityID];
+ var changed = {};
+ for (var j2 in keys) {
+ var key = keys[j2];
+ changed[key] = original ? original.tags[key] : void 0;
+ }
+ var entity = context.entity(entityID);
+ var tags = Object.assign({}, entity.tags);
+ for (var k in changed) {
+ if (!k)
+ continue;
+ var v = changed[k];
+ if (v !== void 0 || tags.hasOwnProperty(k)) {
+ tags[k] = v;
+ }
+ }
+ tags = utilCleanTags(tags);
+ if (!(0, import_fast_deep_equal10.default)(entity.tags, tags)) {
+ actions.push(actionChangeTags(entityID, tags));
+ }
+ }
+ if (actions.length) {
+ var combinedAction = function(graph) {
+ actions.forEach(function(action) {
+ graph = action(graph);
+ });
+ return graph;
+ };
+ var annotation = _t("operations.change_tags.annotation");
+ if (_coalesceChanges) {
+ context.overwrite(combinedAction, annotation);
+ } else {
+ context.perform(combinedAction, annotation);
+ _coalesceChanges = false;
+ }
+ }
+ context.validator().validate();
+ }
+ entityEditor.modified = function(val) {
+ if (!arguments.length)
+ return _modified;
+ _modified = val;
+ return entityEditor;
+ };
+ entityEditor.state = function(val) {
+ if (!arguments.length)
+ return _state;
+ _state = val;
+ return entityEditor;
+ };
+ entityEditor.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _base = context.graph();
+ _coalesceChanges = false;
+ if (val && _entityIDs && utilArrayIdentical(_entityIDs, val))
+ return entityEditor;
+ _entityIDs = val;
+ loadActivePresets(true);
+ return entityEditor.modified(false);
+ };
+ entityEditor.newFeature = function(val) {
+ if (!arguments.length)
+ return _newFeature;
+ _newFeature = val;
+ return entityEditor;
+ };
+ function loadActivePresets(isForNewSelection) {
+ var graph = context.graph();
+ var counts = {};
+ for (var i2 in _entityIDs) {
+ var entity = graph.hasEntity(_entityIDs[i2]);
+ if (!entity)
+ return;
+ var match = _mainPresetIndex.match(entity, graph);
+ if (!counts[match.id])
+ counts[match.id] = 0;
+ counts[match.id] += 1;
+ }
+ var matches = Object.keys(counts).sort(function(p1, p2) {
+ return counts[p2] - counts[p1];
+ }).map(function(pID) {
+ return _mainPresetIndex.item(pID);
+ });
+ if (!isForNewSelection) {
+ var weakPreset = _activePresets.length === 1 && !_activePresets[0].isFallback() && Object.keys(_activePresets[0].addTags || {}).length === 0;
+ if (weakPreset && matches.length === 1 && matches[0].isFallback())
+ return;
+ }
+ entityEditor.presets(matches);
+ }
+ entityEditor.presets = function(val) {
+ if (!arguments.length)
+ return _activePresets;
+ if (!utilArrayIdentical(val, _activePresets)) {
+ _activePresets = val;
+ }
+ return entityEditor;
+ };
+ return utilRebind(entityEditor, dispatch10, "on");
+ }
+
+ // modules/ui/feature_list.js
+ var sexagesimal = __toESM(require_sexagesimal());
+ function uiFeatureList(context) {
+ var _geocodeResults;
+ function featureList(selection2) {
+ var header = selection2.append("div").attr("class", "header fillL");
+ header.append("h2").call(_t.append("inspector.feature_list"));
+ var searchWrap = selection2.append("div").attr("class", "search-header");
+ searchWrap.call(svgIcon("#iD-icon-search", "pre-text"));
+ var search = searchWrap.append("input").attr("placeholder", _t("inspector.search")).attr("type", "search").call(utilNoAuto).on("keypress", keypress).on("keydown", keydown).on("input", inputevent);
+ var listWrap = selection2.append("div").attr("class", "inspector-body");
+ var list = listWrap.append("div").attr("class", "feature-list");
+ context.on("exit.feature-list", clearSearch);
+ context.map().on("drawn.feature-list", mapDrawn);
+ context.keybinding().on(uiCmd("\u2318F"), focusSearch);
+ function focusSearch(d3_event) {
+ var mode = context.mode() && context.mode().id;
+ if (mode !== "browse")
+ return;
+ d3_event.preventDefault();
+ search.node().focus();
+ }
+ function keydown(d3_event) {
+ if (d3_event.keyCode === 27) {
+ search.node().blur();
+ }
+ }
+ function keypress(d3_event) {
+ var q = search.property("value"), items = list.selectAll(".feature-list-item");
+ if (d3_event.keyCode === 13 && q.length && items.size()) {
+ click(d3_event, items.datum());
+ }
+ }
+ function inputevent() {
+ _geocodeResults = void 0;
+ drawList();
+ }
+ function clearSearch() {
+ search.property("value", "");
+ drawList();
+ }
+ function mapDrawn(e) {
+ if (e.full) {
+ drawList();
+ }
+ }
+ function features2() {
+ var result = [];
+ var graph = context.graph();
+ var visibleCenter = context.map().extent().center();
+ var q = search.property("value").toLowerCase();
+ if (!q)
+ return result;
+ var locationMatch = sexagesimal.pair(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
+ if (locationMatch) {
+ var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
+ result.push({
+ id: -1,
+ geometry: "point",
+ type: _t("inspector.location"),
+ name: dmsCoordinatePair([loc[1], loc[0]]),
+ location: loc
+ });
+ }
+ var idMatch = !locationMatch && q.match(/(?:^|\W)(node|way|relation|[nwr])\W?0*([1-9]\d*)(?:\W|$)/i);
+ if (idMatch) {
+ var elemType = idMatch[1].charAt(0);
+ var elemId = idMatch[2];
+ result.push({
+ id: elemType + elemId,
+ geometry: elemType === "n" ? "point" : elemType === "w" ? "line" : "relation",
+ type: elemType === "n" ? _t("inspector.node") : elemType === "w" ? _t("inspector.way") : _t("inspector.relation"),
+ name: elemId
+ });
+ }
+ var allEntities = graph.entities;
+ var localResults = [];
+ for (var id2 in allEntities) {
+ var entity = allEntities[id2];
+ if (!entity)
+ continue;
+ var name2 = utilDisplayName(entity) || "";
+ if (name2.toLowerCase().indexOf(q) < 0)
+ continue;
+ var matched = _mainPresetIndex.match(entity, graph);
+ var type3 = matched && matched.name() || utilDisplayType(entity.id);
+ var extent = entity.extent(graph);
+ var distance = extent ? geoSphericalDistance(visibleCenter, extent.center()) : 0;
+ localResults.push({
+ id: entity.id,
+ entity,
+ geometry: entity.geometry(graph),
+ type: type3,
+ name: name2,
+ distance
+ });
+ if (localResults.length > 100)
+ break;
+ }
+ localResults = localResults.sort(function byDistance(a, b) {
+ return a.distance - b.distance;
+ });
+ result = result.concat(localResults);
+ (_geocodeResults || []).forEach(function(d) {
+ if (d.osm_type && d.osm_id) {
+ var id3 = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
+ var tags = {};
+ tags[d.class] = d.type;
+ var attrs = { id: id3, type: d.osm_type, tags };
+ if (d.osm_type === "way") {
+ attrs.nodes = ["a", "a"];
+ }
+ var tempEntity = osmEntity(attrs);
+ var tempGraph = coreGraph([tempEntity]);
+ var matched2 = _mainPresetIndex.match(tempEntity, tempGraph);
+ var type4 = matched2 && matched2.name() || utilDisplayType(id3);
+ result.push({
+ id: tempEntity.id,
+ geometry: tempEntity.geometry(tempGraph),
+ type: type4,
+ name: d.display_name,
+ extent: new geoExtent([parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])], [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
+ });
+ }
+ });
+ if (q.match(/^[0-9]+$/)) {
+ result.push({
+ id: "n" + q,
+ geometry: "point",
+ type: _t("inspector.node"),
+ name: q
+ });
+ result.push({
+ id: "w" + q,
+ geometry: "line",
+ type: _t("inspector.way"),
+ name: q
+ });
+ result.push({
+ id: "r" + q,
+ geometry: "relation",
+ type: _t("inspector.relation"),
+ name: q
+ });
+ }
+ return result;
+ }
+ function drawList() {
+ var value = search.property("value");
+ var results = features2();
+ list.classed("filtered", value.length);
+ var resultsIndicator = list.selectAll(".no-results-item").data([0]).enter().append("button").property("disabled", true).attr("class", "no-results-item").call(svgIcon("#iD-icon-alert", "pre-text"));
+ resultsIndicator.append("span").attr("class", "entity-name");
+ list.selectAll(".no-results-item .entity-name").html("").call(_t.append("geocoder.no_results_worldwide"));
+ if (services.geocoder) {
+ list.selectAll(".geocode-item").data([0]).enter().append("button").attr("class", "geocode-item secondary-action").on("click", geocoderSearch).append("div").attr("class", "label").append("span").attr("class", "entity-name").call(_t.append("geocoder.search"));
+ }
+ list.selectAll(".no-results-item").style("display", value.length && !results.length ? "block" : "none");
+ list.selectAll(".geocode-item").style("display", value && _geocodeResults === void 0 ? "block" : "none");
+ list.selectAll(".feature-list-item").data([-1]).remove();
+ var items = list.selectAll(".feature-list-item").data(results, function(d) {
+ return d.id;
+ });
+ var enter = items.enter().insert("button", ".geocode-item").attr("class", "feature-list-item").on("mouseover", mouseover).on("mouseout", mouseout).on("click", click);
+ var label = enter.append("div").attr("class", "label");
+ label.each(function(d) {
+ select_default2(this).call(svgIcon("#iD-icon-" + d.geometry, "pre-text"));
+ });
+ label.append("span").attr("class", "entity-type").text(function(d) {
+ return d.type;
+ });
+ label.append("span").attr("class", "entity-name").text(function(d) {
+ return d.name;
+ });
+ enter.style("opacity", 0).transition().style("opacity", 1);
+ items.order();
+ items.exit().remove();
+ }
+ function mouseover(d3_event, d) {
+ if (d.id === -1)
+ return;
+ utilHighlightEntities([d.id], true, context);
+ }
+ function mouseout(d3_event, d) {
+ if (d.id === -1)
+ return;
+ utilHighlightEntities([d.id], false, context);
+ }
+ function click(d3_event, d) {
+ d3_event.preventDefault();
+ if (d.location) {
+ context.map().centerZoomEase([d.location[1], d.location[0]], 19);
+ } else if (d.entity) {
+ utilHighlightEntities([d.id], false, context);
+ context.enter(modeSelect(context, [d.entity.id]));
+ context.map().zoomToEase(d.entity);
+ } else {
+ context.zoomToEntity(d.id);
+ }
+ }
+ function geocoderSearch() {
+ services.geocoder.search(search.property("value"), function(err, resp) {
+ _geocodeResults = resp || [];
+ drawList();
+ });
+ }
+ }
+ return featureList;
+ }
+
+ // modules/ui/improveOSM_comments.js
+ function uiImproveOsmComments() {
+ let _qaItem;
+ function issueComments(selection2) {
+ let comments = selection2.selectAll(".comments-container").data([0]);
+ comments = comments.enter().append("div").attr("class", "comments-container").merge(comments);
+ services.improveOSM.getComments(_qaItem).then((d) => {
+ if (!d.comments)
+ return;
+ const commentEnter = comments.selectAll(".comment").data(d.comments).enter().append("div").attr("class", "comment");
+ commentEnter.append("div").attr("class", "comment-avatar").call(svgIcon("#iD-icon-avatar", "comment-avatar-icon"));
+ const mainEnter = commentEnter.append("div").attr("class", "comment-main");
+ const metadataEnter = mainEnter.append("div").attr("class", "comment-metadata");
+ metadataEnter.append("div").attr("class", "comment-author").each(function(d2) {
+ const osm = services.osm;
+ let selection3 = select_default2(this);
+ if (osm && d2.username) {
+ selection3 = selection3.append("a").attr("class", "comment-author-link").attr("href", osm.userURL(d2.username)).attr("target", "_blank");
+ }
+ selection3.text((d4) => d4.username);
+ });
+ metadataEnter.append("div").attr("class", "comment-date").html((d2) => _t.html("note.status.commented", { when: localeDateString2(d2.timestamp) }));
+ mainEnter.append("div").attr("class", "comment-text").append("p").text((d2) => d2.text);
+ }).catch((err) => {
+ console.log(err);
+ });
+ }
+ function localeDateString2(s) {
+ if (!s)
+ return null;
+ const options2 = { day: "numeric", month: "short", year: "numeric" };
+ const d = new Date(s * 1e3);
+ if (isNaN(d.getTime()))
+ return null;
+ return d.toLocaleDateString(_mainLocalizer.localeCode(), options2);
+ }
+ issueComments.issue = function(val) {
+ if (!arguments.length)
+ return _qaItem;
+ _qaItem = val;
+ return issueComments;
+ };
+ return issueComments;
+ }
+
+ // modules/ui/improveOSM_details.js
+ function uiImproveOsmDetails(context) {
+ let _qaItem;
+ function issueDetail(d) {
+ if (d.desc)
+ return d.desc;
+ const issueKey = d.issueKey;
+ d.replacements = d.replacements || {};
+ d.replacements.default = { html: _t.html("inspector.unknown") };
+ return _t.html(`QA.improveOSM.error_types.${issueKey}.description`, d.replacements);
+ }
+ function improveOsmDetails(selection2) {
+ const details = selection2.selectAll(".error-details").data(_qaItem ? [_qaItem] : [], (d) => `${d.id}-${d.status || 0}`);
+ details.exit().remove();
+ const detailsEnter = details.enter().append("div").attr("class", "error-details qa-details-container");
+ const descriptionEnter = detailsEnter.append("div").attr("class", "qa-details-subsection");
+ descriptionEnter.append("h4").call(_t.append("QA.keepRight.detail_description"));
+ descriptionEnter.append("div").attr("class", "qa-details-description-text").html(issueDetail);
+ let relatedEntities = [];
+ descriptionEnter.selectAll(".error_entity_link, .error_object_link").attr("href", "#").each(function() {
+ const link2 = select_default2(this);
+ const isObjectLink = link2.classed("error_object_link");
+ const entityID = isObjectLink ? utilEntityRoot(_qaItem.objectType) + _qaItem.objectId : this.textContent;
+ const entity = context.hasEntity(entityID);
+ relatedEntities.push(entityID);
+ link2.on("mouseenter", () => {
+ utilHighlightEntities([entityID], true, context);
+ }).on("mouseleave", () => {
+ utilHighlightEntities([entityID], false, context);
+ }).on("click", (d3_event) => {
+ d3_event.preventDefault();
+ utilHighlightEntities([entityID], false, context);
+ const osmlayer = context.layers().layer("osm");
+ if (!osmlayer.enabled()) {
+ osmlayer.enabled(true);
+ }
+ context.map().centerZoom(_qaItem.loc, 20);
+ if (entity) {
+ context.enter(modeSelect(context, [entityID]));
+ } else {
+ context.loadEntity(entityID, (err, result) => {
+ if (err)
+ return;
+ const entity2 = result.data.find((e) => e.id === entityID);
+ if (entity2)
+ context.enter(modeSelect(context, [entityID]));
+ });
+ }
+ });
+ if (entity) {
+ let name2 = utilDisplayName(entity);
+ if (!name2 && !isObjectLink) {
+ const preset = _mainPresetIndex.match(entity, context.graph());
+ name2 = preset && !preset.isFallback() && preset.name();
+ }
+ if (name2) {
+ this.innerText = name2;
+ }
+ }
+ });
+ context.features().forceVisible(relatedEntities);
+ context.map().pan([0, 0]);
+ }
+ improveOsmDetails.issue = function(val) {
+ if (!arguments.length)
+ return _qaItem;
+ _qaItem = val;
+ return improveOsmDetails;
+ };
+ return improveOsmDetails;
+ }
+
+ // modules/ui/improveOSM_header.js
+ function uiImproveOsmHeader() {
+ let _qaItem;
+ function issueTitle(d) {
+ const issueKey = d.issueKey;
+ d.replacements = d.replacements || {};
+ d.replacements.default = { html: _t.html("inspector.unknown") };
+ return _t.html(`QA.improveOSM.error_types.${issueKey}.title`, d.replacements);
+ }
+ function improveOsmHeader(selection2) {
+ const header = selection2.selectAll(".qa-header").data(_qaItem ? [_qaItem] : [], (d) => `${d.id}-${d.status || 0}`);
+ header.exit().remove();
+ const headerEnter = header.enter().append("div").attr("class", "qa-header");
+ const svgEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d) => d.id < 0).append("svg").attr("width", "20px").attr("height", "30px").attr("viewbox", "0 0 20 30").attr("class", (d) => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
+ svgEnter.append("polygon").attr("fill", "currentColor").attr("class", "qaItem-fill").attr("points", "16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6");
+ svgEnter.append("use").attr("class", "icon-annotation").attr("width", "12px").attr("height", "12px").attr("transform", "translate(4, 5.5)").attr("xlink:href", (d) => d.icon ? "#" + d.icon : "");
+ headerEnter.append("div").attr("class", "qa-header-label").html(issueTitle);
+ }
+ improveOsmHeader.issue = function(val) {
+ if (!arguments.length)
+ return _qaItem;
+ _qaItem = val;
+ return improveOsmHeader;
+ };
+ return improveOsmHeader;
+ }
+
+ // modules/ui/improveOSM_editor.js
+ function uiImproveOsmEditor(context) {
+ const dispatch10 = dispatch_default("change");
+ const qaDetails = uiImproveOsmDetails(context);
+ const qaComments = uiImproveOsmComments(context);
+ const qaHeader = uiImproveOsmHeader(context);
+ let _qaItem;
+ function improveOsmEditor(selection2) {
+ const headerEnter = selection2.selectAll(".header").data([0]).enter().append("div").attr("class", "header fillL");
+ headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => context.enter(modeBrowse(context))).call(svgIcon("#iD-icon-close"));
+ headerEnter.append("h2").call(_t.append("QA.improveOSM.title"));
+ let body = selection2.selectAll(".body").data([0]);
+ body = body.enter().append("div").attr("class", "body").merge(body);
+ const editor = body.selectAll(".qa-editor").data([0]);
+ editor.enter().append("div").attr("class", "modal-section qa-editor").merge(editor).call(qaHeader.issue(_qaItem)).call(qaDetails.issue(_qaItem)).call(qaComments.issue(_qaItem)).call(improveOsmSaveSection);
+ }
+ function improveOsmSaveSection(selection2) {
+ const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
+ const isShown = _qaItem && (isSelected || _qaItem.newComment || _qaItem.comment);
+ let saveSection = selection2.selectAll(".qa-save").data(isShown ? [_qaItem] : [], (d) => `${d.id}-${d.status || 0}`);
+ saveSection.exit().remove();
+ const saveSectionEnter = saveSection.enter().append("div").attr("class", "qa-save save-section cf");
+ saveSectionEnter.append("h4").attr("class", ".qa-save-header").call(_t.append("note.newComment"));
+ saveSectionEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("QA.keepRight.comment_placeholder")).attr("maxlength", 1e3).property("value", (d) => d.newComment).call(utilNoAuto).on("input", changeInput).on("blur", changeInput);
+ saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons);
+ function changeInput() {
+ const input = select_default2(this);
+ let val = input.property("value").trim();
+ if (val === "") {
+ val = void 0;
+ }
+ _qaItem = _qaItem.update({ newComment: val });
+ const qaService = services.improveOSM;
+ if (qaService) {
+ qaService.replaceItem(_qaItem);
+ }
+ saveSection.call(qaSaveButtons);
+ }
+ }
+ function qaSaveButtons(selection2) {
+ const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
+ let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d) => d.status + d.id);
+ buttonSection.exit().remove();
+ const buttonEnter = buttonSection.enter().append("div").attr("class", "buttons");
+ buttonEnter.append("button").attr("class", "button comment-button action").call(_t.append("QA.keepRight.save_comment"));
+ buttonEnter.append("button").attr("class", "button close-button action");
+ buttonEnter.append("button").attr("class", "button ignore-button action");
+ buttonSection = buttonSection.merge(buttonEnter);
+ buttonSection.select(".comment-button").attr("disabled", (d) => d.newComment ? null : true).on("click.comment", function(d3_event, d) {
+ this.blur();
+ const qaService = services.improveOSM;
+ if (qaService) {
+ qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
+ }
+ });
+ buttonSection.select(".close-button").html((d) => {
+ const andComment = d.newComment ? "_comment" : "";
+ return _t.html(`QA.keepRight.close${andComment}`);
+ }).on("click.close", function(d3_event, d) {
+ this.blur();
+ const qaService = services.improveOSM;
+ if (qaService) {
+ d.newStatus = "SOLVED";
+ qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
+ }
+ });
+ buttonSection.select(".ignore-button").html((d) => {
+ const andComment = d.newComment ? "_comment" : "";
+ return _t.html(`QA.keepRight.ignore${andComment}`);
+ }).on("click.ignore", function(d3_event, d) {
+ this.blur();
+ const qaService = services.improveOSM;
+ if (qaService) {
+ d.newStatus = "INVALID";
+ qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
+ }
+ });
+ }
+ improveOsmEditor.error = function(val) {
+ if (!arguments.length)
+ return _qaItem;
+ _qaItem = val;
+ return improveOsmEditor;
+ };
+ return utilRebind(improveOsmEditor, dispatch10, "on");
+ }
+
+ // modules/ui/preset_list.js
+ function uiPresetList(context) {
+ var dispatch10 = dispatch_default("cancel", "choose");
+ var _entityIDs;
+ var _currLoc;
+ var _currentPresets;
+ var _autofocus = false;
+ function presetList(selection2) {
+ if (!_entityIDs)
+ return;
+ var presets = _mainPresetIndex.matchAllGeometry(entityGeometries());
+ selection2.html("");
+ var messagewrap = selection2.append("div").attr("class", "header fillL");
+ var message = messagewrap.append("h2").call(_t.append("inspector.choose"));
+ var direction = _mainLocalizer.textDirection() === "rtl" ? "backward" : "forward";
+ messagewrap.append("button").attr("class", "preset-choose").attr("title", direction).on("click", function() {
+ dispatch10.call("cancel", this);
+ }).call(svgIcon(`#iD-icon-${direction}`));
+ function initialKeydown(d3_event) {
+ if (search.property("value").length === 0 && (d3_event.keyCode === utilKeybinding.keyCodes["\u232B"] || d3_event.keyCode === utilKeybinding.keyCodes["\u2326"])) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ operationDelete(context, _entityIDs)();
+ } else if (search.property("value").length === 0 && (d3_event.ctrlKey || d3_event.metaKey) && d3_event.keyCode === utilKeybinding.keyCodes.z) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ context.undo();
+ } else if (!d3_event.ctrlKey && !d3_event.metaKey) {
+ select_default2(this).on("keydown", keydown);
+ keydown.call(this, d3_event);
+ }
+ }
+ function keydown(d3_event) {
+ if (d3_event.keyCode === utilKeybinding.keyCodes["\u2193"] && search.node().selectionStart === search.property("value").length) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ var buttons = list.selectAll(".preset-list-button");
+ if (!buttons.empty())
+ buttons.nodes()[0].focus();
+ }
+ }
+ function keypress(d3_event) {
+ var value = search.property("value");
+ if (d3_event.keyCode === 13 && value.length) {
+ list.selectAll(".preset-list-item:first-child").each(function(d) {
+ d.choose.call(this);
+ });
+ }
+ }
+ function inputevent() {
+ var value = search.property("value");
+ list.classed("filtered", value.length);
+ var results, messageText;
+ if (value.length) {
+ results = presets.search(value, entityGeometries()[0], _currLoc);
+ messageText = _t.html("inspector.results", {
+ n: results.collection.length,
+ search: value
+ });
+ } else {
+ results = _mainPresetIndex.defaults(entityGeometries()[0], 36, !context.inIntro(), _currLoc);
+ messageText = _t.html("inspector.choose");
+ }
+ list.call(drawList, results);
+ message.html(messageText);
+ }
+ var searchWrap = selection2.append("div").attr("class", "search-header");
+ searchWrap.call(svgIcon("#iD-icon-search", "pre-text"));
+ var search = searchWrap.append("input").attr("class", "preset-search-input").attr("placeholder", _t("inspector.search")).attr("type", "search").call(utilNoAuto).on("keydown", initialKeydown).on("keypress", keypress).on("input", debounce_default(inputevent));
+ if (_autofocus) {
+ search.node().focus();
+ setTimeout(function() {
+ search.node().focus();
+ }, 0);
+ }
+ var listWrap = selection2.append("div").attr("class", "inspector-body");
+ var list = listWrap.append("div").attr("class", "preset-list").call(drawList, _mainPresetIndex.defaults(entityGeometries()[0], 36, !context.inIntro(), _currLoc));
+ context.features().on("change.preset-list", updateForFeatureHiddenState);
+ }
+ function drawList(list, presets) {
+ presets = presets.matchAllGeometry(entityGeometries());
+ var collection = presets.collection.reduce(function(collection2, preset) {
+ if (!preset)
+ return collection2;
+ if (preset.members) {
+ if (preset.members.collection.filter(function(preset2) {
+ return preset2.addable();
+ }).length > 1) {
+ collection2.push(CategoryItem(preset));
+ }
+ } else if (preset.addable()) {
+ collection2.push(PresetItem(preset));
+ }
+ return collection2;
+ }, []);
+ var items = list.selectAll(".preset-list-item").data(collection, function(d) {
+ return d.preset.id;
+ });
+ items.order();
+ items.exit().remove();
+ items.enter().append("div").attr("class", function(item) {
+ return "preset-list-item preset-" + item.preset.id.replace("/", "-");
+ }).classed("current", function(item) {
+ return _currentPresets.indexOf(item.preset) !== -1;
+ }).each(function(item) {
+ select_default2(this).call(item);
+ }).style("opacity", 0).transition().style("opacity", 1);
+ updateForFeatureHiddenState();
+ }
+ function itemKeydown(d3_event) {
+ var item = select_default2(this.closest(".preset-list-item"));
+ var parentItem = select_default2(item.node().parentNode.closest(".preset-list-item"));
+ if (d3_event.keyCode === utilKeybinding.keyCodes["\u2193"]) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ var nextItem = select_default2(item.node().nextElementSibling);
+ if (nextItem.empty()) {
+ if (!parentItem.empty()) {
+ nextItem = select_default2(parentItem.node().nextElementSibling);
+ }
+ } else if (select_default2(this).classed("expanded")) {
+ nextItem = item.select(".subgrid .preset-list-item:first-child");
+ }
+ if (!nextItem.empty()) {
+ nextItem.select(".preset-list-button").node().focus();
+ }
+ } else if (d3_event.keyCode === utilKeybinding.keyCodes["\u2191"]) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ var previousItem = select_default2(item.node().previousElementSibling);
+ if (previousItem.empty()) {
+ if (!parentItem.empty()) {
+ previousItem = parentItem;
+ }
+ } else if (previousItem.select(".preset-list-button").classed("expanded")) {
+ previousItem = previousItem.select(".subgrid .preset-list-item:last-child");
+ }
+ if (!previousItem.empty()) {
+ previousItem.select(".preset-list-button").node().focus();
+ } else {
+ var search = select_default2(this.closest(".preset-list-pane")).select(".preset-search-input");
+ search.node().focus();
+ }
+ } else if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === "rtl" ? "\u2192" : "\u2190"]) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ if (!parentItem.empty()) {
+ parentItem.select(".preset-list-button").node().focus();
+ }
+ } else if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === "rtl" ? "\u2190" : "\u2192"]) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ item.datum().choose.call(select_default2(this).node());
+ }
+ }
+ function CategoryItem(preset) {
+ var box, sublist, shown = false;
+ function item(selection2) {
+ var wrap2 = selection2.append("div").attr("class", "preset-list-button-wrap category");
+ function click() {
+ var isExpanded = select_default2(this).classed("expanded");
+ var iconName = isExpanded ? _mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward" : "#iD-icon-down";
+ select_default2(this).classed("expanded", !isExpanded).attr("title", !isExpanded ? _t("icons.collapse") : _t("icons.expand"));
+ select_default2(this).selectAll("div.label-inner svg.icon use").attr("href", iconName);
+ item.choose();
+ }
+ var geometries = entityGeometries();
+ var button = wrap2.append("button").attr("class", "preset-list-button").attr("title", _t("icons.expand")).classed("expanded", false).call(uiPresetIcon().geometry(geometries.length === 1 && geometries[0]).preset(preset)).on("click", click).on("keydown", function(d3_event) {
+ if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === "rtl" ? "\u2190" : "\u2192"]) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ if (!select_default2(this).classed("expanded")) {
+ click.call(this, d3_event);
+ }
+ } else if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === "rtl" ? "\u2192" : "\u2190"]) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ if (select_default2(this).classed("expanded")) {
+ click.call(this, d3_event);
+ }
+ } else {
+ itemKeydown.call(this, d3_event);
+ }
+ });
+ var label = button.append("div").attr("class", "label").append("div").attr("class", "label-inner");
+ label.append("div").attr("class", "namepart").call(svgIcon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward", "inline")).append("span").html(function() {
+ return preset.nameLabel() + "…";
+ });
+ box = selection2.append("div").attr("class", "subgrid").style("max-height", "0px").style("opacity", 0);
+ box.append("div").attr("class", "arrow");
+ sublist = box.append("div").attr("class", "preset-list fillL3");
+ }
+ item.choose = function() {
+ if (!box || !sublist)
+ return;
+ if (shown) {
+ shown = false;
+ box.transition().duration(200).style("opacity", "0").style("max-height", "0px").style("padding-bottom", "0px");
+ } else {
+ shown = true;
+ var members = preset.members.matchAllGeometry(entityGeometries());
+ sublist.call(drawList, members);
+ box.transition().duration(200).style("opacity", "1").style("max-height", 200 + members.collection.length * 190 + "px").style("padding-bottom", "10px");
+ }
+ };
+ item.preset = preset;
+ return item;
+ }
+ function PresetItem(preset) {
+ function item(selection2) {
+ var wrap2 = selection2.append("div").attr("class", "preset-list-button-wrap");
+ var geometries = entityGeometries();
+ var button = wrap2.append("button").attr("class", "preset-list-button").call(uiPresetIcon().geometry(geometries.length === 1 && geometries[0]).preset(preset)).on("click", item.choose).on("keydown", itemKeydown);
+ var label = button.append("div").attr("class", "label").append("div").attr("class", "label-inner");
+ var nameparts = [
+ preset.nameLabel(),
+ preset.subtitleLabel()
+ ].filter(Boolean);
+ label.selectAll(".namepart").data(nameparts).enter().append("div").attr("class", "namepart").html(function(d) {
+ return d;
+ });
+ wrap2.call(item.reference.button);
+ selection2.call(item.reference.body);
+ }
+ item.choose = function() {
+ if (select_default2(this).classed("disabled"))
+ return;
+ if (!context.inIntro()) {
+ _mainPresetIndex.setMostRecent(preset, entityGeometries()[0]);
+ }
+ context.perform(function(graph) {
+ for (var i2 in _entityIDs) {
+ var entityID = _entityIDs[i2];
+ var oldPreset = _mainPresetIndex.match(graph.entity(entityID), graph);
+ graph = actionChangePreset(entityID, oldPreset, preset)(graph);
+ }
+ return graph;
+ }, _t("operations.change_tags.annotation"));
+ context.validator().validate();
+ dispatch10.call("choose", this, preset);
+ };
+ item.help = function(d3_event) {
+ d3_event.stopPropagation();
+ item.reference.toggle();
+ };
+ item.preset = preset;
+ item.reference = uiTagReference(preset.reference(), context);
+ return item;
+ }
+ function updateForFeatureHiddenState() {
+ if (!_entityIDs.every(context.hasEntity))
+ return;
+ var geometries = entityGeometries();
+ var button = context.container().selectAll(".preset-list .preset-list-button");
+ button.call(uiTooltip().destroyAny);
+ button.each(function(item, index) {
+ var hiddenPresetFeaturesId;
+ for (var i2 in geometries) {
+ hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometries[i2]);
+ if (hiddenPresetFeaturesId)
+ break;
+ }
+ var isHiddenPreset = !context.inIntro() && !!hiddenPresetFeaturesId && (_currentPresets.length !== 1 || item.preset !== _currentPresets[0]);
+ select_default2(this).classed("disabled", isHiddenPreset);
+ if (isHiddenPreset) {
+ var isAutoHidden = context.features().autoHidden(hiddenPresetFeaturesId);
+ select_default2(this).call(uiTooltip().title(_t.html("inspector.hidden_preset." + (isAutoHidden ? "zoom" : "manual"), {
+ features: { html: _t.html("feature." + hiddenPresetFeaturesId + ".description") }
+ })).placement(index < 2 ? "bottom" : "top"));
+ }
+ });
+ }
+ presetList.autofocus = function(val) {
+ if (!arguments.length)
+ return _autofocus;
+ _autofocus = val;
+ return presetList;
+ };
+ presetList.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ _currLoc = null;
+ if (_entityIDs && _entityIDs.length) {
+ const extent = _entityIDs.reduce(function(extent2, entityID) {
+ var entity = context.graph().entity(entityID);
+ return extent2.extend(entity.extent(context.graph()));
+ }, geoExtent());
+ _currLoc = extent.center();
+ var presets = _entityIDs.map(function(entityID) {
+ return _mainPresetIndex.match(context.entity(entityID), context.graph());
+ });
+ presetList.presets(presets);
+ }
+ return presetList;
+ };
+ presetList.presets = function(val) {
+ if (!arguments.length)
+ return _currentPresets;
+ _currentPresets = val;
+ return presetList;
+ };
+ function entityGeometries() {
+ var counts = {};
+ for (var i2 in _entityIDs) {
+ var entityID = _entityIDs[i2];
+ var entity = context.entity(entityID);
+ var geometry = entity.geometry(context.graph());
+ if (geometry === "vertex" && entity.isOnAddressLine(context.graph())) {
+ geometry = "point";
+ }
+ if (!counts[geometry])
+ counts[geometry] = 0;
+ counts[geometry] += 1;
+ }
+ return Object.keys(counts).sort(function(geom1, geom2) {
+ return counts[geom2] - counts[geom1];
+ });
+ }
+ return utilRebind(presetList, dispatch10, "on");
+ }
+
+ // modules/ui/view_on_osm.js
+ function uiViewOnOSM(context) {
+ var _what;
+ function viewOnOSM(selection2) {
+ var url;
+ if (_what instanceof osmEntity) {
+ url = context.connection().entityURL(_what);
+ } else if (_what instanceof osmNote) {
+ url = context.connection().noteURL(_what);
+ }
+ var data = !_what || _what.isNew() ? [] : [_what];
+ var link2 = selection2.selectAll(".view-on-osm").data(data, function(d) {
+ return d.id;
+ });
+ link2.exit().remove();
+ var linkEnter = link2.enter().append("a").attr("class", "view-on-osm").attr("target", "_blank").attr("href", url).call(svgIcon("#iD-icon-out-link", "inline"));
+ linkEnter.append("span").call(_t.append("inspector.view_on_osm"));
+ }
+ viewOnOSM.what = function(_) {
+ if (!arguments.length)
+ return _what;
+ _what = _;
+ return viewOnOSM;
+ };
+ return viewOnOSM;
+ }
+
+ // modules/ui/inspector.js
+ function uiInspector(context) {
+ var presetList = uiPresetList(context);
+ var entityEditor = uiEntityEditor(context);
+ var wrap2 = select_default2(null), presetPane = select_default2(null), editorPane = select_default2(null);
+ var _state = "select";
+ var _entityIDs;
+ var _newFeature = false;
+ function inspector(selection2) {
+ presetList.entityIDs(_entityIDs).autofocus(_newFeature).on("choose", inspector.setPreset).on("cancel", function() {
+ inspector.setPreset();
+ });
+ entityEditor.state(_state).entityIDs(_entityIDs).on("choose", inspector.showList);
+ wrap2 = selection2.selectAll(".panewrap").data([0]);
+ var enter = wrap2.enter().append("div").attr("class", "panewrap");
+ enter.append("div").attr("class", "preset-list-pane pane");
+ enter.append("div").attr("class", "entity-editor-pane pane");
+ wrap2 = wrap2.merge(enter);
+ presetPane = wrap2.selectAll(".preset-list-pane");
+ editorPane = wrap2.selectAll(".entity-editor-pane");
+ function shouldDefaultToPresetList() {
+ if (_state !== "select")
+ return false;
+ if (_entityIDs.length !== 1)
+ return false;
+ var entityID = _entityIDs[0];
+ var entity = context.hasEntity(entityID);
+ if (!entity)
+ return false;
+ if (entity.hasNonGeometryTags())
+ return false;
+ if (_newFeature)
+ return true;
+ if (entity.geometry(context.graph()) !== "vertex")
+ return false;
+ if (context.graph().parentRelations(entity).length)
+ return false;
+ if (context.validator().getEntityIssues(entityID).length)
+ return false;
+ if (entity.isHighwayIntersection(context.graph()))
+ return false;
+ return true;
+ }
+ if (shouldDefaultToPresetList()) {
+ wrap2.style("right", "-100%");
+ editorPane.classed("hide", true);
+ presetPane.classed("hide", false).call(presetList);
+ } else {
+ wrap2.style("right", "0%");
+ presetPane.classed("hide", true);
+ editorPane.classed("hide", false).call(entityEditor);
+ }
+ var footer = selection2.selectAll(".footer").data([0]);
+ footer = footer.enter().append("div").attr("class", "footer").merge(footer);
+ footer.call(uiViewOnOSM(context).what(context.hasEntity(_entityIDs.length === 1 && _entityIDs[0])));
+ }
+ inspector.showList = function(presets) {
+ presetPane.classed("hide", false);
+ wrap2.transition().styleTween("right", function() {
+ return value_default("0%", "-100%");
+ }).on("end", function() {
+ editorPane.classed("hide", true);
+ });
+ if (presets) {
+ presetList.presets(presets);
+ }
+ presetPane.call(presetList.autofocus(true));
+ };
+ inspector.setPreset = function(preset) {
+ if (preset && preset.id === "type/multipolygon") {
+ presetPane.call(presetList.autofocus(true));
+ } else {
+ editorPane.classed("hide", false);
+ wrap2.transition().styleTween("right", function() {
+ return value_default("-100%", "0%");
+ }).on("end", function() {
+ presetPane.classed("hide", true);
+ });
+ if (preset) {
+ entityEditor.presets([preset]);
+ }
+ editorPane.call(entityEditor);
+ }
+ };
+ inspector.state = function(val) {
+ if (!arguments.length)
+ return _state;
+ _state = val;
+ entityEditor.state(_state);
+ context.container().selectAll(".field-help-body").remove();
+ return inspector;
+ };
+ inspector.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ _entityIDs = val;
+ return inspector;
+ };
+ inspector.newFeature = function(val) {
+ if (!arguments.length)
+ return _newFeature;
+ _newFeature = val;
+ return inspector;
+ };
+ return inspector;
+ }
+
+ // modules/ui/keepRight_details.js
+ function uiKeepRightDetails(context) {
+ let _qaItem;
+ function issueDetail(d) {
+ const { itemType, parentIssueType } = d;
+ const unknown = { html: _t.html("inspector.unknown") };
+ let replacements = d.replacements || {};
+ replacements.default = unknown;
+ if (_mainLocalizer.hasTextForStringId(`QA.keepRight.errorTypes.${itemType}.title`)) {
+ return _t.html(`QA.keepRight.errorTypes.${itemType}.description`, replacements);
+ } else {
+ return _t.html(`QA.keepRight.errorTypes.${parentIssueType}.description`, replacements);
+ }
+ }
+ function keepRightDetails(selection2) {
+ const details = selection2.selectAll(".error-details").data(_qaItem ? [_qaItem] : [], (d) => `${d.id}-${d.status || 0}`);
+ details.exit().remove();
+ const detailsEnter = details.enter().append("div").attr("class", "error-details qa-details-container");
+ const descriptionEnter = detailsEnter.append("div").attr("class", "qa-details-subsection");
+ descriptionEnter.append("h4").call(_t.append("QA.keepRight.detail_description"));
+ descriptionEnter.append("div").attr("class", "qa-details-description-text").html(issueDetail);
+ let relatedEntities = [];
+ descriptionEnter.selectAll(".error_entity_link, .error_object_link").attr("href", "#").each(function() {
+ const link2 = select_default2(this);
+ const isObjectLink = link2.classed("error_object_link");
+ const entityID = isObjectLink ? utilEntityRoot(_qaItem.objectType) + _qaItem.objectId : this.textContent;
+ const entity = context.hasEntity(entityID);
+ relatedEntities.push(entityID);
+ link2.on("mouseenter", () => {
+ utilHighlightEntities([entityID], true, context);
+ }).on("mouseleave", () => {
+ utilHighlightEntities([entityID], false, context);
+ }).on("click", (d3_event) => {
+ d3_event.preventDefault();
+ utilHighlightEntities([entityID], false, context);
+ const osmlayer = context.layers().layer("osm");
+ if (!osmlayer.enabled()) {
+ osmlayer.enabled(true);
+ }
+ context.map().centerZoomEase(_qaItem.loc, 20);
+ if (entity) {
+ context.enter(modeSelect(context, [entityID]));
+ } else {
+ context.loadEntity(entityID, (err, result) => {
+ if (err)
+ return;
+ const entity2 = result.data.find((e) => e.id === entityID);
+ if (entity2)
+ context.enter(modeSelect(context, [entityID]));
+ });
+ }
+ });
+ if (entity) {
+ let name2 = utilDisplayName(entity);
+ if (!name2 && !isObjectLink) {
+ const preset = _mainPresetIndex.match(entity, context.graph());
+ name2 = preset && !preset.isFallback() && preset.name();
+ }
+ if (name2) {
+ this.innerText = name2;
+ }
+ }
+ });
+ context.features().forceVisible(relatedEntities);
+ context.map().pan([0, 0]);
+ }
+ keepRightDetails.issue = function(val) {
+ if (!arguments.length)
+ return _qaItem;
+ _qaItem = val;
+ return keepRightDetails;
+ };
+ return keepRightDetails;
+ }
+
+ // modules/ui/keepRight_header.js
+ function uiKeepRightHeader() {
+ let _qaItem;
+ function issueTitle(d) {
+ const { itemType, parentIssueType } = d;
+ const unknown = _t.html("inspector.unknown");
+ let replacements = d.replacements || {};
+ replacements.default = { html: unknown };
+ if (_mainLocalizer.hasTextForStringId(`QA.keepRight.errorTypes.${itemType}.title`)) {
+ return _t.html(`QA.keepRight.errorTypes.${itemType}.title`, replacements);
+ } else {
+ return _t.html(`QA.keepRight.errorTypes.${parentIssueType}.title`, replacements);
+ }
+ }
+ function keepRightHeader(selection2) {
+ const header = selection2.selectAll(".qa-header").data(_qaItem ? [_qaItem] : [], (d) => `${d.id}-${d.status || 0}`);
+ header.exit().remove();
+ const headerEnter = header.enter().append("div").attr("class", "qa-header");
+ const iconEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d) => d.id < 0);
+ iconEnter.append("div").attr("class", (d) => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.parentIssueType}`).call(svgIcon("#iD-icon-bolt", "qaItem-fill"));
+ headerEnter.append("div").attr("class", "qa-header-label").html(issueTitle);
+ }
+ keepRightHeader.issue = function(val) {
+ if (!arguments.length)
+ return _qaItem;
+ _qaItem = val;
+ return keepRightHeader;
+ };
+ return keepRightHeader;
+ }
+
+ // modules/ui/view_on_keepRight.js
+ function uiViewOnKeepRight() {
+ let _qaItem;
+ function viewOnKeepRight(selection2) {
+ let url;
+ if (services.keepRight && _qaItem instanceof QAItem) {
+ url = services.keepRight.issueURL(_qaItem);
+ }
+ const link2 = selection2.selectAll(".view-on-keepRight").data(url ? [url] : []);
+ link2.exit().remove();
+ const linkEnter = link2.enter().append("a").attr("class", "view-on-keepRight").attr("target", "_blank").attr("rel", "noopener").attr("href", (d) => d).call(svgIcon("#iD-icon-out-link", "inline"));
+ linkEnter.append("span").call(_t.append("inspector.view_on_keepRight"));
+ }
+ viewOnKeepRight.what = function(val) {
+ if (!arguments.length)
+ return _qaItem;
+ _qaItem = val;
+ return viewOnKeepRight;
+ };
+ return viewOnKeepRight;
+ }
+
+ // modules/ui/keepRight_editor.js
+ function uiKeepRightEditor(context) {
+ const dispatch10 = dispatch_default("change");
+ const qaDetails = uiKeepRightDetails(context);
+ const qaHeader = uiKeepRightHeader(context);
+ let _qaItem;
+ function keepRightEditor(selection2) {
+ const headerEnter = selection2.selectAll(".header").data([0]).enter().append("div").attr("class", "header fillL");
+ headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => context.enter(modeBrowse(context))).call(svgIcon("#iD-icon-close"));
+ headerEnter.append("h2").call(_t.append("QA.keepRight.title"));
+ let body = selection2.selectAll(".body").data([0]);
+ body = body.enter().append("div").attr("class", "body").merge(body);
+ const editor = body.selectAll(".qa-editor").data([0]);
+ editor.enter().append("div").attr("class", "modal-section qa-editor").merge(editor).call(qaHeader.issue(_qaItem)).call(qaDetails.issue(_qaItem)).call(keepRightSaveSection);
+ const footer = selection2.selectAll(".footer").data([0]);
+ footer.enter().append("div").attr("class", "footer").merge(footer).call(uiViewOnKeepRight(context).what(_qaItem));
+ }
+ function keepRightSaveSection(selection2) {
+ const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
+ const isShown = _qaItem && (isSelected || _qaItem.newComment || _qaItem.comment);
+ let saveSection = selection2.selectAll(".qa-save").data(isShown ? [_qaItem] : [], (d) => `${d.id}-${d.status || 0}`);
+ saveSection.exit().remove();
+ const saveSectionEnter = saveSection.enter().append("div").attr("class", "qa-save save-section cf");
+ saveSectionEnter.append("h4").attr("class", ".qa-save-header").call(_t.append("QA.keepRight.comment"));
+ saveSectionEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("QA.keepRight.comment_placeholder")).attr("maxlength", 1e3).property("value", (d) => d.newComment || d.comment).call(utilNoAuto).on("input", changeInput).on("blur", changeInput);
+ saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons);
+ function changeInput() {
+ const input = select_default2(this);
+ let val = input.property("value").trim();
+ if (val === _qaItem.comment) {
+ val = void 0;
+ }
+ _qaItem = _qaItem.update({ newComment: val });
+ const qaService = services.keepRight;
+ if (qaService) {
+ qaService.replaceItem(_qaItem);
+ }
+ saveSection.call(qaSaveButtons);
+ }
+ }
+ function qaSaveButtons(selection2) {
+ const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
+ let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d) => d.status + d.id);
+ buttonSection.exit().remove();
+ const buttonEnter = buttonSection.enter().append("div").attr("class", "buttons");
+ buttonEnter.append("button").attr("class", "button comment-button action").call(_t.append("QA.keepRight.save_comment"));
+ buttonEnter.append("button").attr("class", "button close-button action");
+ buttonEnter.append("button").attr("class", "button ignore-button action");
+ buttonSection = buttonSection.merge(buttonEnter);
+ buttonSection.select(".comment-button").attr("disabled", (d) => d.newComment ? null : true).on("click.comment", function(d3_event, d) {
+ this.blur();
+ const qaService = services.keepRight;
+ if (qaService) {
+ qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
+ }
+ });
+ buttonSection.select(".close-button").html((d) => {
+ const andComment = d.newComment ? "_comment" : "";
+ return _t.html(`QA.keepRight.close${andComment}`);
+ }).on("click.close", function(d3_event, d) {
+ this.blur();
+ const qaService = services.keepRight;
+ if (qaService) {
+ d.newStatus = "ignore_t";
+ qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
+ }
+ });
+ buttonSection.select(".ignore-button").html((d) => {
+ const andComment = d.newComment ? "_comment" : "";
+ return _t.html(`QA.keepRight.ignore${andComment}`);
+ }).on("click.ignore", function(d3_event, d) {
+ this.blur();
+ const qaService = services.keepRight;
+ if (qaService) {
+ d.newStatus = "ignore";
+ qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
+ }
+ });
+ }
+ keepRightEditor.error = function(val) {
+ if (!arguments.length)
+ return _qaItem;
+ _qaItem = val;
+ return keepRightEditor;
+ };
+ return utilRebind(keepRightEditor, dispatch10, "on");
+ }
+
+ // modules/ui/lasso.js
+ function uiLasso(context) {
+ var group, polygon2;
+ lasso.coordinates = [];
+ function lasso(selection2) {
+ context.container().classed("lasso", true);
+ group = selection2.append("g").attr("class", "lasso hide");
+ polygon2 = group.append("path").attr("class", "lasso-path");
+ group.call(uiToggle(true));
+ }
+ function draw() {
+ if (polygon2) {
+ polygon2.data([lasso.coordinates]).attr("d", function(d) {
+ return "M" + d.join(" L") + " Z";
+ });
+ }
+ }
+ lasso.extent = function() {
+ return lasso.coordinates.reduce(function(extent, point) {
+ return extent.extend(geoExtent(point));
+ }, geoExtent());
+ };
+ lasso.p = function(_) {
+ if (!arguments.length)
+ return lasso;
+ lasso.coordinates.push(_);
+ draw();
+ return lasso;
+ };
+ lasso.close = function() {
+ if (group) {
+ group.call(uiToggle(false, function() {
+ select_default2(this).remove();
+ }));
+ }
+ context.container().classed("lasso", false);
+ };
+ return lasso;
+ }
+
+ // modules/ui/note_comments.js
+ function uiNoteComments() {
+ var _note;
+ function noteComments(selection2) {
+ if (_note.isNew())
+ return;
+ var comments = selection2.selectAll(".comments-container").data([0]);
+ comments = comments.enter().append("div").attr("class", "comments-container").merge(comments);
+ var commentEnter = comments.selectAll(".comment").data(_note.comments).enter().append("div").attr("class", "comment");
+ commentEnter.append("div").attr("class", function(d) {
+ return "comment-avatar user-" + d.uid;
+ }).call(svgIcon("#iD-icon-avatar", "comment-avatar-icon"));
+ var mainEnter = commentEnter.append("div").attr("class", "comment-main");
+ var metadataEnter = mainEnter.append("div").attr("class", "comment-metadata");
+ metadataEnter.append("div").attr("class", "comment-author").each(function(d) {
+ var selection3 = select_default2(this);
+ var osm = services.osm;
+ if (osm && d.user) {
+ selection3 = selection3.append("a").attr("class", "comment-author-link").attr("href", osm.userURL(d.user)).attr("target", "_blank");
+ }
+ if (d.user) {
+ selection3.text(d.user);
+ } else {
+ selection3.call(_t.append("note.anonymous"));
+ }
+ });
+ metadataEnter.append("div").attr("class", "comment-date").html(function(d) {
+ return _t.html("note.status." + d.action, { when: localeDateString2(d.date) });
+ });
+ mainEnter.append("div").attr("class", "comment-text").html(function(d) {
+ return d.html;
+ }).selectAll("a").attr("rel", "noopener nofollow").attr("target", "_blank");
+ comments.call(replaceAvatars);
+ }
+ function replaceAvatars(selection2) {
+ var showThirdPartyIcons = corePreferences("preferences.privacy.thirdpartyicons") || "true";
+ var osm = services.osm;
+ if (showThirdPartyIcons !== "true" || !osm)
+ return;
+ var uids = {};
+ _note.comments.forEach(function(d) {
+ if (d.uid)
+ uids[d.uid] = true;
+ });
+ Object.keys(uids).forEach(function(uid) {
+ osm.loadUser(uid, function(err, user) {
+ if (!user || !user.image_url)
+ return;
+ selection2.selectAll(".comment-avatar.user-" + uid).html("").append("img").attr("class", "icon comment-avatar-icon").attr("src", user.image_url).attr("alt", user.display_name);
+ });
+ });
+ }
+ function localeDateString2(s) {
+ if (!s)
+ return null;
+ var options2 = { day: "numeric", month: "short", year: "numeric" };
+ s = s.replace(/-/g, "/");
+ var d = new Date(s);
+ if (isNaN(d.getTime()))
+ return null;
+ return d.toLocaleDateString(_mainLocalizer.localeCode(), options2);
+ }
+ noteComments.note = function(val) {
+ if (!arguments.length)
+ return _note;
+ _note = val;
+ return noteComments;
+ };
+ return noteComments;
+ }
+
+ // modules/ui/note_header.js
+ function uiNoteHeader() {
+ var _note;
+ function noteHeader(selection2) {
+ var header = selection2.selectAll(".note-header").data(_note ? [_note] : [], function(d) {
+ return d.status + d.id;
+ });
+ header.exit().remove();
+ var headerEnter = header.enter().append("div").attr("class", "note-header");
+ var iconEnter = headerEnter.append("div").attr("class", function(d) {
+ return "note-header-icon " + d.status;
+ }).classed("new", function(d) {
+ return d.id < 0;
+ });
+ iconEnter.append("div").attr("class", "preset-icon-28").call(svgIcon("#iD-icon-note", "note-fill"));
+ iconEnter.each(function(d) {
+ var statusIcon;
+ if (d.id < 0) {
+ statusIcon = "#iD-icon-plus";
+ } else if (d.status === "open") {
+ statusIcon = "#iD-icon-close";
+ } else {
+ statusIcon = "#iD-icon-apply";
+ }
+ iconEnter.append("div").attr("class", "note-icon-annotation").attr("title", _t("icons.close")).call(svgIcon(statusIcon, "icon-annotation"));
+ });
+ headerEnter.append("div").attr("class", "note-header-label").html(function(d) {
+ if (_note.isNew()) {
+ return _t.html("note.new");
+ }
+ return _t.html("note.note") + " " + d.id + " " + (d.status === "closed" ? _t.html("note.closed") : "");
+ });
+ }
+ noteHeader.note = function(val) {
+ if (!arguments.length)
+ return _note;
+ _note = val;
+ return noteHeader;
+ };
+ return noteHeader;
+ }
+
+ // modules/ui/note_report.js
+ function uiNoteReport() {
+ var _note;
+ function noteReport(selection2) {
+ var url;
+ if (services.osm && _note instanceof osmNote && !_note.isNew()) {
+ url = services.osm.noteReportURL(_note);
+ }
+ var link2 = selection2.selectAll(".note-report").data(url ? [url] : []);
+ link2.exit().remove();
+ var linkEnter = link2.enter().append("a").attr("class", "note-report").attr("target", "_blank").attr("href", function(d) {
+ return d;
+ }).call(svgIcon("#iD-icon-out-link", "inline"));
+ linkEnter.append("span").call(_t.append("note.report"));
+ }
+ noteReport.note = function(val) {
+ if (!arguments.length)
+ return _note;
+ _note = val;
+ return noteReport;
+ };
+ return noteReport;
+ }
+
+ // modules/ui/note_editor.js
+ function uiNoteEditor(context) {
+ var dispatch10 = dispatch_default("change");
+ var noteComments = uiNoteComments(context);
+ var noteHeader = uiNoteHeader();
+ var _note;
+ var _newNote;
+ function noteEditor(selection2) {
+ var header = selection2.selectAll(".header").data([0]);
+ var headerEnter = header.enter().append("div").attr("class", "header fillL");
+ headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() {
+ context.enter(modeBrowse(context));
+ }).call(svgIcon("#iD-icon-close"));
+ headerEnter.append("h2").call(_t.append("note.title"));
+ var body = selection2.selectAll(".body").data([0]);
+ body = body.enter().append("div").attr("class", "body").merge(body);
+ var editor = body.selectAll(".note-editor").data([0]);
+ editor.enter().append("div").attr("class", "modal-section note-editor").merge(editor).call(noteHeader.note(_note)).call(noteComments.note(_note)).call(noteSaveSection);
+ var footer = selection2.selectAll(".footer").data([0]);
+ footer.enter().append("div").attr("class", "footer").merge(footer).call(uiViewOnOSM(context).what(_note)).call(uiNoteReport(context).note(_note));
+ var osm = services.osm;
+ if (osm) {
+ osm.on("change.note-save", function() {
+ selection2.call(noteEditor);
+ });
+ }
+ }
+ function noteSaveSection(selection2) {
+ var isSelected = _note && _note.id === context.selectedNoteID();
+ var noteSave = selection2.selectAll(".note-save").data(isSelected ? [_note] : [], function(d) {
+ return d.status + d.id;
+ });
+ noteSave.exit().remove();
+ var noteSaveEnter = noteSave.enter().append("div").attr("class", "note-save save-section cf");
+ noteSaveEnter.append("h4").attr("class", ".note-save-header").html(function() {
+ return _note.isNew() ? _t.html("note.newDescription") : _t.html("note.newComment");
+ });
+ var commentTextarea = noteSaveEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("note.inputPlaceholder")).attr("maxlength", 1e3).property("value", function(d) {
+ return d.newComment;
+ }).call(utilNoAuto).on("keydown.note-input", keydown).on("input.note-input", changeInput).on("blur.note-input", changeInput);
+ if (!commentTextarea.empty() && _newNote) {
+ commentTextarea.node().focus();
+ }
+ noteSave = noteSaveEnter.merge(noteSave).call(userDetails).call(noteSaveButtons);
+ function keydown(d3_event) {
+ if (!(d3_event.keyCode === 13 && d3_event.metaKey))
+ return;
+ var osm = services.osm;
+ if (!osm)
+ return;
+ var hasAuth = osm.authenticated();
+ if (!hasAuth)
+ return;
+ if (!_note.newComment)
+ return;
+ d3_event.preventDefault();
+ select_default2(this).on("keydown.note-input", null);
+ window.setTimeout(function() {
+ if (_note.isNew()) {
+ noteSave.selectAll(".save-button").node().focus();
+ clickSave(_note);
+ } else {
+ noteSave.selectAll(".comment-button").node().focus();
+ clickComment(_note);
+ }
+ }, 10);
+ }
+ function changeInput() {
+ var input = select_default2(this);
+ var val = input.property("value").trim() || void 0;
+ _note = _note.update({ newComment: val });
+ var osm = services.osm;
+ if (osm) {
+ osm.replaceNote(_note);
+ }
+ noteSave.call(noteSaveButtons);
+ }
+ }
+ function userDetails(selection2) {
+ var detailSection = selection2.selectAll(".detail-section").data([0]);
+ detailSection = detailSection.enter().append("div").attr("class", "detail-section").merge(detailSection);
+ var osm = services.osm;
+ if (!osm)
+ return;
+ var hasAuth = osm.authenticated();
+ var authWarning = detailSection.selectAll(".auth-warning").data(hasAuth ? [] : [0]);
+ authWarning.exit().transition().duration(200).style("opacity", 0).remove();
+ var authEnter = authWarning.enter().insert("div", ".tag-reference-body").attr("class", "field-warning auth-warning").style("opacity", 0);
+ authEnter.call(svgIcon("#iD-icon-alert", "inline"));
+ authEnter.append("span").call(_t.append("note.login"));
+ authEnter.append("a").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).append("span").call(_t.append("login")).on("click.note-login", function(d3_event) {
+ d3_event.preventDefault();
+ osm.authenticate();
+ });
+ authEnter.transition().duration(200).style("opacity", 1);
+ var prose = detailSection.selectAll(".note-save-prose").data(hasAuth ? [0] : []);
+ prose.exit().remove();
+ prose = prose.enter().append("p").attr("class", "note-save-prose").call(_t.append("note.upload_explanation")).merge(prose);
+ osm.userDetails(function(err, user) {
+ if (err)
+ return;
+ var userLink = select_default2(document.createElement("div"));
+ if (user.image_url) {
+ userLink.append("img").attr("src", user.image_url).attr("class", "icon pre-text user-icon");
+ }
+ userLink.append("a").attr("class", "user-info").text(user.display_name).attr("href", osm.userURL(user.display_name)).attr("target", "_blank");
+ prose.html(_t.html("note.upload_explanation_with_user", { user: { html: userLink.html() } }));
+ });
+ }
+ function noteSaveButtons(selection2) {
+ var osm = services.osm;
+ var hasAuth = osm && osm.authenticated();
+ var isSelected = _note && _note.id === context.selectedNoteID();
+ var buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_note] : [], function(d) {
+ return d.status + d.id;
+ });
+ buttonSection.exit().remove();
+ var buttonEnter = buttonSection.enter().append("div").attr("class", "buttons");
+ if (_note.isNew()) {
+ buttonEnter.append("button").attr("class", "button cancel-button secondary-action").call(_t.append("confirm.cancel"));
+ buttonEnter.append("button").attr("class", "button save-button action").call(_t.append("note.save"));
+ } else {
+ buttonEnter.append("button").attr("class", "button status-button action");
+ buttonEnter.append("button").attr("class", "button comment-button action").call(_t.append("note.comment"));
+ }
+ buttonSection = buttonSection.merge(buttonEnter);
+ buttonSection.select(".cancel-button").on("click.cancel", clickCancel);
+ buttonSection.select(".save-button").attr("disabled", isSaveDisabled).on("click.save", clickSave);
+ buttonSection.select(".status-button").attr("disabled", hasAuth ? null : true).html(function(d) {
+ var action = d.status === "open" ? "close" : "open";
+ var andComment = d.newComment ? "_comment" : "";
+ return _t.html("note." + action + andComment);
+ }).on("click.status", clickStatus);
+ buttonSection.select(".comment-button").attr("disabled", isSaveDisabled).on("click.comment", clickComment);
+ function isSaveDisabled(d) {
+ return hasAuth && d.status === "open" && d.newComment ? null : true;
+ }
+ }
+ function clickCancel(d3_event, d) {
+ this.blur();
+ var osm = services.osm;
+ if (osm) {
+ osm.removeNote(d);
+ }
+ context.enter(modeBrowse(context));
+ dispatch10.call("change");
+ }
+ function clickSave(d3_event, d) {
+ this.blur();
+ var osm = services.osm;
+ if (osm) {
+ osm.postNoteCreate(d, function(err, note) {
+ dispatch10.call("change", note);
+ });
+ }
+ }
+ function clickStatus(d3_event, d) {
+ this.blur();
+ var osm = services.osm;
+ if (osm) {
+ var setStatus = d.status === "open" ? "closed" : "open";
+ osm.postNoteUpdate(d, setStatus, function(err, note) {
+ dispatch10.call("change", note);
+ });
+ }
+ }
+ function clickComment(d3_event, d) {
+ this.blur();
+ var osm = services.osm;
+ if (osm) {
+ osm.postNoteUpdate(d, d.status, function(err, note) {
+ dispatch10.call("change", note);
+ });
+ }
+ }
+ noteEditor.note = function(val) {
+ if (!arguments.length)
+ return _note;
+ _note = val;
+ return noteEditor;
+ };
+ noteEditor.newNote = function(val) {
+ if (!arguments.length)
+ return _newNote;
+ _newNote = val;
+ return noteEditor;
+ };
+ return utilRebind(noteEditor, dispatch10, "on");
+ }
+
+ // modules/ui/source_switch.js
+ function uiSourceSwitch(context) {
+ var keys;
+ function click(d3_event) {
+ d3_event.preventDefault();
+ var osm = context.connection();
+ if (!osm)
+ return;
+ if (context.inIntro())
+ return;
+ if (context.history().hasChanges() && !window.confirm(_t("source_switch.lose_changes")))
+ return;
+ var isLive = select_default2(this).classed("live");
+ isLive = !isLive;
+ context.enter(modeBrowse(context));
+ context.history().clearSaved();
+ context.flush();
+ select_default2(this).html(isLive ? _t.html("source_switch.live") : _t.html("source_switch.dev")).classed("live", isLive).classed("chip", isLive);
+ osm.switch(isLive ? keys[0] : keys[1]);
+ }
+ var sourceSwitch = function(selection2) {
+ selection2.append("a").attr("href", "#").call(_t.append("source_switch.live")).attr("class", "live chip").on("click", click);
+ };
+ sourceSwitch.keys = function(_) {
+ if (!arguments.length)
+ return keys;
+ keys = _;
+ return sourceSwitch;
+ };
+ return sourceSwitch;
+ }
+
+ // modules/ui/spinner.js
+ function uiSpinner(context) {
+ var osm = context.connection();
+ return function(selection2) {
+ var img = selection2.append("img").attr("src", context.imagePath("loader-black.gif")).style("opacity", 0);
+ if (osm) {
+ osm.on("loading.spinner", function() {
+ img.transition().style("opacity", 1);
+ }).on("loaded.spinner", function() {
+ img.transition().style("opacity", 0);
+ });
+ }
+ };
+ }
+
+ // modules/ui/sections/privacy.js
+ function uiSectionPrivacy(context) {
+ let section = uiSection("preferences-third-party", context).label(_t.html("preferences.privacy.title")).disclosureContent(renderDisclosureContent);
+ function renderDisclosureContent(selection2) {
+ selection2.selectAll(".privacy-options-list").data([0]).enter().append("ul").attr("class", "layer-list privacy-options-list");
+ let thirdPartyIconsEnter = selection2.select(".privacy-options-list").selectAll(".privacy-third-party-icons-item").data([corePreferences("preferences.privacy.thirdpartyicons") || "true"]).enter().append("li").attr("class", "privacy-third-party-icons-item").append("label").call(uiTooltip().title(_t.html("preferences.privacy.third_party_icons.tooltip")).placement("bottom"));
+ thirdPartyIconsEnter.append("input").attr("type", "checkbox").on("change", (d3_event, d) => {
+ d3_event.preventDefault();
+ corePreferences("preferences.privacy.thirdpartyicons", d === "true" ? "false" : "true");
+ });
+ thirdPartyIconsEnter.append("span").call(_t.append("preferences.privacy.third_party_icons.description"));
+ selection2.selectAll(".privacy-third-party-icons-item").classed("active", (d) => d === "true").select("input").property("checked", (d) => d === "true");
+ selection2.selectAll(".privacy-link").data([0]).enter().append("div").attr("class", "privacy-link").append("a").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", "https://github.com/openstreetmap/iD/blob/release/PRIVACY.md").append("span").call(_t.append("preferences.privacy.privacy_link"));
+ }
+ corePreferences.onChange("preferences.privacy.thirdpartyicons", section.reRender);
+ return section;
+ }
+
+ // modules/ui/splash.js
+ function uiSplash(context) {
+ return (selection2) => {
+ if (context.history().hasRestorableChanges())
+ return;
+ let updateMessage = "";
+ const sawPrivacyVersion = corePreferences("sawPrivacyVersion");
+ let showSplash = !corePreferences("sawSplash");
+ if (sawPrivacyVersion !== context.privacyVersion) {
+ updateMessage = _t("splash.privacy_update");
+ showSplash = true;
+ }
+ if (!showSplash)
+ return;
+ corePreferences("sawSplash", true);
+ corePreferences("sawPrivacyVersion", context.privacyVersion);
+ _mainFileFetcher.get("intro_graph");
+ let modalSelection = uiModal(selection2);
+ modalSelection.select(".modal").attr("class", "modal-splash modal");
+ let introModal = modalSelection.select(".content").append("div").attr("class", "fillL");
+ introModal.append("div").attr("class", "modal-section").append("h3").call(_t.append("splash.welcome"));
+ let modalSection = introModal.append("div").attr("class", "modal-section");
+ modalSection.append("p").html(_t.html("splash.text", {
+ version: context.version,
+ website: { html: '<a target="_blank" href="https://github.com/openstreetmap/iD/blob/develop/CHANGELOG.md#whats-new">' + _t.html("splash.changelog") + "</a>" },
+ github: { html: '<a target="_blank" href="https://github.com/openstreetmap/iD/issues">github.com</a>' }
+ }));
+ modalSection.append("p").html(_t.html("splash.privacy", {
+ updateMessage,
+ privacyLink: { html: '<a target="_blank" href="https://github.com/openstreetmap/iD/blob/release/PRIVACY.md">' + _t("splash.privacy_policy") + "</a>" }
+ }));
+ uiSectionPrivacy(context).label(_t.html("splash.privacy_settings")).render(modalSection);
+ let buttonWrap = introModal.append("div").attr("class", "modal-actions");
+ let walkthrough = buttonWrap.append("button").attr("class", "walkthrough").on("click", () => {
+ context.container().call(uiIntro(context));
+ modalSelection.close();
+ });
+ walkthrough.append("svg").attr("class", "logo logo-walkthrough").append("use").attr("xlink:href", "#iD-logo-walkthrough");
+ walkthrough.append("div").call(_t.append("splash.walkthrough"));
+ let startEditing = buttonWrap.append("button").attr("class", "start-editing").on("click", modalSelection.close);
+ startEditing.append("svg").attr("class", "logo logo-features").append("use").attr("xlink:href", "#iD-logo-features");
+ startEditing.append("div").call(_t.append("splash.start"));
+ modalSelection.select("button.close").attr("class", "hide");
+ };
+ }
+
+ // modules/ui/status.js
+ function uiStatus(context) {
+ var osm = context.connection();
+ return function(selection2) {
+ if (!osm)
+ return;
+ function update(err, apiStatus) {
+ selection2.html("");
+ if (err) {
+ if (apiStatus === "connectionSwitched") {
+ return;
+ } else if (apiStatus === "rateLimited") {
+ selection2.call(_t.append("osm_api_status.message.rateLimit")).append("a").attr("href", "#").attr("class", "api-status-login").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).append("span").call(_t.append("login")).on("click.login", function(d3_event) {
+ d3_event.preventDefault();
+ osm.authenticate();
+ });
+ } else {
+ var throttledRetry = throttle_default(function() {
+ context.loadTiles(context.projection);
+ osm.reloadApiStatus();
+ }, 2e3);
+ selection2.call(_t.append("osm_api_status.message.error", { suffix: " " })).append("a").attr("href", "#").call(_t.append("osm_api_status.retry")).on("click.retry", function(d3_event) {
+ d3_event.preventDefault();
+ throttledRetry();
+ });
+ }
+ } else if (apiStatus === "readonly") {
+ selection2.call(_t.append("osm_api_status.message.readonly"));
+ } else if (apiStatus === "offline") {
+ selection2.call(_t.append("osm_api_status.message.offline"));
+ }
+ selection2.attr("class", "api-status " + (err ? "error" : apiStatus));
+ }
+ osm.on("apiStatusChange.uiStatus", update);
+ context.history().on("storage_error", () => {
+ selection2.selectAll("span.local-storage-full").remove();
+ selection2.append("span").attr("class", "local-storage-full").call(_t.append("osm_api_status.message.local_storage_full"));
+ selection2.classed("error", true);
+ });
+ window.setInterval(function() {
+ osm.reloadApiStatus();
+ }, 9e4);
+ osm.reloadApiStatus();
+ };
+ }
+
+ // node_modules/osm-community-index/lib/simplify.js
+ var import_diacritics3 = __toESM(require_diacritics(), 1);
+ function simplify2(str2) {
+ if (typeof str2 !== "string")
+ return "";
+ return import_diacritics3.default.remove(str2.replace(/&/g, "and").replace(/İ/ig, "i").replace(/[\s\-=_!"#%'*{},.\/:;?\(\)\[\]@\\$\^*+<>«»~`’\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u200b-\u200f\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\ufeff\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g, "").toLowerCase());
+ }
+
+ // node_modules/osm-community-index/lib/resolve_strings.js
+ function resolveStrings(item, defaults2, localizerFn) {
+ let itemStrings = Object.assign({}, item.strings);
+ let defaultStrings = Object.assign({}, defaults2[item.type]);
+ const anyToken = new RegExp(/(\{\w+\})/, "gi");
+ if (localizerFn) {
+ if (itemStrings.community) {
+ const communityID = simplify2(itemStrings.community);
+ itemStrings.community = localizerFn(`_communities.${communityID}`);
+ }
+ ["name", "description", "extendedDescription"].forEach((prop) => {
+ if (defaultStrings[prop])
+ defaultStrings[prop] = localizerFn(`_defaults.${item.type}.${prop}`);
+ if (itemStrings[prop])
+ itemStrings[prop] = localizerFn(`${item.id}.${prop}`);
+ });
+ }
+ let replacements = {
+ account: item.account,
+ community: itemStrings.community,
+ signupUrl: itemStrings.signupUrl,
+ url: itemStrings.url
+ };
+ if (!replacements.signupUrl) {
+ replacements.signupUrl = resolve(itemStrings.signupUrl || defaultStrings.signupUrl);
+ }
+ if (!replacements.url) {
+ replacements.url = resolve(itemStrings.url || defaultStrings.url);
+ }
+ let resolved = {
+ name: resolve(itemStrings.name || defaultStrings.name),
+ url: resolve(itemStrings.url || defaultStrings.url),
+ signupUrl: resolve(itemStrings.signupUrl || defaultStrings.signupUrl),
+ description: resolve(itemStrings.description || defaultStrings.description),
+ extendedDescription: resolve(itemStrings.extendedDescription || defaultStrings.extendedDescription)
+ };
+ resolved.nameHTML = linkify(resolved.url, resolved.name);
+ resolved.urlHTML = linkify(resolved.url);
+ resolved.signupUrlHTML = linkify(resolved.signupUrl);
+ resolved.descriptionHTML = resolve(itemStrings.description || defaultStrings.description, true);
+ resolved.extendedDescriptionHTML = resolve(itemStrings.extendedDescription || defaultStrings.extendedDescription, true);
+ return resolved;
+ function resolve(s, addLinks) {
+ if (!s)
+ return void 0;
+ let result = s;
+ for (let key in replacements) {
+ const token = `{${key}}`;
+ const regex = new RegExp(token, "g");
+ if (regex.test(result)) {
+ let replacement = replacements[key];
+ if (!replacement) {
+ throw new Error(`Cannot resolve token: ${token}`);
+ } else {
+ if (addLinks && (key === "signupUrl" || key === "url")) {
+ replacement = linkify(replacement);
+ }
+ result = result.replace(regex, replacement);
+ }
+ }
+ }
+ const leftovers = result.match(anyToken);
+ if (leftovers) {
+ throw new Error(`Cannot resolve tokens: ${leftovers}`);
+ }
+ if (addLinks && item.type === "reddit") {
+ result = result.replace(/(\/r\/\w+\/*)/i, (match) => linkify(resolved.url, match));
+ }
+ return result;
+ }
+ function linkify(url, text2) {
+ if (!url)
+ return void 0;
+ text2 = text2 || url;
+ return `<a target="_blank" href="${url}">${text2}</a>`;
+ }
+ }
+
+ // modules/ui/success.js
+ var _oci = null;
+ function uiSuccess(context) {
+ const MAXEVENTS = 2;
+ const dispatch10 = dispatch_default("cancel");
+ let _changeset2;
+ let _location;
+ ensureOSMCommunityIndex();
+ function ensureOSMCommunityIndex() {
+ const data = _mainFileFetcher;
+ return Promise.all([
+ data.get("oci_features"),
+ data.get("oci_resources"),
+ data.get("oci_defaults")
+ ]).then((vals) => {
+ if (_oci)
+ return _oci;
+ if (vals[0] && Array.isArray(vals[0].features)) {
+ _mainLocations.mergeCustomGeoJSON(vals[0]);
+ }
+ let ociResources = Object.values(vals[1].resources);
+ if (ociResources.length) {
+ return _mainLocations.mergeLocationSets(ociResources).then(() => {
+ _oci = {
+ resources: ociResources,
+ defaults: vals[2].defaults
+ };
+ return _oci;
+ });
+ } else {
+ _oci = {
+ resources: [],
+ defaults: vals[2].defaults
+ };
+ return _oci;
+ }
+ });
+ }
+ function parseEventDate(when) {
+ if (!when)
+ return;
+ let raw = when.trim();
+ if (!raw)
+ return;
+ if (!/Z$/.test(raw)) {
+ raw += "Z";
+ }
+ const parsed = new Date(raw);
+ return new Date(parsed.toUTCString().substr(0, 25));
+ }
+ function success(selection2) {
+ let header = selection2.append("div").attr("class", "header fillL");
+ header.append("h2").call(_t.append("success.just_edited"));
+ header.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => dispatch10.call("cancel")).call(svgIcon("#iD-icon-close"));
+ let body = selection2.append("div").attr("class", "body save-success fillL");
+ let summary = body.append("div").attr("class", "save-summary");
+ summary.append("h3").call(_t.append("success.thank_you" + (_location ? "_location" : ""), { where: _location }));
+ summary.append("p").call(_t.append("success.help_html")).append("a").attr("class", "link-out").attr("target", "_blank").attr("href", _t("success.help_link_url")).call(svgIcon("#iD-icon-out-link", "inline")).append("span").call(_t.append("success.help_link_text"));
+ let osm = context.connection();
+ if (!osm)
+ return;
+ let changesetURL = osm.changesetURL(_changeset2.id);
+ let table = summary.append("table").attr("class", "summary-table");
+ let row = table.append("tr").attr("class", "summary-row");
+ row.append("td").attr("class", "cell-icon summary-icon").append("a").attr("target", "_blank").attr("href", changesetURL).append("svg").attr("class", "logo-small").append("use").attr("xlink:href", "#iD-logo-osm");
+ let summaryDetail = row.append("td").attr("class", "cell-detail summary-detail");
+ summaryDetail.append("a").attr("class", "cell-detail summary-view-on-osm").attr("target", "_blank").attr("href", changesetURL).call(_t.append("success.view_on_osm"));
+ summaryDetail.append("div").html(_t.html("success.changeset_id", {
+ changeset_id: { html: `<a href="${changesetURL}" target="_blank">${_changeset2.id}</a>` }
+ }));
+ ensureOSMCommunityIndex().then((oci) => {
+ const loc = context.map().center();
+ const validLocations = _mainLocations.locationsAt(loc);
+ let communities = [];
+ oci.resources.forEach((resource) => {
+ let area = validLocations[resource.locationSetID];
+ if (!area)
+ return;
+ const localizer = (stringID) => _t.html(`community.${stringID}`);
+ resource.resolved = resolveStrings(resource, oci.defaults, localizer);
+ communities.push({
+ area,
+ order: resource.order || 0,
+ resource
+ });
+ });
+ communities.sort((a, b) => a.area - b.area || b.order - a.order);
+ body.call(showCommunityLinks, communities.map((c) => c.resource));
+ });
+ }
+ function showCommunityLinks(selection2, resources) {
+ let communityLinks = selection2.append("div").attr("class", "save-communityLinks");
+ communityLinks.append("h3").call(_t.append("success.like_osm"));
+ let table = communityLinks.append("table").attr("class", "community-table");
+ let row = table.selectAll(".community-row").data(resources);
+ let rowEnter = row.enter().append("tr").attr("class", "community-row");
+ rowEnter.append("td").attr("class", "cell-icon community-icon").append("a").attr("target", "_blank").attr("href", (d) => d.resolved.url).append("svg").attr("class", "logo-small").append("use").attr("xlink:href", (d) => `#community-${d.type}`);
+ let communityDetail = rowEnter.append("td").attr("class", "cell-detail community-detail");
+ communityDetail.each(showCommunityDetails);
+ communityLinks.append("div").attr("class", "community-missing").call(_t.append("success.missing")).append("a").attr("class", "link-out").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", "https://github.com/osmlab/osm-community-index/issues").append("span").call(_t.append("success.tell_us"));
+ }
+ function showCommunityDetails(d) {
+ let selection2 = select_default2(this);
+ let communityID = d.id;
+ selection2.append("div").attr("class", "community-name").html(d.resolved.nameHTML);
+ selection2.append("div").attr("class", "community-description").html(d.resolved.descriptionHTML);
+ if (d.resolved.extendedDescriptionHTML || d.languageCodes && d.languageCodes.length) {
+ selection2.append("div").call(uiDisclosure(context, `community-more-${d.id}`, false).expanded(false).updatePreference(false).label(_t.html("success.more")).content(showMore));
+ }
+ let nextEvents = (d.events || []).map((event) => {
+ event.date = parseEventDate(event.when);
+ return event;
+ }).filter((event) => {
+ const t = event.date.getTime();
+ const now3 = new Date().setHours(0, 0, 0, 0);
+ return !isNaN(t) && t >= now3;
+ }).sort((a, b) => {
+ return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
+ }).slice(0, MAXEVENTS);
+ if (nextEvents.length) {
+ selection2.append("div").call(uiDisclosure(context, `community-events-${d.id}`, false).expanded(false).updatePreference(false).label(_t.html("success.events")).content(showNextEvents)).select(".hide-toggle").append("span").attr("class", "badge-text").text(nextEvents.length);
+ }
+ function showMore(selection3) {
+ let more = selection3.selectAll(".community-more").data([0]);
+ let moreEnter = more.enter().append("div").attr("class", "community-more");
+ if (d.resolved.extendedDescriptionHTML) {
+ moreEnter.append("div").attr("class", "community-extended-description").html(d.resolved.extendedDescriptionHTML);
+ }
+ if (d.languageCodes && d.languageCodes.length) {
+ const languageList = d.languageCodes.map((code) => _mainLocalizer.languageName(code)).join(", ");
+ moreEnter.append("div").attr("class", "community-languages").call(_t.append("success.languages", { languages: languageList }));
+ }
+ }
+ function showNextEvents(selection3) {
+ let events = selection3.append("div").attr("class", "community-events");
+ let item = events.selectAll(".community-event").data(nextEvents);
+ let itemEnter = item.enter().append("div").attr("class", "community-event");
+ itemEnter.append("div").attr("class", "community-event-name").append("a").attr("target", "_blank").attr("href", (d2) => d2.url).text((d2) => {
+ let name2 = d2.name;
+ if (d2.i18n && d2.id) {
+ name2 = _t(`community.${communityID}.events.${d2.id}.name`, { default: name2 });
+ }
+ return name2;
+ });
+ itemEnter.append("div").attr("class", "community-event-when").text((d2) => {
+ let options2 = { weekday: "short", day: "numeric", month: "short", year: "numeric" };
+ if (d2.date.getHours() || d2.date.getMinutes()) {
+ options2.hour = "numeric";
+ options2.minute = "numeric";
+ }
+ return d2.date.toLocaleString(_mainLocalizer.localeCode(), options2);
+ });
+ itemEnter.append("div").attr("class", "community-event-where").text((d2) => {
+ let where = d2.where;
+ if (d2.i18n && d2.id) {
+ where = _t(`community.${communityID}.events.${d2.id}.where`, { default: where });
+ }
+ return where;
+ });
+ itemEnter.append("div").attr("class", "community-event-description").text((d2) => {
+ let description2 = d2.description;
+ if (d2.i18n && d2.id) {
+ description2 = _t(`community.${communityID}.events.${d2.id}.description`, { default: description2 });
+ }
+ return description2;
+ });
+ }
+ }
+ success.changeset = function(val) {
+ if (!arguments.length)
+ return _changeset2;
+ _changeset2 = val;
+ return success;
+ };
+ success.location = function(val) {
+ if (!arguments.length)
+ return _location;
+ _location = val;
+ return success;
+ };
+ return utilRebind(success, dispatch10, "on");
+ }
+
+ // modules/ui/version.js
+ var sawVersion = null;
+ var isNewVersion = false;
+ var isNewUser = false;
+ function uiVersion(context) {
+ var currVersion = context.version;
+ var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
+ if (sawVersion === null && matchedVersion !== null) {
+ if (corePreferences("sawVersion")) {
+ isNewUser = false;
+ isNewVersion = corePreferences("sawVersion") !== currVersion && currVersion.indexOf("-") === -1;
+ } else {
+ isNewUser = true;
+ isNewVersion = true;
+ }
+ corePreferences("sawVersion", currVersion);
+ sawVersion = currVersion;
+ }
+ return function(selection2) {
+ selection2.append("a").attr("target", "_blank").attr("href", "https://github.com/openstreetmap/iD").text(currVersion);
+ if (isNewVersion && !isNewUser) {
+ selection2.append("a").attr("class", "badge").attr("target", "_blank").attr("href", "https://github.com/openstreetmap/iD/blob/release/CHANGELOG.md#whats-new").call(svgIcon("#maki-gift-11")).call(uiTooltip().title(_t.html("version.whats_new", { version: currVersion })).placement("top").scrollContainer(context.container().select(".main-footer-wrap")));
+ }
+ };
+ }
+
+ // modules/ui/zoom.js
+ function uiZoom(context) {
+ var zooms = [{
+ id: "zoom-in",
+ icon: "iD-icon-plus",
+ title: _t.html("zoom.in"),
+ action: zoomIn,
+ disabled: function() {
+ return !context.map().canZoomIn();
+ },
+ disabledTitle: _t.html("zoom.disabled.in"),
+ key: "+"
+ }, {
+ id: "zoom-out",
+ icon: "iD-icon-minus",
+ title: _t.html("zoom.out"),
+ action: zoomOut,
+ disabled: function() {
+ return !context.map().canZoomOut();
+ },
+ disabledTitle: _t.html("zoom.disabled.out"),
+ key: "-"
+ }];
+ function zoomIn(d3_event) {
+ if (d3_event.shiftKey)
+ return;
+ d3_event.preventDefault();
+ context.map().zoomIn();
+ }
+ function zoomOut(d3_event) {
+ if (d3_event.shiftKey)
+ return;
+ d3_event.preventDefault();
+ context.map().zoomOut();
+ }
+ function zoomInFurther(d3_event) {
+ if (d3_event.shiftKey)
+ return;
+ d3_event.preventDefault();
+ context.map().zoomInFurther();
+ }
+ function zoomOutFurther(d3_event) {
+ if (d3_event.shiftKey)
+ return;
+ d3_event.preventDefault();
+ context.map().zoomOutFurther();
+ }
+ return function(selection2) {
+ var tooltipBehavior = uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(function(d) {
+ if (d.disabled()) {
+ return d.disabledTitle;
+ }
+ return d.title;
+ }).keys(function(d) {
+ return [d.key];
+ });
+ var lastPointerUpType;
+ var buttons = selection2.selectAll("button").data(zooms).enter().append("button").attr("class", function(d) {
+ return d.id;
+ }).on("pointerup.editor", function(d3_event) {
+ lastPointerUpType = d3_event.pointerType;
+ }).on("click.editor", function(d3_event, d) {
+ if (!d.disabled()) {
+ d.action(d3_event);
+ } else if (lastPointerUpType === "touch" || lastPointerUpType === "pen") {
+ context.ui().flash.duration(2e3).iconName("#" + d.icon).iconClass("disabled").label(d.disabledTitle)();
+ }
+ lastPointerUpType = null;
+ }).call(tooltipBehavior);
+ buttons.each(function(d) {
+ select_default2(this).call(svgIcon("#" + d.icon, "light"));
+ });
+ utilKeybinding.plusKeys.forEach(function(key) {
+ context.keybinding().on([key], zoomIn);
+ context.keybinding().on([uiCmd("\u2325" + key)], zoomInFurther);
+ });
+ utilKeybinding.minusKeys.forEach(function(key) {
+ context.keybinding().on([key], zoomOut);
+ context.keybinding().on([uiCmd("\u2325" + key)], zoomOutFurther);
+ });
+ function updateButtonStates() {
+ buttons.classed("disabled", function(d) {
+ return d.disabled();
+ }).each(function() {
+ var selection3 = select_default2(this);
+ if (!selection3.select(".tooltip.in").empty()) {
+ selection3.call(tooltipBehavior.updateContent);
+ }
+ });
+ }
+ updateButtonStates();
+ context.map().on("move.uiZoom", updateButtonStates);
+ };
+ }
+
+ // modules/ui/sections/raw_tag_editor.js
+ function uiSectionRawTagEditor(id2, context) {
+ var section = uiSection(id2, context).classes("raw-tag-editor").label(function() {
+ var count = Object.keys(_tags).filter(function(d) {
+ return d;
+ }).length;
+ return _t.html("inspector.title_count", { title: { html: _t.html("inspector.tags") }, count });
+ }).expandedByDefault(false).disclosureContent(renderDisclosureContent);
+ var taginfo = services.taginfo;
+ var dispatch10 = dispatch_default("change");
+ var availableViews = [
+ { id: "list", icon: "#fas-th-list" },
+ { id: "text", icon: "#fas-i-cursor" }
+ ];
+ var _tagView = corePreferences("raw-tag-editor-view") || "list";
+ var _readOnlyTags = [];
+ var _orderedKeys = [];
+ var _showBlank = false;
+ var _pendingChange = null;
+ var _state;
+ var _presets;
+ var _tags;
+ var _entityIDs;
+ var _didInteract = false;
+ function interacted() {
+ _didInteract = true;
+ }
+ function renderDisclosureContent(wrap2) {
+ _orderedKeys = _orderedKeys.filter(function(key) {
+ return _tags[key] !== void 0;
+ });
+ var all = Object.keys(_tags).sort();
+ var missingKeys = utilArrayDifference(all, _orderedKeys);
+ for (var i2 in missingKeys) {
+ _orderedKeys.push(missingKeys[i2]);
+ }
+ var rowData = _orderedKeys.map(function(key, i3) {
+ return { index: i3, key, value: _tags[key] };
+ });
+ if (!rowData.length || _showBlank) {
+ _showBlank = false;
+ rowData.push({ index: rowData.length, key: "", value: "" });
+ }
+ var options2 = wrap2.selectAll(".raw-tag-options").data([0]);
+ options2.exit().remove();
+ var optionsEnter = options2.enter().insert("div", ":first-child").attr("class", "raw-tag-options").attr("role", "tablist");
+ var optionEnter = optionsEnter.selectAll(".raw-tag-option").data(availableViews, function(d) {
+ return d.id;
+ }).enter();
+ optionEnter.append("button").attr("class", function(d) {
+ return "raw-tag-option raw-tag-option-" + d.id + (_tagView === d.id ? " selected" : "");
+ }).attr("aria-selected", function(d) {
+ return _tagView === d.id;
+ }).attr("role", "tab").attr("title", function(d) {
+ return _t("icons." + d.id);
+ }).on("click", function(d3_event, d) {
+ _tagView = d.id;
+ corePreferences("raw-tag-editor-view", d.id);
+ wrap2.selectAll(".raw-tag-option").classed("selected", function(datum2) {
+ return datum2 === d;
+ }).attr("aria-selected", function(datum2) {
+ return datum2 === d;
+ });
+ wrap2.selectAll(".tag-text").classed("hide", d.id !== "text").each(setTextareaHeight);
+ wrap2.selectAll(".tag-list, .add-row").classed("hide", d.id !== "list");
+ }).each(function(d) {
+ select_default2(this).call(svgIcon(d.icon));
+ });
+ var textData = rowsToText(rowData);
+ var textarea = wrap2.selectAll(".tag-text").data([0]);
+ textarea = textarea.enter().append("textarea").attr("class", "tag-text" + (_tagView !== "text" ? " hide" : "")).call(utilNoAuto).attr("placeholder", _t("inspector.key_value")).attr("spellcheck", "false").merge(textarea);
+ textarea.call(utilGetSetValue, textData).each(setTextareaHeight).on("input", setTextareaHeight).on("focus", interacted).on("blur", textChanged).on("change", textChanged);
+ var list = wrap2.selectAll(".tag-list").data([0]);
+ list = list.enter().append("ul").attr("class", "tag-list" + (_tagView !== "list" ? " hide" : "")).merge(list);
+ var addRowEnter = wrap2.selectAll(".add-row").data([0]).enter().append("div").attr("class", "add-row" + (_tagView !== "list" ? " hide" : ""));
+ addRowEnter.append("button").attr("class", "add-tag").attr("aria-label", _t("inspector.add_to_tag")).call(svgIcon("#iD-icon-plus", "light")).call(uiTooltip().title(_t.html("inspector.add_to_tag")).placement(_mainLocalizer.textDirection() === "ltr" ? "right" : "left")).on("click", addTag);
+ addRowEnter.append("div").attr("class", "space-value");
+ addRowEnter.append("div").attr("class", "space-buttons");
+ var items = list.selectAll(".tag-row").data(rowData, function(d) {
+ return d.key;
+ });
+ items.exit().each(unbind).remove();
+ var itemsEnter = items.enter().append("li").attr("class", "tag-row").classed("readonly", isReadOnly);
+ var innerWrap = itemsEnter.append("div").attr("class", "inner-wrap");
+ innerWrap.append("div").attr("class", "key-wrap").append("input").property("type", "text").attr("class", "key").call(utilNoAuto).on("focus", interacted).on("blur", keyChange).on("change", keyChange);
+ innerWrap.append("div").attr("class", "value-wrap").append("input").property("type", "text").attr("class", "value").call(utilNoAuto).on("focus", interacted).on("blur", valueChange).on("change", valueChange).on("keydown.push-more", pushMore);
+ innerWrap.append("button").attr("class", "form-field-button remove").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete"));
+ items = items.merge(itemsEnter).sort(function(a, b) {
+ return a.index - b.index;
+ });
+ items.each(function(d) {
+ var row = select_default2(this);
+ var key = row.select("input.key");
+ var value = row.select("input.value");
+ if (_entityIDs && taginfo && _state !== "hover") {
+ bindTypeahead(key, value);
+ }
+ var referenceOptions = { key: d.key };
+ if (typeof d.value === "string") {
+ referenceOptions.value = d.value;
+ }
+ var reference = uiTagReference(referenceOptions, context);
+ if (_state === "hover") {
+ reference.showing(false);
+ }
+ row.select(".inner-wrap").call(reference.button);
+ row.call(reference.body);
+ row.select("button.remove");
+ });
+ items.selectAll("input.key").attr("title", function(d) {
+ return d.key;
+ }).call(utilGetSetValue, function(d) {
+ return d.key;
+ }).attr("readonly", function(d) {
+ return isReadOnly(d) || null;
+ });
+ items.selectAll("input.value").attr("title", function(d) {
+ return Array.isArray(d.value) ? d.value.filter(Boolean).join("\n") : d.value;
+ }).classed("mixed", function(d) {
+ return Array.isArray(d.value);
+ }).attr("placeholder", function(d) {
+ return typeof d.value === "string" ? null : _t("inspector.multiple_values");
+ }).call(utilGetSetValue, function(d) {
+ return typeof d.value === "string" ? d.value : "";
+ }).attr("readonly", function(d) {
+ return isReadOnly(d) || null;
+ });
+ items.selectAll("button.remove").on(("PointerEvent" in window ? "pointer" : "mouse") + "down", removeTag);
+ }
+ function isReadOnly(d) {
+ for (var i2 = 0; i2 < _readOnlyTags.length; i2++) {
+ if (d.key.match(_readOnlyTags[i2]) !== null) {
+ return true;
+ }
+ }
+ return false;
+ }
+ function setTextareaHeight() {
+ if (_tagView !== "text")
+ return;
+ var selection2 = select_default2(this);
+ var matches = selection2.node().value.match(/\n/g);
+ var lineCount = 2 + Number(matches && matches.length);
+ var lineHeight = 20;
+ selection2.style("height", lineCount * lineHeight + "px");
+ }
+ function stringify3(s) {
+ return JSON.stringify(s).slice(1, -1);
+ }
+ function unstringify(s) {
+ var leading = "";
+ var trailing = "";
+ if (s.length < 1 || s.charAt(0) !== '"') {
+ leading = '"';
+ }
+ if (s.length < 2 || s.charAt(s.length - 1) !== '"' || s.charAt(s.length - 1) === '"' && s.charAt(s.length - 2) === "\\") {
+ trailing = '"';
+ }
+ return JSON.parse(leading + s + trailing);
+ }
+ function rowsToText(rows) {
+ var str2 = rows.filter(function(row) {
+ return row.key && row.key.trim() !== "";
+ }).map(function(row) {
+ var rawVal = row.value;
+ if (typeof rawVal !== "string")
+ rawVal = "*";
+ var val = rawVal ? stringify3(rawVal) : "";
+ return stringify3(row.key) + "=" + val;
+ }).join("\n");
+ if (_state !== "hover" && str2.length) {
+ return str2 + "\n";
+ }
+ return str2;
+ }
+ function textChanged() {
+ var newText = this.value.trim();
+ var newTags = {};
+ newText.split("\n").forEach(function(row) {
+ var m = row.match(/^\s*([^=]+)=(.*)$/);
+ if (m !== null) {
+ var k = context.cleanTagKey(unstringify(m[1].trim()));
+ var v = context.cleanTagValue(unstringify(m[2].trim()));
+ newTags[k] = v;
+ }
+ });
+ var tagDiff = utilTagDiff(_tags, newTags);
+ if (!tagDiff.length)
+ return;
+ _pendingChange = _pendingChange || {};
+ tagDiff.forEach(function(change) {
+ if (isReadOnly({ key: change.key }))
+ return;
+ if (change.newVal === "*" && typeof change.oldVal !== "string")
+ return;
+ if (change.type === "-") {
+ _pendingChange[change.key] = void 0;
+ } else if (change.type === "+") {
+ _pendingChange[change.key] = change.newVal || "";
+ }
+ });
+ if (Object.keys(_pendingChange).length === 0) {
+ _pendingChange = null;
+ return;
+ }
+ scheduleChange();
+ }
+ function pushMore(d3_event) {
+ if (d3_event.keyCode === 9 && !d3_event.shiftKey && section.selection().selectAll(".tag-list li:last-child input.value").node() === this && utilGetSetValue(select_default2(this))) {
+ addTag();
+ }
+ }
+ function bindTypeahead(key, value) {
+ if (isReadOnly(key.datum()))
+ return;
+ if (Array.isArray(value.datum().value)) {
+ value.call(uiCombobox(context, "tag-value").minItems(1).fetcher(function(value2, callback) {
+ var keyString = utilGetSetValue(key);
+ if (!_tags[keyString])
+ return;
+ var data = _tags[keyString].filter(Boolean).map(function(tagValue) {
+ return {
+ value: tagValue,
+ title: tagValue
+ };
+ });
+ callback(data);
+ }));
+ return;
+ }
+ var geometry = context.graph().geometry(_entityIDs[0]);
+ key.call(uiCombobox(context, "tag-key").fetcher(function(value2, callback) {
+ taginfo.keys({
+ debounce: true,
+ geometry,
+ query: value2
+ }, function(err, data) {
+ if (!err) {
+ var filtered = data.filter(function(d) {
+ return _tags[d.value] === void 0;
+ });
+ callback(sort(value2, filtered));
+ }
+ });
+ }));
+ value.call(uiCombobox(context, "tag-value").fetcher(function(value2, callback) {
+ taginfo.values({
+ debounce: true,
+ key: utilGetSetValue(key),
+ geometry,
+ query: value2
+ }, function(err, data) {
+ if (!err)
+ callback(sort(value2, data));
+ });
+ }));
+ function sort(value2, data) {
+ var sameletter = [];
+ var other = [];
+ for (var i2 = 0; i2 < data.length; i2++) {
+ if (data[i2].value.substring(0, value2.length) === value2) {
+ sameletter.push(data[i2]);
+ } else {
+ other.push(data[i2]);
+ }
+ }
+ return sameletter.concat(other);
+ }
+ }
+ function unbind() {
+ var row = select_default2(this);
+ row.selectAll("input.key").call(uiCombobox.off, context);
+ row.selectAll("input.value").call(uiCombobox.off, context);
+ }
+ function keyChange(d3_event, d) {
+ if (select_default2(this).attr("readonly"))
+ return;
+ var kOld = d.key;
+ if (_pendingChange && _pendingChange.hasOwnProperty(kOld) && _pendingChange[kOld] === void 0)
+ return;
+ var kNew = context.cleanTagKey(this.value.trim());
+ if (isReadOnly({ key: kNew })) {
+ this.value = kOld;
+ return;
+ }
+ if (kNew && kNew !== kOld && _tags[kNew] !== void 0) {
+ this.value = kOld;
+ section.selection().selectAll(".tag-list input.value").each(function(d2) {
+ if (d2.key === kNew) {
+ var input = select_default2(this).node();
+ input.focus();
+ input.select();
+ }
+ });
+ return;
+ }
+ _pendingChange = _pendingChange || {};
+ if (kOld) {
+ if (kOld === kNew)
+ return;
+ _pendingChange[kNew] = _pendingChange[kOld] || { oldKey: kOld };
+ _pendingChange[kOld] = void 0;
+ } else {
+ let row = this.parentNode.parentNode;
+ let inputVal = select_default2(row).selectAll("input.value");
+ let vNew = context.cleanTagValue(utilGetSetValue(inputVal));
+ _pendingChange[kNew] = vNew;
+ utilGetSetValue(inputVal, vNew);
+ }
+ var existingKeyIndex = _orderedKeys.indexOf(kOld);
+ if (existingKeyIndex !== -1)
+ _orderedKeys[existingKeyIndex] = kNew;
+ d.key = kNew;
+ this.value = kNew;
+ scheduleChange();
+ }
+ function valueChange(d3_event, d) {
+ if (isReadOnly(d))
+ return;
+ if (typeof d.value !== "string" && !this.value)
+ return;
+ if (_pendingChange && _pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === void 0)
+ return;
+ _pendingChange = _pendingChange || {};
+ _pendingChange[d.key] = context.cleanTagValue(this.value);
+ scheduleChange();
+ }
+ function removeTag(d3_event, d) {
+ if (isReadOnly(d))
+ return;
+ if (d.key === "") {
+ _showBlank = false;
+ section.reRender();
+ } else {
+ _orderedKeys = _orderedKeys.filter(function(key) {
+ return key !== d.key;
+ });
+ _pendingChange = _pendingChange || {};
+ _pendingChange[d.key] = void 0;
+ scheduleChange();
+ }
+ }
+ function addTag() {
+ window.setTimeout(function() {
+ _showBlank = true;
+ section.reRender();
+ section.selection().selectAll(".tag-list li:last-child input.key").node().focus();
+ }, 20);
+ }
+ function scheduleChange() {
+ var entityIDs = _entityIDs;
+ window.setTimeout(function() {
+ if (!_pendingChange)
+ return;
+ dispatch10.call("change", this, entityIDs, _pendingChange);
+ _pendingChange = null;
+ }, 10);
+ }
+ section.state = function(val) {
+ if (!arguments.length)
+ return _state;
+ if (_state !== val) {
+ _orderedKeys = [];
+ _state = val;
+ }
+ return section;
+ };
+ section.presets = function(val) {
+ if (!arguments.length)
+ return _presets;
+ _presets = val;
+ if (_presets && _presets.length && _presets[0].isFallback()) {
+ section.disclosureExpanded(true);
+ } else if (!_didInteract) {
+ section.disclosureExpanded(null);
+ }
+ return section;
+ };
+ section.tags = function(val) {
+ if (!arguments.length)
+ return _tags;
+ _tags = val;
+ return section;
+ };
+ section.entityIDs = function(val) {
+ if (!arguments.length)
+ return _entityIDs;
+ if (!_entityIDs || !val || !utilArrayIdentical(_entityIDs, val)) {
+ _entityIDs = val;
+ _orderedKeys = [];
+ }
+ return section;
+ };
+ section.readOnlyTags = function(val) {
+ if (!arguments.length)
+ return _readOnlyTags;
+ _readOnlyTags = val;
+ return section;
+ };
+ return utilRebind(section, dispatch10, "on");
+ }
+
+ // modules/ui/data_editor.js
+ function uiDataEditor(context) {
+ var dataHeader = uiDataHeader();
+ var rawTagEditor = uiSectionRawTagEditor("custom-data-tag-editor", context).expandedByDefault(true).readOnlyTags([/./]);
+ var _datum;
+ function dataEditor(selection2) {
+ var header = selection2.selectAll(".header").data([0]);
+ var headerEnter = header.enter().append("div").attr("class", "header fillL");
+ headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() {
+ context.enter(modeBrowse(context));
+ }).call(svgIcon("#iD-icon-close"));
+ headerEnter.append("h2").call(_t.append("map_data.title"));
+ var body = selection2.selectAll(".body").data([0]);
+ body = body.enter().append("div").attr("class", "body").merge(body);
+ var editor = body.selectAll(".data-editor").data([0]);
+ editor.enter().append("div").attr("class", "modal-section data-editor").merge(editor).call(dataHeader.datum(_datum));
+ var rte = body.selectAll(".raw-tag-editor").data([0]);
+ rte.enter().append("div").attr("class", "raw-tag-editor data-editor").merge(rte).call(rawTagEditor.tags(_datum && _datum.properties || {}).state("hover").render).selectAll("textarea.tag-text").attr("readonly", true).classed("readonly", true);
+ }
+ dataEditor.datum = function(val) {
+ if (!arguments.length)
+ return _datum;
+ _datum = val;
+ return this;
+ };
+ return dataEditor;
+ }
+
+ // modules/ui/osmose_details.js
+ function uiOsmoseDetails(context) {
+ let _qaItem;
+ function issueString(d, type3) {
+ if (!d)
+ return "";
+ const s = services.osmose.getStrings(d.itemType);
+ return type3 in s ? s[type3] : "";
+ }
+ function osmoseDetails(selection2) {
+ const details = selection2.selectAll(".error-details").data(_qaItem ? [_qaItem] : [], (d) => `${d.id}-${d.status || 0}`);
+ details.exit().remove();
+ const detailsEnter = details.enter().append("div").attr("class", "error-details qa-details-container");
+ if (issueString(_qaItem, "detail")) {
+ const div = detailsEnter.append("div").attr("class", "qa-details-subsection");
+ div.append("h4").call(_t.append("QA.keepRight.detail_description"));
+ div.append("p").attr("class", "qa-details-description-text").html((d) => issueString(d, "detail")).selectAll("a").attr("rel", "noopener").attr("target", "_blank");
+ }
+ const detailsDiv = detailsEnter.append("div").attr("class", "qa-details-subsection");
+ const elemsDiv = detailsEnter.append("div").attr("class", "qa-details-subsection");
+ if (issueString(_qaItem, "fix")) {
+ const div = detailsEnter.append("div").attr("class", "qa-details-subsection");
+ div.append("h4").call(_t.append("QA.osmose.fix_title"));
+ div.append("p").html((d) => issueString(d, "fix")).selectAll("a").attr("rel", "noopener").attr("target", "_blank");
+ }
+ if (issueString(_qaItem, "trap")) {
+ const div = detailsEnter.append("div").attr("class", "qa-details-subsection");
+ div.append("h4").call(_t.append("QA.osmose.trap_title"));
+ div.append("p").html((d) => issueString(d, "trap")).selectAll("a").attr("rel", "noopener").attr("target", "_blank");
+ }
+ const thisItem = _qaItem;
+ services.osmose.loadIssueDetail(_qaItem).then((d) => {
+ if (!d.elems || d.elems.length === 0)
+ return;
+ if (context.selectedErrorID() !== thisItem.id && context.container().selectAll(`.qaItem.osmose.hover.itemId-${thisItem.id}`).empty())
+ return;
+ if (d.detail) {
+ detailsDiv.append("h4").call(_t.append("QA.osmose.detail_title"));
+ detailsDiv.append("p").html((d2) => d2.detail).selectAll("a").attr("rel", "noopener").attr("target", "_blank");
+ }
+ elemsDiv.append("h4").call(_t.append("QA.osmose.elems_title"));
+ elemsDiv.append("ul").selectAll("li").data(d.elems).enter().append("li").append("a").attr("href", "#").attr("class", "error_entity_link").text((d2) => d2).each(function() {
+ const link2 = select_default2(this);
+ const entityID = this.textContent;
+ const entity = context.hasEntity(entityID);
+ link2.on("mouseenter", () => {
+ utilHighlightEntities([entityID], true, context);
+ }).on("mouseleave", () => {
+ utilHighlightEntities([entityID], false, context);
+ }).on("click", (d3_event) => {
+ d3_event.preventDefault();
+ utilHighlightEntities([entityID], false, context);
+ const osmlayer = context.layers().layer("osm");
+ if (!osmlayer.enabled()) {
+ osmlayer.enabled(true);
+ }
+ context.map().centerZoom(d.loc, 20);
+ if (entity) {
+ context.enter(modeSelect(context, [entityID]));
+ } else {
+ context.loadEntity(entityID, (err, result) => {
+ if (err)
+ return;
+ const entity2 = result.data.find((e) => e.id === entityID);
+ if (entity2)
+ context.enter(modeSelect(context, [entityID]));
+ });
+ }
+ });
+ if (entity) {
+ let name2 = utilDisplayName(entity);
+ if (!name2) {
+ const preset = _mainPresetIndex.match(entity, context.graph());
+ name2 = preset && !preset.isFallback() && preset.name();
+ }
+ if (name2) {
+ this.innerText = name2;
+ }
+ }
+ });
+ context.features().forceVisible(d.elems);
+ context.map().pan([0, 0]);
+ }).catch((err) => {
+ console.log(err);
+ });
+ }
+ osmoseDetails.issue = function(val) {
+ if (!arguments.length)
+ return _qaItem;
+ _qaItem = val;
+ return osmoseDetails;
+ };
+ return osmoseDetails;
+ }
+
+ // modules/ui/osmose_header.js
+ function uiOsmoseHeader() {
+ let _qaItem;
+ function issueTitle(d) {
+ const unknown = _t("inspector.unknown");
+ if (!d)
+ return unknown;
+ const s = services.osmose.getStrings(d.itemType);
+ return "title" in s ? s.title : unknown;
+ }
+ function osmoseHeader(selection2) {
+ const header = selection2.selectAll(".qa-header").data(_qaItem ? [_qaItem] : [], (d) => `${d.id}-${d.status || 0}`);
+ header.exit().remove();
+ const headerEnter = header.enter().append("div").attr("class", "qa-header");
+ const svgEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d) => d.id < 0).append("svg").attr("width", "20px").attr("height", "30px").attr("viewbox", "0 0 20 30").attr("class", (d) => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
+ svgEnter.append("polygon").attr("fill", (d) => services.osmose.getColor(d.item)).attr("class", "qaItem-fill").attr("points", "16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6");
+ svgEnter.append("use").attr("class", "icon-annotation").attr("width", "12px").attr("height", "12px").attr("transform", "translate(4, 5.5)").attr("xlink:href", (d) => d.icon ? "#" + d.icon : "");
+ headerEnter.append("div").attr("class", "qa-header-label").text(issueTitle);
+ }
+ osmoseHeader.issue = function(val) {
+ if (!arguments.length)
+ return _qaItem;
+ _qaItem = val;
+ return osmoseHeader;
+ };
+ return osmoseHeader;
+ }
+
+ // modules/ui/view_on_osmose.js
+ function uiViewOnOsmose() {
+ let _qaItem;
+ function viewOnOsmose(selection2) {
+ let url;
+ if (services.osmose && _qaItem instanceof QAItem) {
+ url = services.osmose.itemURL(_qaItem);
+ }
+ const link2 = selection2.selectAll(".view-on-osmose").data(url ? [url] : []);
+ link2.exit().remove();
+ const linkEnter = link2.enter().append("a").attr("class", "view-on-osmose").attr("target", "_blank").attr("rel", "noopener").attr("href", (d) => d).call(svgIcon("#iD-icon-out-link", "inline"));
+ linkEnter.append("span").call(_t.append("inspector.view_on_osmose"));
+ }
+ viewOnOsmose.what = function(val) {
+ if (!arguments.length)
+ return _qaItem;
+ _qaItem = val;
+ return viewOnOsmose;
+ };
+ return viewOnOsmose;
+ }
+
+ // modules/ui/osmose_editor.js
+ function uiOsmoseEditor(context) {
+ const dispatch10 = dispatch_default("change");
+ const qaDetails = uiOsmoseDetails(context);
+ const qaHeader = uiOsmoseHeader(context);
+ let _qaItem;
+ function osmoseEditor(selection2) {
+ const header = selection2.selectAll(".header").data([0]);
+ const headerEnter = header.enter().append("div").attr("class", "header fillL");
+ headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => context.enter(modeBrowse(context))).call(svgIcon("#iD-icon-close"));
+ headerEnter.append("h2").call(_t.append("QA.osmose.title"));
+ let body = selection2.selectAll(".body").data([0]);
+ body = body.enter().append("div").attr("class", "body").merge(body);
+ let editor = body.selectAll(".qa-editor").data([0]);
+ editor.enter().append("div").attr("class", "modal-section qa-editor").merge(editor).call(qaHeader.issue(_qaItem)).call(qaDetails.issue(_qaItem)).call(osmoseSaveSection);
+ const footer = selection2.selectAll(".footer").data([0]);
+ footer.enter().append("div").attr("class", "footer").merge(footer).call(uiViewOnOsmose(context).what(_qaItem));
+ }
+ function osmoseSaveSection(selection2) {
+ const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
+ const isShown = _qaItem && isSelected;
+ let saveSection = selection2.selectAll(".qa-save").data(isShown ? [_qaItem] : [], (d) => `${d.id}-${d.status || 0}`);
+ saveSection.exit().remove();
+ const saveSectionEnter = saveSection.enter().append("div").attr("class", "qa-save save-section cf");
+ saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons);
+ }
+ function qaSaveButtons(selection2) {
+ const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
+ let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d) => d.status + d.id);
+ buttonSection.exit().remove();
+ const buttonEnter = buttonSection.enter().append("div").attr("class", "buttons");
+ buttonEnter.append("button").attr("class", "button close-button action");
+ buttonEnter.append("button").attr("class", "button ignore-button action");
+ buttonSection = buttonSection.merge(buttonEnter);
+ buttonSection.select(".close-button").call(_t.append("QA.keepRight.close")).on("click.close", function(d3_event, d) {
+ this.blur();
+ const qaService = services.osmose;
+ if (qaService) {
+ d.newStatus = "done";
+ qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
+ }
+ });
+ buttonSection.select(".ignore-button").call(_t.append("QA.keepRight.ignore")).on("click.ignore", function(d3_event, d) {
+ this.blur();
+ const qaService = services.osmose;
+ if (qaService) {
+ d.newStatus = "false";
+ qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
+ }
+ });
+ }
+ osmoseEditor.error = function(val) {
+ if (!arguments.length)
+ return _qaItem;
+ _qaItem = val;
+ return osmoseEditor;
+ };
+ return utilRebind(osmoseEditor, dispatch10, "on");
+ }
+
+ // modules/ui/sidebar.js
+ function uiSidebar(context) {
+ var inspector = uiInspector(context);
+ var dataEditor = uiDataEditor(context);
+ var noteEditor = uiNoteEditor(context);
+ var improveOsmEditor = uiImproveOsmEditor(context);
+ var keepRightEditor = uiKeepRightEditor(context);
+ var osmoseEditor = uiOsmoseEditor(context);
+ var _current;
+ var _wasData = false;
+ var _wasNote = false;
+ var _wasQaItem = false;
+ var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ function sidebar(selection2) {
+ var container = context.container();
+ var minWidth = 240;
+ var sidebarWidth;
+ var containerWidth;
+ var dragOffset;
+ selection2.style("min-width", minWidth + "px").style("max-width", "400px").style("width", "33.3333%");
+ var resizer = selection2.append("div").attr("class", "sidebar-resizer").on(_pointerPrefix + "down.sidebar-resizer", pointerdown);
+ var downPointerId, lastClientX, containerLocGetter;
+ function pointerdown(d3_event) {
+ if (downPointerId)
+ return;
+ if ("button" in d3_event && d3_event.button !== 0)
+ return;
+ downPointerId = d3_event.pointerId || "mouse";
+ lastClientX = d3_event.clientX;
+ containerLocGetter = utilFastMouse(container.node());
+ dragOffset = utilFastMouse(resizer.node())(d3_event)[0] - 1;
+ sidebarWidth = selection2.node().getBoundingClientRect().width;
+ containerWidth = container.node().getBoundingClientRect().width;
+ var widthPct = sidebarWidth / containerWidth * 100;
+ selection2.style("width", widthPct + "%").style("max-width", "85%");
+ resizer.classed("dragging", true);
+ select_default2(window).on("touchmove.sidebar-resizer", function(d3_event2) {
+ d3_event2.preventDefault();
+ }, { passive: false }).on(_pointerPrefix + "move.sidebar-resizer", pointermove).on(_pointerPrefix + "up.sidebar-resizer pointercancel.sidebar-resizer", pointerup);
+ }
+ function pointermove(d3_event) {
+ if (downPointerId !== (d3_event.pointerId || "mouse"))
+ return;
+ d3_event.preventDefault();
+ var dx = d3_event.clientX - lastClientX;
+ lastClientX = d3_event.clientX;
+ var isRTL = _mainLocalizer.textDirection() === "rtl";
+ var scaleX = isRTL ? 0 : 1;
+ var xMarginProperty = isRTL ? "margin-right" : "margin-left";
+ var x = containerLocGetter(d3_event)[0] - dragOffset;
+ sidebarWidth = isRTL ? containerWidth - x : x;
+ var isCollapsed = selection2.classed("collapsed");
+ var shouldCollapse = sidebarWidth < minWidth;
+ selection2.classed("collapsed", shouldCollapse);
+ if (shouldCollapse) {
+ if (!isCollapsed) {
+ selection2.style(xMarginProperty, "-400px").style("width", "400px");
+ context.ui().onResize([(sidebarWidth - dx) * scaleX, 0]);
+ }
+ } else {
+ var widthPct = sidebarWidth / containerWidth * 100;
+ selection2.style(xMarginProperty, null).style("width", widthPct + "%");
+ if (isCollapsed) {
+ context.ui().onResize([-sidebarWidth * scaleX, 0]);
+ } else {
+ context.ui().onResize([-dx * scaleX, 0]);
+ }
+ }
+ }
+ function pointerup(d3_event) {
+ if (downPointerId !== (d3_event.pointerId || "mouse"))
+ return;
+ downPointerId = null;
+ resizer.classed("dragging", false);
+ select_default2(window).on("touchmove.sidebar-resizer", null).on(_pointerPrefix + "move.sidebar-resizer", null).on(_pointerPrefix + "up.sidebar-resizer pointercancel.sidebar-resizer", null);
+ }
+ var featureListWrap = selection2.append("div").attr("class", "feature-list-pane").call(uiFeatureList(context));
+ var inspectorWrap = selection2.append("div").attr("class", "inspector-hidden inspector-wrap");
+ var hoverModeSelect = function(targets) {
+ context.container().selectAll(".feature-list-item button").classed("hover", false);
+ if (context.selectedIDs().length > 1 && targets && targets.length) {
+ var elements = context.container().selectAll(".feature-list-item button").filter(function(node) {
+ return targets.indexOf(node) !== -1;
+ });
+ if (!elements.empty()) {
+ elements.classed("hover", true);
+ }
+ }
+ };
+ sidebar.hoverModeSelect = throttle_default(hoverModeSelect, 200);
+ function hover(targets) {
+ var datum2 = targets && targets.length && targets[0];
+ if (datum2 && datum2.__featurehash__) {
+ _wasData = true;
+ sidebar.show(dataEditor.datum(datum2));
+ selection2.selectAll(".sidebar-component").classed("inspector-hover", true);
+ } else if (datum2 instanceof osmNote) {
+ if (context.mode().id === "drag-note")
+ return;
+ _wasNote = true;
+ var osm = services.osm;
+ if (osm) {
+ datum2 = osm.getNote(datum2.id);
+ }
+ sidebar.show(noteEditor.note(datum2));
+ selection2.selectAll(".sidebar-component").classed("inspector-hover", true);
+ } else if (datum2 instanceof QAItem) {
+ _wasQaItem = true;
+ var errService = services[datum2.service];
+ if (errService) {
+ datum2 = errService.getError(datum2.id);
+ }
+ var errEditor;
+ if (datum2.service === "keepRight") {
+ errEditor = keepRightEditor;
+ } else if (datum2.service === "osmose") {
+ errEditor = osmoseEditor;
+ } else {
+ errEditor = improveOsmEditor;
+ }
+ context.container().selectAll(".qaItem." + datum2.service).classed("hover", function(d) {
+ return d.id === datum2.id;
+ });
+ sidebar.show(errEditor.error(datum2));
+ selection2.selectAll(".sidebar-component").classed("inspector-hover", true);
+ } else if (!_current && datum2 instanceof osmEntity) {
+ featureListWrap.classed("inspector-hidden", true);
+ inspectorWrap.classed("inspector-hidden", false).classed("inspector-hover", true);
+ if (!inspector.entityIDs() || !utilArrayIdentical(inspector.entityIDs(), [datum2.id]) || inspector.state() !== "hover") {
+ inspector.state("hover").entityIDs([datum2.id]).newFeature(false);
+ inspectorWrap.call(inspector);
+ }
+ } else if (!_current) {
+ featureListWrap.classed("inspector-hidden", false);
+ inspectorWrap.classed("inspector-hidden", true);
+ inspector.state("hide");
+ } else if (_wasData || _wasNote || _wasQaItem) {
+ _wasNote = false;
+ _wasData = false;
+ _wasQaItem = false;
+ context.container().selectAll(".note").classed("hover", false);
+ context.container().selectAll(".qaItem").classed("hover", false);
+ sidebar.hide();
+ }
+ }
+ sidebar.hover = throttle_default(hover, 200);
+ sidebar.intersects = function(extent) {
+ var rect = selection2.node().getBoundingClientRect();
+ return extent.intersects([
+ context.projection.invert([0, rect.height]),
+ context.projection.invert([rect.width, 0])
+ ]);
+ };
+ sidebar.select = function(ids, newFeature) {
+ sidebar.hide();
+ if (ids && ids.length) {
+ var entity = ids.length === 1 && context.entity(ids[0]);
+ if (entity && newFeature && selection2.classed("collapsed")) {
+ var extent = entity.extent(context.graph());
+ sidebar.expand(sidebar.intersects(extent));
+ }
+ featureListWrap.classed("inspector-hidden", true);
+ inspectorWrap.classed("inspector-hidden", false).classed("inspector-hover", false);
+ inspector.state("select").entityIDs(ids).newFeature(newFeature);
+ inspectorWrap.call(inspector);
+ } else {
+ inspector.state("hide");
+ }
+ };
+ sidebar.showPresetList = function() {
+ inspector.showList();
+ };
+ sidebar.show = function(component, element) {
+ featureListWrap.classed("inspector-hidden", true);
+ inspectorWrap.classed("inspector-hidden", true);
+ if (_current)
+ _current.remove();
+ _current = selection2.append("div").attr("class", "sidebar-component").call(component, element);
+ };
+ sidebar.hide = function() {
+ featureListWrap.classed("inspector-hidden", false);
+ inspectorWrap.classed("inspector-hidden", true);
+ if (_current)
+ _current.remove();
+ _current = null;
+ };
+ sidebar.expand = function(moveMap) {
+ if (selection2.classed("collapsed")) {
+ sidebar.toggle(moveMap);
+ }
+ };
+ sidebar.collapse = function(moveMap) {
+ if (!selection2.classed("collapsed")) {
+ sidebar.toggle(moveMap);
+ }
+ };
+ sidebar.toggle = function(moveMap) {
+ if (context.inIntro())
+ return;
+ var isCollapsed = selection2.classed("collapsed");
+ var isCollapsing = !isCollapsed;
+ var isRTL = _mainLocalizer.textDirection() === "rtl";
+ var scaleX = isRTL ? 0 : 1;
+ var xMarginProperty = isRTL ? "margin-right" : "margin-left";
+ sidebarWidth = selection2.node().getBoundingClientRect().width;
+ selection2.style("width", sidebarWidth + "px");
+ var startMargin, endMargin, lastMargin;
+ if (isCollapsing) {
+ startMargin = lastMargin = 0;
+ endMargin = -sidebarWidth;
+ } else {
+ startMargin = lastMargin = -sidebarWidth;
+ endMargin = 0;
+ }
+ if (!isCollapsing) {
+ selection2.classed("collapsed", isCollapsing);
+ }
+ selection2.transition().style(xMarginProperty, endMargin + "px").tween("panner", function() {
+ var i2 = number_default(startMargin, endMargin);
+ return function(t) {
+ var dx = lastMargin - Math.round(i2(t));
+ lastMargin = lastMargin - dx;
+ context.ui().onResize(moveMap ? void 0 : [dx * scaleX, 0]);
+ };
+ }).on("end", function() {
+ if (isCollapsing) {
+ selection2.classed("collapsed", isCollapsing);
+ }
+ if (!isCollapsing) {
+ var containerWidth2 = container.node().getBoundingClientRect().width;
+ var widthPct = sidebarWidth / containerWidth2 * 100;
+ selection2.style(xMarginProperty, null).style("width", widthPct + "%");
+ }
+ });
+ };
+ resizer.on("dblclick", function(d3_event) {
+ d3_event.preventDefault();
+ if (d3_event.sourceEvent) {
+ d3_event.sourceEvent.preventDefault();
+ }
+ sidebar.toggle();
+ });
+ context.map().on("crossEditableZoom.sidebar", function(within) {
+ if (!within && !selection2.select(".inspector-hover").empty()) {
+ hover([]);
+ }
+ });
+ }
+ sidebar.showPresetList = function() {
+ };
+ sidebar.hover = function() {
+ };
+ sidebar.hover.cancel = function() {
+ };
+ sidebar.intersects = function() {
+ };
+ sidebar.select = function() {
+ };
+ sidebar.show = function() {
+ };
+ sidebar.hide = function() {
+ };
+ sidebar.expand = function() {
+ };
+ sidebar.collapse = function() {
+ };
+ sidebar.toggle = function() {
+ };
+ return sidebar;
+ }
+
+ // modules/modes/draw_area.js
+ function modeDrawArea(context, wayID, startGraph, button) {
+ var mode = {
+ button,
+ id: "draw-area"
+ };
+ var behavior = behaviorDrawWay(context, wayID, mode, startGraph).on("rejectedSelfIntersection.modeDrawArea", function() {
+ context.ui().flash.iconName("#iD-icon-no").label(_t.html("self_intersection.error.areas"))();
+ });
+ mode.wayID = wayID;
+ mode.enter = function() {
+ context.install(behavior);
+ };
+ mode.exit = function() {
+ context.uninstall(behavior);
+ };
+ mode.selectedIDs = function() {
+ return [wayID];
+ };
+ mode.activeID = function() {
+ return behavior && behavior.activeID() || [];
+ };
+ return mode;
+ }
+
+ // modules/modes/add_area.js
+ function modeAddArea(context, mode) {
+ mode.id = "add-area";
+ var behavior = behaviorAddWay(context).on("start", start2).on("startFromWay", startFromWay).on("startFromNode", startFromNode);
+ var defaultTags = { area: "yes" };
+ if (mode.preset)
+ defaultTags = mode.preset.setTags(defaultTags, "area");
+ function actionClose(wayId) {
+ return function(graph) {
+ return graph.replace(graph.entity(wayId).close());
+ };
+ }
+ function start2(loc) {
+ var startGraph = context.graph();
+ var node = osmNode({ loc });
+ var way = osmWay({ tags: defaultTags });
+ context.perform(actionAddEntity(node), actionAddEntity(way), actionAddVertex(way.id, node.id), actionClose(way.id));
+ context.enter(modeDrawArea(context, way.id, startGraph, mode.button));
+ }
+ function startFromWay(loc, edge) {
+ var startGraph = context.graph();
+ var node = osmNode({ loc });
+ var way = osmWay({ tags: defaultTags });
+ context.perform(actionAddEntity(node), actionAddEntity(way), actionAddVertex(way.id, node.id), actionClose(way.id), actionAddMidpoint({ loc, edge }, node));
+ context.enter(modeDrawArea(context, way.id, startGraph, mode.button));
+ }
+ function startFromNode(node) {
+ var startGraph = context.graph();
+ var way = osmWay({ tags: defaultTags });
+ context.perform(actionAddEntity(way), actionAddVertex(way.id, node.id), actionClose(way.id));
+ context.enter(modeDrawArea(context, way.id, startGraph, mode.button));
+ }
+ mode.enter = function() {
+ context.install(behavior);
+ };
+ mode.exit = function() {
+ context.uninstall(behavior);
+ };
+ return mode;
+ }
+
+ // modules/modes/add_line.js
+ function modeAddLine(context, mode) {
+ mode.id = "add-line";
+ var behavior = behaviorAddWay(context).on("start", start2).on("startFromWay", startFromWay).on("startFromNode", startFromNode);
+ var defaultTags = {};
+ if (mode.preset)
+ defaultTags = mode.preset.setTags(defaultTags, "line");
+ function start2(loc) {
+ var startGraph = context.graph();
+ var node = osmNode({ loc });
+ var way = osmWay({ tags: defaultTags });
+ context.perform(actionAddEntity(node), actionAddEntity(way), actionAddVertex(way.id, node.id));
+ context.enter(modeDrawLine(context, way.id, startGraph, mode.button));
+ }
+ function startFromWay(loc, edge) {
+ var startGraph = context.graph();
+ var node = osmNode({ loc });
+ var way = osmWay({ tags: defaultTags });
+ context.perform(actionAddEntity(node), actionAddEntity(way), actionAddVertex(way.id, node.id), actionAddMidpoint({ loc, edge }, node));
+ context.enter(modeDrawLine(context, way.id, startGraph, mode.button));
+ }
+ function startFromNode(node) {
+ var startGraph = context.graph();
+ var way = osmWay({ tags: defaultTags });
+ context.perform(actionAddEntity(way), actionAddVertex(way.id, node.id));
+ context.enter(modeDrawLine(context, way.id, startGraph, mode.button));
+ }
+ mode.enter = function() {
+ context.install(behavior);
+ };
+ mode.exit = function() {
+ context.uninstall(behavior);
+ };
+ return mode;
+ }
+
+ // modules/modes/add_point.js
+ function modeAddPoint(context, mode) {
+ mode.id = "add-point";
+ var behavior = behaviorDraw(context).on("click", add).on("clickWay", addWay).on("clickNode", addNode).on("cancel", cancel).on("finish", cancel);
+ var defaultTags = {};
+ if (mode.preset)
+ defaultTags = mode.preset.setTags(defaultTags, "point");
+ function add(loc) {
+ var node = osmNode({ loc, tags: defaultTags });
+ context.perform(actionAddEntity(node), _t("operations.add.annotation.point"));
+ enterSelectMode(node);
+ }
+ function addWay(loc, edge) {
+ var node = osmNode({ tags: defaultTags });
+ context.perform(actionAddMidpoint({ loc, edge }, node), _t("operations.add.annotation.vertex"));
+ enterSelectMode(node);
+ }
+ function enterSelectMode(node) {
+ context.enter(modeSelect(context, [node.id]).newFeature(true));
+ }
+ function addNode(node) {
+ if (Object.keys(defaultTags).length === 0) {
+ enterSelectMode(node);
+ return;
+ }
+ var tags = Object.assign({}, node.tags);
+ for (var key in defaultTags) {
+ tags[key] = defaultTags[key];
+ }
+ context.perform(actionChangeTags(node.id, tags), _t("operations.add.annotation.point"));
+ enterSelectMode(node);
+ }
+ function cancel() {
+ context.enter(modeBrowse(context));
+ }
+ mode.enter = function() {
+ context.install(behavior);
+ };
+ mode.exit = function() {
+ context.uninstall(behavior);
+ };
+ return mode;
+ }
+
+ // modules/modes/select_note.js
+ function modeSelectNote(context, selectedNoteID) {
+ var mode = {
+ id: "select-note",
+ button: "browse"
+ };
+ var _keybinding = utilKeybinding("select-note");
+ var _noteEditor = uiNoteEditor(context).on("change", function() {
+ context.map().pan([0, 0]);
+ var note = checkSelectedID();
+ if (!note)
+ return;
+ context.ui().sidebar.show(_noteEditor.note(note));
+ });
+ var _behaviors = [
+ behaviorBreathe(context),
+ behaviorHover(context),
+ behaviorSelect(context),
+ behaviorLasso(context),
+ modeDragNode(context).behavior,
+ modeDragNote(context).behavior
+ ];
+ var _newFeature = false;
+ function checkSelectedID() {
+ if (!services.osm)
+ return;
+ var note = services.osm.getNote(selectedNoteID);
+ if (!note) {
+ context.enter(modeBrowse(context));
+ }
+ return note;
+ }
+ function selectNote(d3_event, drawn) {
+ if (!checkSelectedID())
+ return;
+ var selection2 = context.surface().selectAll(".layer-notes .note-" + selectedNoteID);
+ if (selection2.empty()) {
+ var source = d3_event && d3_event.type === "zoom" && d3_event.sourceEvent;
+ if (drawn && source && (source.type === "pointermove" || source.type === "mousemove" || source.type === "touchmove")) {
+ context.enter(modeBrowse(context));
+ }
+ } else {
+ selection2.classed("selected", true);
+ context.selectedNoteID(selectedNoteID);
+ }
+ }
+ function esc() {
+ if (context.container().select(".combobox").size())
+ return;
+ context.enter(modeBrowse(context));
+ }
+ mode.zoomToSelected = function() {
+ if (!services.osm)
+ return;
+ var note = services.osm.getNote(selectedNoteID);
+ if (note) {
+ context.map().centerZoomEase(note.loc, 20);
+ }
+ };
+ mode.newFeature = function(val) {
+ if (!arguments.length)
+ return _newFeature;
+ _newFeature = val;
+ return mode;
+ };
+ mode.enter = function() {
+ var note = checkSelectedID();
+ if (!note)
+ return;
+ _behaviors.forEach(context.install);
+ _keybinding.on(_t("inspector.zoom_to.key"), mode.zoomToSelected).on("\u238B", esc, true);
+ select_default2(document).call(_keybinding);
+ selectNote();
+ var sidebar = context.ui().sidebar;
+ sidebar.show(_noteEditor.note(note).newNote(_newFeature));
+ sidebar.expand(sidebar.intersects(note.extent()));
+ context.map().on("drawn.select", selectNote);
+ };
+ mode.exit = function() {
+ _behaviors.forEach(context.uninstall);
+ select_default2(document).call(_keybinding.unbind);
+ context.surface().selectAll(".layer-notes .selected").classed("selected hover", false);
+ context.map().on("drawn.select", null);
+ context.ui().sidebar.hide();
+ context.selectedNoteID(null);
+ };
+ return mode;
+ }
+
+ // modules/modes/add_note.js
+ function modeAddNote(context) {
+ var mode = {
+ id: "add-note",
+ button: "note",
+ description: _t.html("modes.add_note.description"),
+ key: _t("modes.add_note.key")
+ };
+ var behavior = behaviorDraw(context).on("click", add).on("cancel", cancel).on("finish", cancel);
+ function add(loc) {
+ var osm = services.osm;
+ if (!osm)
+ return;
+ var note = osmNote({ loc, status: "open", comments: [] });
+ osm.replaceNote(note);
+ context.map().pan([0, 0]);
+ context.selectedNoteID(note.id).enter(modeSelectNote(context, note.id).newFeature(true));
+ }
+ function cancel() {
+ context.enter(modeBrowse(context));
+ }
+ mode.enter = function() {
+ context.install(behavior);
+ };
+ mode.exit = function() {
+ context.uninstall(behavior);
+ };
+ return mode;
+ }
+
+ // modules/modes/save.js
+ function modeSave(context) {
+ var mode = { id: "save" };
+ var keybinding = utilKeybinding("modeSave");
+ var commit = uiCommit(context).on("cancel", cancel);
+ var _conflictsUi;
+ var _location;
+ var _success;
+ var uploader = context.uploader().on("saveStarted.modeSave", function() {
+ keybindingOff();
+ }).on("willAttemptUpload.modeSave", prepareForSuccess).on("progressChanged.modeSave", showProgress).on("resultNoChanges.modeSave", function() {
+ cancel();
+ }).on("resultErrors.modeSave", showErrors).on("resultConflicts.modeSave", showConflicts).on("resultSuccess.modeSave", showSuccess);
+ function cancel() {
+ context.enter(modeBrowse(context));
+ }
+ function showProgress(num, total) {
+ var modal = context.container().select(".loading-modal .modal-section");
+ var progress = modal.selectAll(".progress").data([0]);
+ progress.enter().append("div").attr("class", "progress").merge(progress).text(_t("save.conflict_progress", { num, total }));
+ }
+ function showConflicts(changeset, conflicts, origChanges) {
+ var selection2 = context.container().select(".sidebar").append("div").attr("class", "sidebar-component");
+ context.container().selectAll(".main-content").classed("active", true).classed("inactive", false);
+ _conflictsUi = uiConflicts(context).conflictList(conflicts).origChanges(origChanges).on("cancel", function() {
+ context.container().selectAll(".main-content").classed("active", false).classed("inactive", true);
+ selection2.remove();
+ keybindingOn();
+ uploader.cancelConflictResolution();
+ }).on("save", function() {
+ context.container().selectAll(".main-content").classed("active", false).classed("inactive", true);
+ selection2.remove();
+ uploader.processResolvedConflicts(changeset);
+ });
+ selection2.call(_conflictsUi);
+ }
+ function showErrors(errors) {
+ keybindingOn();
+ var selection2 = uiConfirm(context.container());
+ selection2.select(".modal-section.header").append("h3").text(_t("save.error"));
+ addErrors(selection2, errors);
+ selection2.okButton();
+ }
+ function addErrors(selection2, data) {
+ var message = selection2.select(".modal-section.message-text");
+ var items = message.selectAll(".error-container").data(data);
+ var enter = items.enter().append("div").attr("class", "error-container");
+ enter.append("a").attr("class", "error-description").attr("href", "#").classed("hide-toggle", true).text(function(d) {
+ return d.msg || _t("save.unknown_error_details");
+ }).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ var error = select_default2(this);
+ var detail = select_default2(this.nextElementSibling);
+ var exp2 = error.classed("expanded");
+ detail.style("display", exp2 ? "none" : "block");
+ error.classed("expanded", !exp2);
+ });
+ var details = enter.append("div").attr("class", "error-detail-container").style("display", "none");
+ details.append("ul").attr("class", "error-detail-list").selectAll("li").data(function(d) {
+ return d.details || [];
+ }).enter().append("li").attr("class", "error-detail-item").text(function(d) {
+ return d;
+ });
+ items.exit().remove();
+ }
+ function showSuccess(changeset) {
+ commit.reset();
+ var ui = _success.changeset(changeset).location(_location).on("cancel", function() {
+ context.ui().sidebar.hide();
+ });
+ context.enter(modeBrowse(context).sidebar(ui));
+ }
+ function keybindingOn() {
+ select_default2(document).call(keybinding.on("\u238B", cancel, true));
+ }
+ function keybindingOff() {
+ select_default2(document).call(keybinding.unbind);
+ }
+ function prepareForSuccess() {
+ _success = uiSuccess(context);
+ _location = null;
+ if (!services.geocoder)
+ return;
+ services.geocoder.reverse(context.map().center(), function(err, result) {
+ if (err || !result || !result.address)
+ return;
+ var addr = result.address;
+ var place = addr && (addr.town || addr.city || addr.county) || "";
+ var region = addr && (addr.state || addr.country) || "";
+ var separator = place && region ? _t("success.thank_you_where.separator") : "";
+ _location = _t("success.thank_you_where.format", { place, separator, region });
+ });
+ }
+ mode.selectedIDs = function() {
+ return _conflictsUi ? _conflictsUi.shownEntityIds() : [];
+ };
+ mode.enter = function() {
+ context.ui().sidebar.expand();
+ function done() {
+ context.ui().sidebar.show(commit);
+ }
+ keybindingOn();
+ context.container().selectAll(".main-content").classed("active", false).classed("inactive", true);
+ var osm = context.connection();
+ if (!osm) {
+ cancel();
+ return;
+ }
+ if (osm.authenticated()) {
+ done();
+ } else {
+ osm.authenticate(function(err) {
+ if (err) {
+ cancel();
+ } else {
+ done();
+ }
+ });
+ }
+ };
+ mode.exit = function() {
+ keybindingOff();
+ context.container().selectAll(".main-content").classed("active", true).classed("inactive", false);
+ context.ui().sidebar.hide();
+ };
+ return mode;
+ }
+
+ // modules/modes/select_error.js
+ function modeSelectError(context, selectedErrorID, selectedErrorService) {
+ var mode = {
+ id: "select-error",
+ button: "browse"
+ };
+ var keybinding = utilKeybinding("select-error");
+ var errorService = services[selectedErrorService];
+ var errorEditor;
+ switch (selectedErrorService) {
+ case "improveOSM":
+ errorEditor = uiImproveOsmEditor(context).on("change", function() {
+ context.map().pan([0, 0]);
+ var error = checkSelectedID();
+ if (!error)
+ return;
+ context.ui().sidebar.show(errorEditor.error(error));
+ });
+ break;
+ case "keepRight":
+ errorEditor = uiKeepRightEditor(context).on("change", function() {
+ context.map().pan([0, 0]);
+ var error = checkSelectedID();
+ if (!error)
+ return;
+ context.ui().sidebar.show(errorEditor.error(error));
+ });
+ break;
+ case "osmose":
+ errorEditor = uiOsmoseEditor(context).on("change", function() {
+ context.map().pan([0, 0]);
+ var error = checkSelectedID();
+ if (!error)
+ return;
+ context.ui().sidebar.show(errorEditor.error(error));
+ });
+ break;
+ }
+ var behaviors = [
+ behaviorBreathe(context),
+ behaviorHover(context),
+ behaviorSelect(context),
+ behaviorLasso(context),
+ modeDragNode(context).behavior,
+ modeDragNote(context).behavior
+ ];
+ function checkSelectedID() {
+ if (!errorService)
+ return;
+ var error = errorService.getError(selectedErrorID);
+ if (!error) {
+ context.enter(modeBrowse(context));
+ }
+ return error;
+ }
+ mode.zoomToSelected = function() {
+ if (!errorService)
+ return;
+ var error = errorService.getError(selectedErrorID);
+ if (error) {
+ context.map().centerZoomEase(error.loc, 20);
+ }
+ };
+ mode.enter = function() {
+ var error = checkSelectedID();
+ if (!error)
+ return;
+ behaviors.forEach(context.install);
+ keybinding.on(_t("inspector.zoom_to.key"), mode.zoomToSelected).on("\u238B", esc, true);
+ select_default2(document).call(keybinding);
+ selectError();
+ var sidebar = context.ui().sidebar;
+ sidebar.show(errorEditor.error(error));
+ context.map().on("drawn.select-error", selectError);
+ function selectError(d3_event, drawn) {
+ if (!checkSelectedID())
+ return;
+ var selection2 = context.surface().selectAll(".itemId-" + selectedErrorID + "." + selectedErrorService);
+ if (selection2.empty()) {
+ var source = d3_event && d3_event.type === "zoom" && d3_event.sourceEvent;
+ if (drawn && source && (source.type === "pointermove" || source.type === "mousemove" || source.type === "touchmove")) {
+ context.enter(modeBrowse(context));
+ }
+ } else {
+ selection2.classed("selected", true);
+ context.selectedErrorID(selectedErrorID);
+ }
+ }
+ function esc() {
+ if (context.container().select(".combobox").size())
+ return;
+ context.enter(modeBrowse(context));
+ }
+ };
+ mode.exit = function() {
+ behaviors.forEach(context.uninstall);
+ select_default2(document).call(keybinding.unbind);
+ context.surface().selectAll(".qaItem.selected").classed("selected hover", false);
+ context.map().on("drawn.select-error", null);
+ context.ui().sidebar.hide();
+ context.selectedErrorID(null);
+ context.features().forceVisible([]);
+ };
+ return mode;
+ }
+
+ // modules/ui/tools/modes.js
+ function uiToolDrawModes(context) {
+ var tool = {
+ id: "old_modes",
+ label: _t.html("toolbar.add_feature")
+ };
+ var modes = [
+ modeAddPoint(context, {
+ title: _t.html("modes.add_point.title"),
+ button: "point",
+ description: _t.html("modes.add_point.description"),
+ preset: _mainPresetIndex.item("point"),
+ key: "1"
+ }),
+ modeAddLine(context, {
+ title: _t.html("modes.add_line.title"),
+ button: "line",
+ description: _t.html("modes.add_line.description"),
+ preset: _mainPresetIndex.item("line"),
+ key: "2"
+ }),
+ modeAddArea(context, {
+ title: _t.html("modes.add_area.title"),
+ button: "area",
+ description: _t.html("modes.add_area.description"),
+ preset: _mainPresetIndex.item("area"),
+ key: "3"
+ })
+ ];
+ function enabled(_mode) {
+ return osmEditable();
+ }
+ function osmEditable() {
+ return context.editable();
+ }
+ modes.forEach(function(mode) {
+ context.keybinding().on(mode.key, function() {
+ if (!enabled(mode))
+ return;
+ if (mode.id === context.mode().id) {
+ context.enter(modeBrowse(context));
+ } else {
+ context.enter(mode);
+ }
+ });
+ });
+ tool.render = function(selection2) {
+ var wrap2 = selection2.append("div").attr("class", "joined").style("display", "flex");
+ var debouncedUpdate = debounce_default(update, 500, { leading: true, trailing: true });
+ context.map().on("move.modes", debouncedUpdate).on("drawn.modes", debouncedUpdate);
+ context.on("enter.modes", update);
+ update();
+ function update() {
+ var buttons = wrap2.selectAll("button.add-button").data(modes, function(d) {
+ return d.id;
+ });
+ buttons.exit().remove();
+ var buttonsEnter = buttons.enter().append("button").attr("class", function(d) {
+ return d.id + " add-button bar-button";
+ }).on("click.mode-buttons", function(d3_event, d) {
+ if (!enabled(d))
+ return;
+ var currMode = context.mode().id;
+ if (/^draw/.test(currMode))
+ return;
+ if (d.id === currMode) {
+ context.enter(modeBrowse(context));
+ } else {
+ context.enter(d);
+ }
+ }).call(uiTooltip().placement("bottom").title(function(d) {
+ return d.description;
+ }).keys(function(d) {
+ return [d.key];
+ }).scrollContainer(context.container().select(".top-toolbar")));
+ buttonsEnter.each(function(d) {
+ select_default2(this).call(svgIcon("#iD-icon-" + d.button));
+ });
+ buttonsEnter.append("span").attr("class", "label").html(function(mode) {
+ return mode.title;
+ });
+ if (buttons.enter().size() || buttons.exit().size()) {
+ context.ui().checkOverflow(".top-toolbar", true);
+ }
+ buttons = buttons.merge(buttonsEnter).attr("aria-disabled", function(d) {
+ return !enabled(d);
+ }).classed("disabled", function(d) {
+ return !enabled(d);
+ }).attr("aria-pressed", function(d) {
+ return context.mode() && context.mode().button === d.button;
+ }).classed("active", function(d) {
+ return context.mode() && context.mode().button === d.button;
+ });
+ }
+ };
+ return tool;
+ }
+
+ // modules/ui/tools/notes.js
+ function uiToolNotes(context) {
+ var tool = {
+ id: "notes",
+ label: _t.html("modes.add_note.label")
+ };
+ var mode = modeAddNote(context);
+ function enabled() {
+ return notesEnabled() && notesEditable();
+ }
+ function notesEnabled() {
+ var noteLayer = context.layers().layer("notes");
+ return noteLayer && noteLayer.enabled();
+ }
+ function notesEditable() {
+ var mode2 = context.mode();
+ return context.map().notesEditable() && mode2 && mode2.id !== "save";
+ }
+ context.keybinding().on(mode.key, function() {
+ if (!enabled())
+ return;
+ if (mode.id === context.mode().id) {
+ context.enter(modeBrowse(context));
+ } else {
+ context.enter(mode);
+ }
+ });
+ tool.render = function(selection2) {
+ var debouncedUpdate = debounce_default(update, 500, { leading: true, trailing: true });
+ context.map().on("move.notes", debouncedUpdate).on("drawn.notes", debouncedUpdate);
+ context.on("enter.notes", update);
+ update();
+ function update() {
+ var showNotes = notesEnabled();
+ var data = showNotes ? [mode] : [];
+ var buttons = selection2.selectAll("button.add-button").data(data, function(d) {
+ return d.id;
+ });
+ buttons.exit().remove();
+ var buttonsEnter = buttons.enter().append("button").attr("class", function(d) {
+ return d.id + " add-button bar-button";
+ }).on("click.notes", function(d3_event, d) {
+ if (!enabled())
+ return;
+ var currMode = context.mode().id;
+ if (/^draw/.test(currMode))
+ return;
+ if (d.id === currMode) {
+ context.enter(modeBrowse(context));
+ } else {
+ context.enter(d);
+ }
+ }).call(uiTooltip().placement("bottom").title(function(d) {
+ return d.description;
+ }).keys(function(d) {
+ return [d.key];
+ }).scrollContainer(context.container().select(".top-toolbar")));
+ buttonsEnter.each(function(d) {
+ select_default2(this).call(svgIcon(d.icon || "#iD-icon-" + d.button));
+ });
+ if (buttons.enter().size() || buttons.exit().size()) {
+ context.ui().checkOverflow(".top-toolbar", true);
+ }
+ buttons = buttons.merge(buttonsEnter).classed("disabled", function() {
+ return !enabled();
+ }).attr("aria-disabled", function() {
+ return !enabled();
+ }).classed("active", function(d) {
+ return context.mode() && context.mode().button === d.button;
+ }).attr("aria-pressed", function(d) {
+ return context.mode() && context.mode().button === d.button;
+ });
+ }
+ };
+ tool.uninstall = function() {
+ context.on("enter.editor.notes", null).on("exit.editor.notes", null).on("enter.notes", null);
+ context.map().on("move.notes", null).on("drawn.notes", null);
+ };
+ return tool;
+ }
+
+ // modules/ui/tools/save.js
+ function uiToolSave(context) {
+ var tool = {
+ id: "save",
+ label: _t.html("save.title")
+ };
+ var button = null;
+ var tooltipBehavior = null;
+ var history = context.history();
+ var key = uiCmd("\u2318S");
+ var _numChanges = 0;
+ function isSaving() {
+ var mode = context.mode();
+ return mode && mode.id === "save";
+ }
+ function isDisabled() {
+ return _numChanges === 0 || isSaving();
+ }
+ function save(d3_event) {
+ d3_event.preventDefault();
+ if (!context.inIntro() && !isSaving() && history.hasChanges()) {
+ context.enter(modeSave(context));
+ }
+ }
+ function bgColor(numChanges) {
+ var step;
+ if (numChanges === 0) {
+ return null;
+ } else if (numChanges <= 50) {
+ step = numChanges / 50;
+ return rgb_default("#fff", "#ff8")(step);
+ } else {
+ step = Math.min((numChanges - 50) / 50, 1);
+ return rgb_default("#ff8", "#f88")(step);
+ }
+ }
+ function updateCount() {
+ var val = history.difference().summary().length;
+ if (val === _numChanges)
+ return;
+ _numChanges = val;
+ if (tooltipBehavior) {
+ tooltipBehavior.title(_t.html(_numChanges > 0 ? "save.help" : "save.no_changes")).keys([key]);
+ }
+ if (button) {
+ button.classed("disabled", isDisabled()).style("background", bgColor(_numChanges));
+ button.select("span.count").text(_numChanges);
+ }
+ }
+ tool.render = function(selection2) {
+ tooltipBehavior = uiTooltip().placement("bottom").title(_t.html("save.no_changes")).keys([key]).scrollContainer(context.container().select(".top-toolbar"));
+ var lastPointerUpType;
+ button = selection2.append("button").attr("class", "save disabled bar-button").on("pointerup", function(d3_event) {
+ lastPointerUpType = d3_event.pointerType;
+ }).on("click", function(d3_event) {
+ save(d3_event);
+ if (_numChanges === 0 && (lastPointerUpType === "touch" || lastPointerUpType === "pen")) {
+ context.ui().flash.duration(2e3).iconName("#iD-icon-save").iconClass("disabled").label(_t.html("save.no_changes"))();
+ }
+ lastPointerUpType = null;
+ }).call(tooltipBehavior);
+ button.call(svgIcon("#iD-icon-save"));
+ button.append("span").attr("class", "count").attr("aria-hidden", "true").text("0");
+ updateCount();
+ context.keybinding().on(key, save, true);
+ context.history().on("change.save", updateCount);
+ context.on("enter.save", function() {
+ if (button) {
+ button.classed("disabled", isDisabled());
+ if (isSaving()) {
+ button.call(tooltipBehavior.hide);
+ }
+ }
+ });
+ };
+ tool.uninstall = function() {
+ context.keybinding().off(key, true);
+ context.history().on("change.save", null);
+ context.on("enter.save", null);
+ button = null;
+ tooltipBehavior = null;
+ };
+ return tool;
+ }
+
+ // modules/ui/tools/sidebar_toggle.js
+ function uiToolSidebarToggle(context) {
+ var tool = {
+ id: "sidebar_toggle",
+ label: _t.html("toolbar.inspect")
+ };
+ tool.render = function(selection2) {
+ selection2.append("button").attr("class", "bar-button").attr("aria-label", _t("sidebar.tooltip")).on("click", function() {
+ context.ui().sidebar.toggle();
+ }).call(uiTooltip().placement("bottom").title(_t.html("sidebar.tooltip")).keys([_t("sidebar.key")]).scrollContainer(context.container().select(".top-toolbar"))).call(svgIcon("#iD-icon-sidebar-" + (_mainLocalizer.textDirection() === "rtl" ? "right" : "left")));
+ };
+ return tool;
+ }
+
+ // modules/ui/tools/undo_redo.js
+ function uiToolUndoRedo(context) {
+ var tool = {
+ id: "undo_redo",
+ label: _t.html("toolbar.undo_redo")
+ };
+ var commands = [{
+ id: "undo",
+ cmd: uiCmd("\u2318Z"),
+ action: function() {
+ context.undo();
+ },
+ annotation: function() {
+ return context.history().undoAnnotation();
+ },
+ icon: "iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "redo" : "undo")
+ }, {
+ id: "redo",
+ cmd: uiCmd("\u2318\u21E7Z"),
+ action: function() {
+ context.redo();
+ },
+ annotation: function() {
+ return context.history().redoAnnotation();
+ },
+ icon: "iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "undo" : "redo")
+ }];
+ function editable() {
+ return context.mode() && context.mode().id !== "save" && context.map().editableDataEnabled(true);
+ }
+ tool.render = function(selection2) {
+ var tooltipBehavior = uiTooltip().placement("bottom").title(function(d) {
+ return d.annotation() ? _t.html(d.id + ".tooltip", { action: d.annotation() }) : _t.html(d.id + ".nothing");
+ }).keys(function(d) {
+ return [d.cmd];
+ }).scrollContainer(context.container().select(".top-toolbar"));
+ var lastPointerUpType;
+ var buttons = selection2.selectAll("button").data(commands).enter().append("button").attr("class", function(d) {
+ return "disabled " + d.id + "-button bar-button";
+ }).on("pointerup", function(d3_event) {
+ lastPointerUpType = d3_event.pointerType;
+ }).on("click", function(d3_event, d) {
+ d3_event.preventDefault();
+ var annotation = d.annotation();
+ if (editable() && annotation) {
+ d.action();
+ }
+ if (editable() && (lastPointerUpType === "touch" || lastPointerUpType === "pen")) {
+ var text2 = annotation ? _t.html(d.id + ".tooltip", { action: annotation }) : _t.html(d.id + ".nothing");
+ context.ui().flash.duration(2e3).iconName("#" + d.icon).iconClass(annotation ? "" : "disabled").label(text2)();
+ }
+ lastPointerUpType = null;
+ }).call(tooltipBehavior);
+ buttons.each(function(d) {
+ select_default2(this).call(svgIcon("#" + d.icon));
+ });
+ context.keybinding().on(commands[0].cmd, function(d3_event) {
+ d3_event.preventDefault();
+ if (editable())
+ commands[0].action();
+ }).on(commands[1].cmd, function(d3_event) {
+ d3_event.preventDefault();
+ if (editable())
+ commands[1].action();
+ });
+ var debouncedUpdate = debounce_default(update, 500, { leading: true, trailing: true });
+ context.map().on("move.undo_redo", debouncedUpdate).on("drawn.undo_redo", debouncedUpdate);
+ context.history().on("change.undo_redo", function(difference) {
+ if (difference)
+ update();
+ });
+ context.on("enter.undo_redo", update);
+ function update() {
+ buttons.classed("disabled", function(d) {
+ return !editable() || !d.annotation();
+ }).each(function() {
+ var selection3 = select_default2(this);
+ if (!selection3.select(".tooltip.in").empty()) {
+ selection3.call(tooltipBehavior.updateContent);
+ }
+ });
+ }
+ };
+ tool.uninstall = function() {
+ context.keybinding().off(commands[0].cmd).off(commands[1].cmd);
+ context.map().on("move.undo_redo", null).on("drawn.undo_redo", null);
+ context.history().on("change.undo_redo", null);
+ context.on("enter.undo_redo", null);
+ };
+ return tool;
+ }
+
+ // modules/ui/top_toolbar.js
+ function uiTopToolbar(context) {
+ var sidebarToggle = uiToolSidebarToggle(context), modes = uiToolDrawModes(context), notes = uiToolNotes(context), undoRedo = uiToolUndoRedo(context), save = uiToolSave(context);
+ function notesEnabled() {
+ var noteLayer = context.layers().layer("notes");
+ return noteLayer && noteLayer.enabled();
+ }
+ function topToolbar(bar) {
+ bar.on("wheel.topToolbar", function(d3_event) {
+ if (!d3_event.deltaX) {
+ bar.node().scrollLeft += d3_event.deltaY;
+ }
+ });
+ var debouncedUpdate = debounce_default(update, 500, { leading: true, trailing: true });
+ context.layers().on("change.topToolbar", debouncedUpdate);
+ update();
+ function update() {
+ var tools = [
+ sidebarToggle,
+ "spacer",
+ modes
+ ];
+ tools.push("spacer");
+ if (notesEnabled()) {
+ tools = tools.concat([notes, "spacer"]);
+ }
+ tools = tools.concat([undoRedo, save]);
+ var toolbarItems = bar.selectAll(".toolbar-item").data(tools, function(d) {
+ return d.id || d;
+ });
+ toolbarItems.exit().each(function(d) {
+ if (d.uninstall) {
+ d.uninstall();
+ }
+ }).remove();
+ var itemsEnter = toolbarItems.enter().append("div").attr("class", function(d) {
+ var classes = "toolbar-item " + (d.id || d).replace("_", "-");
+ if (d.klass)
+ classes += " " + d.klass;
+ return classes;
+ });
+ var actionableItems = itemsEnter.filter(function(d) {
+ return d !== "spacer";
+ });
+ actionableItems.append("div").attr("class", "item-content").each(function(d) {
+ select_default2(this).call(d.render, bar);
+ });
+ actionableItems.append("div").attr("class", "item-label").html(function(d) {
+ return d.label;
+ });
+ }
+ }
+ return topToolbar;
+ }
+
+ // modules/ui/zoom_to_selection.js
+ function uiZoomToSelection(context) {
+ function isDisabled() {
+ var mode = context.mode();
+ return !mode || !mode.zoomToSelected;
+ }
+ var _lastPointerUpType;
+ function pointerup(d3_event) {
+ _lastPointerUpType = d3_event.pointerType;
+ }
+ function click(d3_event) {
+ d3_event.preventDefault();
+ if (isDisabled()) {
+ if (_lastPointerUpType === "touch" || _lastPointerUpType === "pen") {
+ context.ui().flash.duration(2e3).iconName("#iD-icon-framed-dot").iconClass("disabled").label(_t.html("inspector.zoom_to.no_selection"))();
+ }
+ } else {
+ var mode = context.mode();
+ if (mode && mode.zoomToSelected) {
+ mode.zoomToSelected();
+ }
+ }
+ _lastPointerUpType = null;
+ }
+ return function(selection2) {
+ var tooltipBehavior = uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(function() {
+ if (isDisabled()) {
+ return _t.html("inspector.zoom_to.no_selection");
+ }
+ return _t.html("inspector.zoom_to.title");
+ }).keys([_t("inspector.zoom_to.key")]);
+ var button = selection2.append("button").on("pointerup", pointerup).on("click", click).call(svgIcon("#iD-icon-framed-dot", "light")).call(tooltipBehavior);
+ function setEnabledState() {
+ button.classed("disabled", isDisabled());
+ if (!button.select(".tooltip.in").empty()) {
+ button.call(tooltipBehavior.updateContent);
+ }
+ }
+ context.on("enter.uiZoomToSelection", setEnabledState);
+ setEnabledState();
+ };
+ }
+
+ // modules/ui/pane.js
+ function uiPane(id2, context) {
+ var _key;
+ var _label = "";
+ var _description = "";
+ var _iconName = "";
+ var _sections;
+ var _paneSelection = select_default2(null);
+ var _paneTooltip;
+ var pane = {
+ id: id2
+ };
+ pane.label = function(val) {
+ if (!arguments.length)
+ return _label;
+ _label = val;
+ return pane;
+ };
+ pane.key = function(val) {
+ if (!arguments.length)
+ return _key;
+ _key = val;
+ return pane;
+ };
+ pane.description = function(val) {
+ if (!arguments.length)
+ return _description;
+ _description = val;
+ return pane;
+ };
+ pane.iconName = function(val) {
+ if (!arguments.length)
+ return _iconName;
+ _iconName = val;
+ return pane;
+ };
+ pane.sections = function(val) {
+ if (!arguments.length)
+ return _sections;
+ _sections = val;
+ return pane;
+ };
+ pane.selection = function() {
+ return _paneSelection;
+ };
+ function hidePane() {
+ context.ui().togglePanes();
+ }
+ pane.togglePane = function(d3_event) {
+ if (d3_event)
+ d3_event.preventDefault();
+ _paneTooltip.hide();
+ context.ui().togglePanes(!_paneSelection.classed("shown") ? _paneSelection : void 0);
+ };
+ pane.renderToggleButton = function(selection2) {
+ if (!_paneTooltip) {
+ _paneTooltip = uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(_description).keys([_key]);
+ }
+ selection2.append("button").on("click", pane.togglePane).call(svgIcon("#" + _iconName, "light")).call(_paneTooltip);
+ };
+ pane.renderContent = function(selection2) {
+ if (_sections) {
+ _sections.forEach(function(section) {
+ selection2.call(section.render);
+ });
+ }
+ };
+ pane.renderPane = function(selection2) {
+ _paneSelection = selection2.append("div").attr("class", "fillL map-pane hide " + id2 + "-pane").attr("pane", id2);
+ var heading = _paneSelection.append("div").attr("class", "pane-heading");
+ heading.append("h2").html(_label);
+ heading.append("button").attr("title", _t("icons.close")).on("click", hidePane).call(svgIcon("#iD-icon-close"));
+ _paneSelection.append("div").attr("class", "pane-content").call(pane.renderContent);
+ if (_key) {
+ context.keybinding().on(_key, pane.togglePane);
+ }
+ };
+ return pane;
+ }
+
+ // modules/ui/sections/background_display_options.js
+ function uiSectionBackgroundDisplayOptions(context) {
+ var section = uiSection("background-display-options", context).label(_t.html("background.display_options")).disclosureContent(renderDisclosureContent);
+ var _storedOpacity = corePreferences("background-opacity");
+ var _minVal = 0;
+ var _maxVal = 3;
+ var _sliders = ["brightness", "contrast", "saturation", "sharpness"];
+ var _options = {
+ brightness: _storedOpacity !== null ? +_storedOpacity : 1,
+ contrast: 1,
+ saturation: 1,
+ sharpness: 1
+ };
+ function clamp3(x, min3, max3) {
+ return Math.max(min3, Math.min(x, max3));
+ }
+ function updateValue(d, val) {
+ val = clamp3(val, _minVal, _maxVal);
+ _options[d] = val;
+ context.background()[d](val);
+ if (d === "brightness") {
+ corePreferences("background-opacity", val);
+ }
+ section.reRender();
+ }
+ function renderDisclosureContent(selection2) {
+ var container = selection2.selectAll(".display-options-container").data([0]);
+ var containerEnter = container.enter().append("div").attr("class", "display-options-container controls-list");
+ var slidersEnter = containerEnter.selectAll(".display-control").data(_sliders).enter().append("label").attr("class", function(d) {
+ return "display-control display-control-" + d;
+ });
+ slidersEnter.html(function(d) {
+ return _t.html("background." + d);
+ }).append("span").attr("class", function(d) {
+ return "display-option-value display-option-value-" + d;
+ });
+ var sildersControlEnter = slidersEnter.append("div").attr("class", "control-wrap");
+ sildersControlEnter.append("input").attr("class", function(d) {
+ return "display-option-input display-option-input-" + d;
+ }).attr("type", "range").attr("min", _minVal).attr("max", _maxVal).attr("step", "0.05").on("input", function(d3_event, d) {
+ var val = select_default2(this).property("value");
+ if (!val && d3_event && d3_event.target) {
+ val = d3_event.target.value;
+ }
+ updateValue(d, val);
+ });
+ sildersControlEnter.append("button").attr("title", function(d) {
+ return `${_t("background.reset")} ${_t("background." + d)}`;
+ }).attr("class", function(d) {
+ return "display-option-reset display-option-reset-" + d;
+ }).on("click", function(d3_event, d) {
+ if (d3_event.button !== 0)
+ return;
+ updateValue(d, 1);
+ }).call(svgIcon("#iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "redo" : "undo")));
+ containerEnter.append("a").attr("class", "display-option-resetlink").attr("role", "button").attr("href", "#").call(_t.append("background.reset_all")).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ for (var i2 = 0; i2 < _sliders.length; i2++) {
+ updateValue(_sliders[i2], 1);
+ }
+ });
+ container = containerEnter.merge(container);
+ container.selectAll(".display-option-input").property("value", function(d) {
+ return _options[d];
+ });
+ container.selectAll(".display-option-value").text(function(d) {
+ return Math.floor(_options[d] * 100) + "%";
+ });
+ container.selectAll(".display-option-reset").classed("disabled", function(d) {
+ return _options[d] === 1;
+ });
+ if (containerEnter.size() && _options.brightness !== 1) {
+ context.background().brightness(_options.brightness);
+ }
+ }
+ return section;
+ }
+
+ // modules/ui/settings/custom_background.js
+ function uiSettingsCustomBackground() {
+ var dispatch10 = dispatch_default("change");
+ function render(selection2) {
+ var _origSettings = {
+ template: corePreferences("background-custom-template")
+ };
+ var _currSettings = {
+ template: corePreferences("background-custom-template")
+ };
+ var example = "https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png";
+ var modal = uiConfirm(selection2).okButton();
+ modal.classed("settings-modal settings-custom-background", true);
+ modal.select(".modal-section.header").append("h3").call(_t.append("settings.custom_background.header"));
+ var textSection = modal.select(".modal-section.message-text");
+ var instructions = `${_t.html("settings.custom_background.instructions.info")}
+
+#### ${_t.html("settings.custom_background.instructions.wms.tokens_label")}
+* ${_t.html("settings.custom_background.instructions.wms.tokens.proj")}
+* ${_t.html("settings.custom_background.instructions.wms.tokens.wkid")}
+* ${_t.html("settings.custom_background.instructions.wms.tokens.dimensions")}
+* ${_t.html("settings.custom_background.instructions.wms.tokens.bbox")}
+
+#### ${_t.html("settings.custom_background.instructions.tms.tokens_label")}
+* ${_t.html("settings.custom_background.instructions.tms.tokens.xyz")}
+* ${_t.html("settings.custom_background.instructions.tms.tokens.flipped_y")}
+* ${_t.html("settings.custom_background.instructions.tms.tokens.switch")}
+* ${_t.html("settings.custom_background.instructions.tms.tokens.quadtile")}
+* ${_t.html("settings.custom_background.instructions.tms.tokens.scale_factor")}
+
+#### ${_t.html("settings.custom_background.instructions.example")}
+\`${example}\``;
+ textSection.append("div").attr("class", "instructions-template").html(marked(instructions));
+ textSection.append("textarea").attr("class", "field-template").attr("placeholder", _t("settings.custom_background.template.placeholder")).call(utilNoAuto).property("value", _currSettings.template);
+ var buttonSection = modal.select(".modal-section.buttons");
+ buttonSection.insert("button", ".ok-button").attr("class", "button cancel-button secondary-action").call(_t.append("confirm.cancel"));
+ buttonSection.select(".cancel-button").on("click.cancel", clickCancel);
+ buttonSection.select(".ok-button").attr("disabled", isSaveDisabled).on("click.save", clickSave);
+ function isSaveDisabled() {
+ return null;
+ }
+ function clickCancel() {
+ textSection.select(".field-template").property("value", _origSettings.template);
+ corePreferences("background-custom-template", _origSettings.template);
+ this.blur();
+ modal.close();
+ }
+ function clickSave() {
+ _currSettings.template = textSection.select(".field-template").property("value");
+ corePreferences("background-custom-template", _currSettings.template);
+ this.blur();
+ modal.close();
+ dispatch10.call("change", this, _currSettings);
+ }
+ }
+ return utilRebind(render, dispatch10, "on");
+ }
+
+ // modules/ui/sections/background_list.js
+ function uiSectionBackgroundList(context) {
+ var _backgroundList = select_default2(null);
+ var _customSource = context.background().findSource("custom");
+ var _settingsCustomBackground = uiSettingsCustomBackground(context).on("change", customChanged);
+ var section = uiSection("background-list", context).label(_t.html("background.backgrounds")).disclosureContent(renderDisclosureContent);
+ function previousBackgroundID() {
+ return corePreferences("background-last-used-toggle");
+ }
+ function renderDisclosureContent(selection2) {
+ var container = selection2.selectAll(".layer-background-list").data([0]);
+ _backgroundList = container.enter().append("ul").attr("class", "layer-list layer-background-list").attr("dir", "auto").merge(container);
+ var bgExtrasListEnter = selection2.selectAll(".bg-extras-list").data([0]).enter().append("ul").attr("class", "layer-list bg-extras-list");
+ var minimapLabelEnter = bgExtrasListEnter.append("li").attr("class", "minimap-toggle-item").append("label").call(uiTooltip().title(_t.html("background.minimap.tooltip")).keys([_t("background.minimap.key")]).placement("top"));
+ minimapLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
+ d3_event.preventDefault();
+ uiMapInMap.toggle();
+ });
+ minimapLabelEnter.append("span").call(_t.append("background.minimap.description"));
+ var panelLabelEnter = bgExtrasListEnter.append("li").attr("class", "background-panel-toggle-item").append("label").call(uiTooltip().title(_t.html("background.panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.background.key"))]).placement("top"));
+ panelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
+ d3_event.preventDefault();
+ context.ui().info.toggle("background");
+ });
+ panelLabelEnter.append("span").call(_t.append("background.panel.description"));
+ var locPanelLabelEnter = bgExtrasListEnter.append("li").attr("class", "location-panel-toggle-item").append("label").call(uiTooltip().title(_t.html("background.location_panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.location.key"))]).placement("top"));
+ locPanelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
+ d3_event.preventDefault();
+ context.ui().info.toggle("location");
+ });
+ locPanelLabelEnter.append("span").call(_t.append("background.location_panel.description"));
+ selection2.selectAll(".imagery-faq").data([0]).enter().append("div").attr("class", "imagery-faq").append("a").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", "https://github.com/openstreetmap/iD/blob/develop/FAQ.md#how-can-i-report-an-issue-with-background-imagery").append("span").call(_t.append("background.imagery_problem_faq"));
+ _backgroundList.call(drawListItems, "radio", function(d3_event, d) {
+ chooseBackground(d);
+ }, function(d) {
+ return !d.isHidden() && !d.overlay;
+ });
+ }
+ function setTooltips(selection2) {
+ selection2.each(function(d, i2, nodes) {
+ var item = select_default2(this).select("label");
+ var span = item.select("span");
+ var placement = i2 < nodes.length / 2 ? "bottom" : "top";
+ var description2 = d.description();
+ var isOverflowing = span.property("clientWidth") !== span.property("scrollWidth");
+ item.call(uiTooltip().destroyAny);
+ if (d.id === previousBackgroundID()) {
+ item.call(uiTooltip().placement(placement).title("<div>" + _t.html("background.switch") + "</div>").keys([uiCmd("\u2318" + _t("background.key"))]));
+ } else if (description2 || isOverflowing) {
+ item.call(uiTooltip().placement(placement).title(description2 || d.label()));
+ }
+ });
+ }
+ function drawListItems(layerList, type3, change, filter2) {
+ var sources = context.background().sources(context.map().extent(), context.map().zoom(), true).filter(filter2).sort(function(a, b) {
+ return a.best() && !b.best() ? -1 : b.best() && !a.best() ? 1 : descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
+ });
+ var layerLinks = layerList.selectAll("li").data(sources, function(d, i2) {
+ return d.id + "---" + i2;
+ });
+ layerLinks.exit().remove();
+ var enter = layerLinks.enter().append("li").classed("layer-custom", function(d) {
+ return d.id === "custom";
+ }).classed("best", function(d) {
+ return d.best();
+ });
+ var label = enter.append("label");
+ label.append("input").attr("type", type3).attr("name", "background-layer").attr("value", function(d) {
+ return d.id;
+ }).on("change", change);
+ label.append("span").html(function(d) {
+ return d.label();
+ });
+ enter.filter(function(d) {
+ return d.id === "custom";
+ }).append("button").attr("class", "layer-browse").call(uiTooltip().title(_t.html("settings.custom_background.tooltip")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left")).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ editCustom();
+ }).call(svgIcon("#iD-icon-more"));
+ enter.filter(function(d) {
+ return d.best();
+ }).append("div").attr("class", "best").call(uiTooltip().title(_t.html("background.best_imagery")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left")).append("span").html("★");
+ layerList.call(updateLayerSelections);
+ }
+ function updateLayerSelections(selection2) {
+ function active(d) {
+ return context.background().showsLayer(d);
+ }
+ selection2.selectAll("li").classed("active", active).classed("switch", function(d) {
+ return d.id === previousBackgroundID();
+ }).call(setTooltips).selectAll("input").property("checked", active);
+ }
+ function chooseBackground(d) {
+ if (d.id === "custom" && !d.template()) {
+ return editCustom();
+ }
+ var previousBackground = context.background().baseLayerSource();
+ corePreferences("background-last-used-toggle", previousBackground.id);
+ corePreferences("background-last-used", d.id);
+ context.background().baseLayerSource(d);
+ }
+ function customChanged(d) {
+ if (d && d.template) {
+ _customSource.template(d.template);
+ chooseBackground(_customSource);
+ } else {
+ _customSource.template("");
+ chooseBackground(context.background().findSource("none"));
+ }
+ }
+ function editCustom() {
+ context.container().call(_settingsCustomBackground);
+ }
+ context.background().on("change.background_list", function() {
+ _backgroundList.call(updateLayerSelections);
+ });
+ context.map().on("move.background_list", debounce_default(function() {
+ window.requestIdleCallback(section.reRender);
+ }, 1e3));
+ return section;
+ }
+
+ // modules/ui/sections/background_offset.js
+ function uiSectionBackgroundOffset(context) {
+ var section = uiSection("background-offset", context).label(_t.html("background.fix_misalignment")).disclosureContent(renderDisclosureContent).expandedByDefault(false);
+ var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ var _directions = [
+ ["top", [0, -0.5]],
+ ["left", [-0.5, 0]],
+ ["right", [0.5, 0]],
+ ["bottom", [0, 0.5]]
+ ];
+ function updateValue() {
+ var meters = geoOffsetToMeters(context.background().offset());
+ var x = +meters[0].toFixed(2);
+ var y = +meters[1].toFixed(2);
+ context.container().selectAll(".nudge-inner-rect").select("input").classed("error", false).property("value", x + ", " + y);
+ context.container().selectAll(".nudge-reset").classed("disabled", function() {
+ return x === 0 && y === 0;
+ });
+ }
+ function resetOffset() {
+ context.background().offset([0, 0]);
+ updateValue();
+ }
+ function nudge(d) {
+ context.background().nudge(d, context.map().zoom());
+ updateValue();
+ }
+ function inputOffset() {
+ var input = select_default2(this);
+ var d = input.node().value;
+ if (d === "")
+ return resetOffset();
+ d = d.replace(/;/g, ",").split(",").map(function(n2) {
+ return !isNaN(n2) && n2;
+ });
+ if (d.length !== 2 || !d[0] || !d[1]) {
+ input.classed("error", true);
+ return;
+ }
+ context.background().offset(geoMetersToOffset(d));
+ updateValue();
+ }
+ function dragOffset(d3_event) {
+ if (d3_event.button !== 0)
+ return;
+ var origin = [d3_event.clientX, d3_event.clientY];
+ var pointerId = d3_event.pointerId || "mouse";
+ context.container().append("div").attr("class", "nudge-surface");
+ select_default2(window).on(_pointerPrefix + "move.drag-bg-offset", pointermove).on(_pointerPrefix + "up.drag-bg-offset", pointerup);
+ if (_pointerPrefix === "pointer") {
+ select_default2(window).on("pointercancel.drag-bg-offset", pointerup);
+ }
+ function pointermove(d3_event2) {
+ if (pointerId !== (d3_event2.pointerId || "mouse"))
+ return;
+ var latest = [d3_event2.clientX, d3_event2.clientY];
+ var d = [
+ -(origin[0] - latest[0]) / 4,
+ -(origin[1] - latest[1]) / 4
+ ];
+ origin = latest;
+ nudge(d);
+ }
+ function pointerup(d3_event2) {
+ if (pointerId !== (d3_event2.pointerId || "mouse"))
+ return;
+ if (d3_event2.button !== 0)
+ return;
+ context.container().selectAll(".nudge-surface").remove();
+ select_default2(window).on(".drag-bg-offset", null);
+ }
+ }
+ function renderDisclosureContent(selection2) {
+ var container = selection2.selectAll(".nudge-container").data([0]);
+ var containerEnter = container.enter().append("div").attr("class", "nudge-container");
+ containerEnter.append("div").attr("class", "nudge-instructions").call(_t.append("background.offset"));
+ var nudgeWrapEnter = containerEnter.append("div").attr("class", "nudge-controls-wrap");
+ var nudgeEnter = nudgeWrapEnter.append("div").attr("class", "nudge-outer-rect").on(_pointerPrefix + "down", dragOffset);
+ nudgeEnter.append("div").attr("class", "nudge-inner-rect").append("input").attr("type", "text").attr("aria-label", _t("background.offset_label")).on("change", inputOffset);
+ nudgeWrapEnter.append("div").selectAll("button").data(_directions).enter().append("button").attr("title", function(d) {
+ return _t(`background.nudge.${d[0]}`);
+ }).attr("class", function(d) {
+ return d[0] + " nudge";
+ }).on("click", function(d3_event, d) {
+ nudge(d[1]);
+ });
+ nudgeWrapEnter.append("button").attr("title", _t("background.reset")).attr("class", "nudge-reset disabled").on("click", function(d3_event) {
+ d3_event.preventDefault();
+ resetOffset();
+ }).call(svgIcon("#iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "redo" : "undo")));
+ updateValue();
+ }
+ context.background().on("change.backgroundOffset-update", updateValue);
+ return section;
+ }
+
+ // modules/ui/sections/overlay_list.js
+ function uiSectionOverlayList(context) {
+ var section = uiSection("overlay-list", context).label(_t.html("background.overlays")).disclosureContent(renderDisclosureContent);
+ var _overlayList = select_default2(null);
+ function setTooltips(selection2) {
+ selection2.each(function(d, i2, nodes) {
+ var item = select_default2(this).select("label");
+ var span = item.select("span");
+ var placement = i2 < nodes.length / 2 ? "bottom" : "top";
+ var description2 = d.description();
+ var isOverflowing = span.property("clientWidth") !== span.property("scrollWidth");
+ item.call(uiTooltip().destroyAny);
+ if (description2 || isOverflowing) {
+ item.call(uiTooltip().placement(placement).title(description2 || d.name()));
+ }
+ });
+ }
+ function updateLayerSelections(selection2) {
+ function active(d) {
+ return context.background().showsLayer(d);
+ }
+ selection2.selectAll("li").classed("active", active).call(setTooltips).selectAll("input").property("checked", active);
+ }
+ function chooseOverlay(d3_event, d) {
+ d3_event.preventDefault();
+ context.background().toggleOverlayLayer(d);
+ _overlayList.call(updateLayerSelections);
+ document.activeElement.blur();
+ }
+ function drawListItems(layerList, type3, change, filter2) {
+ var sources = context.background().sources(context.map().extent(), context.map().zoom(), true).filter(filter2);
+ var layerLinks = layerList.selectAll("li").data(sources, function(d) {
+ return d.name();
+ });
+ layerLinks.exit().remove();
+ var enter = layerLinks.enter().append("li");
+ var label = enter.append("label");
+ label.append("input").attr("type", type3).attr("name", "layers").on("change", change);
+ label.append("span").html(function(d) {
+ return d.label();
+ });
+ layerList.selectAll("li").sort(sortSources);
+ layerList.call(updateLayerSelections);
+ function sortSources(a, b) {
+ return a.best() && !b.best() ? -1 : b.best() && !a.best() ? 1 : descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
+ }
+ }
+ function renderDisclosureContent(selection2) {
+ var container = selection2.selectAll(".layer-overlay-list").data([0]);
+ _overlayList = container.enter().append("ul").attr("class", "layer-list layer-overlay-list").attr("dir", "auto").merge(container);
+ _overlayList.call(drawListItems, "checkbox", chooseOverlay, function(d) {
+ return !d.isHidden() && d.overlay;
+ });
+ }
+ context.map().on("move.overlay_list", debounce_default(function() {
+ window.requestIdleCallback(section.reRender);
+ }, 1e3));
+ return section;
+ }
+
+ // modules/ui/panes/background.js
+ function uiPaneBackground(context) {
+ var backgroundPane = uiPane("background", context).key(_t("background.key")).label(_t.html("background.title")).description(_t.html("background.description")).iconName("iD-icon-layers").sections([
+ uiSectionBackgroundList(context),
+ uiSectionOverlayList(context),
+ uiSectionBackgroundDisplayOptions(context),
+ uiSectionBackgroundOffset(context)
+ ]);
+ return backgroundPane;
+ }
+
+ // modules/ui/panes/help.js
+ function uiPaneHelp(context) {
+ var docKeys = [
+ ["help", [
+ "welcome",
+ "open_data_h",
+ "open_data",
+ "before_start_h",
+ "before_start",
+ "open_source_h",
+ "open_source",
+ "open_source_help"
+ ]],
+ ["overview", [
+ "navigation_h",
+ "navigation_drag",
+ "navigation_zoom",
+ "features_h",
+ "features",
+ "nodes_ways"
+ ]],
+ ["editing", [
+ "select_h",
+ "select_left_click",
+ "select_right_click",
+ "select_space",
+ "multiselect_h",
+ "multiselect",
+ "multiselect_shift_click",
+ "multiselect_lasso",
+ "undo_redo_h",
+ "undo_redo",
+ "save_h",
+ "save",
+ "save_validation",
+ "upload_h",
+ "upload",
+ "backups_h",
+ "backups",
+ "keyboard_h",
+ "keyboard"
+ ]],
+ ["feature_editor", [
+ "intro",
+ "definitions",
+ "type_h",
+ "type",
+ "type_picker",
+ "fields_h",
+ "fields_all_fields",
+ "fields_example",
+ "fields_add_field",
+ "tags_h",
+ "tags_all_tags",
+ "tags_resources"
+ ]],
+ ["points", [
+ "intro",
+ "add_point_h",
+ "add_point",
+ "add_point_finish",
+ "move_point_h",
+ "move_point",
+ "delete_point_h",
+ "delete_point",
+ "delete_point_command"
+ ]],
+ ["lines", [
+ "intro",
+ "add_line_h",
+ "add_line",
+ "add_line_draw",
+ "add_line_continue",
+ "add_line_finish",
+ "modify_line_h",
+ "modify_line_dragnode",
+ "modify_line_addnode",
+ "connect_line_h",
+ "connect_line",
+ "connect_line_display",
+ "connect_line_drag",
+ "connect_line_tag",
+ "disconnect_line_h",
+ "disconnect_line_command",
+ "move_line_h",
+ "move_line_command",
+ "move_line_connected",
+ "delete_line_h",
+ "delete_line",
+ "delete_line_command"
+ ]],
+ ["areas", [
+ "intro",
+ "point_or_area_h",
+ "point_or_area",
+ "add_area_h",
+ "add_area_command",
+ "add_area_draw",
+ "add_area_continue",
+ "add_area_finish",
+ "square_area_h",
+ "square_area_command",
+ "modify_area_h",
+ "modify_area_dragnode",
+ "modify_area_addnode",
+ "delete_area_h",
+ "delete_area",
+ "delete_area_command"
+ ]],
+ ["relations", [
+ "intro",
+ "edit_relation_h",
+ "edit_relation",
+ "edit_relation_add",
+ "edit_relation_delete",
+ "maintain_relation_h",
+ "maintain_relation",
+ "relation_types_h",
+ "multipolygon_h",
+ "multipolygon",
+ "multipolygon_create",
+ "multipolygon_merge",
+ "turn_restriction_h",
+ "turn_restriction",
+ "turn_restriction_field",
+ "turn_restriction_editing",
+ "route_h",
+ "route",
+ "route_add",
+ "boundary_h",
+ "boundary",
+ "boundary_add"
+ ]],
+ ["operations", [
+ "intro",
+ "intro_2",
+ "straighten",
+ "orthogonalize",
+ "circularize",
+ "move",
+ "rotate",
+ "reflect",
+ "continue",
+ "reverse",
+ "disconnect",
+ "split",
+ "extract",
+ "merge",
+ "delete",
+ "downgrade",
+ "copy_paste"
+ ]],
+ ["notes", [
+ "intro",
+ "add_note_h",
+ "add_note",
+ "place_note",
+ "move_note",
+ "update_note_h",
+ "update_note",
+ "save_note_h",
+ "save_note"
+ ]],
+ ["imagery", [
+ "intro",
+ "sources_h",
+ "choosing",
+ "sources",
+ "offsets_h",
+ "offset",
+ "offset_change"
+ ]],
+ ["streetlevel", [
+ "intro",
+ "using_h",
+ "using",
+ "photos",
+ "viewer"
+ ]],
+ ["gps", [
+ "intro",
+ "survey",
+ "using_h",
+ "using",
+ "tracing",
+ "upload"
+ ]],
+ ["qa", [
+ "intro",
+ "tools_h",
+ "tools",
+ "issues_h",
+ "issues"
+ ]]
+ ];
+ var headings = {
+ "help.help.open_data_h": 3,
+ "help.help.before_start_h": 3,
+ "help.help.open_source_h": 3,
+ "help.overview.navigation_h": 3,
+ "help.overview.features_h": 3,
+ "help.editing.select_h": 3,
+ "help.editing.multiselect_h": 3,
+ "help.editing.undo_redo_h": 3,
+ "help.editing.save_h": 3,
+ "help.editing.upload_h": 3,
+ "help.editing.backups_h": 3,
+ "help.editing.keyboard_h": 3,
+ "help.feature_editor.type_h": 3,
+ "help.feature_editor.fields_h": 3,
+ "help.feature_editor.tags_h": 3,
+ "help.points.add_point_h": 3,
+ "help.points.move_point_h": 3,
+ "help.points.delete_point_h": 3,
+ "help.lines.add_line_h": 3,
+ "help.lines.modify_line_h": 3,
+ "help.lines.connect_line_h": 3,
+ "help.lines.disconnect_line_h": 3,
+ "help.lines.move_line_h": 3,
+ "help.lines.delete_line_h": 3,
+ "help.areas.point_or_area_h": 3,
+ "help.areas.add_area_h": 3,
+ "help.areas.square_area_h": 3,
+ "help.areas.modify_area_h": 3,
+ "help.areas.delete_area_h": 3,
+ "help.relations.edit_relation_h": 3,
+ "help.relations.maintain_relation_h": 3,
+ "help.relations.relation_types_h": 2,
+ "help.relations.multipolygon_h": 3,
+ "help.relations.turn_restriction_h": 3,
+ "help.relations.route_h": 3,
+ "help.relations.boundary_h": 3,
+ "help.notes.add_note_h": 3,
+ "help.notes.update_note_h": 3,
+ "help.notes.save_note_h": 3,
+ "help.imagery.sources_h": 3,
+ "help.imagery.offsets_h": 3,
+ "help.streetlevel.using_h": 3,
+ "help.gps.using_h": 3,
+ "help.qa.tools_h": 3,
+ "help.qa.issues_h": 3
+ };
+ var docs = docKeys.map(function(key) {
+ var helpkey = "help." + key[0];
+ var helpPaneReplacements = { version: context.version };
+ var text2 = key[1].reduce(function(all, part) {
+ var subkey = helpkey + "." + part;
+ var depth = headings[subkey];
+ var hhh = depth ? Array(depth + 1).join("#") + " " : "";
+ return all + hhh + helpHtml(subkey, helpPaneReplacements) + "\n\n";
+ }, "");
+ return {
+ title: _t.html(helpkey + ".title"),
+ content: marked(text2.trim()).replace(/<code>/g, "<kbd>").replace(/<\/code>/g, "</kbd>")
+ };
+ });
+ var helpPane = uiPane("help", context).key(_t("help.key")).label(_t.html("help.title")).description(_t.html("help.title")).iconName("iD-icon-help");
+ helpPane.renderContent = function(content) {
+ function clickHelp(d, i2) {
+ var rtl = _mainLocalizer.textDirection() === "rtl";
+ content.property("scrollTop", 0);
+ helpPane.selection().select(".pane-heading h2").html(d.title);
+ body.html(d.content);
+ body.selectAll("a").attr("target", "_blank");
+ menuItems.classed("selected", function(m) {
+ return m.title === d.title;
+ });
+ nav.html("");
+ if (rtl) {
+ nav.call(drawNext).call(drawPrevious);
+ } else {
+ nav.call(drawPrevious).call(drawNext);
+ }
+ function drawNext(selection2) {
+ if (i2 < docs.length - 1) {
+ var nextLink = selection2.append("a").attr("href", "#").attr("class", "next").on("click", function(d3_event) {
+ d3_event.preventDefault();
+ clickHelp(docs[i2 + 1], i2 + 1);
+ });
+ nextLink.append("span").html(docs[i2 + 1].title).call(svgIcon(rtl ? "#iD-icon-backward" : "#iD-icon-forward", "inline"));
+ }
+ }
+ function drawPrevious(selection2) {
+ if (i2 > 0) {
+ var prevLink = selection2.append("a").attr("href", "#").attr("class", "previous").on("click", function(d3_event) {
+ d3_event.preventDefault();
+ clickHelp(docs[i2 - 1], i2 - 1);
+ });
+ prevLink.call(svgIcon(rtl ? "#iD-icon-forward" : "#iD-icon-backward", "inline")).append("span").html(docs[i2 - 1].title);
+ }
+ }
+ }
+ function clickWalkthrough(d3_event) {
+ d3_event.preventDefault();
+ if (context.inIntro())
+ return;
+ context.container().call(uiIntro(context));
+ context.ui().togglePanes();
+ }
+ function clickShortcuts(d3_event) {
+ d3_event.preventDefault();
+ context.container().call(context.ui().shortcuts, true);
+ }
+ var toc = content.append("ul").attr("class", "toc");
+ var menuItems = toc.selectAll("li").data(docs).enter().append("li").append("a").attr("role", "button").attr("href", "#").html(function(d) {
+ return d.title;
+ }).on("click", function(d3_event, d) {
+ d3_event.preventDefault();
+ clickHelp(d, docs.indexOf(d));
+ });
+ var shortcuts = toc.append("li").attr("class", "shortcuts").call(uiTooltip().title(_t.html("shortcuts.tooltip")).keys(["?"]).placement("top")).append("a").attr("href", "#").on("click", clickShortcuts);
+ shortcuts.append("div").call(_t.append("shortcuts.title"));
+ var walkthrough = toc.append("li").attr("class", "walkthrough").append("a").attr("href", "#").on("click", clickWalkthrough);
+ walkthrough.append("svg").attr("class", "logo logo-walkthrough").append("use").attr("xlink:href", "#iD-logo-walkthrough");
+ walkthrough.append("div").call(_t.append("splash.walkthrough"));
+ var helpContent = content.append("div").attr("class", "left-content");
+ var body = helpContent.append("div").attr("class", "body");
+ var nav = helpContent.append("div").attr("class", "nav");
+ clickHelp(docs[0], 0);
+ };
+ return helpPane;
+ }
+
+ // modules/ui/sections/validation_issues.js
+ function uiSectionValidationIssues(id2, severity, context) {
+ var _issues = [];
+ var section = uiSection(id2, context).label(function() {
+ if (!_issues)
+ return "";
+ var issueCountText = _issues.length > 1e3 ? "1000+" : String(_issues.length);
+ return _t.html("inspector.title_count", { title: { html: _t.html("issues." + severity + "s.list_title") }, count: issueCountText });
+ }).disclosureContent(renderDisclosureContent).shouldDisplay(function() {
+ return _issues && _issues.length;
+ });
+ function getOptions() {
+ return {
+ what: corePreferences("validate-what") || "edited",
+ where: corePreferences("validate-where") || "all"
+ };
+ }
+ function reloadIssues() {
+ _issues = context.validator().getIssuesBySeverity(getOptions())[severity];
+ }
+ function renderDisclosureContent(selection2) {
+ var center = context.map().center();
+ var graph = context.graph();
+ var issues = _issues.map(function withDistance(issue) {
+ var extent = issue.extent(graph);
+ var dist = extent ? geoSphericalDistance(center, extent.center()) : 0;
+ return Object.assign(issue, { dist });
+ }).sort(function byDistance(a, b) {
+ return a.dist - b.dist;
+ });
+ issues = issues.slice(0, 1e3);
+ selection2.call(drawIssuesList, issues);
+ }
+ function drawIssuesList(selection2, issues) {
+ var list = selection2.selectAll(".issues-list").data([0]);
+ list = list.enter().append("ul").attr("class", "layer-list issues-list " + severity + "s-list").merge(list);
+ var items = list.selectAll("li").data(issues, function(d) {
+ return d.key;
+ });
+ items.exit().remove();
+ var itemsEnter = items.enter().append("li").attr("class", function(d) {
+ return "issue severity-" + d.severity;
+ });
+ var labelsEnter = itemsEnter.append("button").attr("class", "issue-label").on("click", function(d3_event, d) {
+ context.validator().focusIssue(d);
+ }).on("mouseover", function(d3_event, d) {
+ utilHighlightEntities(d.entityIds, true, context);
+ }).on("mouseout", function(d3_event, d) {
+ utilHighlightEntities(d.entityIds, false, context);
+ });
+ var textEnter = labelsEnter.append("span").attr("class", "issue-text");
+ textEnter.append("span").attr("class", "issue-icon").each(function(d) {
+ var iconName = "#iD-icon-" + (d.severity === "warning" ? "alert" : "error");
+ select_default2(this).call(svgIcon(iconName));
+ });
+ textEnter.append("span").attr("class", "issue-message");
+ items = items.merge(itemsEnter).order();
+ items.selectAll(".issue-message").html(function(d) {
+ return d.message(context);
+ });
+ }
+ context.validator().on("validated.uiSectionValidationIssues" + id2, function() {
+ window.requestIdleCallback(function() {
+ reloadIssues();
+ section.reRender();
+ });
+ });
+ context.map().on("move.uiSectionValidationIssues" + id2, debounce_default(function() {
+ window.requestIdleCallback(function() {
+ if (getOptions().where === "visible") {
+ reloadIssues();
+ }
+ section.reRender();
+ });
+ }, 1e3));
+ return section;
+ }
+
+ // modules/ui/sections/validation_options.js
+ function uiSectionValidationOptions(context) {
+ var section = uiSection("issues-options", context).content(renderContent);
+ function renderContent(selection2) {
+ var container = selection2.selectAll(".issues-options-container").data([0]);
+ container = container.enter().append("div").attr("class", "issues-options-container").merge(container);
+ var data = [
+ { key: "what", values: ["edited", "all"] },
+ { key: "where", values: ["visible", "all"] }
+ ];
+ var options2 = container.selectAll(".issues-option").data(data, function(d) {
+ return d.key;
+ });
+ var optionsEnter = options2.enter().append("div").attr("class", function(d) {
+ return "issues-option issues-option-" + d.key;
+ });
+ optionsEnter.append("div").attr("class", "issues-option-title").html(function(d) {
+ return _t.html("issues.options." + d.key + ".title");
+ });
+ var valuesEnter = optionsEnter.selectAll("label").data(function(d) {
+ return d.values.map(function(val) {
+ return { value: val, key: d.key };
+ });
+ }).enter().append("label");
+ valuesEnter.append("input").attr("type", "radio").attr("name", function(d) {
+ return "issues-option-" + d.key;
+ }).attr("value", function(d) {
+ return d.value;
+ }).property("checked", function(d) {
+ return getOptions()[d.key] === d.value;
+ }).on("change", function(d3_event, d) {
+ updateOptionValue(d3_event, d.key, d.value);
+ });
+ valuesEnter.append("span").html(function(d) {
+ return _t.html("issues.options." + d.key + "." + d.value);
+ });
+ }
+ function getOptions() {
+ return {
+ what: corePreferences("validate-what") || "edited",
+ where: corePreferences("validate-where") || "all"
+ };
+ }
+ function updateOptionValue(d3_event, d, val) {
+ if (!val && d3_event && d3_event.target) {
+ val = d3_event.target.value;
+ }
+ corePreferences("validate-" + d, val);
+ context.validator().validate();
+ }
+ return section;
+ }
+
+ // modules/ui/sections/validation_rules.js
+ function uiSectionValidationRules(context) {
+ var MINSQUARE = 0;
+ var MAXSQUARE = 20;
+ var DEFAULTSQUARE = 5;
+ var section = uiSection("issues-rules", context).disclosureContent(renderDisclosureContent).label(_t.html("issues.rules.title"));
+ var _ruleKeys = context.validator().getRuleKeys().filter(function(key) {
+ return key !== "maprules";
+ }).sort(function(key1, key2) {
+ return _t("issues." + key1 + ".title") < _t("issues." + key2 + ".title") ? -1 : 1;
+ });
+ function renderDisclosureContent(selection2) {
+ var container = selection2.selectAll(".issues-rulelist-container").data([0]);
+ var containerEnter = container.enter().append("div").attr("class", "issues-rulelist-container");
+ containerEnter.append("ul").attr("class", "layer-list issue-rules-list");
+ var ruleLinks = containerEnter.append("div").attr("class", "issue-rules-links section-footer");
+ ruleLinks.append("a").attr("class", "issue-rules-link").attr("role", "button").attr("href", "#").call(_t.append("issues.disable_all")).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ context.validator().disableRules(_ruleKeys);
+ });
+ ruleLinks.append("a").attr("class", "issue-rules-link").attr("role", "button").attr("href", "#").call(_t.append("issues.enable_all")).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ context.validator().disableRules([]);
+ });
+ container = container.merge(containerEnter);
+ container.selectAll(".issue-rules-list").call(drawListItems, _ruleKeys, "checkbox", "rule", toggleRule, isRuleEnabled);
+ }
+ function drawListItems(selection2, data, type3, name2, change, active) {
+ var items = selection2.selectAll("li").data(data);
+ items.exit().remove();
+ var enter = items.enter().append("li");
+ if (name2 === "rule") {
+ enter.call(uiTooltip().title(function(d) {
+ return _t.html("issues." + d + ".tip");
+ }).placement("top"));
+ }
+ var label = enter.append("label");
+ label.append("input").attr("type", type3).attr("name", name2).on("change", change);
+ label.append("span").html(function(d) {
+ var params = {};
+ if (d === "unsquare_way") {
+ params.val = { html: '<span class="square-degrees"></span>' };
+ }
+ return _t.html("issues." + d + ".title", params);
+ });
+ items = items.merge(enter);
+ items.classed("active", active).selectAll("input").property("checked", active).property("indeterminate", false);
+ var degStr = corePreferences("validate-square-degrees");
+ if (degStr === null) {
+ degStr = DEFAULTSQUARE.toString();
+ }
+ var span = items.selectAll(".square-degrees");
+ var input = span.selectAll(".square-degrees-input").data([0]);
+ input.enter().append("input").attr("type", "number").attr("min", MINSQUARE.toString()).attr("max", MAXSQUARE.toString()).attr("step", "0.5").attr("class", "square-degrees-input").call(utilNoAuto).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ this.select();
+ }).on("keyup", function(d3_event) {
+ if (d3_event.keyCode === 13) {
+ this.blur();
+ this.select();
+ }
+ }).on("blur", changeSquare).merge(input).property("value", degStr);
+ }
+ function changeSquare() {
+ var input = select_default2(this);
+ var degStr = utilGetSetValue(input).trim();
+ var degNum = parseFloat(degStr, 10);
+ if (!isFinite(degNum)) {
+ degNum = DEFAULTSQUARE;
+ } else if (degNum > MAXSQUARE) {
+ degNum = MAXSQUARE;
+ } else if (degNum < MINSQUARE) {
+ degNum = MINSQUARE;
+ }
+ degNum = Math.round(degNum * 10) / 10;
+ degStr = degNum.toString();
+ input.property("value", degStr);
+ corePreferences("validate-square-degrees", degStr);
+ context.validator().revalidateUnsquare();
+ }
+ function isRuleEnabled(d) {
+ return context.validator().isRuleEnabled(d);
+ }
+ function toggleRule(d3_event, d) {
+ context.validator().toggleRule(d);
+ }
+ context.validator().on("validated.uiSectionValidationRules", function() {
+ window.requestIdleCallback(section.reRender);
+ });
+ return section;
+ }
+
+ // modules/ui/sections/validation_status.js
+ function uiSectionValidationStatus(context) {
+ var section = uiSection("issues-status", context).content(renderContent).shouldDisplay(function() {
+ var issues = context.validator().getIssues(getOptions());
+ return issues.length === 0;
+ });
+ function getOptions() {
+ return {
+ what: corePreferences("validate-what") || "edited",
+ where: corePreferences("validate-where") || "all"
+ };
+ }
+ function renderContent(selection2) {
+ var box = selection2.selectAll(".box").data([0]);
+ var boxEnter = box.enter().append("div").attr("class", "box");
+ boxEnter.append("div").call(svgIcon("#iD-icon-apply", "pre-text"));
+ var noIssuesMessage = boxEnter.append("span");
+ noIssuesMessage.append("strong").attr("class", "message");
+ noIssuesMessage.append("br");
+ noIssuesMessage.append("span").attr("class", "details");
+ renderIgnoredIssuesReset(selection2);
+ setNoIssuesText(selection2);
+ }
+ function renderIgnoredIssuesReset(selection2) {
+ var ignoredIssues = context.validator().getIssues({ what: "all", where: "all", includeDisabledRules: true, includeIgnored: "only" });
+ var resetIgnored = selection2.selectAll(".reset-ignored").data(ignoredIssues.length ? [0] : []);
+ resetIgnored.exit().remove();
+ var resetIgnoredEnter = resetIgnored.enter().append("div").attr("class", "reset-ignored section-footer");
+ resetIgnoredEnter.append("a").attr("href", "#");
+ resetIgnored = resetIgnored.merge(resetIgnoredEnter);
+ resetIgnored.select("a").html(_t.html("inspector.title_count", { title: { html: _t.html("issues.reset_ignored") }, count: ignoredIssues.length }));
+ resetIgnored.on("click", function(d3_event) {
+ d3_event.preventDefault();
+ context.validator().resetIgnoredIssues();
+ });
+ }
+ function setNoIssuesText(selection2) {
+ var opts = getOptions();
+ function checkForHiddenIssues(cases) {
+ for (var type3 in cases) {
+ var hiddenOpts = cases[type3];
+ var hiddenIssues = context.validator().getIssues(hiddenOpts);
+ if (hiddenIssues.length) {
+ selection2.select(".box .details").html("").call(_t.append("issues.no_issues.hidden_issues." + type3, { count: hiddenIssues.length.toString() }));
+ return;
+ }
+ }
+ selection2.select(".box .details").html("").call(_t.append("issues.no_issues.hidden_issues.none"));
+ }
+ var messageType;
+ if (opts.what === "edited" && opts.where === "visible") {
+ messageType = "edits_in_view";
+ checkForHiddenIssues({
+ elsewhere: { what: "edited", where: "all" },
+ everything_else: { what: "all", where: "visible" },
+ disabled_rules: { what: "edited", where: "visible", includeDisabledRules: "only" },
+ everything_else_elsewhere: { what: "all", where: "all" },
+ disabled_rules_elsewhere: { what: "edited", where: "all", includeDisabledRules: "only" },
+ ignored_issues: { what: "edited", where: "visible", includeIgnored: "only" },
+ ignored_issues_elsewhere: { what: "edited", where: "all", includeIgnored: "only" }
+ });
+ } else if (opts.what === "edited" && opts.where === "all") {
+ messageType = "edits";
+ checkForHiddenIssues({
+ everything_else: { what: "all", where: "all" },
+ disabled_rules: { what: "edited", where: "all", includeDisabledRules: "only" },
+ ignored_issues: { what: "edited", where: "all", includeIgnored: "only" }
+ });
+ } else if (opts.what === "all" && opts.where === "visible") {
+ messageType = "everything_in_view";
+ checkForHiddenIssues({
+ elsewhere: { what: "all", where: "all" },
+ disabled_rules: { what: "all", where: "visible", includeDisabledRules: "only" },
+ disabled_rules_elsewhere: { what: "all", where: "all", includeDisabledRules: "only" },
+ ignored_issues: { what: "all", where: "visible", includeIgnored: "only" },
+ ignored_issues_elsewhere: { what: "all", where: "all", includeIgnored: "only" }
+ });
+ } else if (opts.what === "all" && opts.where === "all") {
+ messageType = "everything";
+ checkForHiddenIssues({
+ disabled_rules: { what: "all", where: "all", includeDisabledRules: "only" },
+ ignored_issues: { what: "all", where: "all", includeIgnored: "only" }
+ });
+ }
+ if (opts.what === "edited" && context.history().difference().summary().length === 0) {
+ messageType = "no_edits";
+ }
+ selection2.select(".box .message").html("").call(_t.append("issues.no_issues.message." + messageType));
+ }
+ context.validator().on("validated.uiSectionValidationStatus", function() {
+ window.requestIdleCallback(section.reRender);
+ });
+ context.map().on("move.uiSectionValidationStatus", debounce_default(function() {
+ window.requestIdleCallback(section.reRender);
+ }, 1e3));
+ return section;
+ }
+
+ // modules/ui/panes/issues.js
+ function uiPaneIssues(context) {
+ var issuesPane = uiPane("issues", context).key(_t("issues.key")).label(_t.html("issues.title")).description(_t.html("issues.title")).iconName("iD-icon-alert").sections([
+ uiSectionValidationOptions(context),
+ uiSectionValidationStatus(context),
+ uiSectionValidationIssues("issues-errors", "error", context),
+ uiSectionValidationIssues("issues-warnings", "warning", context),
+ uiSectionValidationRules(context)
+ ]);
+ return issuesPane;
+ }
+
+ // modules/ui/settings/custom_data.js
+ function uiSettingsCustomData(context) {
+ var dispatch10 = dispatch_default("change");
+ function render(selection2) {
+ var dataLayer = context.layers().layer("data");
+ var _origSettings = {
+ fileList: dataLayer && dataLayer.fileList() || null,
+ url: corePreferences("settings-custom-data-url")
+ };
+ var _currSettings = {
+ fileList: dataLayer && dataLayer.fileList() || null,
+ url: corePreferences("settings-custom-data-url")
+ };
+ var modal = uiConfirm(selection2).okButton();
+ modal.classed("settings-modal settings-custom-data", true);
+ modal.select(".modal-section.header").append("h3").call(_t.append("settings.custom_data.header"));
+ var textSection = modal.select(".modal-section.message-text");
+ textSection.append("pre").attr("class", "instructions-file").call(_t.append("settings.custom_data.file.instructions"));
+ textSection.append("input").attr("class", "field-file").attr("type", "file").attr("accept", ".gpx,.kml,.geojson,.json,application/gpx+xml,application/vnd.google-earth.kml+xml,application/geo+json,application/json").property("files", _currSettings.fileList).on("change", function(d3_event) {
+ var files = d3_event.target.files;
+ if (files && files.length) {
+ _currSettings.url = "";
+ textSection.select(".field-url").property("value", "");
+ _currSettings.fileList = files;
+ } else {
+ _currSettings.fileList = null;
+ }
+ });
+ textSection.append("h4").call(_t.append("settings.custom_data.or"));
+ textSection.append("pre").attr("class", "instructions-url").call(_t.append("settings.custom_data.url.instructions"));
+ textSection.append("textarea").attr("class", "field-url").attr("placeholder", _t("settings.custom_data.url.placeholder")).call(utilNoAuto).property("value", _currSettings.url);
+ var buttonSection = modal.select(".modal-section.buttons");
+ buttonSection.insert("button", ".ok-button").attr("class", "button cancel-button secondary-action").call(_t.append("confirm.cancel"));
+ buttonSection.select(".cancel-button").on("click.cancel", clickCancel);
+ buttonSection.select(".ok-button").attr("disabled", isSaveDisabled).on("click.save", clickSave);
+ function isSaveDisabled() {
+ return null;
+ }
+ function clickCancel() {
+ textSection.select(".field-url").property("value", _origSettings.url);
+ corePreferences("settings-custom-data-url", _origSettings.url);
+ this.blur();
+ modal.close();
+ }
+ function clickSave() {
+ _currSettings.url = textSection.select(".field-url").property("value").trim();
+ if (_currSettings.url) {
+ _currSettings.fileList = null;
+ }
+ if (_currSettings.fileList) {
+ _currSettings.url = "";
+ }
+ corePreferences("settings-custom-data-url", _currSettings.url);
+ this.blur();
+ modal.close();
+ dispatch10.call("change", this, _currSettings);
+ }
+ }
+ return utilRebind(render, dispatch10, "on");
+ }
+
+ // modules/ui/sections/data_layers.js
+ function uiSectionDataLayers(context) {
+ var settingsCustomData = uiSettingsCustomData(context).on("change", customChanged);
+ var layers = context.layers();
+ var section = uiSection("data-layers", context).label(_t.html("map_data.data_layers")).disclosureContent(renderDisclosureContent);
+ function renderDisclosureContent(selection2) {
+ var container = selection2.selectAll(".data-layer-container").data([0]);
+ container.enter().append("div").attr("class", "data-layer-container").merge(container).call(drawOsmItems).call(drawQAItems).call(drawCustomDataItems).call(drawVectorItems).call(drawPanelItems);
+ }
+ function showsLayer(which) {
+ var layer = layers.layer(which);
+ if (layer) {
+ return layer.enabled();
+ }
+ return false;
+ }
+ function setLayer(which, enabled) {
+ var mode = context.mode();
+ if (mode && /^draw/.test(mode.id))
+ return;
+ var layer = layers.layer(which);
+ if (layer) {
+ layer.enabled(enabled);
+ if (!enabled && (which === "osm" || which === "notes")) {
+ context.enter(modeBrowse(context));
+ }
+ }
+ }
+ function toggleLayer(which) {
+ setLayer(which, !showsLayer(which));
+ }
+ function drawOsmItems(selection2) {
+ var osmKeys = ["osm", "notes"];
+ var osmLayers = layers.all().filter(function(obj) {
+ return osmKeys.indexOf(obj.id) !== -1;
+ });
+ var ul = selection2.selectAll(".layer-list-osm").data([0]);
+ ul = ul.enter().append("ul").attr("class", "layer-list layer-list-osm").merge(ul);
+ var li = ul.selectAll(".list-item").data(osmLayers);
+ li.exit().remove();
+ var liEnter = li.enter().append("li").attr("class", function(d) {
+ return "list-item list-item-" + d.id;
+ });
+ var labelEnter = liEnter.append("label").each(function(d) {
+ if (d.id === "osm") {
+ select_default2(this).call(uiTooltip().title(_t.html("map_data.layers." + d.id + ".tooltip")).keys([uiCmd("\u2325" + _t("area_fill.wireframe.key"))]).placement("bottom"));
+ } else {
+ select_default2(this).call(uiTooltip().title(_t.html("map_data.layers." + d.id + ".tooltip")).placement("bottom"));
+ }
+ });
+ labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d) {
+ toggleLayer(d.id);
+ });
+ labelEnter.append("span").html(function(d) {
+ return _t.html("map_data.layers." + d.id + ".title");
+ });
+ li.merge(liEnter).classed("active", function(d) {
+ return d.layer.enabled();
+ }).selectAll("input").property("checked", function(d) {
+ return d.layer.enabled();
+ });
+ }
+ function drawQAItems(selection2) {
+ var qaKeys = ["keepRight", "improveOSM", "osmose"];
+ var qaLayers = layers.all().filter(function(obj) {
+ return qaKeys.indexOf(obj.id) !== -1;
+ });
+ var ul = selection2.selectAll(".layer-list-qa").data([0]);
+ ul = ul.enter().append("ul").attr("class", "layer-list layer-list-qa").merge(ul);
+ var li = ul.selectAll(".list-item").data(qaLayers);
+ li.exit().remove();
+ var liEnter = li.enter().append("li").attr("class", function(d) {
+ return "list-item list-item-" + d.id;
+ });
+ var labelEnter = liEnter.append("label").each(function(d) {
+ select_default2(this).call(uiTooltip().title(_t.html("map_data.layers." + d.id + ".tooltip")).placement("bottom"));
+ });
+ labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d) {
+ toggleLayer(d.id);
+ });
+ labelEnter.append("span").html(function(d) {
+ return _t.html("map_data.layers." + d.id + ".title");
+ });
+ li.merge(liEnter).classed("active", function(d) {
+ return d.layer.enabled();
+ }).selectAll("input").property("checked", function(d) {
+ return d.layer.enabled();
+ });
+ }
+ function drawVectorItems(selection2) {
+ var dataLayer = layers.layer("data");
+ var vtData = [
+ {
+ name: "Detroit Neighborhoods/Parks",
+ src: "neighborhoods-parks",
+ tooltip: "Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.",
+ 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"
+ },
+ {
+ name: "Detroit Composite POIs",
+ src: "composite-poi",
+ tooltip: "Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.",
+ 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"
+ },
+ {
+ name: "Detroit All-The-Places POIs",
+ src: "alltheplaces-poi",
+ tooltip: "Public domain business location data created by web scrapers.",
+ 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"
+ }
+ ];
+ var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]);
+ var showVectorItems = context.map().zoom() > 9 && detroit.contains(context.map().center());
+ var container = selection2.selectAll(".vectortile-container").data(showVectorItems ? [0] : []);
+ container.exit().remove();
+ var containerEnter = container.enter().append("div").attr("class", "vectortile-container");
+ containerEnter.append("h4").attr("class", "vectortile-header").text("Detroit Vector Tiles (Beta)");
+ containerEnter.append("ul").attr("class", "layer-list layer-list-vectortile");
+ containerEnter.append("div").attr("class", "vectortile-footer").append("a").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", "https://github.com/osmus/detroit-mapping-challenge").append("span").text("About these layers");
+ container = container.merge(containerEnter);
+ var ul = container.selectAll(".layer-list-vectortile");
+ var li = ul.selectAll(".list-item").data(vtData);
+ li.exit().remove();
+ var liEnter = li.enter().append("li").attr("class", function(d) {
+ return "list-item list-item-" + d.src;
+ });
+ var labelEnter = liEnter.append("label").each(function(d) {
+ select_default2(this).call(uiTooltip().title(d.tooltip).placement("top"));
+ });
+ labelEnter.append("input").attr("type", "radio").attr("name", "vectortile").on("change", selectVTLayer);
+ labelEnter.append("span").text(function(d) {
+ return d.name;
+ });
+ li.merge(liEnter).classed("active", isVTLayerSelected).selectAll("input").property("checked", isVTLayerSelected);
+ function isVTLayerSelected(d) {
+ return dataLayer && dataLayer.template() === d.template;
+ }
+ function selectVTLayer(d3_event, d) {
+ corePreferences("settings-custom-data-url", d.template);
+ if (dataLayer) {
+ dataLayer.template(d.template, d.src);
+ dataLayer.enabled(true);
+ }
+ }
+ }
+ function drawCustomDataItems(selection2) {
+ var dataLayer = layers.layer("data");
+ var hasData = dataLayer && dataLayer.hasData();
+ var showsData = hasData && dataLayer.enabled();
+ var ul = selection2.selectAll(".layer-list-data").data(dataLayer ? [0] : []);
+ ul.exit().remove();
+ var ulEnter = ul.enter().append("ul").attr("class", "layer-list layer-list-data");
+ var liEnter = ulEnter.append("li").attr("class", "list-item-data");
+ var labelEnter = liEnter.append("label").call(uiTooltip().title(_t.html("map_data.layers.custom.tooltip")).placement("top"));
+ labelEnter.append("input").attr("type", "checkbox").on("change", function() {
+ toggleLayer("data");
+ });
+ labelEnter.append("span").call(_t.append("map_data.layers.custom.title"));
+ liEnter.append("button").attr("class", "open-data-options").call(uiTooltip().title(_t.html("settings.custom_data.tooltip")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left")).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ editCustom();
+ }).call(svgIcon("#iD-icon-more"));
+ liEnter.append("button").attr("class", "zoom-to-data").call(uiTooltip().title(_t.html("map_data.layers.custom.zoom")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left")).on("click", function(d3_event) {
+ if (select_default2(this).classed("disabled"))
+ return;
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ dataLayer.fitZoom();
+ }).call(svgIcon("#iD-icon-framed-dot", "monochrome"));
+ ul = ul.merge(ulEnter);
+ ul.selectAll(".list-item-data").classed("active", showsData).selectAll("label").classed("deemphasize", !hasData).selectAll("input").property("disabled", !hasData).property("checked", showsData);
+ ul.selectAll("button.zoom-to-data").classed("disabled", !hasData);
+ }
+ function editCustom() {
+ context.container().call(settingsCustomData);
+ }
+ function customChanged(d) {
+ var dataLayer = layers.layer("data");
+ if (d && d.url) {
+ dataLayer.url(d.url);
+ } else if (d && d.fileList) {
+ dataLayer.fileList(d.fileList);
+ }
+ }
+ function drawPanelItems(selection2) {
+ var panelsListEnter = selection2.selectAll(".md-extras-list").data([0]).enter().append("ul").attr("class", "layer-list md-extras-list");
+ var historyPanelLabelEnter = panelsListEnter.append("li").attr("class", "history-panel-toggle-item").append("label").call(uiTooltip().title(_t.html("map_data.history_panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.history.key"))]).placement("top"));
+ historyPanelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
+ d3_event.preventDefault();
+ context.ui().info.toggle("history");
+ });
+ historyPanelLabelEnter.append("span").call(_t.append("map_data.history_panel.title"));
+ var measurementPanelLabelEnter = panelsListEnter.append("li").attr("class", "measurement-panel-toggle-item").append("label").call(uiTooltip().title(_t.html("map_data.measurement_panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.measurement.key"))]).placement("top"));
+ measurementPanelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
+ d3_event.preventDefault();
+ context.ui().info.toggle("measurement");
+ });
+ measurementPanelLabelEnter.append("span").call(_t.append("map_data.measurement_panel.title"));
+ }
+ context.layers().on("change.uiSectionDataLayers", section.reRender);
+ context.map().on("move.uiSectionDataLayers", debounce_default(function() {
+ window.requestIdleCallback(section.reRender);
+ }, 1e3));
+ return section;
+ }
+
+ // modules/ui/sections/map_features.js
+ function uiSectionMapFeatures(context) {
+ var _features = context.features().keys();
+ var section = uiSection("map-features", context).label(_t.html("map_data.map_features")).disclosureContent(renderDisclosureContent).expandedByDefault(false);
+ function renderDisclosureContent(selection2) {
+ var container = selection2.selectAll(".layer-feature-list-container").data([0]);
+ var containerEnter = container.enter().append("div").attr("class", "layer-feature-list-container");
+ containerEnter.append("ul").attr("class", "layer-list layer-feature-list");
+ var footer = containerEnter.append("div").attr("class", "feature-list-links section-footer");
+ footer.append("a").attr("class", "feature-list-link").attr("role", "button").attr("href", "#").call(_t.append("issues.disable_all")).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ context.features().disableAll();
+ });
+ footer.append("a").attr("class", "feature-list-link").attr("role", "button").attr("href", "#").call(_t.append("issues.enable_all")).on("click", function(d3_event) {
+ d3_event.preventDefault();
+ context.features().enableAll();
+ });
+ container = container.merge(containerEnter);
+ container.selectAll(".layer-feature-list").call(drawListItems, _features, "checkbox", "feature", clickFeature, showsFeature);
+ }
+ function drawListItems(selection2, data, type3, name2, change, active) {
+ var items = selection2.selectAll("li").data(data);
+ items.exit().remove();
+ var enter = items.enter().append("li").call(uiTooltip().title(function(d) {
+ var tip = _t.html(name2 + "." + d + ".tooltip");
+ if (autoHiddenFeature(d)) {
+ var msg = showsLayer("osm") ? _t.html("map_data.autohidden") : _t.html("map_data.osmhidden");
+ tip += "<div>" + msg + "</div>";
+ }
+ return tip;
+ }).placement("top"));
+ var label = enter.append("label");
+ label.append("input").attr("type", type3).attr("name", name2).on("change", change);
+ label.append("span").html(function(d) {
+ return _t.html(name2 + "." + d + ".description");
+ });
+ items = items.merge(enter);
+ items.classed("active", active).selectAll("input").property("checked", active).property("indeterminate", autoHiddenFeature);
+ }
+ function autoHiddenFeature(d) {
+ return context.features().autoHidden(d);
+ }
+ function showsFeature(d) {
+ return context.features().enabled(d);
+ }
+ function clickFeature(d3_event, d) {
+ context.features().toggle(d);
+ }
+ function showsLayer(id2) {
+ var layer = context.layers().layer(id2);
+ return layer && layer.enabled();
+ }
+ context.features().on("change.map_features", section.reRender);
+ return section;
+ }
+
+ // modules/ui/sections/map_style_options.js
+ function uiSectionMapStyleOptions(context) {
+ var section = uiSection("fill-area", context).label(_t.html("map_data.style_options")).disclosureContent(renderDisclosureContent).expandedByDefault(false);
+ function renderDisclosureContent(selection2) {
+ var container = selection2.selectAll(".layer-fill-list").data([0]);
+ container.enter().append("ul").attr("class", "layer-list layer-fill-list").merge(container).call(drawListItems, context.map().areaFillOptions, "radio", "area_fill", setFill, isActiveFill);
+ var container2 = selection2.selectAll(".layer-visual-diff-list").data([0]);
+ container2.enter().append("ul").attr("class", "layer-list layer-visual-diff-list").merge(container2).call(drawListItems, ["highlight_edits"], "checkbox", "visual_diff", toggleHighlightEdited, function() {
+ return context.surface().classed("highlight-edited");
+ });
+ }
+ function drawListItems(selection2, data, type3, name2, change, active) {
+ var items = selection2.selectAll("li").data(data);
+ items.exit().remove();
+ var enter = items.enter().append("li").call(uiTooltip().title(function(d) {
+ return _t.html(name2 + "." + d + ".tooltip");
+ }).keys(function(d) {
+ var key = d === "wireframe" ? _t("area_fill.wireframe.key") : null;
+ if (d === "highlight_edits")
+ key = _t("map_data.highlight_edits.key");
+ return key ? [key] : null;
+ }).placement("top"));
+ var label = enter.append("label");
+ label.append("input").attr("type", type3).attr("name", name2).on("change", change);
+ label.append("span").html(function(d) {
+ return _t.html(name2 + "." + d + ".description");
+ });
+ items = items.merge(enter);
+ items.classed("active", active).selectAll("input").property("checked", active).property("indeterminate", false);
+ }
+ function isActiveFill(d) {
+ return context.map().activeAreaFill() === d;
+ }
+ function toggleHighlightEdited(d3_event) {
+ d3_event.preventDefault();
+ context.map().toggleHighlightEdited();
+ }
+ function setFill(d3_event, d) {
+ context.map().activeAreaFill(d);
+ }
+ context.map().on("changeHighlighting.ui_style, changeAreaFill.ui_style", section.reRender);
+ return section;
+ }
+
+ // modules/ui/sections/photo_overlays.js
+ function uiSectionPhotoOverlays(context) {
+ var layers = context.layers();
+ var section = uiSection("photo-overlays", context).label(_t.html("photo_overlays.title")).disclosureContent(renderDisclosureContent).expandedByDefault(false);
+ function renderDisclosureContent(selection2) {
+ var container = selection2.selectAll(".photo-overlay-container").data([0]);
+ container.enter().append("div").attr("class", "photo-overlay-container").merge(container).call(drawPhotoItems).call(drawPhotoTypeItems).call(drawDateFilter).call(drawUsernameFilter);
+ }
+ function drawPhotoItems(selection2) {
+ var photoKeys = context.photos().overlayLayerIDs();
+ var photoLayers = layers.all().filter(function(obj) {
+ return photoKeys.indexOf(obj.id) !== -1;
+ });
+ var data = photoLayers.filter(function(obj) {
+ return obj.layer.supported();
+ });
+ function layerSupported(d) {
+ return d.layer && d.layer.supported();
+ }
+ function layerEnabled(d) {
+ return layerSupported(d) && d.layer.enabled();
+ }
+ var ul = selection2.selectAll(".layer-list-photos").data([0]);
+ ul = ul.enter().append("ul").attr("class", "layer-list layer-list-photos").merge(ul);
+ var li = ul.selectAll(".list-item-photos").data(data);
+ li.exit().remove();
+ var liEnter = li.enter().append("li").attr("class", function(d) {
+ var classes = "list-item-photos list-item-" + d.id;
+ if (d.id === "mapillary-signs" || d.id === "mapillary-map-features") {
+ classes += " indented";
+ }
+ return classes;
+ });
+ var labelEnter = liEnter.append("label").each(function(d) {
+ var titleID;
+ if (d.id === "mapillary-signs")
+ titleID = "mapillary.signs.tooltip";
+ else if (d.id === "mapillary")
+ titleID = "mapillary_images.tooltip";
+ else if (d.id === "kartaview")
+ titleID = "kartaview_images.tooltip";
+ else
+ titleID = d.id.replace(/-/g, "_") + ".tooltip";
+ select_default2(this).call(uiTooltip().title(_t.html(titleID)).placement("top"));
+ });
+ labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d) {
+ toggleLayer(d.id);
+ });
+ labelEnter.append("span").html(function(d) {
+ var id2 = d.id;
+ if (id2 === "mapillary-signs")
+ id2 = "photo_overlays.traffic_signs";
+ return _t.html(id2.replace(/-/g, "_") + ".title");
+ });
+ li.merge(liEnter).classed("active", layerEnabled).selectAll("input").property("checked", layerEnabled);
+ }
+ function drawPhotoTypeItems(selection2) {
+ var data = context.photos().allPhotoTypes();
+ function typeEnabled(d) {
+ return context.photos().showsPhotoType(d);
+ }
+ var ul = selection2.selectAll(".layer-list-photo-types").data([0]);
+ ul.exit().remove();
+ ul = ul.enter().append("ul").attr("class", "layer-list layer-list-photo-types").merge(ul);
+ var li = ul.selectAll(".list-item-photo-types").data(context.photos().shouldFilterByPhotoType() ? data : []);
+ li.exit().remove();
+ var liEnter = li.enter().append("li").attr("class", function(d) {
+ return "list-item-photo-types list-item-" + d;
+ });
+ var labelEnter = liEnter.append("label").each(function(d) {
+ select_default2(this).call(uiTooltip().title(_t.html("photo_overlays.photo_type." + d + ".tooltip")).placement("top"));
+ });
+ labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d) {
+ context.photos().togglePhotoType(d);
+ });
+ labelEnter.append("span").html(function(d) {
+ return _t.html("photo_overlays.photo_type." + d + ".title");
+ });
+ li.merge(liEnter).classed("active", typeEnabled).selectAll("input").property("checked", typeEnabled);
+ }
+ function drawDateFilter(selection2) {
+ var data = context.photos().dateFilters();
+ function filterEnabled(d) {
+ return context.photos().dateFilterValue(d);
+ }
+ var ul = selection2.selectAll(".layer-list-date-filter").data([0]);
+ ul.exit().remove();
+ ul = ul.enter().append("ul").attr("class", "layer-list layer-list-date-filter").merge(ul);
+ var li = ul.selectAll(".list-item-date-filter").data(context.photos().shouldFilterByDate() ? data : []);
+ li.exit().remove();
+ var liEnter = li.enter().append("li").attr("class", "list-item-date-filter");
+ var labelEnter = liEnter.append("label").each(function(d) {
+ select_default2(this).call(uiTooltip().title(_t.html("photo_overlays.date_filter." + d + ".tooltip")).placement("top"));
+ });
+ labelEnter.append("span").html(function(d) {
+ return _t.html("photo_overlays.date_filter." + d + ".title");
+ });
+ labelEnter.append("input").attr("type", "date").attr("class", "list-item-input").attr("placeholder", _t("units.year_month_day")).call(utilNoAuto).each(function(d) {
+ utilGetSetValue(select_default2(this), context.photos().dateFilterValue(d) || "");
+ }).on("change", function(d3_event, d) {
+ var value = utilGetSetValue(select_default2(this)).trim();
+ context.photos().setDateFilter(d, value, true);
+ li.selectAll("input").each(function(d2) {
+ utilGetSetValue(select_default2(this), context.photos().dateFilterValue(d2) || "");
+ });
+ });
+ li = li.merge(liEnter).classed("active", filterEnabled);
+ }
+ function drawUsernameFilter(selection2) {
+ function filterEnabled() {
+ return context.photos().usernames();
+ }
+ var ul = selection2.selectAll(".layer-list-username-filter").data([0]);
+ ul.exit().remove();
+ ul = ul.enter().append("ul").attr("class", "layer-list layer-list-username-filter").merge(ul);
+ var li = ul.selectAll(".list-item-username-filter").data(context.photos().shouldFilterByUsername() ? ["username-filter"] : []);
+ li.exit().remove();
+ var liEnter = li.enter().append("li").attr("class", "list-item-username-filter");
+ var labelEnter = liEnter.append("label").each(function() {
+ select_default2(this).call(uiTooltip().title(_t.html("photo_overlays.username_filter.tooltip")).placement("top"));
+ });
+ labelEnter.append("span").call(_t.append("photo_overlays.username_filter.title"));
+ labelEnter.append("input").attr("type", "text").attr("class", "list-item-input").call(utilNoAuto).property("value", usernameValue).on("change", function() {
+ var value = select_default2(this).property("value");
+ context.photos().setUsernameFilter(value, true);
+ select_default2(this).property("value", usernameValue);
+ });
+ li.merge(liEnter).classed("active", filterEnabled);
+ function usernameValue() {
+ var usernames = context.photos().usernames();
+ if (usernames)
+ return usernames.join("; ");
+ return usernames;
+ }
+ }
+ function toggleLayer(which) {
+ setLayer(which, !showsLayer(which));
+ }
+ function showsLayer(which) {
+ var layer = layers.layer(which);
+ if (layer) {
+ return layer.enabled();
+ }
+ return false;
+ }
+ function setLayer(which, enabled) {
+ var layer = layers.layer(which);
+ if (layer) {
+ layer.enabled(enabled);
+ }
+ }
+ context.layers().on("change.uiSectionPhotoOverlays", section.reRender);
+ context.photos().on("change.uiSectionPhotoOverlays", section.reRender);
+ return section;
+ }
+
+ // modules/ui/panes/map_data.js
+ function uiPaneMapData(context) {
+ var mapDataPane = uiPane("map-data", context).key(_t("map_data.key")).label(_t.html("map_data.title")).description(_t.html("map_data.description")).iconName("iD-icon-data").sections([
+ uiSectionDataLayers(context),
+ uiSectionPhotoOverlays(context),
+ uiSectionMapStyleOptions(context),
+ uiSectionMapFeatures(context)
+ ]);
+ return mapDataPane;
+ }
+
+ // modules/ui/panes/preferences.js
+ function uiPanePreferences(context) {
+ let preferencesPane = uiPane("preferences", context).key(_t("preferences.key")).label(_t.html("preferences.title")).description(_t.html("preferences.description")).iconName("fas-user-cog").sections([
+ uiSectionPrivacy(context)
+ ]);
+ return preferencesPane;
+ }
+
+ // modules/ui/init.js
+ function uiInit(context) {
+ var _initCounter = 0;
+ var _needWidth = {};
+ var _lastPointerType;
+ function render(container) {
+ container.on("click.ui", function(d3_event) {
+ if (d3_event.button !== 0)
+ return;
+ if (!d3_event.composedPath)
+ return;
+ var isOkayTarget = d3_event.composedPath().some(function(node) {
+ return node.nodeType === 1 && (node.nodeName === "INPUT" || node.nodeName === "LABEL" || node.nodeName === "A");
+ });
+ if (isOkayTarget)
+ return;
+ d3_event.preventDefault();
+ });
+ var detected = utilDetect();
+ if ("GestureEvent" in window && !detected.isMobileWebKit) {
+ container.on("gesturestart.ui gesturechange.ui gestureend.ui", function(d3_event) {
+ d3_event.preventDefault();
+ });
+ }
+ if ("PointerEvent" in window) {
+ select_default2(window).on("pointerdown.ui pointerup.ui", function(d3_event) {
+ var pointerType = d3_event.pointerType || "mouse";
+ if (_lastPointerType !== pointerType) {
+ _lastPointerType = pointerType;
+ container.attr("pointer", pointerType);
+ }
+ }, true);
+ } else {
+ _lastPointerType = "mouse";
+ container.attr("pointer", "mouse");
+ }
+ container.attr("lang", _mainLocalizer.localeCode()).attr("dir", _mainLocalizer.textDirection());
+ container.call(uiFullScreen(context));
+ var map2 = context.map();
+ map2.redrawEnable(false);
+ map2.on("hitMinZoom.ui", function() {
+ ui.flash.iconName("#iD-icon-no").label(_t.html("cannot_zoom"))();
+ });
+ container.append("svg").attr("id", "ideditor-defs").call(ui.svgDefs);
+ container.append("div").attr("class", "sidebar").call(ui.sidebar);
+ var content = container.append("div").attr("class", "main-content active");
+ content.append("div").attr("class", "top-toolbar-wrap").append("div").attr("class", "top-toolbar fillD").call(uiTopToolbar(context));
+ content.append("div").attr("class", "main-map").attr("dir", "ltr").call(map2);
+ var overMap = content.append("div").attr("class", "over-map");
+ overMap.append("div").attr("class", "select-trap").text("t");
+ overMap.call(uiMapInMap(context)).call(uiNotice(context));
+ overMap.append("div").attr("class", "spinner").call(uiSpinner(context));
+ var controlsWrap = overMap.append("div").attr("class", "map-controls-wrap");
+ var controls = controlsWrap.append("div").attr("class", "map-controls");
+ controls.append("div").attr("class", "map-control zoombuttons").call(uiZoom(context));
+ controls.append("div").attr("class", "map-control zoom-to-selection-control").call(uiZoomToSelection(context));
+ controls.append("div").attr("class", "map-control geolocate-control").call(uiGeolocate(context));
+ controlsWrap.on("wheel.mapControls", function(d3_event) {
+ if (!d3_event.deltaX) {
+ controlsWrap.node().scrollTop += d3_event.deltaY;
+ }
+ });
+ var panes = overMap.append("div").attr("class", "map-panes");
+ var uiPanes = [
+ uiPaneBackground(context),
+ uiPaneMapData(context),
+ uiPaneIssues(context),
+ uiPanePreferences(context),
+ uiPaneHelp(context)
+ ];
+ uiPanes.forEach(function(pane) {
+ controls.append("div").attr("class", "map-control map-pane-control " + pane.id + "-control").call(pane.renderToggleButton);
+ panes.call(pane.renderPane);
+ });
+ ui.info = uiInfo(context);
+ overMap.call(ui.info);
+ overMap.append("div").attr("class", "photoviewer").classed("al", true).classed("hide", true).call(ui.photoviewer);
+ overMap.append("div").attr("class", "attribution-wrap").attr("dir", "ltr").call(uiAttribution(context));
+ var about = content.append("div").attr("class", "map-footer");
+ about.append("div").attr("class", "api-status").call(uiStatus(context));
+ var footer = about.append("div").attr("class", "map-footer-bar fillD");
+ footer.append("div").attr("class", "flash-wrap footer-hide");
+ var footerWrap = footer.append("div").attr("class", "main-footer-wrap footer-show");
+ footerWrap.append("div").attr("class", "scale-block").call(uiScale(context));
+ var aboutList = footerWrap.append("div").attr("class", "info-block").append("ul").attr("class", "map-footer-list");
+ aboutList.append("li").attr("class", "user-list").call(uiContributors(context));
+ var apiConnections = context.apiConnections();
+ if (apiConnections && apiConnections.length > 1) {
+ aboutList.append("li").attr("class", "source-switch").call(uiSourceSwitch(context).keys(apiConnections));
+ }
+ aboutList.append("li").attr("class", "issues-info").call(uiIssuesInfo(context));
+ aboutList.append("li").attr("class", "feature-warning").call(uiFeatureInfo(context));
+ var issueLinks = aboutList.append("li");
+ issueLinks.append("a").attr("target", "_blank").attr("href", "https://github.com/openstreetmap/iD/issues").attr("aria-label", _t("report_a_bug")).call(svgIcon("#iD-icon-bug", "light")).call(uiTooltip().title(_t.html("report_a_bug")).placement("top"));
+ issueLinks.append("a").attr("target", "_blank").attr("href", "https://github.com/openstreetmap/iD/blob/develop/CONTRIBUTING.md#translating").attr("aria-label", _t("help_translate")).call(svgIcon("#iD-icon-translate", "light")).call(uiTooltip().title(_t.html("help_translate")).placement("top"));
+ aboutList.append("li").attr("class", "version").call(uiVersion(context));
+ if (!context.embed()) {
+ aboutList.call(uiAccount(context));
+ }
+ ui.onResize();
+ map2.redrawEnable(true);
+ ui.hash = behaviorHash(context);
+ ui.hash();
+ if (!ui.hash.hadHash) {
+ map2.centerZoom([0, 0], 2);
+ }
+ window.onbeforeunload = function() {
+ return context.save();
+ };
+ window.onunload = function() {
+ context.history().unlock();
+ };
+ select_default2(window).on("resize.editor", function() {
+ ui.onResize();
+ });
+ var panPixels = 80;
+ context.keybinding().on("\u232B", function(d3_event) {
+ d3_event.preventDefault();
+ }).on([_t("sidebar.key"), "`", "\xB2", "@"], ui.sidebar.toggle).on("\u2190", pan([panPixels, 0])).on("\u2191", pan([0, panPixels])).on("\u2192", pan([-panPixels, 0])).on("\u2193", pan([0, -panPixels])).on(uiCmd("\u2325\u2190"), pan([map2.dimensions()[0], 0])).on(uiCmd("\u2325\u2191"), pan([0, map2.dimensions()[1]])).on(uiCmd("\u2325\u2192"), pan([-map2.dimensions()[0], 0])).on(uiCmd("\u2325\u2193"), pan([0, -map2.dimensions()[1]])).on(uiCmd("\u2318" + _t("background.key")), function quickSwitch(d3_event) {
+ if (d3_event) {
+ d3_event.stopImmediatePropagation();
+ d3_event.preventDefault();
+ }
+ var previousBackground = context.background().findSource(corePreferences("background-last-used-toggle"));
+ if (previousBackground) {
+ var currentBackground = context.background().baseLayerSource();
+ corePreferences("background-last-used-toggle", currentBackground.id);
+ corePreferences("background-last-used", previousBackground.id);
+ context.background().baseLayerSource(previousBackground);
+ }
+ }).on(_t("area_fill.wireframe.key"), function toggleWireframe(d3_event) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ context.map().toggleWireframe();
+ }).on(uiCmd("\u2325" + _t("area_fill.wireframe.key")), function toggleOsmData(d3_event) {
+ d3_event.preventDefault();
+ d3_event.stopPropagation();
+ var mode = context.mode();
+ if (mode && /^draw/.test(mode.id))
+ return;
+ var layer = context.layers().layer("osm");
+ if (layer) {
+ layer.enabled(!layer.enabled());
+ if (!layer.enabled()) {
+ context.enter(modeBrowse(context));
+ }
+ }
+ }).on(_t("map_data.highlight_edits.key"), function toggleHighlightEdited(d3_event) {
+ d3_event.preventDefault();
+ context.map().toggleHighlightEdited();
+ });
+ context.on("enter.editor", function(entered) {
+ container.classed("mode-" + entered.id, true);
+ }).on("exit.editor", function(exited) {
+ container.classed("mode-" + exited.id, false);
+ });
+ context.enter(modeBrowse(context));
+ if (!_initCounter++) {
+ if (!ui.hash.startWalkthrough) {
+ context.container().call(uiSplash(context)).call(uiRestore(context));
+ }
+ context.container().call(ui.shortcuts);
+ }
+ var osm = context.connection();
+ var auth = uiLoading(context).message(_t.html("loading_auth")).blocking(true);
+ if (osm && auth) {
+ osm.on("authLoading.ui", function() {
+ context.container().call(auth);
+ }).on("authDone.ui", function() {
+ auth.close();
+ });
+ }
+ _initCounter++;
+ if (ui.hash.startWalkthrough) {
+ ui.hash.startWalkthrough = false;
+ context.container().call(uiIntro(context));
+ }
+ function pan(d) {
+ return function(d3_event) {
+ if (d3_event.shiftKey)
+ return;
+ if (context.container().select(".combobox").size())
+ return;
+ d3_event.preventDefault();
+ context.map().pan(d, 100);
+ };
+ }
+ }
+ let ui = {};
+ let _loadPromise;
+ ui.ensureLoaded = () => {
+ if (_loadPromise)
+ return _loadPromise;
+ return _loadPromise = Promise.all([
+ _mainLocalizer.ensureLoaded(),
+ _mainPresetIndex.ensureLoaded()
+ ]).then(() => {
+ if (!context.container().empty())
+ render(context.container());
+ }).catch((err) => console.error(err));
+ };
+ ui.restart = function() {
+ context.keybinding().clear();
+ _loadPromise = null;
+ context.container().selectAll("*").remove();
+ ui.ensureLoaded();
+ };
+ ui.lastPointerType = function() {
+ return _lastPointerType;
+ };
+ ui.svgDefs = svgDefs(context);
+ ui.flash = uiFlash(context);
+ ui.sidebar = uiSidebar(context);
+ ui.photoviewer = uiPhotoviewer(context);
+ ui.shortcuts = uiShortcuts(context);
+ ui.onResize = function(withPan) {
+ var map2 = context.map();
+ var mapDimensions = utilGetDimensions(context.container().select(".main-content"), true);
+ utilGetDimensions(context.container().select(".sidebar"), true);
+ if (withPan !== void 0) {
+ map2.redrawEnable(false);
+ map2.pan(withPan);
+ map2.redrawEnable(true);
+ }
+ map2.dimensions(mapDimensions);
+ ui.photoviewer.onMapResize();
+ ui.checkOverflow(".top-toolbar");
+ ui.checkOverflow(".map-footer-bar");
+ var resizeWindowEvent = document.createEvent("Event");
+ resizeWindowEvent.initEvent("resizeWindow", true, true);
+ document.dispatchEvent(resizeWindowEvent);
+ };
+ ui.checkOverflow = function(selector, reset) {
+ if (reset) {
+ delete _needWidth[selector];
+ }
+ var selection2 = context.container().select(selector);
+ if (selection2.empty())
+ return;
+ var scrollWidth = selection2.property("scrollWidth");
+ var clientWidth = selection2.property("clientWidth");
+ var needed = _needWidth[selector] || scrollWidth;
+ if (scrollWidth > clientWidth) {
+ selection2.classed("narrow", true);
+ if (!_needWidth[selector]) {
+ _needWidth[selector] = scrollWidth;
+ }
+ } else if (scrollWidth >= needed) {
+ selection2.classed("narrow", false);
+ }
+ };
+ ui.togglePanes = function(showPane) {
+ var hidePanes = context.container().selectAll(".map-pane.shown");
+ var side = _mainLocalizer.textDirection() === "ltr" ? "right" : "left";
+ hidePanes.classed("shown", false).classed("hide", true);
+ context.container().selectAll(".map-pane-control button").classed("active", false);
+ if (showPane) {
+ hidePanes.classed("shown", false).classed("hide", true).style(side, "-500px");
+ context.container().selectAll("." + showPane.attr("pane") + "-control button").classed("active", true);
+ showPane.classed("shown", true).classed("hide", false);
+ if (hidePanes.empty()) {
+ showPane.style(side, "-500px").transition().duration(200).style(side, "0px");
+ } else {
+ showPane.style(side, "0px");
+ }
+ } else {
+ hidePanes.classed("shown", true).classed("hide", false).style(side, "0px").transition().duration(200).style(side, "-500px").on("end", function() {
+ select_default2(this).classed("shown", false).classed("hide", true);
+ });
+ }
+ };
+ var _editMenu = uiEditMenu(context);
+ ui.editMenu = function() {
+ return _editMenu;
+ };
+ ui.showEditMenu = function(anchorPoint, triggerType, operations) {
+ ui.closeEditMenu();
+ if (!operations && context.mode().operations)
+ operations = context.mode().operations();
+ if (!operations || !operations.length)
+ return;
+ if (!context.map().editableDataEnabled())
+ return;
+ var surfaceNode = context.surface().node();
+ if (surfaceNode.focus) {
+ surfaceNode.focus();
+ }
+ operations.forEach(function(operation) {
+ if (operation.point)
+ operation.point(anchorPoint);
+ });
+ _editMenu.anchorLoc(anchorPoint).triggerType(triggerType).operations(operations);
+ context.map().supersurface.call(_editMenu);
+ };
+ ui.closeEditMenu = function() {
+ context.map().supersurface.select(".edit-menu").remove();
+ };
+ var _saveLoading = select_default2(null);
+ context.uploader().on("saveStarted.ui", function() {
+ _saveLoading = uiLoading(context).message(_t.html("save.uploading")).blocking(true);
+ context.container().call(_saveLoading);
+ }).on("saveEnded.ui", function() {
+ _saveLoading.close();
+ _saveLoading = select_default2(null);
+ });
+ return ui;
+ }
+
+ // modules/core/context.js
+ function coreContext() {
+ const dispatch10 = dispatch_default("enter", "exit", "change");
+ let context = utilRebind({}, dispatch10, "on");
+ let _deferred2 = /* @__PURE__ */ new Set();
+ context.version = "2.21.1";
+ context.privacyVersion = "20201202";
+ context.initialHashParams = window.location.hash ? utilStringQs(window.location.hash) : {};
+ context.changeset = null;
+ let _defaultChangesetComment = context.initialHashParams.comment;
+ let _defaultChangesetSource = context.initialHashParams.source;
+ let _defaultChangesetHashtags = context.initialHashParams.hashtags;
+ context.defaultChangesetComment = function(val) {
+ if (!arguments.length)
+ return _defaultChangesetComment;
+ _defaultChangesetComment = val;
+ return context;
+ };
+ context.defaultChangesetSource = function(val) {
+ if (!arguments.length)
+ return _defaultChangesetSource;
+ _defaultChangesetSource = val;
+ return context;
+ };
+ context.defaultChangesetHashtags = function(val) {
+ if (!arguments.length)
+ return _defaultChangesetHashtags;
+ _defaultChangesetHashtags = val;
+ return context;
+ };
+ let _setsDocumentTitle = true;
+ context.setsDocumentTitle = function(val) {
+ if (!arguments.length)
+ return _setsDocumentTitle;
+ _setsDocumentTitle = val;
+ return context;
+ };
+ let _documentTitleBase = document.title;
+ context.documentTitleBase = function(val) {
+ if (!arguments.length)
+ return _documentTitleBase;
+ _documentTitleBase = val;
+ return context;
+ };
+ let _ui;
+ context.ui = () => _ui;
+ context.lastPointerType = () => _ui.lastPointerType();
+ let _keybinding = utilKeybinding("context");
+ context.keybinding = () => _keybinding;
+ select_default2(document).call(_keybinding);
+ let _connection = services.osm;
+ let _history;
+ let _validator;
+ let _uploader;
+ context.connection = () => _connection;
+ context.history = () => _history;
+ context.validator = () => _validator;
+ context.uploader = () => _uploader;
+ context.preauth = (options2) => {
+ if (_connection) {
+ _connection.switch(options2);
+ }
+ return context;
+ };
+ let _apiConnections;
+ context.apiConnections = function(val) {
+ if (!arguments.length)
+ return _apiConnections;
+ _apiConnections = val;
+ return context;
+ };
+ context.locale = function(locale2) {
+ if (!arguments.length)
+ return _mainLocalizer.localeCode();
+ _mainLocalizer.preferredLocaleCodes(locale2);
+ return context;
+ };
+ function afterLoad(cid, callback) {
+ return (err, result) => {
+ if (err) {
+ if (err.status === 400 || err.status === 401 || err.status === 403) {
+ if (_connection) {
+ _connection.logout();
+ }
+ }
+ if (typeof callback === "function") {
+ callback(err);
+ }
+ return;
+ } else if (_connection && _connection.getConnectionId() !== cid) {
+ if (typeof callback === "function") {
+ callback({ message: "Connection Switched", status: -1 });
+ }
+ return;
+ } else {
+ _history.merge(result.data, result.extent);
+ if (typeof callback === "function") {
+ callback(err, result);
+ }
+ return;
+ }
+ };
+ }
+ context.loadTiles = (projection2, callback) => {
+ const handle = window.requestIdleCallback(() => {
+ _deferred2.delete(handle);
+ if (_connection && context.editableDataEnabled()) {
+ const cid = _connection.getConnectionId();
+ _connection.loadTiles(projection2, afterLoad(cid, callback));
+ }
+ });
+ _deferred2.add(handle);
+ };
+ context.loadTileAtLoc = (loc, callback) => {
+ const handle = window.requestIdleCallback(() => {
+ _deferred2.delete(handle);
+ if (_connection && context.editableDataEnabled()) {
+ const cid = _connection.getConnectionId();
+ _connection.loadTileAtLoc(loc, afterLoad(cid, callback));
+ }
+ });
+ _deferred2.add(handle);
+ };
+ context.loadEntity = (entityID, callback) => {
+ if (_connection) {
+ const cid = _connection.getConnectionId();
+ _connection.loadEntity(entityID, afterLoad(cid, callback));
+ _connection.loadEntityRelations(entityID, afterLoad(cid, callback));
+ }
+ };
+ context.zoomToEntity = (entityID, zoomTo) => {
+ context.loadEntity(entityID, (err, result) => {
+ if (err)
+ return;
+ if (zoomTo !== false) {
+ const entity = result.data.find((e) => e.id === entityID);
+ if (entity) {
+ _map.zoomTo(entity);
+ }
+ }
+ });
+ _map.on("drawn.zoomToEntity", () => {
+ if (!context.hasEntity(entityID))
+ return;
+ _map.on("drawn.zoomToEntity", null);
+ context.on("enter.zoomToEntity", null);
+ context.enter(modeSelect(context, [entityID]));
+ });
+ context.on("enter.zoomToEntity", () => {
+ if (_mode.id !== "browse") {
+ _map.on("drawn.zoomToEntity", null);
+ context.on("enter.zoomToEntity", null);
+ }
+ });
+ };
+ let _minEditableZoom = 16;
+ context.minEditableZoom = function(val) {
+ if (!arguments.length)
+ return _minEditableZoom;
+ _minEditableZoom = val;
+ if (_connection) {
+ _connection.tileZoom(val);
+ }
+ return context;
+ };
+ context.maxCharsForTagKey = () => 255;
+ context.maxCharsForTagValue = () => 255;
+ context.maxCharsForRelationRole = () => 255;
+ function cleanOsmString(val, maxChars) {
+ if (val === void 0 || val === null) {
+ val = "";
+ } else {
+ val = val.toString();
+ }
+ val = val.trim();
+ if (val.normalize)
+ val = val.normalize("NFC");
+ return utilUnicodeCharsTruncated(val, maxChars);
+ }
+ context.cleanTagKey = (val) => cleanOsmString(val, context.maxCharsForTagKey());
+ context.cleanTagValue = (val) => cleanOsmString(val, context.maxCharsForTagValue());
+ context.cleanRelationRole = (val) => cleanOsmString(val, context.maxCharsForRelationRole());
+ let _inIntro = false;
+ context.inIntro = function(val) {
+ if (!arguments.length)
+ return _inIntro;
+ _inIntro = val;
+ return context;
+ };
+ context.save = () => {
+ if (_inIntro || context.container().select(".modal").size())
+ return;
+ let canSave;
+ if (_mode && _mode.id === "save") {
+ canSave = false;
+ if (services.osm && services.osm.isChangesetInflight()) {
+ _history.clearSaved();
+ return;
+ }
+ } else {
+ canSave = context.selectedIDs().every((id2) => {
+ const entity = context.hasEntity(id2);
+ return entity && !entity.isDegenerate();
+ });
+ }
+ if (canSave) {
+ _history.save();
+ }
+ if (_history.hasChanges()) {
+ return _t("save.unsaved_changes");
+ }
+ };
+ context.debouncedSave = debounce_default(context.save, 350);
+ function withDebouncedSave(fn) {
+ return function() {
+ const result = fn.apply(_history, arguments);
+ context.debouncedSave();
+ return result;
+ };
+ }
+ context.hasEntity = (id2) => _history.graph().hasEntity(id2);
+ context.entity = (id2) => _history.graph().entity(id2);
+ let _mode;
+ context.mode = () => _mode;
+ context.enter = (newMode) => {
+ if (_mode) {
+ _mode.exit();
+ dispatch10.call("exit", this, _mode);
+ }
+ _mode = newMode;
+ _mode.enter();
+ dispatch10.call("enter", this, _mode);
+ };
+ context.selectedIDs = () => _mode && _mode.selectedIDs && _mode.selectedIDs() || [];
+ context.activeID = () => _mode && _mode.activeID && _mode.activeID();
+ let _selectedNoteID;
+ context.selectedNoteID = function(noteID) {
+ if (!arguments.length)
+ return _selectedNoteID;
+ _selectedNoteID = noteID;
+ return context;
+ };
+ let _selectedErrorID;
+ context.selectedErrorID = function(errorID) {
+ if (!arguments.length)
+ return _selectedErrorID;
+ _selectedErrorID = errorID;
+ return context;
+ };
+ context.install = (behavior) => context.surface().call(behavior);
+ context.uninstall = (behavior) => context.surface().call(behavior.off);
+ let _copyGraph;
+ context.copyGraph = () => _copyGraph;
+ let _copyIDs = [];
+ context.copyIDs = function(val) {
+ if (!arguments.length)
+ return _copyIDs;
+ _copyIDs = val;
+ _copyGraph = _history.graph();
+ return context;
+ };
+ let _copyLonLat;
+ context.copyLonLat = function(val) {
+ if (!arguments.length)
+ return _copyLonLat;
+ _copyLonLat = val;
+ return context;
+ };
+ let _background;
+ context.background = () => _background;
+ let _features;
+ context.features = () => _features;
+ context.hasHiddenConnections = (id2) => {
+ const graph = _history.graph();
+ const entity = graph.entity(id2);
+ return _features.hasHiddenConnections(entity, graph);
+ };
+ let _photos;
+ context.photos = () => _photos;
+ let _map;
+ context.map = () => _map;
+ context.layers = () => _map.layers();
+ context.surface = () => _map.surface;
+ context.editableDataEnabled = () => _map.editableDataEnabled();
+ context.surfaceRect = () => _map.surface.node().getBoundingClientRect();
+ context.editable = () => {
+ const mode = context.mode();
+ if (!mode || mode.id === "save")
+ return false;
+ return _map.editableDataEnabled();
+ };
+ let _debugFlags = {
+ tile: false,
+ collision: false,
+ imagery: false,
+ target: false,
+ downloaded: false
+ };
+ context.debugFlags = () => _debugFlags;
+ context.getDebug = (flag) => flag && _debugFlags[flag];
+ context.setDebug = function(flag, val) {
+ if (arguments.length === 1)
+ val = true;
+ _debugFlags[flag] = val;
+ dispatch10.call("change");
+ return context;
+ };
+ let _container = select_default2(null);
+ context.container = function(val) {
+ if (!arguments.length)
+ return _container;
+ _container = val;
+ _container.classed("ideditor", true);
+ return context;
+ };
+ context.containerNode = function(val) {
+ if (!arguments.length)
+ return context.container().node();
+ context.container(select_default2(val));
+ return context;
+ };
+ let _embed;
+ context.embed = function(val) {
+ if (!arguments.length)
+ return _embed;
+ _embed = val;
+ return context;
+ };
+ let _assetPath = "";
+ context.assetPath = function(val) {
+ if (!arguments.length)
+ return _assetPath;
+ _assetPath = val;
+ _mainFileFetcher.assetPath(val);
+ return context;
+ };
+ let _assetMap = {};
+ context.assetMap = function(val) {
+ if (!arguments.length)
+ return _assetMap;
+ _assetMap = val;
+ _mainFileFetcher.assetMap(val);
+ return context;
+ };
+ context.asset = (val) => {
+ if (/^http(s)?:\/\//i.test(val))
+ return val;
+ const filename = _assetPath + val;
+ return _assetMap[filename] || filename;
+ };
+ context.imagePath = (val) => context.asset(`img/${val}`);
+ context.reset = context.flush = () => {
+ context.debouncedSave.cancel();
+ Array.from(_deferred2).forEach((handle) => {
+ window.cancelIdleCallback(handle);
+ _deferred2.delete(handle);
+ });
+ Object.values(services).forEach((service) => {
+ if (service && typeof service.reset === "function") {
+ service.reset(context);
+ }
+ });
+ context.changeset = null;
+ _validator.reset();
+ _features.reset();
+ _history.reset();
+ _uploader.reset();
+ context.container().select(".inspector-wrap *").remove();
+ return context;
+ };
+ context.projection = geoRawMercator();
+ context.curtainProjection = geoRawMercator();
+ context.init = () => {
+ instantiateInternal();
+ initializeDependents();
+ return context;
+ function instantiateInternal() {
+ _history = coreHistory(context);
+ context.graph = _history.graph;
+ context.pauseChangeDispatch = _history.pauseChangeDispatch;
+ context.resumeChangeDispatch = _history.resumeChangeDispatch;
+ context.perform = withDebouncedSave(_history.perform);
+ context.replace = withDebouncedSave(_history.replace);
+ context.pop = withDebouncedSave(_history.pop);
+ context.overwrite = withDebouncedSave(_history.overwrite);
+ context.undo = withDebouncedSave(_history.undo);
+ context.redo = withDebouncedSave(_history.redo);
+ _validator = coreValidator(context);
+ _uploader = coreUploader(context);
+ _background = rendererBackground(context);
+ _features = rendererFeatures(context);
+ _map = rendererMap(context);
+ _photos = rendererPhotos(context);
+ _ui = uiInit(context);
+ }
+ function initializeDependents() {
+ if (context.initialHashParams.presets) {
+ _mainPresetIndex.addablePresetIDs(new Set(context.initialHashParams.presets.split(",")));
+ }
+ if (context.initialHashParams.locale) {
+ _mainLocalizer.preferredLocaleCodes(context.initialHashParams.locale);
+ }
+ _mainLocalizer.ensureLoaded();
+ _background.ensureLoaded();
+ _mainPresetIndex.ensureLoaded();
+ Object.values(services).forEach((service) => {
+ if (service && typeof service.init === "function") {
+ service.init();
+ }
+ });
+ _map.init();
+ _validator.init();
+ _features.init();
+ if (services.maprules && context.initialHashParams.maprules) {
+ json_default(context.initialHashParams.maprules).then((mapcss) => {
+ services.maprules.init();
+ mapcss.forEach((mapcssSelector) => services.maprules.addRule(mapcssSelector));
+ }).catch(() => {
+ });
+ }
+ if (!context.container().empty()) {
+ _ui.ensureLoaded().then(() => {
+ _photos.init();
+ });
+ }
+ }
+ };
+ return context;
+ }
+
+ // modules/services/nsi.js
+ var _nsiStatus = "loading";
+ var _nsi = {};
+ var buildingPreset = {
+ "building/commercial": true,
+ "building/government": true,
+ "building/hotel": true,
+ "building/retail": true,
+ "building/office": true,
+ "building/supermarket": true,
+ "building/yes": true
+ };
+ var notNames = /:(colou?r|type|forward|backward|left|right|etymology|pronunciation|wikipedia)$/i;
+ var notBranches = /(coop|express|wireless|factory|outlet)/i;
+ function setNsiSources() {
+ const nsiVersion = package_default.dependencies["name-suggestion-index"] || package_default.devDependencies["name-suggestion-index"];
+ const v = (0, import_vparse2.default)(nsiVersion);
+ const vMinor = `${v.major}.${v.minor}`;
+ const sources = {
+ "nsi_data": `https://cdn.jsdelivr.net/npm/name-suggestion-index@${vMinor}/dist/nsi.min.json`,
+ "nsi_dissolved": `https://cdn.jsdelivr.net/npm/name-suggestion-index@${vMinor}/dist/dissolved.min.json`,
+ "nsi_features": `https://cdn.jsdelivr.net/npm/name-suggestion-index@${vMinor}/dist/featureCollection.min.json`,
+ "nsi_generics": `https://cdn.jsdelivr.net/npm/name-suggestion-index@${vMinor}/dist/genericWords.min.json`,
+ "nsi_presets": `https://cdn.jsdelivr.net/npm/name-suggestion-index@${vMinor}/dist/presets/nsi-id-presets.min.json`,
+ "nsi_replacements": `https://cdn.jsdelivr.net/npm/name-suggestion-index@${vMinor}/dist/replacements.min.json`,
+ "nsi_trees": `https://cdn.jsdelivr.net/npm/name-suggestion-index@${vMinor}/dist/trees.min.json`
+ };
+ let fileMap = _mainFileFetcher.fileMap();
+ for (const k in sources) {
+ if (!fileMap[k])
+ fileMap[k] = sources[k];
+ }
+ }
+ function loadNsiPresets() {
+ return Promise.all([
+ _mainFileFetcher.get("nsi_presets"),
+ _mainFileFetcher.get("nsi_features")
+ ]).then((vals) => {
+ Object.values(vals[0].presets).forEach((preset) => preset.suggestion = true);
+ _mainPresetIndex.merge({
+ presets: vals[0].presets,
+ featureCollection: vals[1]
+ });
+ });
+ }
+ function loadNsiData() {
+ return Promise.all([
+ _mainFileFetcher.get("nsi_data"),
+ _mainFileFetcher.get("nsi_dissolved"),
+ _mainFileFetcher.get("nsi_replacements"),
+ _mainFileFetcher.get("nsi_trees")
+ ]).then((vals) => {
+ _nsi = {
+ data: vals[0].nsi,
+ dissolved: vals[1].dissolved,
+ replacements: vals[2].replacements,
+ trees: vals[3].trees,
+ kvt: /* @__PURE__ */ new Map(),
+ qids: /* @__PURE__ */ new Map(),
+ ids: /* @__PURE__ */ new Map()
+ };
+ _nsi.matcher = new Matcher();
+ _nsi.matcher.buildMatchIndex(_nsi.data);
+ _nsi.matcher.buildLocationIndex(_nsi.data, _mainLocations.loco());
+ Object.keys(_nsi.data).forEach((tkv) => {
+ const category = _nsi.data[tkv];
+ const parts = tkv.split("/", 3);
+ const t = parts[0];
+ const k = parts[1];
+ const v = parts[2];
+ let vmap = _nsi.kvt.get(k);
+ if (!vmap) {
+ vmap = /* @__PURE__ */ new Map();
+ _nsi.kvt.set(k, vmap);
+ }
+ vmap.set(v, t);
+ const tree = _nsi.trees[t];
+ const mainTag = tree.mainTag;
+ const items = category.items || [];
+ items.forEach((item) => {
+ item.tkv = tkv;
+ item.mainTag = mainTag;
+ _nsi.ids.set(item.id, item);
+ const wd = item.tags[mainTag];
+ const wp = item.tags[mainTag.replace("wikidata", "wikipedia")];
+ if (wd)
+ _nsi.qids.set(wd, wd);
+ if (wp && wd)
+ _nsi.qids.set(wp, wd);
+ });
+ });
+ });
+ }
+ function gatherKVs(tags) {
+ let primary = /* @__PURE__ */ new Set();
+ let alternate = /* @__PURE__ */ new Set();
+ Object.keys(tags).forEach((osmkey) => {
+ const osmvalue = tags[osmkey];
+ if (!osmvalue)
+ return;
+ if (osmkey === "route_master")
+ osmkey = "route";
+ const vmap = _nsi.kvt.get(osmkey);
+ if (!vmap)
+ return;
+ if (vmap.get(osmvalue)) {
+ primary.add(`${osmkey}/${osmvalue}`);
+ } else if (osmvalue === "yes") {
+ alternate.add(`${osmkey}/${osmvalue}`);
+ }
+ });
+ const preset = _mainPresetIndex.matchTags(tags, "area");
+ if (buildingPreset[preset.id]) {
+ alternate.add("building/yes");
+ }
+ return { primary, alternate };
+ }
+ function identifyTree(tags) {
+ let unknown;
+ let t;
+ Object.keys(tags).forEach((osmkey) => {
+ if (t)
+ return;
+ const osmvalue = tags[osmkey];
+ if (!osmvalue)
+ return;
+ if (osmkey === "route_master")
+ osmkey = "route";
+ const vmap = _nsi.kvt.get(osmkey);
+ if (!vmap)
+ return;
+ if (osmvalue === "yes") {
+ unknown = "unknown";
+ } else {
+ t = vmap.get(osmvalue);
+ }
+ });
+ return t || unknown || null;
+ }
+ function gatherNames(tags) {
+ const empty2 = { primary: /* @__PURE__ */ new Set(), alternate: /* @__PURE__ */ new Set() };
+ let primary = /* @__PURE__ */ new Set();
+ let alternate = /* @__PURE__ */ new Set();
+ let foundSemi = false;
+ let testNameFragments = false;
+ let patterns2;
+ let t = identifyTree(tags);
+ if (!t)
+ return empty2;
+ if (t === "transit") {
+ patterns2 = {
+ primary: /^network$/i,
+ alternate: /^(operator|operator:\w+|network:\w+|\w+_name|\w+_name:\w+)$/i
+ };
+ } else if (t === "flags") {
+ patterns2 = {
+ primary: /^(flag:name|flag:name:\w+)$/i,
+ alternate: /^(flag|flag:\w+|subject|subject:\w+)$/i
+ };
+ } else if (t === "brands") {
+ testNameFragments = true;
+ patterns2 = {
+ primary: /^(name|name:\w+)$/i,
+ alternate: /^(brand|brand:\w+|operator|operator:\w+|\w+_name|\w+_name:\w+)/i
+ };
+ } else if (t === "operators") {
+ testNameFragments = true;
+ patterns2 = {
+ primary: /^(name|name:\w+|operator|operator:\w+)$/i,
+ alternate: /^(brand|brand:\w+|\w+_name|\w+_name:\w+)/i
+ };
+ } else {
+ testNameFragments = true;
+ patterns2 = {
+ primary: /^(name|name:\w+)$/i,
+ alternate: /^(brand|brand:\w+|network|network:\w+|operator|operator:\w+|\w+_name|\w+_name:\w+)/i
+ };
+ }
+ if (tags.name && testNameFragments) {
+ const nameParts = tags.name.split(/[\s\-\/,.]/);
+ for (let split = nameParts.length; split > 0; split--) {
+ const name2 = nameParts.slice(0, split).join(" ");
+ primary.add(name2);
+ }
+ }
+ Object.keys(tags).forEach((osmkey) => {
+ const osmvalue = tags[osmkey];
+ if (!osmvalue)
+ return;
+ if (isNamelike(osmkey, "primary")) {
+ if (/;/.test(osmvalue)) {
+ foundSemi = true;
+ } else {
+ primary.add(osmvalue);
+ alternate.delete(osmvalue);
+ }
+ } else if (!primary.has(osmvalue) && isNamelike(osmkey, "alternate")) {
+ if (/;/.test(osmvalue)) {
+ foundSemi = true;
+ } else {
+ alternate.add(osmvalue);
+ }
+ }
+ });
+ if (tags.man_made === "flagpole" && !primary.size && !alternate.size && !!tags.country) {
+ const osmvalue = tags.country;
+ if (/;/.test(osmvalue)) {
+ foundSemi = true;
+ } else {
+ alternate.add(osmvalue);
+ }
+ }
+ if (foundSemi) {
+ return empty2;
+ } else {
+ return { primary, alternate };
+ }
+ function isNamelike(osmkey, which) {
+ if (osmkey === "old_name")
+ return false;
+ return patterns2[which].test(osmkey) && !notNames.test(osmkey);
+ }
+ }
+ function gatherTuples(tryKVs, tryNames) {
+ let tuples = [];
+ ["primary", "alternate"].forEach((whichName) => {
+ const arr = Array.from(tryNames[whichName]).sort((a, b) => b.length - a.length);
+ arr.forEach((n2) => {
+ ["primary", "alternate"].forEach((whichKV) => {
+ tryKVs[whichKV].forEach((kv) => {
+ const parts = kv.split("/", 2);
+ const k = parts[0];
+ const v = parts[1];
+ tuples.push({ k, v, n: n2 });
+ });
+ });
+ });
+ });
+ return tuples;
+ }
+ function _upgradeTags(tags, loc) {
+ let newTags = Object.assign({}, tags);
+ let changed = false;
+ Object.keys(newTags).forEach((osmkey) => {
+ const matchTag = osmkey.match(/^(\w+:)?wikidata$/);
+ if (matchTag) {
+ const prefix = matchTag[1] || "";
+ const wd = newTags[osmkey];
+ const replace = _nsi.replacements[wd];
+ if (replace && replace.wikidata !== void 0) {
+ changed = true;
+ if (replace.wikidata) {
+ newTags[osmkey] = replace.wikidata;
+ } else {
+ delete newTags[osmkey];
+ }
+ }
+ if (replace && replace.wikipedia !== void 0) {
+ changed = true;
+ const wpkey = `${prefix}wikipedia`;
+ if (replace.wikipedia) {
+ newTags[wpkey] = replace.wikipedia;
+ } else {
+ delete newTags[wpkey];
+ }
+ }
+ }
+ });
+ const isRouteMaster = tags.type === "route_master";
+ const tryKVs = gatherKVs(tags);
+ if (!tryKVs.primary.size && !tryKVs.alternate.size) {
+ return changed ? { newTags, matched: null } : null;
+ }
+ const tryNames = gatherNames(tags);
+ const foundQID = _nsi.qids.get(tags.wikidata) || _nsi.qids.get(tags.wikipedia);
+ if (foundQID)
+ tryNames.primary.add(foundQID);
+ if (!tryNames.primary.size && !tryNames.alternate.size) {
+ return changed ? { newTags, matched: null } : null;
+ }
+ const tuples = gatherTuples(tryKVs, tryNames);
+ let foundPrimary = false;
+ let bestItem;
+ for (let i2 = 0; i2 < tuples.length && !foundPrimary; i2++) {
+ const tuple = tuples[i2];
+ const hits = _nsi.matcher.match(tuple.k, tuple.v, tuple.n, loc);
+ if (!hits || !hits.length)
+ continue;
+ if (hits[0].match !== "primary" && hits[0].match !== "alternate")
+ break;
+ for (let j2 = 0; j2 < hits.length; j2++) {
+ const hit = hits[j2];
+ const isPrimary = hits[j2].match === "primary";
+ const itemID = hit.itemID;
+ if (_nsi.dissolved[itemID])
+ continue;
+ const item = _nsi.ids.get(itemID);
+ if (!item)
+ continue;
+ const mainTag = item.mainTag;
+ const itemQID = item.tags[mainTag];
+ const notQID = newTags[`not:${mainTag}`];
+ if (!itemQID || itemQID === notQID || newTags.office && !item.tags.office) {
+ continue;
+ }
+ if (!bestItem || isPrimary) {
+ bestItem = item;
+ if (isPrimary) {
+ foundPrimary = true;
+ }
+ break;
+ }
+ }
+ }
+ if (bestItem) {
+ const itemID = bestItem.id;
+ const item = JSON.parse(JSON.stringify(bestItem));
+ const tkv = item.tkv;
+ const parts = tkv.split("/", 3);
+ const k = parts[1];
+ const v = parts[2];
+ const category = _nsi.data[tkv];
+ const properties = category.properties || {};
+ let preserveTags = item.preserveTags || properties.preserveTags || [];
+ ["building", "emergency", "internet_access", "takeaway"].forEach((osmkey) => {
+ if (k !== osmkey)
+ preserveTags.push(`^${osmkey}$`);
+ });
+ const regexes = preserveTags.map((s) => new RegExp(s, "i"));
+ let keepTags = {};
+ Object.keys(newTags).forEach((osmkey) => {
+ if (regexes.some((regex) => regex.test(osmkey))) {
+ keepTags[osmkey] = newTags[osmkey];
+ }
+ });
+ _nsi.kvt.forEach((vmap, k2) => {
+ if (newTags[k2] === "yes")
+ delete newTags[k2];
+ });
+ if (foundQID) {
+ delete newTags.wikipedia;
+ delete newTags.wikidata;
+ }
+ Object.assign(newTags, item.tags, keepTags);
+ if (isRouteMaster) {
+ newTags.route_master = newTags.route;
+ delete newTags.route;
+ }
+ const origName = tags.name;
+ const newName = newTags.name;
+ if (newName && origName && newName !== origName && !newTags.branch) {
+ const newNames = gatherNames(newTags);
+ const newSet = /* @__PURE__ */ new Set([...newNames.primary, ...newNames.alternate]);
+ const isMoved = newSet.has(origName);
+ if (!isMoved) {
+ const nameParts = origName.split(/[\s\-\/,.]/);
+ for (let split = nameParts.length; split > 0; split--) {
+ const name2 = nameParts.slice(0, split).join(" ");
+ const branch = nameParts.slice(split).join(" ");
+ const nameHits = _nsi.matcher.match(k, v, name2, loc);
+ if (!nameHits || !nameHits.length)
+ continue;
+ if (nameHits.some((hit) => hit.itemID === itemID)) {
+ if (branch) {
+ if (notBranches.test(branch)) {
+ newTags.name = origName;
+ } else {
+ const branchHits = _nsi.matcher.match(k, v, branch, loc);
+ if (branchHits && branchHits.length) {
+ if (branchHits[0].match === "primary" || branchHits[0].match === "alternate") {
+ return null;
+ }
+ } else {
+ newTags.branch = branch;
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ return { newTags, matched: item };
+ }
+ return changed ? { newTags, matched: null } : null;
+ }
+ function _isGenericName(tags) {
+ const n2 = tags.name;
+ if (!n2)
+ return false;
+ const tryNames = { primary: /* @__PURE__ */ new Set([n2]), alternate: /* @__PURE__ */ new Set() };
+ const tryKVs = gatherKVs(tags);
+ if (!tryKVs.primary.size && !tryKVs.alternate.size)
+ return false;
+ const tuples = gatherTuples(tryKVs, tryNames);
+ for (let i2 = 0; i2 < tuples.length; i2++) {
+ const tuple = tuples[i2];
+ const hits = _nsi.matcher.match(tuple.k, tuple.v, tuple.n);
+ if (hits && hits.length && hits[0].match === "excludeGeneric")
+ return true;
+ }
+ return false;
+ }
+ var nsi_default = {
+ init: () => {
+ setNsiSources();
+ _mainPresetIndex.ensureLoaded().then(() => loadNsiPresets()).then(() => delay(100)).then(() => _mainLocations.mergeLocationSets([])).then(() => loadNsiData()).then(() => _nsiStatus = "ok").catch(() => _nsiStatus = "failed");
+ function delay(msec) {
+ return new Promise((resolve) => {
+ window.setTimeout(resolve, msec);
+ });
+ }
+ },
+ reset: () => {
+ },
+ status: () => _nsiStatus,
+ isGenericName: (tags) => _isGenericName(tags),
+ upgradeTags: (tags, loc) => _upgradeTags(tags, loc),
+ cache: () => _nsi
+ };
+
+ // modules/services/kartaview.js
+ var import_rbush8 = __toESM(require_rbush_min());
+ var apibase2 = "https://kartaview.org";
+ var maxResults = 1e3;
+ var tileZoom = 14;
+ var tiler4 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
+ var dispatch6 = dispatch_default("loadedImages");
+ var imgZoom = zoom_default2().extent([[0, 0], [320, 240]]).translateExtent([[0, 0], [320, 240]]).scaleExtent([1, 15]);
+ var _oscCache;
+ var _oscSelectedImage;
+ var _loadViewerPromise2;
+ function abortRequest4(controller) {
+ controller.abort();
+ }
+ function maxPageAtZoom(z) {
+ if (z < 15)
+ return 2;
+ if (z === 15)
+ return 5;
+ if (z === 16)
+ return 10;
+ if (z === 17)
+ return 20;
+ if (z === 18)
+ return 40;
+ if (z > 18)
+ return 80;
+ }
+ function loadTiles2(which, url, projection2) {
+ var currZoom = Math.floor(geoScaleToZoom(projection2.scale()));
+ var tiles = tiler4.getTiles(projection2);
+ var cache = _oscCache[which];
+ Object.keys(cache.inflight).forEach(function(k) {
+ var wanted = tiles.find(function(tile) {
+ return k.indexOf(tile.id + ",") === 0;
+ });
+ if (!wanted) {
+ abortRequest4(cache.inflight[k]);
+ delete cache.inflight[k];
+ }
+ });
+ tiles.forEach(function(tile) {
+ loadNextTilePage(which, currZoom, url, tile);
+ });
+ }
+ function loadNextTilePage(which, currZoom, url, tile) {
+ var cache = _oscCache[which];
+ var bbox = tile.extent.bbox();
+ var maxPages = maxPageAtZoom(currZoom);
+ var nextPage = cache.nextPage[tile.id] || 1;
+ var params = utilQsString({
+ ipp: maxResults,
+ page: nextPage,
+ bbTopLeft: [bbox.maxY, bbox.minX].join(","),
+ bbBottomRight: [bbox.minY, bbox.maxX].join(",")
+ }, true);
+ if (nextPage > maxPages)
+ return;
+ var id2 = tile.id + "," + String(nextPage);
+ if (cache.loaded[id2] || cache.inflight[id2])
+ return;
+ var controller = new AbortController();
+ cache.inflight[id2] = controller;
+ var options2 = {
+ method: "POST",
+ signal: controller.signal,
+ body: params,
+ headers: { "Content-Type": "application/x-www-form-urlencoded" }
+ };
+ json_default(url, options2).then(function(data) {
+ cache.loaded[id2] = true;
+ delete cache.inflight[id2];
+ if (!data || !data.currentPageItems || !data.currentPageItems.length) {
+ throw new Error("No Data");
+ }
+ var features2 = data.currentPageItems.map(function(item) {
+ var loc = [+item.lng, +item.lat];
+ var d;
+ if (which === "images") {
+ d = {
+ loc,
+ key: item.id,
+ ca: +item.heading,
+ captured_at: item.shot_date || item.date_added,
+ captured_by: item.username,
+ imagePath: item.lth_name,
+ sequence_id: item.sequence_id,
+ sequence_index: +item.sequence_index
+ };
+ var seq = _oscCache.sequences[d.sequence_id];
+ if (!seq) {
+ seq = { rotation: 0, images: [] };
+ _oscCache.sequences[d.sequence_id] = seq;
+ }
+ seq.images[d.sequence_index] = d;
+ _oscCache.images.forImageKey[d.key] = d;
+ }
+ return {
+ minX: loc[0],
+ minY: loc[1],
+ maxX: loc[0],
+ maxY: loc[1],
+ data: d
+ };
+ });
+ cache.rtree.load(features2);
+ if (data.currentPageItems.length === maxResults) {
+ cache.nextPage[tile.id] = nextPage + 1;
+ loadNextTilePage(which, currZoom, url, tile);
+ } else {
+ cache.nextPage[tile.id] = Infinity;
+ }
+ if (which === "images") {
+ dispatch6.call("loadedImages");
+ }
+ }).catch(function() {
+ cache.loaded[id2] = true;
+ delete cache.inflight[id2];
+ });
+ }
+ function partitionViewport2(projection2) {
+ var z = geoScaleToZoom(projection2.scale());
+ var z2 = Math.ceil(z * 2) / 2 + 2.5;
+ var tiler8 = utilTiler().zoomExtent([z2, z2]);
+ return tiler8.getTiles(projection2).map(function(tile) {
+ return tile.extent;
+ });
+ }
+ function searchLimited2(limit, projection2, rtree) {
+ limit = limit || 5;
+ return partitionViewport2(projection2).reduce(function(result, extent) {
+ var found = rtree.search(extent.bbox()).slice(0, limit).map(function(d) {
+ return d.data;
+ });
+ return found.length ? result.concat(found) : result;
+ }, []);
+ }
+ var kartaview_default = {
+ init: function() {
+ if (!_oscCache) {
+ this.reset();
+ }
+ this.event = utilRebind(this, dispatch6, "on");
+ },
+ reset: function() {
+ if (_oscCache) {
+ Object.values(_oscCache.images.inflight).forEach(abortRequest4);
+ }
+ _oscCache = {
+ images: { inflight: {}, loaded: {}, nextPage: {}, rtree: new import_rbush8.default(), forImageKey: {} },
+ sequences: {}
+ };
+ _oscSelectedImage = null;
+ },
+ images: function(projection2) {
+ var limit = 5;
+ return searchLimited2(limit, projection2, _oscCache.images.rtree);
+ },
+ sequences: function(projection2) {
+ var viewport = projection2.clipExtent();
+ var min3 = [viewport[0][0], viewport[1][1]];
+ var max3 = [viewport[1][0], viewport[0][1]];
+ var bbox = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
+ var sequenceKeys = {};
+ _oscCache.images.rtree.search(bbox).forEach(function(d) {
+ sequenceKeys[d.data.sequence_id] = true;
+ });
+ var lineStrings = [];
+ Object.keys(sequenceKeys).forEach(function(sequenceKey) {
+ var seq = _oscCache.sequences[sequenceKey];
+ var images = seq && seq.images;
+ if (images) {
+ lineStrings.push({
+ type: "LineString",
+ coordinates: images.map(function(d) {
+ return d.loc;
+ }).filter(Boolean),
+ properties: {
+ captured_at: images[0] ? images[0].captured_at : null,
+ captured_by: images[0] ? images[0].captured_by : null,
+ key: sequenceKey
+ }
+ });
+ }
+ });
+ return lineStrings;
+ },
+ cachedImage: function(imageKey) {
+ return _oscCache.images.forImageKey[imageKey];
+ },
+ loadImages: function(projection2) {
+ var url = apibase2 + "/1.0/list/nearby-photos/";
+ loadTiles2("images", url, projection2);
+ },
+ ensureViewerLoaded: function(context) {
+ if (_loadViewerPromise2)
+ return _loadViewerPromise2;
+ var wrap2 = context.container().select(".photoviewer").selectAll(".kartaview-wrapper").data([0]);
+ var that = this;
+ var wrapEnter = wrap2.enter().append("div").attr("class", "photo-wrapper kartaview-wrapper").classed("hide", true).call(imgZoom.on("zoom", zoomPan)).on("dblclick.zoom", null);
+ wrapEnter.append("div").attr("class", "photo-attribution fillD");
+ var controlsEnter = wrapEnter.append("div").attr("class", "photo-controls-wrap").append("div").attr("class", "photo-controls");
+ controlsEnter.append("button").on("click.back", step(-1)).text("\u25C4");
+ controlsEnter.append("button").on("click.rotate-ccw", rotate(-90)).text("\u293F");
+ controlsEnter.append("button").on("click.rotate-cw", rotate(90)).text("\u293E");
+ controlsEnter.append("button").on("click.forward", step(1)).text("\u25BA");
+ wrapEnter.append("div").attr("class", "kartaview-image-wrap");
+ context.ui().photoviewer.on("resize.kartaview", function(dimensions) {
+ imgZoom = zoom_default2().extent([[0, 0], dimensions]).translateExtent([[0, 0], dimensions]).scaleExtent([1, 15]).on("zoom", zoomPan);
+ });
+ function zoomPan(d3_event) {
+ var t = d3_event.transform;
+ context.container().select(".photoviewer .kartaview-image-wrap").call(utilSetTransform, t.x, t.y, t.k);
+ }
+ function rotate(deg) {
+ return function() {
+ if (!_oscSelectedImage)
+ return;
+ var sequenceKey = _oscSelectedImage.sequence_id;
+ var sequence = _oscCache.sequences[sequenceKey];
+ if (!sequence)
+ return;
+ var r = sequence.rotation || 0;
+ r += deg;
+ if (r > 180)
+ r -= 360;
+ if (r < -180)
+ r += 360;
+ sequence.rotation = r;
+ var wrap3 = context.container().select(".photoviewer .kartaview-wrapper");
+ wrap3.transition().duration(100).call(imgZoom.transform, identity2);
+ wrap3.selectAll(".kartaview-image").transition().duration(100).style("transform", "rotate(" + r + "deg)");
+ };
+ }
+ function step(stepBy) {
+ return function() {
+ if (!_oscSelectedImage)
+ return;
+ var sequenceKey = _oscSelectedImage.sequence_id;
+ var sequence = _oscCache.sequences[sequenceKey];
+ if (!sequence)
+ return;
+ var nextIndex = _oscSelectedImage.sequence_index + stepBy;
+ var nextImage = sequence.images[nextIndex];
+ if (!nextImage)
+ return;
+ context.map().centerEase(nextImage.loc);
+ that.selectImage(context, nextImage.key);
+ };
+ }
+ _loadViewerPromise2 = Promise.resolve();
+ return _loadViewerPromise2;
+ },
+ showViewer: function(context) {
+ var viewer = context.container().select(".photoviewer").classed("hide", false);
+ var isHidden = viewer.selectAll(".photo-wrapper.kartaview-wrapper.hide").size();
+ if (isHidden) {
+ viewer.selectAll(".photo-wrapper:not(.kartaview-wrapper)").classed("hide", true);
+ viewer.selectAll(".photo-wrapper.kartaview-wrapper").classed("hide", false);
+ }
+ return this;
+ },
+ hideViewer: function(context) {
+ _oscSelectedImage = null;
+ this.updateUrlImage(null);
+ var viewer = context.container().select(".photoviewer");
+ if (!viewer.empty())
+ viewer.datum(null);
+ viewer.classed("hide", true).selectAll(".photo-wrapper").classed("hide", true);
+ context.container().selectAll(".viewfield-group, .sequence, .icon-sign").classed("currentView", false);
+ return this.setStyles(context, null, true);
+ },
+ selectImage: function(context, imageKey) {
+ var d = this.cachedImage(imageKey);
+ _oscSelectedImage = d;
+ this.updateUrlImage(imageKey);
+ var viewer = context.container().select(".photoviewer");
+ if (!viewer.empty())
+ viewer.datum(d);
+ this.setStyles(context, null, true);
+ context.container().selectAll(".icon-sign").classed("currentView", false);
+ if (!d)
+ return this;
+ var wrap2 = context.container().select(".photoviewer .kartaview-wrapper");
+ var imageWrap = wrap2.selectAll(".kartaview-image-wrap");
+ var attribution = wrap2.selectAll(".photo-attribution").text("");
+ wrap2.transition().duration(100).call(imgZoom.transform, identity2);
+ imageWrap.selectAll(".kartaview-image").remove();
+ if (d) {
+ var sequence = _oscCache.sequences[d.sequence_id];
+ var r = sequence && sequence.rotation || 0;
+ imageWrap.append("img").attr("class", "kartaview-image").attr("src", apibase2 + "/" + d.imagePath).style("transform", "rotate(" + r + "deg)");
+ if (d.captured_by) {
+ attribution.append("a").attr("class", "captured_by").attr("target", "_blank").attr("href", "https://kartaview.org/user/" + encodeURIComponent(d.captured_by)).text("@" + d.captured_by);
+ attribution.append("span").text("|");
+ }
+ if (d.captured_at) {
+ attribution.append("span").attr("class", "captured_at").text(localeDateString2(d.captured_at));
+ attribution.append("span").text("|");
+ }
+ attribution.append("a").attr("class", "image-link").attr("target", "_blank").attr("href", "https://kartaview.org/details/" + d.sequence_id + "/" + d.sequence_index).text("kartaview.org");
+ }
+ return this;
+ function localeDateString2(s) {
+ if (!s)
+ return null;
+ var options2 = { day: "numeric", month: "short", year: "numeric" };
+ var d2 = new Date(s);
+ if (isNaN(d2.getTime()))
+ return null;
+ return d2.toLocaleDateString(_mainLocalizer.localeCode(), options2);
+ }
+ },
+ getSelectedImage: function() {
+ return _oscSelectedImage;
+ },
+ getSequenceKeyForImage: function(d) {
+ return d && d.sequence_id;
+ },
+ setStyles: function(context, hovered, reset) {
+ if (reset) {
+ context.container().selectAll(".viewfield-group").classed("highlighted", false).classed("hovered", false).classed("currentView", false);
+ context.container().selectAll(".sequence").classed("highlighted", false).classed("currentView", false);
+ }
+ var hoveredImageKey = hovered && hovered.key;
+ var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
+ var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
+ var hoveredImageKeys = hoveredSequence && hoveredSequence.images.map(function(d) {
+ return d.key;
+ }) || [];
+ var viewer = context.container().select(".photoviewer");
+ var selected = viewer.empty() ? void 0 : viewer.datum();
+ var selectedImageKey = selected && selected.key;
+ var selectedSequenceKey = this.getSequenceKeyForImage(selected);
+ var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
+ var selectedImageKeys = selectedSequence && selectedSequence.images.map(function(d) {
+ return d.key;
+ }) || [];
+ var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
+ context.container().selectAll(".layer-kartaview .viewfield-group").classed("highlighted", function(d) {
+ return highlightedImageKeys.indexOf(d.key) !== -1;
+ }).classed("hovered", function(d) {
+ return d.key === hoveredImageKey;
+ }).classed("currentView", function(d) {
+ return d.key === selectedImageKey;
+ });
+ context.container().selectAll(".layer-kartaview .sequence").classed("highlighted", function(d) {
+ return d.properties.key === hoveredSequenceKey;
+ }).classed("currentView", function(d) {
+ return d.properties.key === selectedSequenceKey;
+ });
+ context.container().selectAll(".layer-kartaview .viewfield-group .viewfield").attr("d", viewfieldPath);
+ function viewfieldPath() {
+ var d = this.parentNode.__data__;
+ if (d.pano && d.key !== selectedImageKey) {
+ return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0";
+ } else {
+ return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z";
+ }
+ }
+ return this;
+ },
+ updateUrlImage: function(imageKey) {
+ if (!window.mocha) {
+ var hash = utilStringQs(window.location.hash);
+ if (imageKey) {
+ hash.photo = "kartaview/" + imageKey;
+ } else {
+ delete hash.photo;
+ }
+ window.location.replace("#" + utilQsString(hash, true));
+ }
+ },
+ cache: function() {
+ return _oscCache;
+ }
+ };
+
+ // node_modules/osm-auth/src/osm-auth.mjs
+ var import_store = __toESM(require_store_legacy(), 1);
+ function osmAuth(o) {
+ var oauth2 = {};
+ oauth2.authenticated = function() {
+ return !!token("oauth2_access_token");
+ };
+ oauth2.logout = function() {
+ token("oauth2_access_token", "");
+ token("oauth_token", "");
+ token("oauth_token_secret", "");
+ token("oauth_request_token_secret", "");
+ return oauth2;
+ };
+ oauth2.authenticate = function(callback) {
+ if (oauth2.authenticated()) {
+ callback(null, oauth2);
+ return;
+ }
+ oauth2.logout();
+ var url = o.url + "/oauth2/authorize?" + utilQsString2({
+ client_id: o.client_id,
+ redirect_uri: o.redirect_uri,
+ response_type: "code",
+ scope: o.scope
+ });
+ if (!o.singlepage) {
+ var w = 600;
+ var h = 550;
+ var settings = [
+ ["width", w],
+ ["height", h],
+ ["left", screen.width / 2 - w / 2],
+ ["top", screen.height / 2 - h / 2]
+ ].map(function(x) {
+ return x.join("=");
+ }).join(",");
+ var popup = window.open("about:blank", "oauth_window", settings);
+ oauth2.popupWindow = popup;
+ popup.location = url;
+ if (!popup) {
+ var error = new Error("Popup was blocked");
+ error.status = "popup-blocked";
+ throw error;
+ }
+ }
+ window.authComplete = function(url2) {
+ var params = utilStringQs2(url2.split("?")[1]);
+ getAccessToken(params.code);
+ delete window.authComplete;
+ };
+ function getAccessToken(auth_code) {
+ var url2 = o.url + "/oauth2/token?" + utilQsString2({
+ client_id: o.client_id,
+ grant_type: "authorization_code",
+ code: auth_code,
+ redirect_uri: o.redirect_uri,
+ client_secret: o.client_secret
+ });
+ oauth2.rawxhr("POST", url2, null, null, null, accessTokenDone);
+ o.loading();
+ }
+ function accessTokenDone(err, xhr) {
+ o.done();
+ if (err) {
+ callback(err);
+ return;
+ }
+ var access_token = JSON.parse(xhr.response);
+ token("oauth2_access_token", access_token.access_token);
+ callback(null, oauth2);
+ }
+ };
+ oauth2.bringPopupWindowToFront = function() {
+ var broughtPopupToFront = false;
+ try {
+ if (oauth2.popupWindow && !oauth2.popupWindow.closed) {
+ oauth2.popupWindow.focus();
+ broughtPopupToFront = true;
+ }
+ } catch (err) {
+ }
+ return broughtPopupToFront;
+ };
+ oauth2.bootstrapToken = function(auth_code, callback) {
+ function getAccessToken(auth_code2) {
+ var url = o.url + "/oauth2/token?" + utilQsString2({
+ client_id: o.client_id,
+ grant_type: "authorization_code",
+ code: auth_code2,
+ redirect_uri: o.redirect_uri,
+ client_secret: o.client_secret
+ });
+ oauth2.rawxhr("POST", url, null, null, null, accessTokenDone);
+ o.loading();
+ }
+ function accessTokenDone(err, xhr) {
+ o.done();
+ if (err) {
+ callback(err);
+ return;
+ }
+ var access_token = JSON.parse(xhr.response);
+ token("oauth2_access_token", access_token.access_token);
+ callback(null, oauth2);
+ }
+ getAccessToken(auth_code);
+ };
+ oauth2.xhr = function(options2, callback) {
+ if (oauth2.authenticated()) {
+ return run();
+ } else {
+ if (o.auto) {
+ oauth2.authenticate(run);
+ return;
+ } else {
+ callback("not authenticated", null);
+ return;
+ }
+ }
+ function run() {
+ var url = options2.prefix !== false ? o.url + options2.path : options2.path;
+ return oauth2.rawxhr(options2.method, url, token("oauth2_access_token"), options2.content, options2.headers, done);
+ }
+ function done(err, xhr) {
+ if (err) {
+ callback(err);
+ } else if (xhr.responseXML) {
+ callback(err, xhr.responseXML);
+ } else {
+ callback(err, xhr.response);
+ }
+ }
+ };
+ oauth2.rawxhr = function(method, url, access_token, data, headers, callback) {
+ headers = headers || { "Content-Type": "application/x-www-form-urlencoded" };
+ if (access_token) {
+ headers.Authorization = "Bearer " + access_token;
+ }
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState === 4 && xhr.status !== 0) {
+ if (/^20\d$/.test(xhr.status)) {
+ callback(null, xhr);
+ } else {
+ callback(xhr, null);
+ }
+ }
+ };
+ xhr.onerror = function(e) {
+ callback(e, null);
+ };
+ xhr.open(method, url, true);
+ for (var h in headers)
+ xhr.setRequestHeader(h, headers[h]);
+ xhr.send(data);
+ return xhr;
+ };
+ oauth2.preauth = function(val) {
+ if (val && val.access_token) {
+ token("oauth2_access_token", val.access_token);
+ }
+ return oauth2;
+ };
+ oauth2.options = function(val) {
+ if (!arguments.length)
+ return o;
+ o = val;
+ o.url = o.url || "https://www.openstreetmap.org";
+ o.auto = o.auto || false;
+ o.singlepage = o.singlepage || false;
+ o.loading = o.loading || function() {
+ };
+ o.done = o.done || function() {
+ };
+ return oauth2.preauth(o);
+ };
+ var token;
+ if (import_store.default.enabled) {
+ token = function(x, y) {
+ if (arguments.length === 1)
+ return import_store.default.get(o.url + x);
+ else if (arguments.length === 2)
+ return import_store.default.set(o.url + x, y);
+ };
+ } else {
+ var storage = {};
+ token = function(x, y) {
+ if (arguments.length === 1)
+ return storage[o.url + x];
+ else if (arguments.length === 2)
+ return storage[o.url + x] = y;
+ };
+ }
+ oauth2.options(o);
+ return oauth2;
+ }
+ function utilQsString2(obj) {
+ return Object.keys(obj).sort().map(function(key) {
+ return encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]);
+ }).join("&");
+ }
+ function utilStringQs2(str2) {
+ var i2 = 0;
+ while (i2 < str2.length && (str2[i2] === "?" || str2[i2] === "#"))
+ i2++;
+ str2 = str2.slice(i2);
+ return str2.split("&").reduce(function(obj, pair2) {
+ var parts = pair2.split("=");
+ if (parts.length === 2) {
+ obj[parts[0]] = decodeURIComponent(parts[1]);
+ }
+ return obj;
+ }, {});
+ }
+
+ // modules/services/osm.js
+ var import_rbush9 = __toESM(require_rbush_min());
+ var tiler5 = utilTiler();
+ var dispatch7 = dispatch_default("apiStatusChange", "authLoading", "authDone", "change", "loading", "loaded", "loadedNotes");
+ var urlroot = "https://www.openstreetmap.org";
+ var redirectPath = window.location.origin + window.location.pathname;
+ var oauth = osmAuth({
+ url: urlroot,
+ client_id: "0tmNTmd0Jo1dQp4AUmMBLtGiD9YpMuXzHefitcuVStc",
+ client_secret: "BTlNrNxIPitHdL4sP2clHw5KLoee9aKkA7dQbc0Bj7Q",
+ scope: "read_prefs write_prefs write_api read_gpx write_notes",
+ redirect_uri: redirectPath + "land.html",
+ loading: authLoading,
+ done: authDone
+ });
+ var _imageryBlocklists = [/.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/];
+ var _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: new import_rbush9.default() };
+ var _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: new import_rbush9.default() };
+ var _userCache = { toLoad: {}, user: {} };
+ var _cachedApiStatus;
+ var _changeset = {};
+ var _deferred = /* @__PURE__ */ new Set();
+ var _connectionID = 1;
+ var _tileZoom4 = 16;
+ var _noteZoom = 12;
+ var _rateLimitError;
+ var _userChangesets;
+ var _userDetails;
+ var _off;
+ var _maxWayNodes = 2e3;
+ function authLoading() {
+ dispatch7.call("authLoading");
+ }
+ function authDone() {
+ dispatch7.call("authDone");
+ }
+ function abortRequest5(controllerOrXHR) {
+ if (controllerOrXHR) {
+ controllerOrXHR.abort();
+ }
+ }
+ function hasInflightRequests(cache) {
+ return Object.keys(cache.inflight).length;
+ }
+ function abortUnwantedRequests4(cache, visibleTiles) {
+ Object.keys(cache.inflight).forEach(function(k) {
+ if (cache.toLoad[k])
+ return;
+ if (visibleTiles.find(function(tile) {
+ return k === tile.id;
+ }))
+ return;
+ abortRequest5(cache.inflight[k]);
+ delete cache.inflight[k];
+ });
+ }
+ function getLoc(attrs) {
+ var lon = attrs.lon && attrs.lon.value;
+ var lat = attrs.lat && attrs.lat.value;
+ return [parseFloat(lon), parseFloat(lat)];
+ }
+ function getNodes(obj) {
+ var elems = obj.getElementsByTagName("nd");
+ var nodes = new Array(elems.length);
+ for (var i2 = 0, l = elems.length; i2 < l; i2++) {
+ nodes[i2] = "n" + elems[i2].attributes.ref.value;
+ }
+ return nodes;
+ }
+ function getNodesJSON(obj) {
+ var elems = obj.nodes;
+ var nodes = new Array(elems.length);
+ for (var i2 = 0, l = elems.length; i2 < l; i2++) {
+ nodes[i2] = "n" + elems[i2];
+ }
+ return nodes;
+ }
+ function getTags(obj) {
+ var elems = obj.getElementsByTagName("tag");
+ var tags = {};
+ for (var i2 = 0, l = elems.length; i2 < l; i2++) {
+ var attrs = elems[i2].attributes;
+ tags[attrs.k.value] = attrs.v.value;
+ }
+ return tags;
+ }
+ function getMembers(obj) {
+ var elems = obj.getElementsByTagName("member");
+ var members = new Array(elems.length);
+ for (var i2 = 0, l = elems.length; i2 < l; i2++) {
+ var attrs = elems[i2].attributes;
+ members[i2] = {
+ id: attrs.type.value[0] + attrs.ref.value,
+ type: attrs.type.value,
+ role: attrs.role.value
+ };
+ }
+ return members;
+ }
+ function getMembersJSON(obj) {
+ var elems = obj.members;
+ var members = new Array(elems.length);
+ for (var i2 = 0, l = elems.length; i2 < l; i2++) {
+ var attrs = elems[i2];
+ members[i2] = {
+ id: attrs.type[0] + attrs.ref,
+ type: attrs.type,
+ role: attrs.role
+ };
+ }
+ return members;
+ }
+ function getVisible(attrs) {
+ return !attrs.visible || attrs.visible.value !== "false";
+ }
+ function parseComments(comments) {
+ var parsedComments = [];
+ for (var i2 = 0; i2 < comments.length; i2++) {
+ var comment = comments[i2];
+ if (comment.nodeName === "comment") {
+ var childNodes = comment.childNodes;
+ var parsedComment = {};
+ for (var j2 = 0; j2 < childNodes.length; j2++) {
+ var node = childNodes[j2];
+ var nodeName = node.nodeName;
+ if (nodeName === "#text")
+ continue;
+ parsedComment[nodeName] = node.textContent;
+ if (nodeName === "uid") {
+ var uid = node.textContent;
+ if (uid && !_userCache.user[uid]) {
+ _userCache.toLoad[uid] = true;
+ }
+ }
+ }
+ if (parsedComment) {
+ parsedComments.push(parsedComment);
+ }
+ }
+ }
+ return parsedComments;
+ }
+ function encodeNoteRtree(note) {
+ return {
+ minX: note.loc[0],
+ minY: note.loc[1],
+ maxX: note.loc[0],
+ maxY: note.loc[1],
+ data: note
+ };
+ }
+ var jsonparsers = {
+ node: function nodeData(obj, uid) {
+ return new osmNode({
+ id: uid,
+ visible: typeof obj.visible === "boolean" ? obj.visible : true,
+ version: obj.version && obj.version.toString(),
+ changeset: obj.changeset && obj.changeset.toString(),
+ timestamp: obj.timestamp,
+ user: obj.user,
+ uid: obj.uid && obj.uid.toString(),
+ loc: [parseFloat(obj.lon), parseFloat(obj.lat)],
+ tags: obj.tags
+ });
+ },
+ way: function wayData(obj, uid) {
+ return new osmWay({
+ id: uid,
+ visible: typeof obj.visible === "boolean" ? obj.visible : true,
+ version: obj.version && obj.version.toString(),
+ changeset: obj.changeset && obj.changeset.toString(),
+ timestamp: obj.timestamp,
+ user: obj.user,
+ uid: obj.uid && obj.uid.toString(),
+ tags: obj.tags,
+ nodes: getNodesJSON(obj)
+ });
+ },
+ relation: function relationData(obj, uid) {
+ return new osmRelation({
+ id: uid,
+ visible: typeof obj.visible === "boolean" ? obj.visible : true,
+ version: obj.version && obj.version.toString(),
+ changeset: obj.changeset && obj.changeset.toString(),
+ timestamp: obj.timestamp,
+ user: obj.user,
+ uid: obj.uid && obj.uid.toString(),
+ tags: obj.tags,
+ members: getMembersJSON(obj)
+ });
+ },
+ user: function parseUser(obj, uid) {
+ return {
+ id: uid,
+ display_name: obj.display_name,
+ account_created: obj.account_created,
+ image_url: obj.img && obj.img.href,
+ changesets_count: obj.changesets && obj.changesets.count && obj.changesets.count.toString() || "0",
+ active_blocks: obj.blocks && obj.blocks.received && obj.blocks.received.active && obj.blocks.received.active.toString() || "0"
+ };
+ }
+ };
+ function parseJSON(payload, callback, options2) {
+ options2 = Object.assign({ skipSeen: true }, options2);
+ if (!payload) {
+ return callback({ message: "No JSON", status: -1 });
+ }
+ var json = payload;
+ if (typeof json !== "object")
+ json = JSON.parse(payload);
+ if (!json.elements)
+ return callback({ message: "No JSON", status: -1 });
+ var children2 = json.elements;
+ var handle = window.requestIdleCallback(function() {
+ _deferred.delete(handle);
+ var results = [];
+ var result;
+ for (var i2 = 0; i2 < children2.length; i2++) {
+ result = parseChild(children2[i2]);
+ if (result)
+ results.push(result);
+ }
+ callback(null, results);
+ });
+ _deferred.add(handle);
+ function parseChild(child) {
+ var parser3 = jsonparsers[child.type];
+ if (!parser3)
+ return null;
+ var uid;
+ uid = osmEntity.id.fromOSM(child.type, child.id);
+ if (options2.skipSeen) {
+ if (_tileCache.seen[uid])
+ return null;
+ _tileCache.seen[uid] = true;
+ }
+ return parser3(child, uid);
+ }
+ }
+ function parseUserJSON(payload, callback, options2) {
+ options2 = Object.assign({ skipSeen: true }, options2);
+ if (!payload) {
+ return callback({ message: "No JSON", status: -1 });
+ }
+ var json = payload;
+ if (typeof json !== "object")
+ json = JSON.parse(payload);
+ if (!json.users && !json.user)
+ return callback({ message: "No JSON", status: -1 });
+ var objs = json.users || [json];
+ var handle = window.requestIdleCallback(function() {
+ _deferred.delete(handle);
+ var results = [];
+ var result;
+ for (var i2 = 0; i2 < objs.length; i2++) {
+ result = parseObj(objs[i2]);
+ if (result)
+ results.push(result);
+ }
+ callback(null, results);
+ });
+ _deferred.add(handle);
+ function parseObj(obj) {
+ var uid = obj.user.id && obj.user.id.toString();
+ if (options2.skipSeen && _userCache.user[uid]) {
+ delete _userCache.toLoad[uid];
+ return null;
+ }
+ var user = jsonparsers.user(obj.user, uid);
+ _userCache.user[uid] = user;
+ delete _userCache.toLoad[uid];
+ return user;
+ }
+ }
+ var parsers = {
+ node: function nodeData2(obj, uid) {
+ var attrs = obj.attributes;
+ return new osmNode({
+ id: uid,
+ visible: getVisible(attrs),
+ version: attrs.version.value,
+ changeset: attrs.changeset && attrs.changeset.value,
+ timestamp: attrs.timestamp && attrs.timestamp.value,
+ user: attrs.user && attrs.user.value,
+ uid: attrs.uid && attrs.uid.value,
+ loc: getLoc(attrs),
+ tags: getTags(obj)
+ });
+ },
+ way: function wayData2(obj, uid) {
+ var attrs = obj.attributes;
+ return new osmWay({
+ id: uid,
+ visible: getVisible(attrs),
+ version: attrs.version.value,
+ changeset: attrs.changeset && attrs.changeset.value,
+ timestamp: attrs.timestamp && attrs.timestamp.value,
+ user: attrs.user && attrs.user.value,
+ uid: attrs.uid && attrs.uid.value,
+ tags: getTags(obj),
+ nodes: getNodes(obj)
+ });
+ },
+ relation: function relationData2(obj, uid) {
+ var attrs = obj.attributes;
+ return new osmRelation({
+ id: uid,
+ visible: getVisible(attrs),
+ version: attrs.version.value,
+ changeset: attrs.changeset && attrs.changeset.value,
+ timestamp: attrs.timestamp && attrs.timestamp.value,
+ user: attrs.user && attrs.user.value,
+ uid: attrs.uid && attrs.uid.value,
+ tags: getTags(obj),
+ members: getMembers(obj)
+ });
+ },
+ note: function parseNote(obj, uid) {
+ var attrs = obj.attributes;
+ var childNodes = obj.childNodes;
+ var props = {};
+ props.id = uid;
+ props.loc = getLoc(attrs);
+ var coincident = false;
+ var epsilon3 = 1e-5;
+ do {
+ if (coincident) {
+ props.loc = geoVecAdd(props.loc, [epsilon3, epsilon3]);
+ }
+ var bbox = geoExtent(props.loc).bbox();
+ coincident = _noteCache.rtree.search(bbox).length;
+ } while (coincident);
+ for (var i2 = 0; i2 < childNodes.length; i2++) {
+ var node = childNodes[i2];
+ var nodeName = node.nodeName;
+ if (nodeName === "#text")
+ continue;
+ if (nodeName === "comments") {
+ props[nodeName] = parseComments(node.childNodes);
+ } else {
+ props[nodeName] = node.textContent;
+ }
+ }
+ var note = new osmNote(props);
+ var item = encodeNoteRtree(note);
+ _noteCache.note[note.id] = note;
+ _noteCache.rtree.insert(item);
+ return note;
+ },
+ user: function parseUser2(obj, uid) {
+ var attrs = obj.attributes;
+ var user = {
+ id: uid,
+ display_name: attrs.display_name && attrs.display_name.value,
+ account_created: attrs.account_created && attrs.account_created.value,
+ changesets_count: "0",
+ active_blocks: "0"
+ };
+ var img = obj.getElementsByTagName("img");
+ if (img && img[0] && img[0].getAttribute("href")) {
+ user.image_url = img[0].getAttribute("href");
+ }
+ var changesets = obj.getElementsByTagName("changesets");
+ if (changesets && changesets[0] && changesets[0].getAttribute("count")) {
+ user.changesets_count = changesets[0].getAttribute("count");
+ }
+ var blocks = obj.getElementsByTagName("blocks");
+ if (blocks && blocks[0]) {
+ var received = blocks[0].getElementsByTagName("received");
+ if (received && received[0] && received[0].getAttribute("active")) {
+ user.active_blocks = received[0].getAttribute("active");
+ }
+ }
+ _userCache.user[uid] = user;
+ delete _userCache.toLoad[uid];
+ return user;
+ }
+ };
+ function parseXML(xml, callback, options2) {
+ options2 = Object.assign({ skipSeen: true }, options2);
+ if (!xml || !xml.childNodes) {
+ return callback({ message: "No XML", status: -1 });
+ }
+ var root3 = xml.childNodes[0];
+ var children2 = root3.childNodes;
+ var handle = window.requestIdleCallback(function() {
+ _deferred.delete(handle);
+ var results = [];
+ var result;
+ for (var i2 = 0; i2 < children2.length; i2++) {
+ result = parseChild(children2[i2]);
+ if (result)
+ results.push(result);
+ }
+ callback(null, results);
+ });
+ _deferred.add(handle);
+ function parseChild(child) {
+ var parser3 = parsers[child.nodeName];
+ if (!parser3)
+ return null;
+ var uid;
+ if (child.nodeName === "user") {
+ uid = child.attributes.id.value;
+ if (options2.skipSeen && _userCache.user[uid]) {
+ delete _userCache.toLoad[uid];
+ return null;
+ }
+ } else if (child.nodeName === "note") {
+ uid = child.getElementsByTagName("id")[0].textContent;
+ } else {
+ uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
+ if (options2.skipSeen) {
+ if (_tileCache.seen[uid])
+ return null;
+ _tileCache.seen[uid] = true;
+ }
+ }
+ return parser3(child, uid);
+ }
+ }
+ function updateRtree4(item, replace) {
+ _noteCache.rtree.remove(item, function isEql(a, b) {
+ return a.data.id === b.data.id;
+ });
+ if (replace) {
+ _noteCache.rtree.insert(item);
+ }
+ }
+ function wrapcb(thisArg, callback, cid) {
+ return function(err, result) {
+ if (err) {
+ if (err.status === 400 || err.status === 401 || err.status === 403) {
+ thisArg.logout();
+ }
+ return callback.call(thisArg, err);
+ } else if (thisArg.getConnectionId() !== cid) {
+ return callback.call(thisArg, { message: "Connection Switched", status: -1 });
+ } else {
+ return callback.call(thisArg, err, result);
+ }
+ };
+ }
+ var osm_default = {
+ init: function() {
+ utilRebind(this, dispatch7, "on");
+ },
+ reset: function() {
+ Array.from(_deferred).forEach(function(handle) {
+ window.cancelIdleCallback(handle);
+ _deferred.delete(handle);
+ });
+ _connectionID++;
+ _userChangesets = void 0;
+ _userDetails = void 0;
+ _rateLimitError = void 0;
+ Object.values(_tileCache.inflight).forEach(abortRequest5);
+ Object.values(_noteCache.inflight).forEach(abortRequest5);
+ Object.values(_noteCache.inflightPost).forEach(abortRequest5);
+ if (_changeset.inflight)
+ abortRequest5(_changeset.inflight);
+ _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: new import_rbush9.default() };
+ _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: new import_rbush9.default() };
+ _userCache = { toLoad: {}, user: {} };
+ _cachedApiStatus = void 0;
+ _changeset = {};
+ return this;
+ },
+ getConnectionId: function() {
+ return _connectionID;
+ },
+ getUrlRoot: function() {
+ return urlroot;
+ },
+ changesetURL: function(changesetID) {
+ return urlroot + "/changeset/" + changesetID;
+ },
+ changesetsURL: function(center, zoom) {
+ var precision2 = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
+ return urlroot + "/history#map=" + Math.floor(zoom) + "/" + center[1].toFixed(precision2) + "/" + center[0].toFixed(precision2);
+ },
+ entityURL: function(entity) {
+ return urlroot + "/" + entity.type + "/" + entity.osmId();
+ },
+ historyURL: function(entity) {
+ return urlroot + "/" + entity.type + "/" + entity.osmId() + "/history";
+ },
+ userURL: function(username) {
+ return urlroot + "/user/" + encodeURIComponent(username);
+ },
+ noteURL: function(note) {
+ return urlroot + "/note/" + note.id;
+ },
+ noteReportURL: function(note) {
+ return urlroot + "/reports/new?reportable_type=Note&reportable_id=" + note.id;
+ },
+ loadFromAPI: function(path, callback, options2) {
+ options2 = Object.assign({ skipSeen: true }, options2);
+ var that = this;
+ var cid = _connectionID;
+ function done(err, payload) {
+ if (that.getConnectionId() !== cid) {
+ if (callback)
+ callback({ message: "Connection Switched", status: -1 });
+ return;
+ }
+ var isAuthenticated = that.authenticated();
+ if (isAuthenticated && err && err.status && (err.status === 400 || err.status === 401 || err.status === 403)) {
+ that.logout();
+ that.loadFromAPI(path, callback, options2);
+ } else {
+ if (!isAuthenticated && !_rateLimitError && err && err.status && (err.status === 509 || err.status === 429)) {
+ _rateLimitError = err;
+ dispatch7.call("change");
+ that.reloadApiStatus();
+ } else if (err && _cachedApiStatus === "online" || !err && _cachedApiStatus !== "online") {
+ that.reloadApiStatus();
+ }
+ if (callback) {
+ if (err) {
+ return callback(err);
+ } else {
+ if (path.indexOf(".json") !== -1) {
+ return parseJSON(payload, callback, options2);
+ } else {
+ return parseXML(payload, callback, options2);
+ }
+ }
+ }
+ }
+ }
+ if (this.authenticated()) {
+ return oauth.xhr({ method: "GET", path }, done);
+ } else {
+ var url = urlroot + path;
+ var controller = new AbortController();
+ var fn;
+ if (path.indexOf(".json") !== -1) {
+ fn = json_default;
+ } else {
+ fn = xml_default;
+ }
+ fn(url, { signal: controller.signal }).then(function(data) {
+ done(null, data);
+ }).catch(function(err) {
+ if (err.name === "AbortError")
+ return;
+ var match = err.message.match(/^\d{3}/);
+ if (match) {
+ done({ status: +match[0], statusText: err.message });
+ } else {
+ done(err.message);
+ }
+ });
+ return controller;
+ }
+ },
+ loadEntity: function(id2, callback) {
+ var type3 = osmEntity.id.type(id2);
+ var osmID = osmEntity.id.toOSM(id2);
+ var options2 = { skipSeen: false };
+ this.loadFromAPI("/api/0.6/" + type3 + "/" + osmID + (type3 !== "node" ? "/full" : "") + ".json", function(err, entities) {
+ if (callback)
+ callback(err, { data: entities });
+ }, options2);
+ },
+ loadEntityVersion: function(id2, version2, callback) {
+ var type3 = osmEntity.id.type(id2);
+ var osmID = osmEntity.id.toOSM(id2);
+ var options2 = { skipSeen: false };
+ this.loadFromAPI("/api/0.6/" + type3 + "/" + osmID + "/" + version2 + ".json", function(err, entities) {
+ if (callback)
+ callback(err, { data: entities });
+ }, options2);
+ },
+ loadEntityRelations: function(id2, callback) {
+ var type3 = osmEntity.id.type(id2);
+ var osmID = osmEntity.id.toOSM(id2);
+ var options2 = { skipSeen: false };
+ this.loadFromAPI("/api/0.6/" + type3 + "/" + osmID + "/relations.json", function(err, entities) {
+ if (callback)
+ callback(err, { data: entities });
+ }, options2);
+ },
+ loadMultiple: function(ids, callback) {
+ var that = this;
+ var groups = utilArrayGroupBy(utilArrayUniq(ids), osmEntity.id.type);
+ Object.keys(groups).forEach(function(k) {
+ var type3 = k + "s";
+ var osmIDs = groups[k].map(function(id2) {
+ return osmEntity.id.toOSM(id2);
+ });
+ var options2 = { skipSeen: false };
+ utilArrayChunk(osmIDs, 150).forEach(function(arr) {
+ that.loadFromAPI("/api/0.6/" + type3 + ".json?" + type3 + "=" + arr.join(), function(err, entities) {
+ if (callback)
+ callback(err, { data: entities });
+ }, options2);
+ });
+ });
+ },
+ putChangeset: function(changeset, changes, callback) {
+ var cid = _connectionID;
+ if (_changeset.inflight) {
+ return callback({ message: "Changeset already inflight", status: -2 }, changeset);
+ } else if (_changeset.open) {
+ return createdChangeset.call(this, null, _changeset.open);
+ } else {
+ var options2 = {
+ method: "PUT",
+ path: "/api/0.6/changeset/create",
+ headers: { "Content-Type": "text/xml" },
+ content: JXON.stringify(changeset.asJXON())
+ };
+ _changeset.inflight = oauth.xhr(options2, wrapcb(this, createdChangeset, cid));
+ }
+ function createdChangeset(err, changesetID) {
+ _changeset.inflight = null;
+ if (err) {
+ return callback(err, changeset);
+ }
+ _changeset.open = changesetID;
+ changeset = changeset.update({ id: changesetID });
+ var options3 = {
+ method: "POST",
+ path: "/api/0.6/changeset/" + changesetID + "/upload",
+ headers: { "Content-Type": "text/xml" },
+ content: JXON.stringify(changeset.osmChangeJXON(changes))
+ };
+ _changeset.inflight = oauth.xhr(options3, wrapcb(this, uploadedChangeset, cid));
+ }
+ function uploadedChangeset(err) {
+ _changeset.inflight = null;
+ if (err)
+ return callback(err, changeset);
+ window.setTimeout(function() {
+ callback(null, changeset);
+ }, 2500);
+ _changeset.open = null;
+ if (this.getConnectionId() === cid) {
+ oauth.xhr({
+ method: "PUT",
+ path: "/api/0.6/changeset/" + changeset.id + "/close",
+ headers: { "Content-Type": "text/xml" }
+ }, function() {
+ return true;
+ });
+ }
+ }
+ },
+ loadUsers: function(uids, callback) {
+ var toLoad = [];
+ var cached = [];
+ utilArrayUniq(uids).forEach(function(uid) {
+ if (_userCache.user[uid]) {
+ delete _userCache.toLoad[uid];
+ cached.push(_userCache.user[uid]);
+ } else {
+ toLoad.push(uid);
+ }
+ });
+ if (cached.length || !this.authenticated()) {
+ callback(void 0, cached);
+ if (!this.authenticated())
+ return;
+ }
+ utilArrayChunk(toLoad, 150).forEach(function(arr) {
+ oauth.xhr({ method: "GET", path: "/api/0.6/users.json?users=" + arr.join() }, wrapcb(this, done, _connectionID));
+ }.bind(this));
+ function done(err, payload) {
+ if (err)
+ return callback(err);
+ var options2 = { skipSeen: true };
+ return parseUserJSON(payload, function(err2, results) {
+ if (err2)
+ return callback(err2);
+ return callback(void 0, results);
+ }, options2);
+ }
+ },
+ loadUser: function(uid, callback) {
+ if (_userCache.user[uid] || !this.authenticated()) {
+ delete _userCache.toLoad[uid];
+ return callback(void 0, _userCache.user[uid]);
+ }
+ oauth.xhr({ method: "GET", path: "/api/0.6/user/" + uid + ".json" }, wrapcb(this, done, _connectionID));
+ function done(err, payload) {
+ if (err)
+ return callback(err);
+ var options2 = { skipSeen: true };
+ return parseUserJSON(payload, function(err2, results) {
+ if (err2)
+ return callback(err2);
+ return callback(void 0, results[0]);
+ }, options2);
+ }
+ },
+ userDetails: function(callback) {
+ if (_userDetails) {
+ return callback(void 0, _userDetails);
+ }
+ oauth.xhr({ method: "GET", path: "/api/0.6/user/details.json" }, wrapcb(this, done, _connectionID));
+ function done(err, payload) {
+ if (err)
+ return callback(err);
+ var options2 = { skipSeen: false };
+ return parseUserJSON(payload, function(err2, results) {
+ if (err2)
+ return callback(err2);
+ _userDetails = results[0];
+ return callback(void 0, _userDetails);
+ }, options2);
+ }
+ },
+ userChangesets: function(callback) {
+ if (_userChangesets) {
+ return callback(void 0, _userChangesets);
+ }
+ this.userDetails(wrapcb(this, gotDetails, _connectionID));
+ function gotDetails(err, user) {
+ if (err) {
+ return callback(err);
+ }
+ oauth.xhr({ method: "GET", path: "/api/0.6/changesets?user=" + user.id }, wrapcb(this, done, _connectionID));
+ }
+ function done(err, xml) {
+ if (err) {
+ return callback(err);
+ }
+ _userChangesets = Array.prototype.map.call(xml.getElementsByTagName("changeset"), function(changeset) {
+ return { tags: getTags(changeset) };
+ }).filter(function(changeset) {
+ var comment = changeset.tags.comment;
+ return comment && comment !== "";
+ });
+ return callback(void 0, _userChangesets);
+ }
+ },
+ status: function(callback) {
+ var url = urlroot + "/api/capabilities";
+ var errback = wrapcb(this, done, _connectionID);
+ xml_default(url).then(function(data) {
+ errback(null, data);
+ }).catch(function(err) {
+ errback(err.message);
+ });
+ function done(err, xml) {
+ if (err) {
+ return callback(err, null);
+ }
+ var elements = xml.getElementsByTagName("blacklist");
+ var regexes = [];
+ for (var i2 = 0; i2 < elements.length; i2++) {
+ var regexString = elements[i2].getAttribute("regex");
+ if (regexString) {
+ try {
+ var regex = new RegExp(regexString);
+ regexes.push(regex);
+ } catch (e) {
+ }
+ }
+ }
+ if (regexes.length) {
+ _imageryBlocklists = regexes;
+ }
+ if (_rateLimitError) {
+ return callback(_rateLimitError, "rateLimited");
+ } else {
+ var waynodes = xml.getElementsByTagName("waynodes");
+ var maxWayNodes = waynodes.length && parseInt(waynodes[0].getAttribute("maximum"), 10);
+ if (maxWayNodes && isFinite(maxWayNodes))
+ _maxWayNodes = maxWayNodes;
+ var apiStatus = xml.getElementsByTagName("status");
+ var val = apiStatus[0].getAttribute("api");
+ return callback(void 0, val);
+ }
+ }
+ },
+ reloadApiStatus: function() {
+ if (!this.throttledReloadApiStatus) {
+ var that = this;
+ this.throttledReloadApiStatus = throttle_default(function() {
+ that.status(function(err, status) {
+ if (status !== _cachedApiStatus) {
+ _cachedApiStatus = status;
+ dispatch7.call("apiStatusChange", that, err, status);
+ }
+ });
+ }, 500);
+ }
+ this.throttledReloadApiStatus();
+ },
+ maxWayNodes: function() {
+ return _maxWayNodes;
+ },
+ loadTiles: function(projection2, callback) {
+ if (_off)
+ return;
+ var tiles = tiler5.zoomExtent([_tileZoom4, _tileZoom4]).getTiles(projection2);
+ var hadRequests = hasInflightRequests(_tileCache);
+ abortUnwantedRequests4(_tileCache, tiles);
+ if (hadRequests && !hasInflightRequests(_tileCache)) {
+ dispatch7.call("loaded");
+ }
+ tiles.forEach(function(tile) {
+ this.loadTile(tile, callback);
+ }, this);
+ },
+ loadTile: function(tile, callback) {
+ if (_off)
+ return;
+ if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id])
+ return;
+ if (!hasInflightRequests(_tileCache)) {
+ dispatch7.call("loading");
+ }
+ var path = "/api/0.6/map.json?bbox=";
+ var options2 = { skipSeen: true };
+ _tileCache.inflight[tile.id] = this.loadFromAPI(path + tile.extent.toParam(), tileCallback, options2);
+ function tileCallback(err, parsed) {
+ delete _tileCache.inflight[tile.id];
+ if (!err) {
+ delete _tileCache.toLoad[tile.id];
+ _tileCache.loaded[tile.id] = true;
+ var bbox = tile.extent.bbox();
+ bbox.id = tile.id;
+ _tileCache.rtree.insert(bbox);
+ }
+ if (callback) {
+ callback(err, Object.assign({ data: parsed }, tile));
+ }
+ if (!hasInflightRequests(_tileCache)) {
+ dispatch7.call("loaded");
+ }
+ }
+ },
+ isDataLoaded: function(loc) {
+ var bbox = { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] };
+ return _tileCache.rtree.collides(bbox);
+ },
+ loadTileAtLoc: function(loc, callback) {
+ if (Object.keys(_tileCache.toLoad).length > 50)
+ return;
+ var k = geoZoomToScale(_tileZoom4 + 1);
+ var offset = geoRawMercator().scale(k)(loc);
+ var projection2 = geoRawMercator().transform({ k, x: -offset[0], y: -offset[1] });
+ var tiles = tiler5.zoomExtent([_tileZoom4, _tileZoom4]).getTiles(projection2);
+ tiles.forEach(function(tile) {
+ if (_tileCache.toLoad[tile.id] || _tileCache.loaded[tile.id] || _tileCache.inflight[tile.id])
+ return;
+ _tileCache.toLoad[tile.id] = true;
+ this.loadTile(tile, callback);
+ }, this);
+ },
+ loadNotes: function(projection2, noteOptions) {
+ noteOptions = Object.assign({ limit: 1e4, closed: 7 }, noteOptions);
+ if (_off)
+ return;
+ var that = this;
+ var path = "/api/0.6/notes?limit=" + noteOptions.limit + "&closed=" + noteOptions.closed + "&bbox=";
+ var throttleLoadUsers = throttle_default(function() {
+ var uids = Object.keys(_userCache.toLoad);
+ if (!uids.length)
+ return;
+ that.loadUsers(uids, function() {
+ });
+ }, 750);
+ var tiles = tiler5.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection2);
+ abortUnwantedRequests4(_noteCache, tiles);
+ tiles.forEach(function(tile) {
+ if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id])
+ return;
+ var options2 = { skipSeen: false };
+ _noteCache.inflight[tile.id] = that.loadFromAPI(path + tile.extent.toParam(), function(err) {
+ delete _noteCache.inflight[tile.id];
+ if (!err) {
+ _noteCache.loaded[tile.id] = true;
+ }
+ throttleLoadUsers();
+ dispatch7.call("loadedNotes");
+ }, options2);
+ });
+ },
+ postNoteCreate: function(note, callback) {
+ if (!this.authenticated()) {
+ return callback({ message: "Not Authenticated", status: -3 }, note);
+ }
+ if (_noteCache.inflightPost[note.id]) {
+ return callback({ message: "Note update already inflight", status: -2 }, note);
+ }
+ if (!note.loc[0] || !note.loc[1] || !note.newComment)
+ return;
+ var comment = note.newComment;
+ if (note.newCategory && note.newCategory !== "None") {
+ comment += " #" + note.newCategory;
+ }
+ var path = "/api/0.6/notes?" + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
+ _noteCache.inflightPost[note.id] = oauth.xhr({ method: "POST", path }, wrapcb(this, done, _connectionID));
+ function done(err, xml) {
+ delete _noteCache.inflightPost[note.id];
+ if (err) {
+ return callback(err);
+ }
+ this.removeNote(note);
+ var options2 = { skipSeen: false };
+ return parseXML(xml, function(err2, results) {
+ if (err2) {
+ return callback(err2);
+ } else {
+ return callback(void 0, results[0]);
+ }
+ }, options2);
+ }
+ },
+ postNoteUpdate: function(note, newStatus, callback) {
+ if (!this.authenticated()) {
+ return callback({ message: "Not Authenticated", status: -3 }, note);
+ }
+ if (_noteCache.inflightPost[note.id]) {
+ return callback({ message: "Note update already inflight", status: -2 }, note);
+ }
+ var action;
+ if (note.status !== "closed" && newStatus === "closed") {
+ action = "close";
+ } else if (note.status !== "open" && newStatus === "open") {
+ action = "reopen";
+ } else {
+ action = "comment";
+ if (!note.newComment)
+ return;
+ }
+ var path = "/api/0.6/notes/" + note.id + "/" + action;
+ if (note.newComment) {
+ path += "?" + utilQsString({ text: note.newComment });
+ }
+ _noteCache.inflightPost[note.id] = oauth.xhr({ method: "POST", path }, wrapcb(this, done, _connectionID));
+ function done(err, xml) {
+ delete _noteCache.inflightPost[note.id];
+ if (err) {
+ return callback(err);
+ }
+ this.removeNote(note);
+ if (action === "close") {
+ _noteCache.closed[note.id] = true;
+ } else if (action === "reopen") {
+ delete _noteCache.closed[note.id];
+ }
+ var options2 = { skipSeen: false };
+ return parseXML(xml, function(err2, results) {
+ if (err2) {
+ return callback(err2);
+ } else {
+ return callback(void 0, results[0]);
+ }
+ }, options2);
+ }
+ },
+ switch: function(newOptions) {
+ urlroot = newOptions.url;
+ var oldOptions = utilObjectOmit(oauth.options(), "access_token");
+ oauth.options(Object.assign(oldOptions, newOptions));
+ this.reset();
+ this.userChangesets(function() {
+ });
+ dispatch7.call("change");
+ return this;
+ },
+ toggle: function(val) {
+ _off = !val;
+ return this;
+ },
+ isChangesetInflight: function() {
+ return !!_changeset.inflight;
+ },
+ caches: function(obj) {
+ function cloneCache(source) {
+ var target = {};
+ Object.keys(source).forEach(function(k) {
+ if (k === "rtree") {
+ target.rtree = new import_rbush9.default().fromJSON(source.rtree.toJSON());
+ } else if (k === "note") {
+ target.note = {};
+ Object.keys(source.note).forEach(function(id2) {
+ target.note[id2] = osmNote(source.note[id2]);
+ });
+ } else {
+ target[k] = JSON.parse(JSON.stringify(source[k]));
+ }
+ });
+ return target;
+ }
+ if (!arguments.length) {
+ return {
+ tile: cloneCache(_tileCache),
+ note: cloneCache(_noteCache),
+ user: cloneCache(_userCache)
+ };
+ }
+ if (obj === "get") {
+ return {
+ tile: _tileCache,
+ note: _noteCache,
+ user: _userCache
+ };
+ }
+ if (obj.tile) {
+ _tileCache = obj.tile;
+ _tileCache.inflight = {};
+ }
+ if (obj.note) {
+ _noteCache = obj.note;
+ _noteCache.inflight = {};
+ _noteCache.inflightPost = {};
+ }
+ if (obj.user) {
+ _userCache = obj.user;
+ }
+ return this;
+ },
+ logout: function() {
+ _userChangesets = void 0;
+ _userDetails = void 0;
+ oauth.logout();
+ dispatch7.call("change");
+ return this;
+ },
+ authenticated: function() {
+ return oauth.authenticated();
+ },
+ authenticate: function(callback) {
+ var that = this;
+ var cid = _connectionID;
+ _userChangesets = void 0;
+ _userDetails = void 0;
+ function done(err, res) {
+ if (err) {
+ if (callback)
+ callback(err);
+ return;
+ }
+ if (that.getConnectionId() !== cid) {
+ if (callback)
+ callback({ message: "Connection Switched", status: -1 });
+ return;
+ }
+ _rateLimitError = void 0;
+ dispatch7.call("change");
+ if (callback)
+ callback(err, res);
+ that.userChangesets(function() {
+ });
+ }
+ oauth.authenticate(done);
+ },
+ imageryBlocklists: function() {
+ return _imageryBlocklists;
+ },
+ tileZoom: function(val) {
+ if (!arguments.length)
+ return _tileZoom4;
+ _tileZoom4 = val;
+ return this;
+ },
+ notes: function(projection2) {
+ var viewport = projection2.clipExtent();
+ var min3 = [viewport[0][0], viewport[1][1]];
+ var max3 = [viewport[1][0], viewport[0][1]];
+ var bbox = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
+ return _noteCache.rtree.search(bbox).map(function(d) {
+ return d.data;
+ });
+ },
+ getNote: function(id2) {
+ return _noteCache.note[id2];
+ },
+ removeNote: function(note) {
+ if (!(note instanceof osmNote) || !note.id)
+ return;
+ delete _noteCache.note[note.id];
+ updateRtree4(encodeNoteRtree(note), false);
+ },
+ replaceNote: function(note) {
+ if (!(note instanceof osmNote) || !note.id)
+ return;
+ _noteCache.note[note.id] = note;
+ updateRtree4(encodeNoteRtree(note), true);
+ return note;
+ },
+ getClosedIDs: function() {
+ return Object.keys(_noteCache.closed).sort();
+ }
+ };
+
+ // modules/services/osm_wikibase.js
+ var apibase3 = "https://wiki.openstreetmap.org/w/api.php";
+ var _inflight2 = {};
+ var _wikibaseCache = {};
+ var _localeIDs = { en: false };
+ var debouncedRequest = debounce_default(request, 500, { leading: false });
+ function request(url, callback) {
+ if (_inflight2[url])
+ return;
+ var controller = new AbortController();
+ _inflight2[url] = controller;
+ json_default(url, { signal: controller.signal }).then(function(result) {
+ delete _inflight2[url];
+ if (callback)
+ callback(null, result);
+ }).catch(function(err) {
+ delete _inflight2[url];
+ if (err.name === "AbortError")
+ return;
+ if (callback)
+ callback(err.message);
+ });
+ }
+ var osm_wikibase_default = {
+ init: function() {
+ _inflight2 = {};
+ _wikibaseCache = {};
+ _localeIDs = {};
+ },
+ reset: function() {
+ Object.values(_inflight2).forEach(function(controller) {
+ controller.abort();
+ });
+ _inflight2 = {};
+ },
+ claimToValue: function(entity, property, langCode) {
+ if (!entity.claims[property])
+ return void 0;
+ var locale2 = _localeIDs[langCode];
+ var preferredPick, localePick;
+ entity.claims[property].forEach(function(stmt) {
+ if (!preferredPick && stmt.rank === "preferred") {
+ preferredPick = stmt;
+ }
+ if (locale2 && stmt.qualifiers && stmt.qualifiers.P26 && stmt.qualifiers.P26[0].datavalue.value.id === locale2) {
+ localePick = stmt;
+ }
+ });
+ var result = localePick || preferredPick;
+ if (result) {
+ var datavalue = result.mainsnak.datavalue;
+ return datavalue.type === "wikibase-entityid" ? datavalue.value.id : datavalue.value;
+ } else {
+ return void 0;
+ }
+ },
+ monolingualClaimToValueObj: function(entity, property) {
+ if (!entity || !entity.claims[property])
+ return void 0;
+ return entity.claims[property].reduce(function(acc, obj) {
+ var value = obj.mainsnak.datavalue.value;
+ acc[value.language] = value.text;
+ return acc;
+ }, {});
+ },
+ toSitelink: function(key, value) {
+ var result = value ? "Tag:" + key + "=" + value : "Key:" + key;
+ return result.replace(/_/g, " ").trim();
+ },
+ getEntity: function(params, callback) {
+ var doRequest = params.debounce ? debouncedRequest : request;
+ var that = this;
+ var titles = [];
+ var result = {};
+ var rtypeSitelink = params.key === "type" && params.value ? ("Relation:" + params.value).replace(/_/g, " ").trim() : false;
+ var keySitelink = params.key ? this.toSitelink(params.key) : false;
+ var tagSitelink = params.key && params.value ? this.toSitelink(params.key, params.value) : false;
+ var localeSitelink;
+ if (params.langCodes) {
+ params.langCodes.forEach(function(langCode) {
+ if (_localeIDs[langCode] === void 0) {
+ localeSitelink = ("Locale:" + langCode).replace(/_/g, " ").trim();
+ titles.push(localeSitelink);
+ }
+ });
+ }
+ if (rtypeSitelink) {
+ if (_wikibaseCache[rtypeSitelink]) {
+ result.rtype = _wikibaseCache[rtypeSitelink];
+ } else {
+ titles.push(rtypeSitelink);
+ }
+ }
+ if (keySitelink) {
+ if (_wikibaseCache[keySitelink]) {
+ result.key = _wikibaseCache[keySitelink];
+ } else {
+ titles.push(keySitelink);
+ }
+ }
+ if (tagSitelink) {
+ if (_wikibaseCache[tagSitelink]) {
+ result.tag = _wikibaseCache[tagSitelink];
+ } else {
+ titles.push(tagSitelink);
+ }
+ }
+ if (!titles.length) {
+ return callback(null, result);
+ }
+ var obj = {
+ action: "wbgetentities",
+ sites: "wiki",
+ titles: titles.join("|"),
+ languages: params.langCodes.join("|"),
+ languagefallback: 1,
+ origin: "*",
+ format: "json"
+ };
+ var url = apibase3 + "?" + utilQsString(obj);
+ doRequest(url, function(err, d) {
+ if (err) {
+ callback(err);
+ } else if (!d.success || d.error) {
+ callback(d.error.messages.map(function(v) {
+ return v.html["*"];
+ }).join("<br>"));
+ } else {
+ var localeID = false;
+ Object.values(d.entities).forEach(function(res) {
+ if (res.missing !== "") {
+ var title = res.sitelinks.wiki.title;
+ if (title === rtypeSitelink) {
+ _wikibaseCache[rtypeSitelink] = res;
+ result.rtype = res;
+ } else if (title === keySitelink) {
+ _wikibaseCache[keySitelink] = res;
+ result.key = res;
+ } else if (title === tagSitelink) {
+ _wikibaseCache[tagSitelink] = res;
+ result.tag = res;
+ } else if (title === localeSitelink) {
+ localeID = res.id;
+ } else {
+ console.log("Unexpected title " + title);
+ }
+ }
+ });
+ if (localeSitelink) {
+ that.addLocale(params.langCodes[0], localeID);
+ }
+ callback(null, result);
+ }
+ });
+ },
+ getDocs: function(params, callback) {
+ var that = this;
+ var langCodes = _mainLocalizer.localeCodes().map(function(code) {
+ return code.toLowerCase();
+ });
+ params.langCodes = langCodes;
+ this.getEntity(params, function(err, data) {
+ if (err) {
+ callback(err);
+ return;
+ }
+ var entity = data.rtype || data.tag || data.key;
+ if (!entity) {
+ callback("No entity");
+ return;
+ }
+ var i2;
+ var description2;
+ for (i2 in langCodes) {
+ let code2 = langCodes[i2];
+ if (entity.descriptions[code2] && entity.descriptions[code2].language === code2) {
+ description2 = entity.descriptions[code2];
+ break;
+ }
+ }
+ if (!description2 && Object.values(entity.descriptions).length)
+ description2 = Object.values(entity.descriptions)[0];
+ var result = {
+ title: entity.title,
+ description: description2 ? description2.value : "",
+ descriptionLocaleCode: description2 ? description2.language : "",
+ editURL: "https://wiki.openstreetmap.org/wiki/" + entity.title
+ };
+ if (entity.claims) {
+ var imageroot;
+ var image = that.claimToValue(entity, "P4", langCodes[0]);
+ if (image) {
+ imageroot = "https://commons.wikimedia.org/w/index.php";
+ } else {
+ image = that.claimToValue(entity, "P28", langCodes[0]);
+ if (image) {
+ imageroot = "https://wiki.openstreetmap.org/w/index.php";
+ }
+ }
+ if (imageroot && image) {
+ result.imageURL = imageroot + "?" + utilQsString({
+ title: "Special:Redirect/file/" + image,
+ width: 400
+ });
+ }
+ }
+ var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, "P31");
+ var tagWiki = that.monolingualClaimToValueObj(data.tag, "P31");
+ var keyWiki = that.monolingualClaimToValueObj(data.key, "P31");
+ var wikis = [rtypeWiki, tagWiki, keyWiki];
+ for (i2 in wikis) {
+ var wiki = wikis[i2];
+ for (var j2 in langCodes) {
+ var code = langCodes[j2];
+ var referenceId = langCodes[0].split("-")[0] !== "en" && code.split("-")[0] === "en" ? "inspector.wiki_en_reference" : "inspector.wiki_reference";
+ var info = getWikiInfo(wiki, code, referenceId);
+ if (info) {
+ result.wiki = info;
+ break;
+ }
+ }
+ if (result.wiki)
+ break;
+ }
+ callback(null, result);
+ function getWikiInfo(wiki2, langCode, tKey) {
+ if (wiki2 && wiki2[langCode]) {
+ return {
+ title: wiki2[langCode],
+ text: tKey,
+ url: "https://wiki.openstreetmap.org/wiki/" + wiki2[langCode]
+ };
+ }
+ }
+ });
+ },
+ addLocale: function(langCode, qid) {
+ _localeIDs[langCode] = qid;
+ },
+ apibase: function(val) {
+ if (!arguments.length)
+ return apibase3;
+ apibase3 = val;
+ return this;
+ }
+ };
+
+ // modules/services/streetside.js
+ var import_rbush10 = __toESM(require_rbush_min());
+
+ // modules/util/jsonp_request.js
+ var jsonpCache = {};
+ window.jsonpCache = jsonpCache;
+ function jsonpRequest(url, callback) {
+ var request3 = {
+ abort: function() {
+ }
+ };
+ if (window.JSONP_FIX) {
+ if (window.JSONP_DELAY === 0) {
+ callback(window.JSONP_FIX);
+ } else {
+ var t = window.setTimeout(function() {
+ callback(window.JSONP_FIX);
+ }, window.JSONP_DELAY || 0);
+ request3.abort = function() {
+ window.clearTimeout(t);
+ };
+ }
+ return request3;
+ }
+ function rand() {
+ var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ var c = "";
+ var i2 = -1;
+ while (++i2 < 15)
+ c += chars.charAt(Math.floor(Math.random() * 52));
+ return c;
+ }
+ function create2(url2) {
+ var e = url2.match(/callback=(\w+)/);
+ var c = e ? e[1] : rand();
+ jsonpCache[c] = function(data) {
+ if (jsonpCache[c]) {
+ callback(data);
+ }
+ finalize();
+ };
+ function finalize() {
+ delete jsonpCache[c];
+ script.remove();
+ }
+ request3.abort = finalize;
+ return "jsonpCache." + c;
+ }
+ var cb = create2(url);
+ var script = select_default2("head").append("script").attr("type", "text/javascript").attr("src", url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
+ return request3;
+ }
+
+ // modules/services/streetside.js
+ var bubbleApi = "https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?";
+ var streetsideImagesApi = "https://t.ssl.ak.tiles.virtualearth.net/tiles/";
+ var bubbleAppKey = "AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm";
+ var pannellumViewerCSS = "pannellum-streetside/pannellum.css";
+ var pannellumViewerJS = "pannellum-streetside/pannellum.js";
+ var maxResults2 = 2e3;
+ var tileZoom2 = 16.5;
+ var tiler6 = utilTiler().zoomExtent([tileZoom2, tileZoom2]).skipNullIsland(true);
+ var dispatch8 = dispatch_default("loadedImages", "viewerChanged");
+ var minHfov = 10;
+ var maxHfov = 90;
+ var defaultHfov = 45;
+ var _hires = false;
+ var _resolution = 512;
+ var _currScene = 0;
+ var _ssCache;
+ var _pannellumViewer;
+ var _sceneOptions = {
+ showFullscreenCtrl: false,
+ autoLoad: true,
+ compass: true,
+ yaw: 0,
+ minHfov,
+ maxHfov,
+ hfov: defaultHfov,
+ type: "cubemap",
+ cubeMap: []
+ };
+ var _loadViewerPromise3;
+ function abortRequest6(i2) {
+ i2.abort();
+ }
+ function localeTimestamp(s) {
+ if (!s)
+ return null;
+ const options2 = { day: "numeric", month: "short", year: "numeric" };
+ const d = new Date(s);
+ if (isNaN(d.getTime()))
+ return null;
+ return d.toLocaleString(_mainLocalizer.localeCode(), options2);
+ }
+ function loadTiles3(which, url, projection2, margin) {
+ const tiles = tiler6.margin(margin).getTiles(projection2);
+ const cache = _ssCache[which];
+ Object.keys(cache.inflight).forEach((k) => {
+ const wanted = tiles.find((tile) => k.indexOf(tile.id + ",") === 0);
+ if (!wanted) {
+ abortRequest6(cache.inflight[k]);
+ delete cache.inflight[k];
+ }
+ });
+ tiles.forEach((tile) => loadNextTilePage2(which, url, tile));
+ }
+ function loadNextTilePage2(which, url, tile) {
+ const cache = _ssCache[which];
+ const nextPage = cache.nextPage[tile.id] || 0;
+ const id2 = tile.id + "," + String(nextPage);
+ if (cache.loaded[id2] || cache.inflight[id2])
+ return;
+ cache.inflight[id2] = getBubbles(url, tile, (bubbles) => {
+ cache.loaded[id2] = true;
+ delete cache.inflight[id2];
+ if (!bubbles)
+ return;
+ bubbles.shift();
+ const features2 = bubbles.map((bubble) => {
+ if (cache.points[bubble.id])
+ return null;
+ const loc = [bubble.lo, bubble.la];
+ const d = {
+ loc,
+ key: bubble.id,
+ ca: bubble.he,
+ captured_at: bubble.cd,
+ captured_by: "microsoft",
+ pr: bubble.pr,
+ ne: bubble.ne,
+ pano: true,
+ sequenceKey: null
+ };
+ cache.points[bubble.id] = d;
+ if (bubble.pr === void 0) {
+ cache.leaders.push(bubble.id);
+ }
+ return {
+ minX: loc[0],
+ minY: loc[1],
+ maxX: loc[0],
+ maxY: loc[1],
+ data: d
+ };
+ }).filter(Boolean);
+ cache.rtree.load(features2);
+ connectSequences();
+ if (which === "bubbles") {
+ dispatch8.call("loadedImages");
+ }
+ });
+ }
+ function connectSequences() {
+ let cache = _ssCache.bubbles;
+ let keepLeaders = [];
+ for (let i2 = 0; i2 < cache.leaders.length; i2++) {
+ let bubble = cache.points[cache.leaders[i2]];
+ let seen = {};
+ let sequence = { key: bubble.key, bubbles: [] };
+ let complete = false;
+ do {
+ sequence.bubbles.push(bubble);
+ seen[bubble.key] = true;
+ if (bubble.ne === void 0) {
+ complete = true;
+ } else {
+ bubble = cache.points[bubble.ne];
+ }
+ } while (bubble && !seen[bubble.key] && !complete);
+ if (complete) {
+ _ssCache.sequences[sequence.key] = sequence;
+ for (let j2 = 0; j2 < sequence.bubbles.length; j2++) {
+ sequence.bubbles[j2].sequenceKey = sequence.key;
+ }
+ sequence.geojson = {
+ type: "LineString",
+ properties: {
+ captured_at: sequence.bubbles[0] ? sequence.bubbles[0].captured_at : null,
+ captured_by: sequence.bubbles[0] ? sequence.bubbles[0].captured_by : null,
+ key: sequence.key
+ },
+ coordinates: sequence.bubbles.map((d) => d.loc)
+ };
+ } else {
+ keepLeaders.push(cache.leaders[i2]);
+ }
+ }
+ cache.leaders = keepLeaders;
+ }
+ function getBubbles(url, tile, callback) {
+ let rect = tile.extent.rectangle();
+ let urlForRequest = url + utilQsString({
+ n: rect[3],
+ s: rect[1],
+ e: rect[2],
+ w: rect[0],
+ c: maxResults2,
+ appkey: bubbleAppKey,
+ jsCallback: "{callback}"
+ });
+ return jsonpRequest(urlForRequest, (data) => {
+ if (!data || data.error) {
+ callback(null);
+ } else {
+ callback(data);
+ }
+ });
+ }
+ function partitionViewport3(projection2) {
+ let z = geoScaleToZoom(projection2.scale());
+ let z2 = Math.ceil(z * 2) / 2 + 2.5;
+ let tiler8 = utilTiler().zoomExtent([z2, z2]);
+ return tiler8.getTiles(projection2).map((tile) => tile.extent);
+ }
+ function searchLimited3(limit, projection2, rtree) {
+ limit = limit || 5;
+ return partitionViewport3(projection2).reduce((result, extent) => {
+ let found = rtree.search(extent.bbox()).slice(0, limit).map((d) => d.data);
+ return found.length ? result.concat(found) : result;
+ }, []);
+ }
+ function loadImage(imgInfo) {
+ return new Promise((resolve) => {
+ let img = new Image();
+ img.onload = () => {
+ let canvas = document.getElementById("ideditor-canvas" + imgInfo.face);
+ let ctx = canvas.getContext("2d");
+ ctx.drawImage(img, imgInfo.x, imgInfo.y);
+ resolve({ imgInfo, status: "ok" });
+ };
+ img.onerror = () => {
+ resolve({ data: imgInfo, status: "error" });
+ };
+ img.setAttribute("crossorigin", "");
+ img.src = imgInfo.url;
+ });
+ }
+ function loadCanvas(imageGroup) {
+ return Promise.all(imageGroup.map(loadImage)).then((data) => {
+ let canvas = document.getElementById("ideditor-canvas" + data[0].imgInfo.face);
+ const which = { "01": 0, "02": 1, "03": 2, "10": 3, "11": 4, "12": 5 };
+ let face = data[0].imgInfo.face;
+ _sceneOptions.cubeMap[which[face]] = canvas.toDataURL("image/jpeg", 1);
+ return { status: "loadCanvas for face " + data[0].imgInfo.face + "ok" };
+ });
+ }
+ function loadFaces(faceGroup) {
+ return Promise.all(faceGroup.map(loadCanvas)).then(() => {
+ return { status: "loadFaces done" };
+ });
+ }
+ function setupCanvas(selection2, reset) {
+ if (reset) {
+ selection2.selectAll("#ideditor-stitcher-canvases").remove();
+ }
+ selection2.selectAll("#ideditor-stitcher-canvases").data([0]).enter().append("div").attr("id", "ideditor-stitcher-canvases").attr("display", "none").selectAll("canvas").data(["canvas01", "canvas02", "canvas03", "canvas10", "canvas11", "canvas12"]).enter().append("canvas").attr("id", (d) => "ideditor-" + d).attr("width", _resolution).attr("height", _resolution);
+ }
+ function qkToXY(qk) {
+ let x = 0;
+ let y = 0;
+ let scale = 256;
+ for (let i2 = qk.length; i2 > 0; i2--) {
+ const key = qk[i2 - 1];
+ x += +(key === "1" || key === "3") * scale;
+ y += +(key === "2" || key === "3") * scale;
+ scale *= 2;
+ }
+ return [x, y];
+ }
+ function getQuadKeys() {
+ let dim = _resolution / 256;
+ let quadKeys;
+ if (dim === 16) {
+ quadKeys = [
+ "0000",
+ "0001",
+ "0010",
+ "0011",
+ "0100",
+ "0101",
+ "0110",
+ "0111",
+ "1000",
+ "1001",
+ "1010",
+ "1011",
+ "1100",
+ "1101",
+ "1110",
+ "1111",
+ "0002",
+ "0003",
+ "0012",
+ "0013",
+ "0102",
+ "0103",
+ "0112",
+ "0113",
+ "1002",
+ "1003",
+ "1012",
+ "1013",
+ "1102",
+ "1103",
+ "1112",
+ "1113",
+ "0020",
+ "0021",
+ "0030",
+ "0031",
+ "0120",
+ "0121",
+ "0130",
+ "0131",
+ "1020",
+ "1021",
+ "1030",
+ "1031",
+ "1120",
+ "1121",
+ "1130",
+ "1131",
+ "0022",
+ "0023",
+ "0032",
+ "0033",
+ "0122",
+ "0123",
+ "0132",
+ "0133",
+ "1022",
+ "1023",
+ "1032",
+ "1033",
+ "1122",
+ "1123",
+ "1132",
+ "1133",
+ "0200",
+ "0201",
+ "0210",
+ "0211",
+ "0300",
+ "0301",
+ "0310",
+ "0311",
+ "1200",
+ "1201",
+ "1210",
+ "1211",
+ "1300",
+ "1301",
+ "1310",
+ "1311",
+ "0202",
+ "0203",
+ "0212",
+ "0213",
+ "0302",
+ "0303",
+ "0312",
+ "0313",
+ "1202",
+ "1203",
+ "1212",
+ "1213",
+ "1302",
+ "1303",
+ "1312",
+ "1313",
+ "0220",
+ "0221",
+ "0230",
+ "0231",
+ "0320",
+ "0321",
+ "0330",
+ "0331",
+ "1220",
+ "1221",
+ "1230",
+ "1231",
+ "1320",
+ "1321",
+ "1330",
+ "1331",
+ "0222",
+ "0223",
+ "0232",
+ "0233",
+ "0322",
+ "0323",
+ "0332",
+ "0333",
+ "1222",
+ "1223",
+ "1232",
+ "1233",
+ "1322",
+ "1323",
+ "1332",
+ "1333",
+ "2000",
+ "2001",
+ "2010",
+ "2011",
+ "2100",
+ "2101",
+ "2110",
+ "2111",
+ "3000",
+ "3001",
+ "3010",
+ "3011",
+ "3100",
+ "3101",
+ "3110",
+ "3111",
+ "2002",
+ "2003",
+ "2012",
+ "2013",
+ "2102",
+ "2103",
+ "2112",
+ "2113",
+ "3002",
+ "3003",
+ "3012",
+ "3013",
+ "3102",
+ "3103",
+ "3112",
+ "3113",
+ "2020",
+ "2021",
+ "2030",
+ "2031",
+ "2120",
+ "2121",
+ "2130",
+ "2131",
+ "3020",
+ "3021",
+ "3030",
+ "3031",
+ "3120",
+ "3121",
+ "3130",
+ "3131",
+ "2022",
+ "2023",
+ "2032",
+ "2033",
+ "2122",
+ "2123",
+ "2132",
+ "2133",
+ "3022",
+ "3023",
+ "3032",
+ "3033",
+ "3122",
+ "3123",
+ "3132",
+ "3133",
+ "2200",
+ "2201",
+ "2210",
+ "2211",
+ "2300",
+ "2301",
+ "2310",
+ "2311",
+ "3200",
+ "3201",
+ "3210",
+ "3211",
+ "3300",
+ "3301",
+ "3310",
+ "3311",
+ "2202",
+ "2203",
+ "2212",
+ "2213",
+ "2302",
+ "2303",
+ "2312",
+ "2313",
+ "3202",
+ "3203",
+ "3212",
+ "3213",
+ "3302",
+ "3303",
+ "3312",
+ "3313",
+ "2220",
+ "2221",
+ "2230",
+ "2231",
+ "2320",
+ "2321",
+ "2330",
+ "2331",
+ "3220",
+ "3221",
+ "3230",
+ "3231",
+ "3320",
+ "3321",
+ "3330",
+ "3331",
+ "2222",
+ "2223",
+ "2232",
+ "2233",
+ "2322",
+ "2323",
+ "2332",
+ "2333",
+ "3222",
+ "3223",
+ "3232",
+ "3233",
+ "3322",
+ "3323",
+ "3332",
+ "3333"
+ ];
+ } else if (dim === 8) {
+ quadKeys = [
+ "000",
+ "001",
+ "010",
+ "011",
+ "100",
+ "101",
+ "110",
+ "111",
+ "002",
+ "003",
+ "012",
+ "013",
+ "102",
+ "103",
+ "112",
+ "113",
+ "020",
+ "021",
+ "030",
+ "031",
+ "120",
+ "121",
+ "130",
+ "131",
+ "022",
+ "023",
+ "032",
+ "033",
+ "122",
+ "123",
+ "132",
+ "133",
+ "200",
+ "201",
+ "210",
+ "211",
+ "300",
+ "301",
+ "310",
+ "311",
+ "202",
+ "203",
+ "212",
+ "213",
+ "302",
+ "303",
+ "312",
+ "313",
+ "220",
+ "221",
+ "230",
+ "231",
+ "320",
+ "321",
+ "330",
+ "331",
+ "222",
+ "223",
+ "232",
+ "233",
+ "322",
+ "323",
+ "332",
+ "333"
+ ];
+ } else if (dim === 4) {
+ quadKeys = [
+ "00",
+ "01",
+ "10",
+ "11",
+ "02",
+ "03",
+ "12",
+ "13",
+ "20",
+ "21",
+ "30",
+ "31",
+ "22",
+ "23",
+ "32",
+ "33"
+ ];
+ } else {
+ quadKeys = [
+ "0",
+ "1",
+ "2",
+ "3"
+ ];
+ }
+ return quadKeys;
+ }
+ var streetside_default = {
+ init: function() {
+ if (!_ssCache) {
+ this.reset();
+ }
+ this.event = utilRebind(this, dispatch8, "on");
+ },
+ reset: function() {
+ if (_ssCache) {
+ Object.values(_ssCache.bubbles.inflight).forEach(abortRequest6);
+ }
+ _ssCache = {
+ bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: new import_rbush10.default(), points: {}, leaders: [] },
+ sequences: {}
+ };
+ },
+ bubbles: function(projection2) {
+ const limit = 5;
+ return searchLimited3(limit, projection2, _ssCache.bubbles.rtree);
+ },
+ cachedImage: function(imageKey) {
+ return _ssCache.bubbles.points[imageKey];
+ },
+ sequences: function(projection2) {
+ const viewport = projection2.clipExtent();
+ const min3 = [viewport[0][0], viewport[1][1]];
+ const max3 = [viewport[1][0], viewport[0][1]];
+ const bbox = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
+ let seen = {};
+ let results = [];
+ _ssCache.bubbles.rtree.search(bbox).forEach((d) => {
+ const key = d.data.sequenceKey;
+ if (key && !seen[key]) {
+ seen[key] = true;
+ results.push(_ssCache.sequences[key].geojson);
+ }
+ });
+ return results;
+ },
+ loadBubbles: function(projection2, margin) {
+ if (margin === void 0)
+ margin = 2;
+ loadTiles3("bubbles", bubbleApi, projection2, margin);
+ },
+ viewer: function() {
+ return _pannellumViewer;
+ },
+ initViewer: function() {
+ if (!window.pannellum)
+ return;
+ if (_pannellumViewer)
+ return;
+ _currScene += 1;
+ const sceneID = _currScene.toString();
+ const options2 = {
+ "default": { firstScene: sceneID },
+ scenes: {}
+ };
+ options2.scenes[sceneID] = _sceneOptions;
+ _pannellumViewer = window.pannellum.viewer("ideditor-viewer-streetside", options2);
+ },
+ ensureViewerLoaded: function(context) {
+ if (_loadViewerPromise3)
+ return _loadViewerPromise3;
+ let wrap2 = context.container().select(".photoviewer").selectAll(".ms-wrapper").data([0]);
+ let wrapEnter = wrap2.enter().append("div").attr("class", "photo-wrapper ms-wrapper").classed("hide", true);
+ let that = this;
+ let pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ wrapEnter.append("div").attr("id", "ideditor-viewer-streetside").on(pointerPrefix + "down.streetside", () => {
+ select_default2(window).on(pointerPrefix + "move.streetside", () => {
+ dispatch8.call("viewerChanged");
+ }, true);
+ }).on(pointerPrefix + "up.streetside pointercancel.streetside", () => {
+ select_default2(window).on(pointerPrefix + "move.streetside", null);
+ let t = timer((elapsed) => {
+ dispatch8.call("viewerChanged");
+ if (elapsed > 2e3) {
+ t.stop();
+ }
+ });
+ }).append("div").attr("class", "photo-attribution fillD");
+ let controlsEnter = wrapEnter.append("div").attr("class", "photo-controls-wrap").append("div").attr("class", "photo-controls");
+ controlsEnter.append("button").on("click.back", step(-1)).text("\u25C4");
+ controlsEnter.append("button").on("click.forward", step(1)).text("\u25BA");
+ wrap2 = wrap2.merge(wrapEnter).call(setupCanvas, true);
+ context.ui().photoviewer.on("resize.streetside", () => {
+ if (_pannellumViewer) {
+ _pannellumViewer.resize();
+ }
+ });
+ _loadViewerPromise3 = new Promise((resolve, reject) => {
+ let loadedCount = 0;
+ function loaded() {
+ loadedCount += 1;
+ if (loadedCount === 2)
+ resolve();
+ }
+ const head = select_default2("head");
+ head.selectAll("#ideditor-streetside-viewercss").data([0]).enter().append("link").attr("id", "ideditor-streetside-viewercss").attr("rel", "stylesheet").attr("crossorigin", "anonymous").attr("href", context.asset(pannellumViewerCSS)).on("load.serviceStreetside", loaded).on("error.serviceStreetside", function() {
+ reject();
+ });
+ head.selectAll("#ideditor-streetside-viewerjs").data([0]).enter().append("script").attr("id", "ideditor-streetside-viewerjs").attr("crossorigin", "anonymous").attr("src", context.asset(pannellumViewerJS)).on("load.serviceStreetside", loaded).on("error.serviceStreetside", function() {
+ reject();
+ });
+ }).catch(function() {
+ _loadViewerPromise3 = null;
+ });
+ return _loadViewerPromise3;
+ function step(stepBy) {
+ return () => {
+ let viewer = context.container().select(".photoviewer");
+ let selected = viewer.empty() ? void 0 : viewer.datum();
+ if (!selected)
+ return;
+ let nextID = stepBy === 1 ? selected.ne : selected.pr;
+ let yaw = _pannellumViewer.getYaw();
+ let ca = selected.ca + yaw;
+ let origin = selected.loc;
+ const meters = 35;
+ let p1 = [
+ origin[0] + geoMetersToLon(meters / 5, origin[1]),
+ origin[1]
+ ];
+ let p2 = [
+ origin[0] + geoMetersToLon(meters / 2, origin[1]),
+ origin[1] + geoMetersToLat(meters)
+ ];
+ let p3 = [
+ origin[0] - geoMetersToLon(meters / 2, origin[1]),
+ origin[1] + geoMetersToLat(meters)
+ ];
+ let p4 = [
+ origin[0] - geoMetersToLon(meters / 5, origin[1]),
+ origin[1]
+ ];
+ let poly = [p1, p2, p3, p4, p1];
+ let angle2 = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
+ poly = geoRotate(poly, -angle2, origin);
+ let extent = poly.reduce((extent2, point) => {
+ return extent2.extend(geoExtent(point));
+ }, geoExtent());
+ let minDist = Infinity;
+ _ssCache.bubbles.rtree.search(extent.bbox()).forEach((d) => {
+ if (d.data.key === selected.key)
+ return;
+ if (!geoPointInPolygon(d.data.loc, poly))
+ return;
+ let dist = geoVecLength(d.data.loc, selected.loc);
+ let theta = selected.ca - d.data.ca;
+ let minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
+ if (minTheta > 20) {
+ dist += 5;
+ }
+ if (dist < minDist) {
+ nextID = d.data.key;
+ minDist = dist;
+ }
+ });
+ let nextBubble = nextID && that.cachedImage(nextID);
+ if (!nextBubble)
+ return;
+ context.map().centerEase(nextBubble.loc);
+ that.selectImage(context, nextBubble.key).yaw(yaw).showViewer(context);
+ };
+ }
+ },
+ yaw: function(yaw) {
+ if (typeof yaw !== "number")
+ return yaw;
+ _sceneOptions.yaw = yaw;
+ return this;
+ },
+ showViewer: function(context) {
+ let wrap2 = context.container().select(".photoviewer").classed("hide", false);
+ let isHidden = wrap2.selectAll(".photo-wrapper.ms-wrapper.hide").size();
+ if (isHidden) {
+ wrap2.selectAll(".photo-wrapper:not(.ms-wrapper)").classed("hide", true);
+ wrap2.selectAll(".photo-wrapper.ms-wrapper").classed("hide", false);
+ }
+ return this;
+ },
+ hideViewer: function(context) {
+ let viewer = context.container().select(".photoviewer");
+ if (!viewer.empty())
+ viewer.datum(null);
+ viewer.classed("hide", true).selectAll(".photo-wrapper").classed("hide", true);
+ context.container().selectAll(".viewfield-group, .sequence, .icon-sign").classed("currentView", false);
+ this.updateUrlImage(null);
+ return this.setStyles(context, null, true);
+ },
+ selectImage: function(context, key) {
+ let that = this;
+ let d = this.cachedImage(key);
+ let viewer = context.container().select(".photoviewer");
+ if (!viewer.empty())
+ viewer.datum(d);
+ this.setStyles(context, null, true);
+ let wrap2 = context.container().select(".photoviewer .ms-wrapper");
+ let attribution = wrap2.selectAll(".photo-attribution").html("");
+ wrap2.selectAll(".pnlm-load-box").style("display", "block");
+ if (!d)
+ return this;
+ this.updateUrlImage(key);
+ _sceneOptions.northOffset = d.ca;
+ let line1 = attribution.append("div").attr("class", "attribution-row");
+ const hiresDomId = utilUniqueDomId("streetside-hires");
+ let label = line1.append("label").attr("for", hiresDomId).attr("class", "streetside-hires");
+ label.append("input").attr("type", "checkbox").attr("id", hiresDomId).property("checked", _hires).on("click", (d3_event) => {
+ d3_event.stopPropagation();
+ _hires = !_hires;
+ _resolution = _hires ? 1024 : 512;
+ wrap2.call(setupCanvas, true);
+ let viewstate = {
+ yaw: _pannellumViewer.getYaw(),
+ pitch: _pannellumViewer.getPitch(),
+ hfov: _pannellumViewer.getHfov()
+ };
+ _sceneOptions = Object.assign(_sceneOptions, viewstate);
+ that.selectImage(context, d.key).showViewer(context);
+ });
+ label.append("span").call(_t.append("streetside.hires"));
+ let captureInfo = line1.append("div").attr("class", "attribution-capture-info");
+ if (d.captured_by) {
+ const yyyy = new Date().getFullYear();
+ captureInfo.append("a").attr("class", "captured_by").attr("target", "_blank").attr("href", "https://www.microsoft.com/en-us/maps/streetside").text("\xA9" + yyyy + " Microsoft");
+ captureInfo.append("span").text("|");
+ }
+ if (d.captured_at) {
+ captureInfo.append("span").attr("class", "captured_at").text(localeTimestamp(d.captured_at));
+ }
+ let line2 = attribution.append("div").attr("class", "attribution-row");
+ line2.append("a").attr("class", "image-view-link").attr("target", "_blank").attr("href", "https://www.bing.com/maps?cp=" + d.loc[1] + "~" + d.loc[0] + "&lvl=17&dir=" + d.ca + "&style=x&v=2&sV=1").call(_t.append("streetside.view_on_bing"));
+ line2.append("a").attr("class", "image-report-link").attr("target", "_blank").attr("href", "https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=" + encodeURIComponent(d.key) + "&focus=photo&lat=" + d.loc[1] + "&lng=" + d.loc[0] + "&z=17").call(_t.append("streetside.report"));
+ let bubbleIdQuadKey = d.key.toString(4);
+ const paddingNeeded = 16 - bubbleIdQuadKey.length;
+ for (let i2 = 0; i2 < paddingNeeded; i2++) {
+ bubbleIdQuadKey = "0" + bubbleIdQuadKey;
+ }
+ const imgUrlPrefix = streetsideImagesApi + "hs" + bubbleIdQuadKey;
+ const imgUrlSuffix = ".jpg?g=6338&n=z";
+ const faceKeys = ["01", "02", "03", "10", "11", "12"];
+ let quadKeys = getQuadKeys();
+ let faces = faceKeys.map((faceKey) => {
+ return quadKeys.map((quadKey) => {
+ const xy = qkToXY(quadKey);
+ return {
+ face: faceKey,
+ url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
+ x: xy[0],
+ y: xy[1]
+ };
+ });
+ });
+ loadFaces(faces).then(function() {
+ if (!_pannellumViewer) {
+ that.initViewer();
+ } else {
+ _currScene += 1;
+ let sceneID = _currScene.toString();
+ _pannellumViewer.addScene(sceneID, _sceneOptions).loadScene(sceneID);
+ if (_currScene > 2) {
+ sceneID = (_currScene - 1).toString();
+ _pannellumViewer.removeScene(sceneID);
+ }
+ }
+ });
+ return this;
+ },
+ getSequenceKeyForBubble: function(d) {
+ return d && d.sequenceKey;
+ },
+ setStyles: function(context, hovered, reset) {
+ if (reset) {
+ context.container().selectAll(".viewfield-group").classed("highlighted", false).classed("hovered", false).classed("currentView", false);
+ context.container().selectAll(".sequence").classed("highlighted", false).classed("currentView", false);
+ }
+ let hoveredBubbleKey = hovered && hovered.key;
+ let hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
+ let hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
+ let hoveredBubbleKeys = hoveredSequence && hoveredSequence.bubbles.map((d) => d.key) || [];
+ let viewer = context.container().select(".photoviewer");
+ let selected = viewer.empty() ? void 0 : viewer.datum();
+ let selectedBubbleKey = selected && selected.key;
+ let selectedSequenceKey = this.getSequenceKeyForBubble(selected);
+ let selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
+ let selectedBubbleKeys = selectedSequence && selectedSequence.bubbles.map((d) => d.key) || [];
+ let highlightedBubbleKeys = utilArrayUnion(hoveredBubbleKeys, selectedBubbleKeys);
+ context.container().selectAll(".layer-streetside-images .viewfield-group").classed("highlighted", (d) => highlightedBubbleKeys.indexOf(d.key) !== -1).classed("hovered", (d) => d.key === hoveredBubbleKey).classed("currentView", (d) => d.key === selectedBubbleKey);
+ context.container().selectAll(".layer-streetside-images .sequence").classed("highlighted", (d) => d.properties.key === hoveredSequenceKey).classed("currentView", (d) => d.properties.key === selectedSequenceKey);
+ context.container().selectAll(".layer-streetside-images .viewfield-group .viewfield").attr("d", viewfieldPath);
+ function viewfieldPath() {
+ let d = this.parentNode.__data__;
+ if (d.pano && d.key !== selectedBubbleKey) {
+ return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0";
+ } else {
+ return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z";
+ }
+ }
+ return this;
+ },
+ updateUrlImage: function(imageKey) {
+ if (!window.mocha) {
+ var hash = utilStringQs(window.location.hash);
+ if (imageKey) {
+ hash.photo = "streetside/" + imageKey;
+ } else {
+ delete hash.photo;
+ }
+ window.location.replace("#" + utilQsString(hash, true));
+ }
+ },
+ cache: function() {
+ return _ssCache;
+ }
+ };
+
+ // modules/services/taginfo.js
+ var apibase4 = "https://taginfo.openstreetmap.org/api/4/";
+ var _inflight3 = {};
+ var _popularKeys = {};
+ var _taginfoCache = {};
+ var tag_sorts = {
+ point: "count_nodes",
+ vertex: "count_nodes",
+ area: "count_ways",
+ line: "count_ways"
+ };
+ var tag_sort_members = {
+ point: "count_node_members",
+ vertex: "count_node_members",
+ area: "count_way_members",
+ line: "count_way_members",
+ relation: "count_relation_members"
+ };
+ var tag_filters = {
+ point: "nodes",
+ vertex: "nodes",
+ area: "ways",
+ line: "ways"
+ };
+ var tag_members_fractions = {
+ point: "count_node_members_fraction",
+ vertex: "count_node_members_fraction",
+ area: "count_way_members_fraction",
+ line: "count_way_members_fraction",
+ relation: "count_relation_members_fraction"
+ };
+ function sets(params, n2, o) {
+ if (params.geometry && o[params.geometry]) {
+ params[n2] = o[params.geometry];
+ }
+ return params;
+ }
+ function setFilter(params) {
+ return sets(params, "filter", tag_filters);
+ }
+ function setSort(params) {
+ return sets(params, "sortname", tag_sorts);
+ }
+ function setSortMembers(params) {
+ return sets(params, "sortname", tag_sort_members);
+ }
+ function clean(params) {
+ return utilObjectOmit(params, ["geometry", "debounce"]);
+ }
+ function filterKeys(type3) {
+ var count_type = type3 ? "count_" + type3 : "count_all";
+ return function(d) {
+ return parseFloat(d[count_type]) > 2500 || d.in_wiki;
+ };
+ }
+ function filterMultikeys(prefix) {
+ return function(d) {
+ var re2 = new RegExp("^" + prefix + "(.*)$");
+ var matches = d.key.match(re2) || [];
+ return matches.length === 2 && matches[1].indexOf(":") === -1;
+ };
+ }
+ function filterValues(allowUpperCase) {
+ return function(d) {
+ if (d.value.match(/[;,]/) !== null)
+ return false;
+ if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null)
+ return false;
+ return parseFloat(d.fraction) > 0;
+ };
+ }
+ function filterRoles(geometry) {
+ return function(d) {
+ if (d.role === "")
+ return false;
+ if (d.role.match(/[A-Z*;,]/) !== null)
+ return false;
+ return parseFloat(d[tag_members_fractions[geometry]]) > 0;
+ };
+ }
+ function valKey(d) {
+ return {
+ value: d.key,
+ title: d.key
+ };
+ }
+ function valKeyDescription(d) {
+ var obj = {
+ value: d.value,
+ title: d.description || d.value
+ };
+ if (d.count) {
+ obj.count = d.count;
+ }
+ return obj;
+ }
+ function roleKey(d) {
+ return {
+ value: d.role,
+ title: d.role
+ };
+ }
+ function sortKeys(a, b) {
+ return a.key.indexOf(":") === -1 && b.key.indexOf(":") !== -1 ? -1 : a.key.indexOf(":") !== -1 && b.key.indexOf(":") === -1 ? 1 : 0;
+ }
+ var debouncedRequest2 = debounce_default(request2, 300, { leading: false });
+ function request2(url, params, exactMatch, callback, loaded) {
+ if (_inflight3[url])
+ return;
+ if (checkCache(url, params, exactMatch, callback))
+ return;
+ var controller = new AbortController();
+ _inflight3[url] = controller;
+ json_default(url, { signal: controller.signal }).then(function(result) {
+ delete _inflight3[url];
+ if (loaded)
+ loaded(null, result);
+ }).catch(function(err) {
+ delete _inflight3[url];
+ if (err.name === "AbortError")
+ return;
+ if (loaded)
+ loaded(err.message);
+ });
+ }
+ function checkCache(url, params, exactMatch, callback) {
+ var rp = params.rp || 25;
+ var testQuery = params.query || "";
+ var testUrl = url;
+ do {
+ var hit = _taginfoCache[testUrl];
+ if (hit && (url === testUrl || hit.length < rp)) {
+ callback(null, hit);
+ return true;
+ }
+ if (exactMatch || !testQuery.length)
+ return false;
+ testQuery = testQuery.slice(0, -1);
+ testUrl = url.replace(/&query=(.*?)&/, "&query=" + testQuery + "&");
+ } while (testQuery.length >= 0);
+ return false;
+ }
+ var taginfo_default = {
+ init: function() {
+ _inflight3 = {};
+ _taginfoCache = {};
+ _popularKeys = {
+ postal_code: true,
+ full_name: true,
+ loc_name: true,
+ reg_name: true,
+ short_name: true,
+ sorting_name: true,
+ artist_name: true,
+ nat_name: true,
+ long_name: true,
+ "bridge:name": true
+ };
+ var params = {
+ rp: 100,
+ sortname: "values_all",
+ sortorder: "desc",
+ page: 1,
+ debounce: false,
+ lang: _mainLocalizer.languageCode()
+ };
+ this.keys(params, function(err, data) {
+ if (err)
+ return;
+ data.forEach(function(d) {
+ if (d.value === "opening_hours")
+ return;
+ _popularKeys[d.value] = true;
+ });
+ });
+ },
+ reset: function() {
+ Object.values(_inflight3).forEach(function(controller) {
+ controller.abort();
+ });
+ _inflight3 = {};
+ },
+ keys: function(params, callback) {
+ var doRequest = params.debounce ? debouncedRequest2 : request2;
+ params = clean(setSort(params));
+ params = Object.assign({
+ rp: 10,
+ sortname: "count_all",
+ sortorder: "desc",
+ page: 1,
+ lang: _mainLocalizer.languageCode()
+ }, params);
+ var url = apibase4 + "keys/all?" + utilQsString(params);
+ doRequest(url, params, false, callback, function(err, d) {
+ if (err) {
+ callback(err);
+ } else {
+ var f2 = filterKeys(params.filter);
+ var result = d.data.filter(f2).sort(sortKeys).map(valKey);
+ _taginfoCache[url] = result;
+ callback(null, result);
+ }
+ });
+ },
+ multikeys: function(params, callback) {
+ var doRequest = params.debounce ? debouncedRequest2 : request2;
+ params = clean(setSort(params));
+ params = Object.assign({
+ rp: 25,
+ sortname: "count_all",
+ sortorder: "desc",
+ page: 1,
+ lang: _mainLocalizer.languageCode()
+ }, params);
+ var prefix = params.query;
+ var url = apibase4 + "keys/all?" + utilQsString(params);
+ doRequest(url, params, true, callback, function(err, d) {
+ if (err) {
+ callback(err);
+ } else {
+ var f2 = filterMultikeys(prefix);
+ var result = d.data.filter(f2).map(valKey);
+ _taginfoCache[url] = result;
+ callback(null, result);
+ }
+ });
+ },
+ values: function(params, callback) {
+ var key = params.key;
+ if (key && _popularKeys[key]) {
+ callback(null, []);
+ return;
+ }
+ var doRequest = params.debounce ? debouncedRequest2 : request2;
+ params = clean(setSort(setFilter(params)));
+ params = Object.assign({
+ rp: 25,
+ sortname: "count_all",
+ sortorder: "desc",
+ page: 1,
+ lang: _mainLocalizer.languageCode()
+ }, params);
+ var url = apibase4 + "key/values?" + utilQsString(params);
+ doRequest(url, params, false, callback, function(err, d) {
+ if (err) {
+ callback(err);
+ } else {
+ var re2 = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer|country|target|brewery|cai_scale/;
+ var allowUpperCase = re2.test(params.key);
+ var f2 = filterValues(allowUpperCase);
+ var result = d.data.filter(f2).map(valKeyDescription);
+ _taginfoCache[url] = result;
+ callback(null, result);
+ }
+ });
+ },
+ roles: function(params, callback) {
+ var doRequest = params.debounce ? debouncedRequest2 : request2;
+ var geometry = params.geometry;
+ params = clean(setSortMembers(params));
+ params = Object.assign({
+ rp: 25,
+ sortname: "count_all_members",
+ sortorder: "desc",
+ page: 1,
+ lang: _mainLocalizer.languageCode()
+ }, params);
+ var url = apibase4 + "relation/roles?" + utilQsString(params);
+ doRequest(url, params, true, callback, function(err, d) {
+ if (err) {
+ callback(err);
+ } else {
+ var f2 = filterRoles(geometry);
+ var result = d.data.filter(f2).map(roleKey);
+ _taginfoCache[url] = result;
+ callback(null, result);
+ }
+ });
+ },
+ docs: function(params, callback) {
+ var doRequest = params.debounce ? debouncedRequest2 : request2;
+ params = clean(setSort(params));
+ var path = "key/wiki_pages?";
+ if (params.value) {
+ path = "tag/wiki_pages?";
+ } else if (params.rtype) {
+ path = "relation/wiki_pages?";
+ }
+ var url = apibase4 + path + utilQsString(params);
+ doRequest(url, params, true, callback, function(err, d) {
+ if (err) {
+ callback(err);
+ } else {
+ _taginfoCache[url] = d.data;
+ callback(null, d.data);
+ }
+ });
+ },
+ apibase: function(_) {
+ if (!arguments.length)
+ return apibase4;
+ apibase4 = _;
+ return this;
+ }
+ };
+
+ // modules/services/vector_tile.js
+ var import_fast_deep_equal11 = __toESM(require_fast_deep_equal());
+
+ // node_modules/@turf/helpers/dist/es/index.js
+ var earthRadius = 63710088e-1;
+ var factors = {
+ centimeters: earthRadius * 100,
+ centimetres: earthRadius * 100,
+ degrees: earthRadius / 111325,
+ feet: earthRadius * 3.28084,
+ inches: earthRadius * 39.37,
+ kilometers: earthRadius / 1e3,
+ kilometres: earthRadius / 1e3,
+ meters: earthRadius,
+ metres: earthRadius,
+ miles: earthRadius / 1609.344,
+ millimeters: earthRadius * 1e3,
+ millimetres: earthRadius * 1e3,
+ nauticalmiles: earthRadius / 1852,
+ radians: 1,
+ yards: earthRadius * 1.0936
+ };
+ var unitsFactors = {
+ centimeters: 100,
+ centimetres: 100,
+ degrees: 1 / 111325,
+ feet: 3.28084,
+ inches: 39.37,
+ kilometers: 1 / 1e3,
+ kilometres: 1 / 1e3,
+ meters: 1,
+ metres: 1,
+ miles: 1 / 1609.344,
+ millimeters: 1e3,
+ millimetres: 1e3,
+ nauticalmiles: 1 / 1852,
+ radians: 1 / earthRadius,
+ yards: 1.0936133
+ };
+ function feature2(geom, properties, options2) {
+ if (options2 === void 0) {
+ options2 = {};
+ }
+ var feat = { type: "Feature" };
+ if (options2.id === 0 || options2.id) {
+ feat.id = options2.id;
+ }
+ if (options2.bbox) {
+ feat.bbox = options2.bbox;
+ }
+ feat.properties = properties || {};
+ feat.geometry = geom;
+ return feat;
+ }
+ function polygon(coordinates, properties, options2) {
+ if (options2 === void 0) {
+ options2 = {};
+ }
+ for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
+ var ring = coordinates_1[_i];
+ if (ring.length < 4) {
+ throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
+ }
+ for (var j2 = 0; j2 < ring[ring.length - 1].length; j2++) {
+ if (ring[ring.length - 1][j2] !== ring[0][j2]) {
+ throw new Error("First and last Position are not equivalent.");
+ }
+ }
+ }
+ var geom = {
+ type: "Polygon",
+ coordinates
+ };
+ return feature2(geom, properties, options2);
+ }
+ function lineString(coordinates, properties, options2) {
+ if (options2 === void 0) {
+ options2 = {};
+ }
+ if (coordinates.length < 2) {
+ throw new Error("coordinates must be an array of two or more positions");
+ }
+ var geom = {
+ type: "LineString",
+ coordinates
+ };
+ return feature2(geom, properties, options2);
+ }
+ function multiLineString(coordinates, properties, options2) {
+ if (options2 === void 0) {
+ options2 = {};
+ }
+ var geom = {
+ type: "MultiLineString",
+ coordinates
+ };
+ return feature2(geom, properties, options2);
+ }
+ function multiPolygon(coordinates, properties, options2) {
+ if (options2 === void 0) {
+ options2 = {};
+ }
+ var geom = {
+ type: "MultiPolygon",
+ coordinates
+ };
+ return feature2(geom, properties, options2);
+ }
+
+ // node_modules/@turf/invariant/dist/es/index.js
+ function getGeom(geojson) {
+ if (geojson.type === "Feature") {
+ return geojson.geometry;
+ }
+ return geojson;
+ }
+
+ // node_modules/@turf/bbox-clip/dist/es/lib/lineclip.js
+ function lineclip(points, bbox, result) {
+ var len = points.length, codeA = bitCode(points[0], bbox), part = [], i2, codeB, lastCode;
+ var a;
+ var b;
+ if (!result)
+ result = [];
+ for (i2 = 1; i2 < len; i2++) {
+ a = points[i2 - 1];
+ b = points[i2];
+ codeB = lastCode = bitCode(b, bbox);
+ while (true) {
+ if (!(codeA | codeB)) {
+ part.push(a);
+ if (codeB !== lastCode) {
+ part.push(b);
+ if (i2 < len - 1) {
+ result.push(part);
+ part = [];
+ }
+ } else if (i2 === len - 1) {
+ part.push(b);
+ }
+ break;
+ } else if (codeA & codeB) {
+ break;
+ } else if (codeA) {
+ a = intersect(a, b, codeA, bbox);
+ codeA = bitCode(a, bbox);
+ } else {
+ b = intersect(a, b, codeB, bbox);
+ codeB = bitCode(b, bbox);
+ }
+ }
+ codeA = lastCode;
+ }
+ if (part.length)
+ result.push(part);
+ return result;
+ }
+ function polygonclip(points, bbox) {
+ var result, edge, prev, prevInside, i2, p, inside;
+ for (edge = 1; edge <= 8; edge *= 2) {
+ result = [];
+ prev = points[points.length - 1];
+ prevInside = !(bitCode(prev, bbox) & edge);
+ for (i2 = 0; i2 < points.length; i2++) {
+ p = points[i2];
+ inside = !(bitCode(p, bbox) & edge);
+ if (inside !== prevInside)
+ result.push(intersect(prev, p, edge, bbox));
+ if (inside)
+ result.push(p);
+ prev = p;
+ prevInside = inside;
+ }
+ points = result;
+ if (!points.length)
+ break;
+ }
+ return result;
+ }
+ function intersect(a, b, edge, bbox) {
+ return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : null;
+ }
+ function bitCode(p, bbox) {
+ var code = 0;
+ if (p[0] < bbox[0])
+ code |= 1;
+ else if (p[0] > bbox[2])
+ code |= 2;
+ if (p[1] < bbox[1])
+ code |= 4;
+ else if (p[1] > bbox[3])
+ code |= 8;
+ return code;
+ }
+
+ // node_modules/@turf/bbox-clip/dist/es/index.js
+ function bboxClip(feature3, bbox) {
+ var geom = getGeom(feature3);
+ var type3 = geom.type;
+ var properties = feature3.type === "Feature" ? feature3.properties : {};
+ var coords = geom.coordinates;
+ switch (type3) {
+ case "LineString":
+ case "MultiLineString": {
+ var lines_1 = [];
+ if (type3 === "LineString") {
+ coords = [coords];
+ }
+ coords.forEach(function(line) {
+ lineclip(line, bbox, lines_1);
+ });
+ if (lines_1.length === 1) {
+ return lineString(lines_1[0], properties);
+ }
+ return multiLineString(lines_1, properties);
+ }
+ case "Polygon":
+ return polygon(clipPolygon(coords, bbox), properties);
+ case "MultiPolygon":
+ return multiPolygon(coords.map(function(poly) {
+ return clipPolygon(poly, bbox);
+ }), properties);
+ default:
+ throw new Error("geometry " + type3 + " not supported");
+ }
+ }
+ function clipPolygon(rings, bbox) {
+ var outRings = [];
+ for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
+ var ring = rings_1[_i];
+ var clipped = polygonclip(ring, bbox);
+ if (clipped.length > 0) {
+ if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
+ clipped.push(clipped[0]);
+ }
+ if (clipped.length >= 4) {
+ outRings.push(clipped);
+ }
+ }
+ }
+ return outRings;
+ }
+
+ // modules/services/vector_tile.js
+ var import_fast_json_stable_stringify2 = __toESM(require_fast_json_stable_stringify());
+ var import_polygon_clipping2 = __toESM(require_polygon_clipping_umd());
+ var import_pbf2 = __toESM(require_pbf());
+ var import_vector_tile2 = __toESM(require_vector_tile());
+ var tiler7 = utilTiler().tileSize(512).margin(1);
+ var dispatch9 = dispatch_default("loadedData");
+ var _vtCache;
+ function abortRequest7(controller) {
+ controller.abort();
+ }
+ function vtToGeoJSON(data, tile, mergeCache) {
+ var vectorTile = new import_vector_tile2.default.VectorTile(new import_pbf2.default(data));
+ var layers = Object.keys(vectorTile.layers);
+ if (!Array.isArray(layers)) {
+ layers = [layers];
+ }
+ var features2 = [];
+ layers.forEach(function(layerID) {
+ var layer = vectorTile.layers[layerID];
+ if (layer) {
+ for (var i2 = 0; i2 < layer.length; i2++) {
+ var feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
+ var geometry = feature3.geometry;
+ if (geometry.type === "Polygon") {
+ geometry.type = "MultiPolygon";
+ geometry.coordinates = [geometry.coordinates];
+ }
+ var isClipped = false;
+ if (geometry.type === "MultiPolygon") {
+ var featureClip = bboxClip(feature3, tile.extent.rectangle());
+ if (!(0, import_fast_deep_equal11.default)(feature3.geometry, featureClip.geometry)) {
+ isClipped = true;
+ }
+ if (!feature3.geometry.coordinates.length)
+ continue;
+ if (!feature3.geometry.coordinates[0].length)
+ continue;
+ }
+ var featurehash = utilHashcode((0, import_fast_json_stable_stringify2.default)(feature3));
+ var propertyhash = utilHashcode((0, import_fast_json_stable_stringify2.default)(feature3.properties || {}));
+ feature3.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, "_");
+ feature3.__featurehash__ = featurehash;
+ feature3.__propertyhash__ = propertyhash;
+ features2.push(feature3);
+ if (isClipped && geometry.type === "MultiPolygon") {
+ var merged = mergeCache[propertyhash];
+ if (merged && merged.length) {
+ var other = merged[0];
+ var coords = import_polygon_clipping2.default.union(feature3.geometry.coordinates, other.geometry.coordinates);
+ if (!coords || !coords.length) {
+ continue;
+ }
+ merged.push(feature3);
+ for (var j2 = 0; j2 < merged.length; j2++) {
+ merged[j2].geometry.coordinates = coords;
+ merged[j2].__featurehash__ = featurehash;
+ }
+ } else {
+ mergeCache[propertyhash] = [feature3];
+ }
+ }
+ }
+ }
+ });
+ return features2;
+ }
+ function loadTile2(source, tile) {
+ if (source.loaded[tile.id] || source.inflight[tile.id])
+ return;
+ var url = source.template.replace("{x}", tile.xyz[0]).replace("{y}", tile.xyz[1]).replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1).replace(/\{z(oom)?\}/, tile.xyz[2]).replace(/\{switch:([^}]+)\}/, function(s, r) {
+ var subdomains = r.split(",");
+ return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
+ });
+ var controller = new AbortController();
+ source.inflight[tile.id] = controller;
+ fetch(url, { signal: controller.signal }).then(function(response) {
+ if (!response.ok) {
+ throw new Error(response.status + " " + response.statusText);
+ }
+ source.loaded[tile.id] = [];
+ delete source.inflight[tile.id];
+ return response.arrayBuffer();
+ }).then(function(data) {
+ if (!data) {
+ throw new Error("No Data");
+ }
+ var z = tile.xyz[2];
+ if (!source.canMerge[z]) {
+ source.canMerge[z] = {};
+ }
+ source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
+ dispatch9.call("loadedData");
+ }).catch(function() {
+ source.loaded[tile.id] = [];
+ delete source.inflight[tile.id];
+ });
+ }
+ var vector_tile_default = {
+ init: function() {
+ if (!_vtCache) {
+ this.reset();
+ }
+ this.event = utilRebind(this, dispatch9, "on");
+ },
+ reset: function() {
+ for (var sourceID in _vtCache) {
+ var source = _vtCache[sourceID];
+ if (source && source.inflight) {
+ Object.values(source.inflight).forEach(abortRequest7);
+ }
+ }
+ _vtCache = {};
+ },
+ addSource: function(sourceID, template) {
+ _vtCache[sourceID] = { template, inflight: {}, loaded: {}, canMerge: {} };
+ return _vtCache[sourceID];
+ },
+ data: function(sourceID, projection2) {
+ var source = _vtCache[sourceID];
+ if (!source)
+ return [];
+ var tiles = tiler7.getTiles(projection2);
+ var seen = {};
+ var results = [];
+ for (var i2 = 0; i2 < tiles.length; i2++) {
+ var features2 = source.loaded[tiles[i2].id];
+ if (!features2 || !features2.length)
+ continue;
+ for (var j2 = 0; j2 < features2.length; j2++) {
+ var feature3 = features2[j2];
+ var hash = feature3.__featurehash__;
+ if (seen[hash])
+ continue;
+ seen[hash] = true;
+ results.push(Object.assign({}, feature3));
+ }
+ }
+ return results;
+ },
+ loadTiles: function(sourceID, template, projection2) {
+ var source = _vtCache[sourceID];
+ if (!source) {
+ source = this.addSource(sourceID, template);
+ }
+ var tiles = tiler7.getTiles(projection2);
+ Object.keys(source.inflight).forEach(function(k) {
+ var wanted = tiles.find(function(tile) {
+ return k === tile.id;
+ });
+ if (!wanted) {
+ abortRequest7(source.inflight[k]);
+ delete source.inflight[k];
+ }
+ });
+ tiles.forEach(function(tile) {
+ loadTile2(source, tile);
+ });
+ },
+ cache: function() {
+ return _vtCache;
+ }
+ };
+
+ // modules/services/wikidata.js
+ var apibase5 = "https://www.wikidata.org/w/api.php?";
+ var _wikidataCache = {};
+ var wikidata_default = {
+ init: function() {
+ },
+ reset: function() {
+ _wikidataCache = {};
+ },
+ itemsForSearchQuery: function(query, callback) {
+ if (!query) {
+ if (callback)
+ callback("No query", {});
+ return;
+ }
+ var lang = this.languagesToQuery()[0];
+ var url = apibase5 + utilQsString({
+ action: "wbsearchentities",
+ format: "json",
+ formatversion: 2,
+ search: query,
+ type: "item",
+ language: lang,
+ uselang: lang,
+ limit: 10,
+ origin: "*"
+ });
+ json_default(url).then(function(result) {
+ if (result && result.error) {
+ throw new Error(result.error);
+ }
+ if (callback)
+ callback(null, result.search || {});
+ }).catch(function(err) {
+ if (callback)
+ callback(err.message, {});
+ });
+ },
+ itemsByTitle: function(lang, title, callback) {
+ if (!title) {
+ if (callback)
+ callback("No title", {});
+ return;
+ }
+ lang = lang || "en";
+ var url = apibase5 + utilQsString({
+ action: "wbgetentities",
+ format: "json",
+ formatversion: 2,
+ sites: lang.replace(/-/g, "_") + "wiki",
+ titles: title,
+ languages: "en",
+ origin: "*"
+ });
+ json_default(url).then(function(result) {
+ if (result && result.error) {
+ throw new Error(result.error);
+ }
+ if (callback)
+ callback(null, result.entities || {});
+ }).catch(function(err) {
+ if (callback)
+ callback(err.message, {});
+ });
+ },
+ languagesToQuery: function() {
+ return _mainLocalizer.localeCodes().map(function(code) {
+ return code.toLowerCase();
+ }).filter(function(code) {
+ return code !== "en-us";
+ });
+ },
+ entityByQID: function(qid, callback) {
+ if (!qid) {
+ callback("No qid", {});
+ return;
+ }
+ if (_wikidataCache[qid]) {
+ if (callback)
+ callback(null, _wikidataCache[qid]);
+ return;
+ }
+ var langs = this.languagesToQuery();
+ var url = apibase5 + utilQsString({
+ action: "wbgetentities",
+ format: "json",
+ formatversion: 2,
+ ids: qid,
+ props: "labels|descriptions|claims|sitelinks",
+ sitefilter: langs.map(function(d) {
+ return d + "wiki";
+ }).join("|"),
+ languages: langs.join("|"),
+ languagefallback: 1,
+ origin: "*"
+ });
+ json_default(url).then(function(result) {
+ if (result && result.error) {
+ throw new Error(result.error);
+ }
+ if (callback)
+ callback(null, result.entities[qid] || {});
+ }).catch(function(err) {
+ if (callback)
+ callback(err.message, {});
+ });
+ },
+ getDocs: function(params, callback) {
+ var langs = this.languagesToQuery();
+ this.entityByQID(params.qid, function(err, entity) {
+ if (err || !entity) {
+ callback(err || "No entity");
+ return;
+ }
+ var i2;
+ var description2;
+ for (i2 in langs) {
+ let code = langs[i2];
+ if (entity.descriptions[code] && entity.descriptions[code].language === code) {
+ description2 = entity.descriptions[code];
+ break;
+ }
+ }
+ if (!description2 && Object.values(entity.descriptions).length)
+ description2 = Object.values(entity.descriptions)[0];
+ var result = {
+ title: entity.id,
+ description: description2 ? description2.value : "",
+ descriptionLocaleCode: description2 ? description2.language : "",
+ editURL: "https://www.wikidata.org/wiki/" + entity.id
+ };
+ if (entity.claims) {
+ var imageroot = "https://commons.wikimedia.org/w/index.php";
+ var props = ["P154", "P18"];
+ var prop, image;
+ for (i2 = 0; i2 < props.length; i2++) {
+ prop = entity.claims[props[i2]];
+ if (prop && Object.keys(prop).length > 0) {
+ image = prop[Object.keys(prop)[0]].mainsnak.datavalue.value;
+ if (image) {
+ result.imageURL = imageroot + "?" + utilQsString({
+ title: "Special:Redirect/file/" + image,
+ width: 400
+ });
+ break;
+ }
+ }
+ }
+ }
+ if (entity.sitelinks) {
+ var englishLocale = _mainLocalizer.languageCode().toLowerCase() === "en";
+ for (i2 = 0; i2 < langs.length; i2++) {
+ var w = langs[i2] + "wiki";
+ if (entity.sitelinks[w]) {
+ var title = entity.sitelinks[w].title;
+ var tKey = "inspector.wiki_reference";
+ if (!englishLocale && langs[i2] === "en") {
+ tKey = "inspector.wiki_en_reference";
+ }
+ result.wiki = {
+ title,
+ text: tKey,
+ url: "https://" + langs[i2] + ".wikipedia.org/wiki/" + title.replace(/ /g, "_")
+ };
+ break;
+ }
+ }
+ }
+ callback(null, result);
+ });
+ }
+ };
+
+ // modules/services/wikipedia.js
+ var endpoint = "https://en.wikipedia.org/w/api.php?";
+ var wikipedia_default = {
+ init: function() {
+ },
+ reset: function() {
+ },
+ search: function(lang, query, callback) {
+ if (!query) {
+ if (callback)
+ callback("No Query", []);
+ return;
+ }
+ lang = lang || "en";
+ var url = endpoint.replace("en", lang) + utilQsString({
+ action: "query",
+ list: "search",
+ srlimit: "10",
+ srinfo: "suggestion",
+ format: "json",
+ origin: "*",
+ srsearch: query
+ });
+ json_default(url).then(function(result) {
+ if (result && result.error) {
+ throw new Error(result.error);
+ } else if (!result || !result.query || !result.query.search) {
+ throw new Error("No Results");
+ }
+ if (callback) {
+ var titles = result.query.search.map(function(d) {
+ return d.title;
+ });
+ callback(null, titles);
+ }
+ }).catch(function(err) {
+ if (callback)
+ callback(err, []);
+ });
+ },
+ suggestions: function(lang, query, callback) {
+ if (!query) {
+ if (callback)
+ callback("", []);
+ return;
+ }
+ lang = lang || "en";
+ var url = endpoint.replace("en", lang) + utilQsString({
+ action: "opensearch",
+ namespace: 0,
+ suggest: "",
+ format: "json",
+ origin: "*",
+ search: query
+ });
+ json_default(url).then(function(result) {
+ if (result && result.error) {
+ throw new Error(result.error);
+ } else if (!result || result.length < 2) {
+ throw new Error("No Results");
+ }
+ if (callback)
+ callback(null, result[1] || []);
+ }).catch(function(err) {
+ if (callback)
+ callback(err.message, []);
+ });
+ },
+ translations: function(lang, title, callback) {
+ if (!title) {
+ if (callback)
+ callback("No Title");
+ return;
+ }
+ var url = endpoint.replace("en", lang) + utilQsString({
+ action: "query",
+ prop: "langlinks",
+ format: "json",
+ origin: "*",
+ lllimit: 500,
+ titles: title
+ });
+ json_default(url).then(function(result) {
+ if (result && result.error) {
+ throw new Error(result.error);
+ } else if (!result || !result.query || !result.query.pages) {
+ throw new Error("No Results");
+ }
+ if (callback) {
+ var list = result.query.pages[Object.keys(result.query.pages)[0]];
+ var translations = {};
+ if (list && list.langlinks) {
+ list.langlinks.forEach(function(d) {
+ translations[d.lang] = d["*"];
+ });
+ }
+ callback(null, translations);
+ }
+ }).catch(function(err) {
+ if (callback)
+ callback(err.message);
+ });
+ }
+ };
+
+ // modules/services/index.js
+ var services = {
+ geocoder: nominatim_default,
+ keepRight: keepRight_default,
+ improveOSM: improveOSM_default,
+ osmose: osmose_default,
+ mapillary: mapillary_default,
+ nsi: nsi_default,
+ kartaview: kartaview_default,
+ osm: osm_default,
+ osmWikibase: osm_wikibase_default,
+ maprules: maprules_default,
+ streetside: streetside_default,
+ taginfo: taginfo_default,
+ vectorTile: vector_tile_default,
+ wikidata: wikidata_default,
+ wikipedia: wikipedia_default
+ };
+
+ // modules/modes/drag_note.js
+ function modeDragNote(context) {
+ var mode = {
+ id: "drag-note",
+ button: "browse"
+ };
+ var edit2 = behaviorEdit(context);
+ var _nudgeInterval;
+ var _lastLoc;
+ var _note;
+ function startNudge(d3_event, nudge) {
+ if (_nudgeInterval)
+ window.clearInterval(_nudgeInterval);
+ _nudgeInterval = window.setInterval(function() {
+ context.map().pan(nudge);
+ doMove(d3_event, nudge);
+ }, 50);
+ }
+ function stopNudge() {
+ if (_nudgeInterval) {
+ window.clearInterval(_nudgeInterval);
+ _nudgeInterval = null;
+ }
+ }
+ function origin(note) {
+ return context.projection(note.loc);
+ }
+ function start2(d3_event, note) {
+ _note = note;
+ var osm = services.osm;
+ if (osm) {
+ _note = osm.getNote(_note.id);
+ }
+ context.surface().selectAll(".note-" + _note.id).classed("active", true);
+ context.perform(actionNoop());
+ context.enter(mode);
+ context.selectedNoteID(_note.id);
+ }
+ function move(d3_event, entity, point) {
+ d3_event.stopPropagation();
+ _lastLoc = context.projection.invert(point);
+ doMove(d3_event);
+ var nudge = geoViewportEdge(point, context.map().dimensions());
+ if (nudge) {
+ startNudge(d3_event, nudge);
+ } else {
+ stopNudge();
+ }
+ }
+ function doMove(d3_event, nudge) {
+ nudge = nudge || [0, 0];
+ var currPoint = d3_event && d3_event.point || context.projection(_lastLoc);
+ var currMouse = geoVecSubtract(currPoint, nudge);
+ var loc = context.projection.invert(currMouse);
+ _note = _note.move(loc);
+ var osm = services.osm;
+ if (osm) {
+ osm.replaceNote(_note);
+ }
+ context.replace(actionNoop());
+ }
+ function end() {
+ context.replace(actionNoop());
+ context.selectedNoteID(_note.id).enter(modeSelectNote(context, _note.id));
+ }
+ var drag = behaviorDrag().selector(".layer-touch.markers .target.note.new").surface(context.container().select(".main-map").node()).origin(origin).on("start", start2).on("move", move).on("end", end);
+ mode.enter = function() {
+ context.install(edit2);
+ };
+ mode.exit = function() {
+ context.ui().sidebar.hover.cancel();
+ context.uninstall(edit2);
+ context.surface().selectAll(".active").classed("active", false);
+ stopNudge();
+ };
+ mode.behavior = drag;
+ return mode;
+ }
+
+ // modules/modes/select_data.js
+ function modeSelectData(context, selectedDatum) {
+ var mode = {
+ id: "select-data",
+ button: "browse"
+ };
+ var keybinding = utilKeybinding("select-data");
+ var dataEditor = uiDataEditor(context);
+ var behaviors = [
+ behaviorBreathe(context),
+ behaviorHover(context),
+ behaviorSelect(context),
+ behaviorLasso(context),
+ modeDragNode(context).behavior,
+ modeDragNote(context).behavior
+ ];
+ function selectData(d3_event, drawn) {
+ var selection2 = context.surface().selectAll(".layer-mapdata .data" + selectedDatum.__featurehash__);
+ if (selection2.empty()) {
+ var source = d3_event && d3_event.type === "zoom" && d3_event.sourceEvent;
+ if (drawn && source && (source.type === "pointermove" || source.type === "mousemove" || source.type === "touchmove")) {
+ context.enter(modeBrowse(context));
+ }
+ } else {
+ selection2.classed("selected", true);
+ }
+ }
+ function esc() {
+ if (context.container().select(".combobox").size())
+ return;
+ context.enter(modeBrowse(context));
+ }
+ mode.zoomToSelected = function() {
+ var extent = geoExtent(bounds_default(selectedDatum));
+ context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
+ };
+ mode.enter = function() {
+ behaviors.forEach(context.install);
+ keybinding.on(_t("inspector.zoom_to.key"), mode.zoomToSelected).on("\u238B", esc, true);
+ select_default2(document).call(keybinding);
+ selectData();
+ var sidebar = context.ui().sidebar;
+ sidebar.show(dataEditor.datum(selectedDatum));
+ var extent = geoExtent(bounds_default(selectedDatum));
+ sidebar.expand(sidebar.intersects(extent));
+ context.map().on("drawn.select-data", selectData);
+ };
+ mode.exit = function() {
+ behaviors.forEach(context.uninstall);
+ select_default2(document).call(keybinding.unbind);
+ context.surface().selectAll(".layer-mapdata .selected").classed("selected hover", false);
+ context.map().on("drawn.select-data", null);
+ context.ui().sidebar.hide();
+ };
+ return mode;
+ }
+
+ // modules/behavior/select.js
+ function behaviorSelect(context) {
+ var _tolerancePx = 4;
+ var _lastMouseEvent = null;
+ var _showMenu = false;
+ var _downPointers = {};
+ var _longPressTimeout = null;
+ var _lastInteractionType = null;
+ var _multiselectionPointerId = null;
+ var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ function keydown(d3_event) {
+ if (d3_event.keyCode === 32) {
+ var activeNode = document.activeElement;
+ if (activeNode && (/* @__PURE__ */ new Set(["INPUT", "TEXTAREA"])).has(activeNode.nodeName))
+ return;
+ }
+ if (d3_event.keyCode === 93 || d3_event.keyCode === 32) {
+ d3_event.preventDefault();
+ }
+ if (d3_event.repeat)
+ return;
+ cancelLongPress();
+ if (d3_event.shiftKey) {
+ context.surface().classed("behavior-multiselect", true);
+ }
+ if (d3_event.keyCode === 32) {
+ if (!_downPointers.spacebar && _lastMouseEvent) {
+ cancelLongPress();
+ _longPressTimeout = window.setTimeout(didLongPress, 500, "spacebar", "spacebar");
+ _downPointers.spacebar = {
+ firstEvent: _lastMouseEvent,
+ lastEvent: _lastMouseEvent
+ };
+ }
+ }
+ }
+ function keyup(d3_event) {
+ cancelLongPress();
+ if (!d3_event.shiftKey) {
+ context.surface().classed("behavior-multiselect", false);
+ }
+ if (d3_event.keyCode === 93) {
+ d3_event.preventDefault();
+ _lastInteractionType = "menukey";
+ contextmenu(d3_event);
+ } else if (d3_event.keyCode === 32) {
+ var pointer = _downPointers.spacebar;
+ if (pointer) {
+ delete _downPointers.spacebar;
+ if (pointer.done)
+ return;
+ d3_event.preventDefault();
+ _lastInteractionType = "spacebar";
+ click(pointer.firstEvent, pointer.lastEvent, "spacebar");
+ }
+ }
+ }
+ function pointerdown(d3_event) {
+ var id2 = (d3_event.pointerId || "mouse").toString();
+ cancelLongPress();
+ if (d3_event.buttons && d3_event.buttons !== 1)
+ return;
+ context.ui().closeEditMenu();
+ _longPressTimeout = window.setTimeout(didLongPress, 500, id2, "longdown-" + (d3_event.pointerType || "mouse"));
+ _downPointers[id2] = {
+ firstEvent: d3_event,
+ lastEvent: d3_event
+ };
+ }
+ function didLongPress(id2, interactionType) {
+ var pointer = _downPointers[id2];
+ if (!pointer)
+ return;
+ for (var i2 in _downPointers) {
+ _downPointers[i2].done = true;
+ }
+ _longPressTimeout = null;
+ _lastInteractionType = interactionType;
+ _showMenu = true;
+ click(pointer.firstEvent, pointer.lastEvent, id2);
+ }
+ function pointermove(d3_event) {
+ var id2 = (d3_event.pointerId || "mouse").toString();
+ if (_downPointers[id2]) {
+ _downPointers[id2].lastEvent = d3_event;
+ }
+ if (!d3_event.pointerType || d3_event.pointerType === "mouse") {
+ _lastMouseEvent = d3_event;
+ if (_downPointers.spacebar) {
+ _downPointers.spacebar.lastEvent = d3_event;
+ }
+ }
+ }
+ function pointerup(d3_event) {
+ var id2 = (d3_event.pointerId || "mouse").toString();
+ var pointer = _downPointers[id2];
+ if (!pointer)
+ return;
+ delete _downPointers[id2];
+ if (_multiselectionPointerId === id2) {
+ _multiselectionPointerId = null;
+ }
+ if (pointer.done)
+ return;
+ click(pointer.firstEvent, d3_event, id2);
+ }
+ function pointercancel(d3_event) {
+ var id2 = (d3_event.pointerId || "mouse").toString();
+ if (!_downPointers[id2])
+ return;
+ delete _downPointers[id2];
+ if (_multiselectionPointerId === id2) {
+ _multiselectionPointerId = null;
+ }
+ }
+ function contextmenu(d3_event) {
+ d3_event.preventDefault();
+ if (!+d3_event.clientX && !+d3_event.clientY) {
+ if (_lastMouseEvent) {
+ d3_event.sourceEvent = _lastMouseEvent;
+ } else {
+ return;
+ }
+ } else {
+ _lastMouseEvent = d3_event;
+ _lastInteractionType = "rightclick";
+ }
+ _showMenu = true;
+ click(d3_event, d3_event);
+ }
+ function click(firstEvent, lastEvent, pointerId) {
+ cancelLongPress();
+ var mapNode = context.container().select(".main-map").node();
+ var pointGetter = utilFastMouse(mapNode);
+ var p1 = pointGetter(firstEvent);
+ var p2 = pointGetter(lastEvent);
+ var dist = geoVecLength(p1, p2);
+ if (dist > _tolerancePx || !mapContains(lastEvent)) {
+ resetProperties();
+ return;
+ }
+ var targetDatum = lastEvent.target.__data__;
+ var multiselectEntityId;
+ if (!_multiselectionPointerId) {
+ var selectPointerInfo = pointerDownOnSelection(pointerId);
+ if (selectPointerInfo) {
+ _multiselectionPointerId = selectPointerInfo.pointerId;
+ multiselectEntityId = !selectPointerInfo.selected && selectPointerInfo.entityId;
+ _downPointers[selectPointerInfo.pointerId].done = true;
+ }
+ }
+ var isMultiselect = context.mode().id === "select" && (lastEvent && lastEvent.shiftKey || context.surface().select(".lasso").node() || _multiselectionPointerId && !multiselectEntityId);
+ processClick(targetDatum, isMultiselect, p2, multiselectEntityId);
+ function mapContains(event) {
+ var rect = mapNode.getBoundingClientRect();
+ return event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom;
+ }
+ function pointerDownOnSelection(skipPointerId) {
+ var mode = context.mode();
+ var selectedIDs = mode.id === "select" ? mode.selectedIDs() : [];
+ for (var pointerId2 in _downPointers) {
+ if (pointerId2 === "spacebar" || pointerId2 === skipPointerId)
+ continue;
+ var pointerInfo = _downPointers[pointerId2];
+ var p12 = pointGetter(pointerInfo.firstEvent);
+ var p22 = pointGetter(pointerInfo.lastEvent);
+ if (geoVecLength(p12, p22) > _tolerancePx)
+ continue;
+ var datum2 = pointerInfo.firstEvent.target.__data__;
+ var entity = datum2 && datum2.properties && datum2.properties.entity || datum2;
+ if (context.graph().hasEntity(entity.id)) {
+ return {
+ pointerId: pointerId2,
+ entityId: entity.id,
+ selected: selectedIDs.indexOf(entity.id) !== -1
+ };
+ }
+ }
+ return null;
+ }
+ }
+ function processClick(datum2, isMultiselect, point, alsoSelectId) {
+ var mode = context.mode();
+ var showMenu = _showMenu;
+ var interactionType = _lastInteractionType;
+ var entity = datum2 && datum2.properties && datum2.properties.entity;
+ if (entity)
+ datum2 = entity;
+ if (datum2 && datum2.type === "midpoint") {
+ datum2 = datum2.parents[0];
+ }
+ var newMode;
+ if (datum2 instanceof osmEntity) {
+ var selectedIDs = context.selectedIDs();
+ context.selectedNoteID(null);
+ context.selectedErrorID(null);
+ if (!isMultiselect) {
+ if (!showMenu || selectedIDs.length <= 1 || selectedIDs.indexOf(datum2.id) === -1) {
+ if (alsoSelectId === datum2.id)
+ alsoSelectId = null;
+ selectedIDs = (alsoSelectId ? [alsoSelectId] : []).concat([datum2.id]);
+ newMode = mode.id === "select" ? mode.selectedIDs(selectedIDs) : modeSelect(context, selectedIDs).selectBehavior(behavior);
+ context.enter(newMode);
+ }
+ } else {
+ if (selectedIDs.indexOf(datum2.id) !== -1) {
+ if (!showMenu) {
+ selectedIDs = selectedIDs.filter(function(id2) {
+ return id2 !== datum2.id;
+ });
+ newMode = selectedIDs.length ? mode.selectedIDs(selectedIDs) : modeBrowse(context).selectBehavior(behavior);
+ context.enter(newMode);
+ }
+ } else {
+ selectedIDs = selectedIDs.concat([datum2.id]);
+ newMode = mode.selectedIDs(selectedIDs);
+ context.enter(newMode);
+ }
+ }
+ } else if (datum2 && datum2.__featurehash__ && !isMultiselect) {
+ context.selectedNoteID(null).enter(modeSelectData(context, datum2));
+ } else if (datum2 instanceof osmNote && !isMultiselect) {
+ context.selectedNoteID(datum2.id).enter(modeSelectNote(context, datum2.id));
+ } else if (datum2 instanceof QAItem && !isMultiselect) {
+ context.selectedErrorID(datum2.id).enter(modeSelectError(context, datum2.id, datum2.service));
+ } else {
+ context.selectedNoteID(null);
+ context.selectedErrorID(null);
+ if (!isMultiselect && mode.id !== "browse") {
+ context.enter(modeBrowse(context));
+ }
+ }
+ context.ui().closeEditMenu();
+ if (showMenu)
+ context.ui().showEditMenu(point, interactionType);
+ resetProperties();
+ }
+ function cancelLongPress() {
+ if (_longPressTimeout)
+ window.clearTimeout(_longPressTimeout);
+ _longPressTimeout = null;
+ }
+ function resetProperties() {
+ cancelLongPress();
+ _showMenu = false;
+ _lastInteractionType = null;
+ }
+ function behavior(selection2) {
+ resetProperties();
+ _lastMouseEvent = context.map().lastPointerEvent();
+ select_default2(window).on("keydown.select", keydown).on("keyup.select", keyup).on(_pointerPrefix + "move.select", pointermove, true).on(_pointerPrefix + "up.select", pointerup, true).on("pointercancel.select", pointercancel, true).on("contextmenu.select-window", function(d3_event) {
+ var e = d3_event;
+ if (+e.clientX === 0 && +e.clientY === 0) {
+ d3_event.preventDefault();
+ }
+ });
+ selection2.on(_pointerPrefix + "down.select", pointerdown).on("contextmenu.select", contextmenu);
+ }
+ behavior.off = function(selection2) {
+ cancelLongPress();
+ select_default2(window).on("keydown.select", null).on("keyup.select", null).on("contextmenu.select-window", null).on(_pointerPrefix + "move.select", null, true).on(_pointerPrefix + "up.select", null, true).on("pointercancel.select", null, true);
+ selection2.on(_pointerPrefix + "down.select", null).on("contextmenu.select", null);
+ context.surface().classed("behavior-multiselect", false);
+ };
+ return behavior;
+ }
+
+ // modules/operations/index.js
+ var operations_exports = {};
+ __export(operations_exports, {
+ operationCircularize: () => operationCircularize,
+ operationContinue: () => operationContinue,
+ operationCopy: () => operationCopy,
+ operationDelete: () => operationDelete,
+ operationDisconnect: () => operationDisconnect,
+ operationDowngrade: () => operationDowngrade,
+ operationExtract: () => operationExtract,
+ operationMerge: () => operationMerge,
+ operationMove: () => operationMove,
+ operationOrthogonalize: () => operationOrthogonalize,
+ operationPaste: () => operationPaste,
+ operationReflectLong: () => operationReflectLong,
+ operationReflectShort: () => operationReflectShort,
+ operationReverse: () => operationReverse,
+ operationRotate: () => operationRotate,
+ operationSplit: () => operationSplit,
+ operationStraighten: () => operationStraighten
+ });
+
+ // modules/operations/continue.js
+ function operationContinue(context, selectedIDs) {
+ var _entities = selectedIDs.map(function(id2) {
+ return context.graph().entity(id2);
+ });
+ var _geometries = Object.assign({ line: [], vertex: [] }, utilArrayGroupBy(_entities, function(entity) {
+ return entity.geometry(context.graph());
+ }));
+ var _vertex = _geometries.vertex.length && _geometries.vertex[0];
+ function candidateWays() {
+ return _vertex ? context.graph().parentWays(_vertex).filter(function(parent) {
+ return parent.geometry(context.graph()) === "line" && !parent.isClosed() && parent.affix(_vertex.id) && (_geometries.line.length === 0 || _geometries.line[0] === parent);
+ }) : [];
+ }
+ var _candidates = candidateWays();
+ var operation = function() {
+ var candidate = _candidates[0];
+ context.enter(modeDrawLine(context, candidate.id, context.graph(), "line", candidate.affix(_vertex.id), true));
+ };
+ operation.relatedEntityIds = function() {
+ return _candidates.length ? [_candidates[0].id] : [];
+ };
+ operation.available = function() {
+ return _geometries.vertex.length === 1 && _geometries.line.length <= 1 && !context.features().hasHiddenConnections(_vertex, context.graph());
+ };
+ operation.disabled = function() {
+ if (_candidates.length === 0) {
+ return "not_eligible";
+ } else if (_candidates.length > 1) {
+ return "multiple";
+ }
+ return false;
+ };
+ operation.tooltip = function() {
+ var disable = operation.disabled();
+ return disable ? _t("operations.continue." + disable) : _t("operations.continue.description");
+ };
+ operation.annotation = function() {
+ return _t("operations.continue.annotation.line");
+ };
+ operation.id = "continue";
+ operation.keys = [_t("operations.continue.key")];
+ operation.title = _t("operations.continue.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/operations/copy.js
+ function operationCopy(context, selectedIDs) {
+ function getFilteredIdsToCopy() {
+ return selectedIDs.filter(function(selectedID) {
+ var entity = context.graph().hasEntity(selectedID);
+ return entity.hasInterestingTags() || entity.geometry(context.graph()) !== "vertex";
+ });
+ }
+ var operation = function() {
+ var graph = context.graph();
+ var selected = groupEntities(getFilteredIdsToCopy(), graph);
+ var canCopy = [];
+ var skip = {};
+ var entity;
+ var i2;
+ for (i2 = 0; i2 < selected.relation.length; i2++) {
+ entity = selected.relation[i2];
+ if (!skip[entity.id] && entity.isComplete(graph)) {
+ canCopy.push(entity.id);
+ skip = getDescendants(entity.id, graph, skip);
+ }
+ }
+ for (i2 = 0; i2 < selected.way.length; i2++) {
+ entity = selected.way[i2];
+ if (!skip[entity.id]) {
+ canCopy.push(entity.id);
+ skip = getDescendants(entity.id, graph, skip);
+ }
+ }
+ for (i2 = 0; i2 < selected.node.length; i2++) {
+ entity = selected.node[i2];
+ if (!skip[entity.id]) {
+ canCopy.push(entity.id);
+ }
+ }
+ context.copyIDs(canCopy);
+ if (_point && (canCopy.length !== 1 || graph.entity(canCopy[0]).type !== "node")) {
+ context.copyLonLat(context.projection.invert(_point));
+ } else {
+ context.copyLonLat(null);
+ }
+ };
+ function groupEntities(ids, graph) {
+ var entities = ids.map(function(id2) {
+ return graph.entity(id2);
+ });
+ return Object.assign({ relation: [], way: [], node: [] }, utilArrayGroupBy(entities, "type"));
+ }
+ function getDescendants(id2, graph, descendants) {
+ var entity = graph.entity(id2);
+ var children2;
+ descendants = descendants || {};
+ if (entity.type === "relation") {
+ children2 = entity.members.map(function(m) {
+ return m.id;
+ });
+ } else if (entity.type === "way") {
+ children2 = entity.nodes;
+ } else {
+ children2 = [];
+ }
+ for (var i2 = 0; i2 < children2.length; i2++) {
+ if (!descendants[children2[i2]]) {
+ descendants[children2[i2]] = true;
+ descendants = getDescendants(children2[i2], graph, descendants);
+ }
+ }
+ return descendants;
+ }
+ operation.available = function() {
+ return getFilteredIdsToCopy().length > 0;
+ };
+ operation.disabled = function() {
+ var extent = utilTotalExtent(getFilteredIdsToCopy(), context.graph());
+ if (extent.percentContainedIn(context.map().extent()) < 0.8) {
+ return "too_large";
+ }
+ return false;
+ };
+ operation.availableForKeypress = function() {
+ var selection2 = window.getSelection && window.getSelection();
+ return !selection2 || !selection2.toString();
+ };
+ operation.tooltip = function() {
+ var disable = operation.disabled();
+ return disable ? _t("operations.copy." + disable, { n: selectedIDs.length }) : _t("operations.copy.description", { n: selectedIDs.length });
+ };
+ operation.annotation = function() {
+ return _t("operations.copy.annotation", { n: selectedIDs.length });
+ };
+ var _point;
+ operation.point = function(val) {
+ _point = val;
+ return operation;
+ };
+ operation.id = "copy";
+ operation.keys = [uiCmd("\u2318C")];
+ operation.title = _t("operations.copy.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/operations/disconnect.js
+ function operationDisconnect(context, selectedIDs) {
+ var _vertexIDs = [];
+ var _wayIDs = [];
+ var _otherIDs = [];
+ var _actions = [];
+ selectedIDs.forEach(function(id2) {
+ var entity = context.entity(id2);
+ if (entity.type === "way") {
+ _wayIDs.push(id2);
+ } else if (entity.geometry(context.graph()) === "vertex") {
+ _vertexIDs.push(id2);
+ } else {
+ _otherIDs.push(id2);
+ }
+ });
+ var _coords, _descriptionID = "", _annotationID = "features";
+ var _disconnectingVertexIds = [];
+ var _disconnectingWayIds = [];
+ if (_vertexIDs.length > 0) {
+ _disconnectingVertexIds = _vertexIDs;
+ _vertexIDs.forEach(function(vertexID) {
+ var action = actionDisconnect(vertexID);
+ if (_wayIDs.length > 0) {
+ var waysIDsForVertex = _wayIDs.filter(function(wayID) {
+ var way = context.entity(wayID);
+ return way.nodes.indexOf(vertexID) !== -1;
+ });
+ action.limitWays(waysIDsForVertex);
+ }
+ _actions.push(action);
+ _disconnectingWayIds = _disconnectingWayIds.concat(context.graph().parentWays(context.graph().entity(vertexID)).map((d) => d.id));
+ });
+ _disconnectingWayIds = utilArrayUniq(_disconnectingWayIds).filter(function(id2) {
+ return _wayIDs.indexOf(id2) === -1;
+ });
+ _descriptionID += _actions.length === 1 ? "single_point." : "multiple_points.";
+ if (_wayIDs.length === 1) {
+ _descriptionID += "single_way." + context.graph().geometry(_wayIDs[0]);
+ } else {
+ _descriptionID += _wayIDs.length === 0 ? "no_ways" : "multiple_ways";
+ }
+ } else if (_wayIDs.length > 0) {
+ var ways = _wayIDs.map(function(id2) {
+ return context.entity(id2);
+ });
+ var nodes = utilGetAllNodes(_wayIDs, context.graph());
+ _coords = nodes.map(function(n2) {
+ return n2.loc;
+ });
+ var sharedActions = [];
+ var sharedNodes = [];
+ var unsharedActions = [];
+ var unsharedNodes = [];
+ nodes.forEach(function(node) {
+ var action = actionDisconnect(node.id).limitWays(_wayIDs);
+ if (action.disabled(context.graph()) !== "not_connected") {
+ var count = 0;
+ for (var i2 in ways) {
+ var way = ways[i2];
+ if (way.nodes.indexOf(node.id) !== -1) {
+ count += 1;
+ }
+ if (count > 1)
+ break;
+ }
+ if (count > 1) {
+ sharedActions.push(action);
+ sharedNodes.push(node);
+ } else {
+ unsharedActions.push(action);
+ unsharedNodes.push(node);
+ }
+ }
+ });
+ _descriptionID += "no_points.";
+ _descriptionID += _wayIDs.length === 1 ? "single_way." : "multiple_ways.";
+ if (sharedActions.length) {
+ _actions = sharedActions;
+ _disconnectingVertexIds = sharedNodes.map((node) => node.id);
+ _descriptionID += "conjoined";
+ _annotationID = "from_each_other";
+ } else {
+ _actions = unsharedActions;
+ _disconnectingVertexIds = unsharedNodes.map((node) => node.id);
+ if (_wayIDs.length === 1) {
+ _descriptionID += context.graph().geometry(_wayIDs[0]);
+ } else {
+ _descriptionID += "separate";
+ }
+ }
+ }
+ var _extent = utilTotalExtent(_disconnectingVertexIds, context.graph());
+ var operation = function() {
+ context.perform(function(graph) {
+ return _actions.reduce(function(graph2, action) {
+ return action(graph2);
+ }, graph);
+ }, operation.annotation());
+ context.validator().validate();
+ };
+ operation.relatedEntityIds = function() {
+ if (_vertexIDs.length) {
+ return _disconnectingWayIds;
+ }
+ return _disconnectingVertexIds;
+ };
+ operation.available = function() {
+ if (_actions.length === 0)
+ return false;
+ if (_otherIDs.length !== 0)
+ return false;
+ if (_vertexIDs.length !== 0 && _wayIDs.length !== 0 && !_wayIDs.every(function(wayID) {
+ return _vertexIDs.some(function(vertexID) {
+ var way = context.entity(wayID);
+ return way.nodes.indexOf(vertexID) !== -1;
+ });
+ }))
+ return false;
+ return true;
+ };
+ operation.disabled = function() {
+ var reason;
+ for (var actionIndex in _actions) {
+ reason = _actions[actionIndex].disabled(context.graph());
+ if (reason)
+ return reason;
+ }
+ if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
+ return "too_large." + ((_vertexIDs.length ? _vertexIDs : _wayIDs).length === 1 ? "single" : "multiple");
+ } else if (_coords && someMissing()) {
+ return "not_downloaded";
+ } else if (selectedIDs.some(context.hasHiddenConnections)) {
+ return "connected_to_hidden";
+ }
+ return false;
+ function someMissing() {
+ if (context.inIntro())
+ return false;
+ var osm = context.connection();
+ if (osm) {
+ var missing = _coords.filter(function(loc) {
+ return !osm.isDataLoaded(loc);
+ });
+ if (missing.length) {
+ missing.forEach(function(loc) {
+ context.loadTileAtLoc(loc);
+ });
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+ operation.tooltip = function() {
+ var disable = operation.disabled();
+ if (disable) {
+ return _t("operations.disconnect." + disable);
+ }
+ return _t("operations.disconnect.description." + _descriptionID);
+ };
+ operation.annotation = function() {
+ return _t("operations.disconnect.annotation." + _annotationID);
+ };
+ operation.id = "disconnect";
+ operation.keys = [_t("operations.disconnect.key")];
+ operation.title = _t("operations.disconnect.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/operations/downgrade.js
+ function operationDowngrade(context, selectedIDs) {
+ var _affectedFeatureCount = 0;
+ var _downgradeType = downgradeTypeForEntityIDs(selectedIDs);
+ var _multi = _affectedFeatureCount === 1 ? "single" : "multiple";
+ function downgradeTypeForEntityIDs(entityIds) {
+ var downgradeType;
+ _affectedFeatureCount = 0;
+ for (var i2 in entityIds) {
+ var entityID = entityIds[i2];
+ var type3 = downgradeTypeForEntityID(entityID);
+ if (type3) {
+ _affectedFeatureCount += 1;
+ if (downgradeType && type3 !== downgradeType) {
+ if (downgradeType !== "generic" && type3 !== "generic") {
+ downgradeType = "building_address";
+ } else {
+ downgradeType = "generic";
+ }
+ } else {
+ downgradeType = type3;
+ }
+ }
+ }
+ return downgradeType;
+ }
+ function downgradeTypeForEntityID(entityID) {
+ var graph = context.graph();
+ var entity = graph.entity(entityID);
+ var preset = _mainPresetIndex.match(entity, graph);
+ if (!preset || preset.isFallback())
+ return null;
+ if (entity.type === "node" && preset.id !== "address" && Object.keys(entity.tags).some(function(key) {
+ return key.match(/^addr:.{1,}/);
+ })) {
+ return "address";
+ }
+ var geometry = entity.geometry(graph);
+ if (geometry === "area" && entity.tags.building && !preset.tags.building) {
+ return "building";
+ }
+ if (geometry === "vertex" && Object.keys(entity.tags).length) {
+ return "generic";
+ }
+ return null;
+ }
+ var buildingKeysToKeep = ["architect", "building", "height", "layer", "source", "type", "wheelchair"];
+ var addressKeysToKeep = ["source"];
+ var operation = function() {
+ context.perform(function(graph) {
+ for (var i2 in selectedIDs) {
+ var entityID = selectedIDs[i2];
+ var type3 = downgradeTypeForEntityID(entityID);
+ if (!type3)
+ continue;
+ var tags = Object.assign({}, graph.entity(entityID).tags);
+ for (var key in tags) {
+ if (type3 === "address" && addressKeysToKeep.indexOf(key) !== -1)
+ continue;
+ if (type3 === "building") {
+ if (buildingKeysToKeep.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/))
+ continue;
+ }
+ if (type3 !== "generic") {
+ if (key.match(/^addr:.{1,}/) || key.match(/^source:.{1,}/))
+ continue;
+ }
+ delete tags[key];
+ }
+ graph = actionChangeTags(entityID, tags)(graph);
+ }
+ return graph;
+ }, operation.annotation());
+ context.validator().validate();
+ context.enter(modeSelect(context, selectedIDs));
+ };
+ operation.available = function() {
+ return _downgradeType;
+ };
+ operation.disabled = function() {
+ if (selectedIDs.some(hasWikidataTag)) {
+ return "has_wikidata_tag";
+ }
+ return false;
+ function hasWikidataTag(id2) {
+ var entity = context.entity(id2);
+ return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
+ }
+ };
+ operation.tooltip = function() {
+ var disable = operation.disabled();
+ return disable ? _t("operations.downgrade." + disable + "." + _multi) : _t("operations.downgrade.description." + _downgradeType);
+ };
+ operation.annotation = function() {
+ var suffix;
+ if (_downgradeType === "building_address") {
+ suffix = "generic";
+ } else {
+ suffix = _downgradeType;
+ }
+ return _t("operations.downgrade.annotation." + suffix, { n: _affectedFeatureCount });
+ };
+ operation.id = "downgrade";
+ operation.keys = [uiCmd("\u232B")];
+ operation.title = _t("operations.downgrade.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/operations/extract.js
+ function operationExtract(context, selectedIDs) {
+ var _amount = selectedIDs.length === 1 ? "single" : "multiple";
+ var _geometries = utilArrayUniq(selectedIDs.map(function(entityID) {
+ return context.graph().hasEntity(entityID) && context.graph().geometry(entityID);
+ }).filter(Boolean));
+ var _geometryID = _geometries.length === 1 ? _geometries[0] : "feature";
+ var _extent;
+ var _actions = selectedIDs.map(function(entityID) {
+ var graph = context.graph();
+ var entity = graph.hasEntity(entityID);
+ if (!entity || !entity.hasInterestingTags())
+ return null;
+ if (entity.type === "node" && graph.parentWays(entity).length === 0)
+ return null;
+ if (entity.type !== "node") {
+ var preset = _mainPresetIndex.match(entity, graph);
+ if (preset.geometry.indexOf("point") === -1)
+ return null;
+ }
+ _extent = _extent ? _extent.extend(entity.extent(graph)) : entity.extent(graph);
+ return actionExtract(entityID, context.projection);
+ }).filter(Boolean);
+ var operation = function() {
+ var combinedAction = function(graph) {
+ _actions.forEach(function(action) {
+ graph = action(graph);
+ });
+ return graph;
+ };
+ context.perform(combinedAction, operation.annotation());
+ var extractedNodeIDs = _actions.map(function(action) {
+ return action.getExtractedNodeID();
+ });
+ context.enter(modeSelect(context, extractedNodeIDs));
+ };
+ operation.available = function() {
+ return _actions.length && selectedIDs.length === _actions.length;
+ };
+ operation.disabled = function() {
+ if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
+ return "too_large";
+ } else if (selectedIDs.some(function(entityID) {
+ return context.graph().geometry(entityID) === "vertex" && context.hasHiddenConnections(entityID);
+ })) {
+ return "connected_to_hidden";
+ }
+ return false;
+ };
+ operation.tooltip = function() {
+ var disableReason = operation.disabled();
+ if (disableReason) {
+ return _t("operations.extract." + disableReason + "." + _amount);
+ } else {
+ return _t("operations.extract.description." + _geometryID + "." + _amount);
+ }
+ };
+ operation.annotation = function() {
+ return _t("operations.extract.annotation", { n: selectedIDs.length });
+ };
+ operation.id = "extract";
+ operation.keys = [_t("operations.extract.key")];
+ operation.title = _t("operations.extract.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/operations/merge.js
+ function operationMerge(context, selectedIDs) {
+ var _action = getAction();
+ function getAction() {
+ var join = actionJoin(selectedIDs);
+ if (!join.disabled(context.graph()))
+ return join;
+ var merge3 = actionMerge(selectedIDs);
+ if (!merge3.disabled(context.graph()))
+ return merge3;
+ var mergePolygon = actionMergePolygon(selectedIDs);
+ if (!mergePolygon.disabled(context.graph()))
+ return mergePolygon;
+ var mergeNodes = actionMergeNodes(selectedIDs);
+ if (!mergeNodes.disabled(context.graph()))
+ return mergeNodes;
+ if (join.disabled(context.graph()) !== "not_eligible")
+ return join;
+ if (merge3.disabled(context.graph()) !== "not_eligible")
+ return merge3;
+ if (mergePolygon.disabled(context.graph()) !== "not_eligible")
+ return mergePolygon;
+ return mergeNodes;
+ }
+ var operation = function() {
+ if (operation.disabled())
+ return;
+ context.perform(_action, operation.annotation());
+ context.validator().validate();
+ var resultIDs = selectedIDs.filter(context.hasEntity);
+ if (resultIDs.length > 1) {
+ var interestingIDs = resultIDs.filter(function(id2) {
+ return context.entity(id2).hasInterestingTags();
+ });
+ if (interestingIDs.length)
+ resultIDs = interestingIDs;
+ }
+ context.enter(modeSelect(context, resultIDs));
+ };
+ operation.available = function() {
+ return selectedIDs.length >= 2;
+ };
+ operation.disabled = function() {
+ var actionDisabled = _action.disabled(context.graph());
+ if (actionDisabled)
+ return actionDisabled;
+ var osm = context.connection();
+ if (osm && _action.resultingWayNodesLength && _action.resultingWayNodesLength(context.graph()) > osm.maxWayNodes()) {
+ return "too_many_vertices";
+ }
+ return false;
+ };
+ operation.tooltip = function() {
+ var disabled = operation.disabled();
+ if (disabled) {
+ if (disabled === "conflicting_relations") {
+ return _t("operations.merge.conflicting_relations");
+ }
+ if (disabled === "restriction" || disabled === "connectivity") {
+ return _t("operations.merge.damage_relation", { relation: _mainPresetIndex.item("type/" + disabled).name() });
+ }
+ return _t("operations.merge." + disabled);
+ }
+ return _t("operations.merge.description");
+ };
+ operation.annotation = function() {
+ return _t("operations.merge.annotation", { n: selectedIDs.length });
+ };
+ operation.id = "merge";
+ operation.keys = [_t("operations.merge.key")];
+ operation.title = _t("operations.merge.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/operations/paste.js
+ function operationPaste(context) {
+ var _pastePoint;
+ var operation = function() {
+ if (!_pastePoint)
+ return;
+ var oldIDs = context.copyIDs();
+ if (!oldIDs.length)
+ return;
+ var projection2 = context.projection;
+ var extent = geoExtent();
+ var oldGraph = context.copyGraph();
+ var newIDs = [];
+ var action = actionCopyEntities(oldIDs, oldGraph);
+ context.perform(action);
+ var copies = action.copies();
+ var originals = /* @__PURE__ */ new Set();
+ Object.values(copies).forEach(function(entity) {
+ originals.add(entity.id);
+ });
+ for (var id2 in copies) {
+ var oldEntity = oldGraph.entity(id2);
+ var newEntity = copies[id2];
+ extent._extend(oldEntity.extent(oldGraph));
+ var parents = context.graph().parentWays(newEntity);
+ var parentCopied = parents.some(function(parent) {
+ return originals.has(parent.id);
+ });
+ if (!parentCopied) {
+ newIDs.push(newEntity.id);
+ }
+ }
+ var copyPoint = context.copyLonLat() && projection2(context.copyLonLat()) || projection2(extent.center());
+ var delta = geoVecSubtract(_pastePoint, copyPoint);
+ context.replace(actionMove(newIDs, delta, projection2), operation.annotation());
+ context.enter(modeSelect(context, newIDs));
+ };
+ operation.point = function(val) {
+ _pastePoint = val;
+ return operation;
+ };
+ operation.available = function() {
+ return context.mode().id === "browse";
+ };
+ operation.disabled = function() {
+ return !context.copyIDs().length;
+ };
+ operation.tooltip = function() {
+ var oldGraph = context.copyGraph();
+ var ids = context.copyIDs();
+ if (!ids.length) {
+ return _t("operations.paste.nothing_copied");
+ }
+ return _t("operations.paste.description", { feature: utilDisplayLabel(oldGraph.entity(ids[0]), oldGraph), n: ids.length });
+ };
+ operation.annotation = function() {
+ var ids = context.copyIDs();
+ return _t("operations.paste.annotation", { n: ids.length });
+ };
+ operation.id = "paste";
+ operation.keys = [uiCmd("\u2318V")];
+ operation.title = _t("operations.paste.title");
+ return operation;
+ }
+
+ // modules/operations/reverse.js
+ function operationReverse(context, selectedIDs) {
+ var operation = function() {
+ context.perform(function combinedReverseAction(graph) {
+ actions().forEach(function(action) {
+ graph = action(graph);
+ });
+ return graph;
+ }, operation.annotation());
+ context.validator().validate();
+ };
+ function actions(situation) {
+ return selectedIDs.map(function(entityID) {
+ var entity = context.hasEntity(entityID);
+ if (!entity)
+ return null;
+ if (situation === "toolbar") {
+ if (entity.type === "way" && (!entity.isOneWay() && !entity.isSided()))
+ return null;
+ }
+ var geometry = entity.geometry(context.graph());
+ if (entity.type !== "node" && geometry !== "line")
+ return null;
+ var action = actionReverse(entityID);
+ if (action.disabled(context.graph()))
+ return null;
+ return action;
+ }).filter(Boolean);
+ }
+ function reverseTypeID() {
+ var acts = actions();
+ var nodeActionCount = acts.filter(function(act) {
+ var entity = context.hasEntity(act.entityID());
+ return entity && entity.type === "node";
+ }).length;
+ if (nodeActionCount === 0)
+ return "line";
+ if (nodeActionCount === acts.length)
+ return "point";
+ return "feature";
+ }
+ operation.available = function(situation) {
+ return actions(situation).length > 0;
+ };
+ operation.disabled = function() {
+ return false;
+ };
+ operation.tooltip = function() {
+ return _t("operations.reverse.description." + reverseTypeID());
+ };
+ operation.annotation = function() {
+ var acts = actions();
+ return _t("operations.reverse.annotation." + reverseTypeID(), { n: acts.length });
+ };
+ operation.id = "reverse";
+ operation.keys = [_t("operations.reverse.key")];
+ operation.title = _t("operations.reverse.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/operations/split.js
+ function operationSplit(context, selectedIDs) {
+ var _vertexIds = selectedIDs.filter(function(id2) {
+ return context.graph().geometry(id2) === "vertex";
+ });
+ var _selectedWayIds = selectedIDs.filter(function(id2) {
+ var entity = context.graph().hasEntity(id2);
+ return entity && entity.type === "way";
+ });
+ var _isAvailable = _vertexIds.length > 0 && _vertexIds.length + _selectedWayIds.length === selectedIDs.length;
+ var _action = actionSplit(_vertexIds);
+ var _ways = [];
+ var _geometry = "feature";
+ var _waysAmount = "single";
+ var _nodesAmount = _vertexIds.length === 1 ? "single" : "multiple";
+ if (_isAvailable) {
+ if (_selectedWayIds.length)
+ _action.limitWays(_selectedWayIds);
+ _ways = _action.ways(context.graph());
+ var geometries = {};
+ _ways.forEach(function(way) {
+ geometries[way.geometry(context.graph())] = true;
+ });
+ if (Object.keys(geometries).length === 1) {
+ _geometry = Object.keys(geometries)[0];
+ }
+ _waysAmount = _ways.length === 1 ? "single" : "multiple";
+ }
+ var operation = function() {
+ var difference = context.perform(_action, operation.annotation());
+ var idsToSelect = _vertexIds.concat(difference.extantIDs().filter(function(id2) {
+ return context.entity(id2).type === "way";
+ }));
+ context.enter(modeSelect(context, idsToSelect));
+ };
+ operation.relatedEntityIds = function() {
+ return _selectedWayIds.length ? [] : _ways.map((way) => way.id);
+ };
+ operation.available = function() {
+ return _isAvailable;
+ };
+ operation.disabled = function() {
+ var reason = _action.disabled(context.graph());
+ if (reason) {
+ return reason;
+ } else if (selectedIDs.some(context.hasHiddenConnections)) {
+ return "connected_to_hidden";
+ }
+ return false;
+ };
+ operation.tooltip = function() {
+ var disable = operation.disabled();
+ if (disable)
+ return _t("operations.split." + disable);
+ return _t("operations.split.description." + _geometry + "." + _waysAmount + "." + _nodesAmount + "_node");
+ };
+ operation.annotation = function() {
+ return _t("operations.split.annotation." + _geometry, { n: _ways.length });
+ };
+ operation.icon = function() {
+ if (_waysAmount === "multiple") {
+ return "#iD-operation-split-multiple";
+ } else {
+ return "#iD-operation-split";
+ }
+ };
+ operation.id = "split";
+ operation.keys = [_t("operations.split.key")];
+ operation.title = _t("operations.split.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/operations/straighten.js
+ function operationStraighten(context, selectedIDs) {
+ var _wayIDs = selectedIDs.filter(function(id2) {
+ return id2.charAt(0) === "w";
+ });
+ var _nodeIDs = selectedIDs.filter(function(id2) {
+ return id2.charAt(0) === "n";
+ });
+ var _amount = (_wayIDs.length ? _wayIDs : _nodeIDs).length === 1 ? "single" : "multiple";
+ var _nodes = utilGetAllNodes(selectedIDs, context.graph());
+ var _coords = _nodes.map(function(n2) {
+ return n2.loc;
+ });
+ var _extent = utilTotalExtent(selectedIDs, context.graph());
+ var _action = chooseAction();
+ var _geometry;
+ function chooseAction() {
+ if (_wayIDs.length === 0 && _nodeIDs.length > 2) {
+ _geometry = "point";
+ return actionStraightenNodes(_nodeIDs, context.projection);
+ } else if (_wayIDs.length > 0 && (_nodeIDs.length === 0 || _nodeIDs.length === 2)) {
+ var startNodeIDs = [];
+ var endNodeIDs = [];
+ for (var i2 = 0; i2 < selectedIDs.length; i2++) {
+ var entity = context.entity(selectedIDs[i2]);
+ if (entity.type === "node") {
+ continue;
+ } else if (entity.type !== "way" || entity.isClosed()) {
+ return null;
+ }
+ startNodeIDs.push(entity.first());
+ endNodeIDs.push(entity.last());
+ }
+ startNodeIDs = startNodeIDs.filter(function(n2) {
+ return startNodeIDs.indexOf(n2) === startNodeIDs.lastIndexOf(n2);
+ });
+ endNodeIDs = endNodeIDs.filter(function(n2) {
+ return endNodeIDs.indexOf(n2) === endNodeIDs.lastIndexOf(n2);
+ });
+ if (utilArrayDifference(startNodeIDs, endNodeIDs).length + utilArrayDifference(endNodeIDs, startNodeIDs).length !== 2)
+ return null;
+ var wayNodeIDs = utilGetAllNodes(_wayIDs, context.graph()).map(function(node) {
+ return node.id;
+ });
+ if (wayNodeIDs.length <= 2)
+ return null;
+ if (_nodeIDs.length === 2 && (wayNodeIDs.indexOf(_nodeIDs[0]) === -1 || wayNodeIDs.indexOf(_nodeIDs[1]) === -1))
+ return null;
+ if (_nodeIDs.length) {
+ _extent = utilTotalExtent(_nodeIDs, context.graph());
+ }
+ _geometry = "line";
+ return actionStraightenWay(selectedIDs, context.projection);
+ }
+ return null;
+ }
+ function operation() {
+ if (!_action)
+ return;
+ context.perform(_action, operation.annotation());
+ window.setTimeout(function() {
+ context.validator().validate();
+ }, 300);
+ }
+ operation.available = function() {
+ return Boolean(_action);
+ };
+ operation.disabled = function() {
+ var reason = _action.disabled(context.graph());
+ if (reason) {
+ return reason;
+ } else if (_extent.percentContainedIn(context.map().extent()) < 0.8) {
+ return "too_large";
+ } else if (someMissing()) {
+ return "not_downloaded";
+ } else if (selectedIDs.some(context.hasHiddenConnections)) {
+ return "connected_to_hidden";
+ }
+ return false;
+ function someMissing() {
+ if (context.inIntro())
+ return false;
+ var osm = context.connection();
+ if (osm) {
+ var missing = _coords.filter(function(loc) {
+ return !osm.isDataLoaded(loc);
+ });
+ if (missing.length) {
+ missing.forEach(function(loc) {
+ context.loadTileAtLoc(loc);
+ });
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+ operation.tooltip = function() {
+ var disable = operation.disabled();
+ return disable ? _t("operations.straighten." + disable + "." + _amount) : _t("operations.straighten.description." + _geometry + (_wayIDs.length === 1 ? "" : "s"));
+ };
+ operation.annotation = function() {
+ return _t("operations.straighten.annotation." + _geometry, { n: _wayIDs.length ? _wayIDs.length : _nodeIDs.length });
+ };
+ operation.id = "straighten";
+ operation.keys = [_t("operations.straighten.key")];
+ operation.title = _t("operations.straighten.title");
+ operation.behavior = behaviorOperation(context).which(operation);
+ return operation;
+ }
+
+ // modules/modes/select.js
+ function modeSelect(context, selectedIDs) {
+ var mode = {
+ id: "select",
+ button: "browse"
+ };
+ var keybinding = utilKeybinding("select");
+ var _breatheBehavior = behaviorBreathe(context);
+ var _modeDragNode = modeDragNode(context);
+ var _selectBehavior;
+ var _behaviors = [];
+ var _operations = [];
+ var _newFeature = false;
+ var _follow = false;
+ var _focusedParentWayId;
+ var _focusedVertexIds;
+ function singular() {
+ if (selectedIDs && selectedIDs.length === 1) {
+ return context.hasEntity(selectedIDs[0]);
+ }
+ }
+ function selectedEntities() {
+ return selectedIDs.map(function(id2) {
+ return context.hasEntity(id2);
+ }).filter(Boolean);
+ }
+ function checkSelectedIDs() {
+ var ids = [];
+ if (Array.isArray(selectedIDs)) {
+ ids = selectedIDs.filter(function(id2) {
+ return context.hasEntity(id2);
+ });
+ }
+ if (!ids.length) {
+ context.enter(modeBrowse(context));
+ return false;
+ } else if (selectedIDs.length > 1 && ids.length === 1 || selectedIDs.length === 1 && ids.length > 1) {
+ context.enter(modeSelect(context, ids));
+ return false;
+ }
+ selectedIDs = ids;
+ return true;
+ }
+ function parentWaysIdsOfSelection(onlyCommonParents) {
+ var graph = context.graph();
+ var parents = [];
+ for (var i2 = 0; i2 < selectedIDs.length; i2++) {
+ var entity = context.hasEntity(selectedIDs[i2]);
+ if (!entity || entity.geometry(graph) !== "vertex") {
+ return [];
+ }
+ var currParents = graph.parentWays(entity).map(function(w) {
+ return w.id;
+ });
+ if (!parents.length) {
+ parents = currParents;
+ continue;
+ }
+ parents = (onlyCommonParents ? utilArrayIntersection : utilArrayUnion)(parents, currParents);
+ if (!parents.length) {
+ return [];
+ }
+ }
+ return parents;
+ }
+ function childNodeIdsOfSelection(onlyCommon) {
+ var graph = context.graph();
+ var childs = [];
+ for (var i2 = 0; i2 < selectedIDs.length; i2++) {
+ var entity = context.hasEntity(selectedIDs[i2]);
+ if (!entity || !["area", "line"].includes(entity.geometry(graph))) {
+ return [];
+ }
+ var currChilds = graph.childNodes(entity).map(function(node) {
+ return node.id;
+ });
+ if (!childs.length) {
+ childs = currChilds;
+ continue;
+ }
+ childs = (onlyCommon ? utilArrayIntersection : utilArrayUnion)(childs, currChilds);
+ if (!childs.length) {
+ return [];
+ }
+ }
+ return childs;
+ }
+ function checkFocusedParent() {
+ if (_focusedParentWayId) {
+ var parents = parentWaysIdsOfSelection(true);
+ if (parents.indexOf(_focusedParentWayId) === -1)
+ _focusedParentWayId = null;
+ }
+ }
+ function parentWayIdForVertexNavigation() {
+ var parentIds = parentWaysIdsOfSelection(true);
+ if (_focusedParentWayId && parentIds.indexOf(_focusedParentWayId) !== -1) {
+ return _focusedParentWayId;
+ }
+ return parentIds.length ? parentIds[0] : null;
+ }
+ mode.selectedIDs = function(val) {
+ if (!arguments.length)
+ return selectedIDs;
+ selectedIDs = val;
+ return mode;
+ };
+ mode.zoomToSelected = function() {
+ context.map().zoomToEase(selectedEntities());
+ };
+ mode.newFeature = function(val) {
+ if (!arguments.length)
+ return _newFeature;
+ _newFeature = val;
+ return mode;
+ };
+ mode.selectBehavior = function(val) {
+ if (!arguments.length)
+ return _selectBehavior;
+ _selectBehavior = val;
+ return mode;
+ };
+ mode.follow = function(val) {
+ if (!arguments.length)
+ return _follow;
+ _follow = val;
+ return mode;
+ };
+ function loadOperations() {
+ _operations.forEach(function(operation) {
+ if (operation.behavior) {
+ context.uninstall(operation.behavior);
+ }
+ });
+ _operations = Object.values(operations_exports).map(function(o) {
+ return o(context, selectedIDs);
+ }).filter(function(o) {
+ return o.id !== "delete" && o.id !== "downgrade" && o.id !== "copy";
+ }).concat([
+ operationCopy(context, selectedIDs),
+ operationDowngrade(context, selectedIDs),
+ operationDelete(context, selectedIDs)
+ ]).filter(function(operation) {
+ return operation.available();
+ });
+ _operations.forEach(function(operation) {
+ if (operation.behavior) {
+ context.install(operation.behavior);
+ }
+ });
+ context.ui().closeEditMenu();
+ }
+ mode.operations = function() {
+ return _operations;
+ };
+ mode.enter = function() {
+ if (!checkSelectedIDs())
+ return;
+ context.features().forceVisible(selectedIDs);
+ _modeDragNode.restoreSelectedIDs(selectedIDs);
+ loadOperations();
+ if (!_behaviors.length) {
+ if (!_selectBehavior)
+ _selectBehavior = behaviorSelect(context);
+ _behaviors = [
+ behaviorPaste(context),
+ _breatheBehavior,
+ behaviorHover(context).on("hover", context.ui().sidebar.hoverModeSelect),
+ _selectBehavior,
+ behaviorLasso(context),
+ _modeDragNode.behavior,
+ modeDragNote(context).behavior
+ ];
+ }
+ _behaviors.forEach(context.install);
+ keybinding.on(_t("inspector.zoom_to.key"), mode.zoomToSelected).on(["[", "pgup"], previousVertex).on(["]", "pgdown"], nextVertex).on(["{", uiCmd("\u2318["), "home"], firstVertex).on(["}", uiCmd("\u2318]"), "end"], lastVertex).on(uiCmd("\u21E7\u2190"), nudgeSelection([-10, 0])).on(uiCmd("\u21E7\u2191"), nudgeSelection([0, -10])).on(uiCmd("\u21E7\u2192"), nudgeSelection([10, 0])).on(uiCmd("\u21E7\u2193"), nudgeSelection([0, 10])).on(uiCmd("\u21E7\u2325\u2190"), nudgeSelection([-100, 0])).on(uiCmd("\u21E7\u2325\u2191"), nudgeSelection([0, -100])).on(uiCmd("\u21E7\u2325\u2192"), nudgeSelection([100, 0])).on(uiCmd("\u21E7\u2325\u2193"), nudgeSelection([0, 100])).on(utilKeybinding.plusKeys.map((key) => uiCmd("\u21E7" + key)), scaleSelection(1.05)).on(utilKeybinding.plusKeys.map((key) => uiCmd("\u21E7\u2325" + key)), scaleSelection(Math.pow(1.05, 5))).on(utilKeybinding.minusKeys.map((key) => uiCmd("\u21E7" + key)), scaleSelection(1 / 1.05)).on(utilKeybinding.minusKeys.map((key) => uiCmd("\u21E7\u2325" + key)), scaleSelection(1 / Math.pow(1.05, 5))).on(["\\", "pause"], focusNextParent).on(uiCmd("\u2318\u2191"), selectParent).on(uiCmd("\u2318\u2193"), selectChild).on("\u238B", esc, true);
+ select_default2(document).call(keybinding);
+ context.ui().sidebar.select(selectedIDs, _newFeature);
+ context.history().on("change.select", function() {
+ loadOperations();
+ selectElements();
+ }).on("undone.select", checkSelectedIDs).on("redone.select", checkSelectedIDs);
+ context.map().on("drawn.select", selectElements).on("crossEditableZoom.select", function() {
+ selectElements();
+ _breatheBehavior.restartIfNeeded(context.surface());
+ });
+ context.map().doubleUpHandler().on("doubleUp.modeSelect", didDoubleUp);
+ selectElements();
+ if (_follow) {
+ var extent = geoExtent();
+ var graph = context.graph();
+ selectedIDs.forEach(function(id2) {
+ var entity = context.entity(id2);
+ extent._extend(entity.extent(graph));
+ });
+ var loc = extent.center();
+ context.map().centerEase(loc);
+ _follow = false;
+ }
+ function nudgeSelection(delta) {
+ return function() {
+ if (!context.map().withinEditableZoom())
+ return;
+ var moveOp = operationMove(context, selectedIDs);
+ if (moveOp.disabled()) {
+ context.ui().flash.duration(4e3).iconName("#iD-operation-" + moveOp.id).iconClass("operation disabled").label(moveOp.tooltip)();
+ } else {
+ context.perform(actionMove(selectedIDs, delta, context.projection), moveOp.annotation());
+ context.validator().validate();
+ }
+ };
+ }
+ function scaleSelection(factor) {
+ return function() {
+ if (!context.map().withinEditableZoom())
+ return;
+ let nodes = utilGetAllNodes(selectedIDs, context.graph());
+ let isUp = factor > 1;
+ if (nodes.length <= 1)
+ return;
+ let extent2 = utilTotalExtent(selectedIDs, context.graph());
+ function scalingDisabled() {
+ if (tooSmall()) {
+ return "too_small";
+ } else if (extent2.percentContainedIn(context.map().extent()) < 0.8) {
+ return "too_large";
+ } else if (someMissing() || selectedIDs.some(incompleteRelation)) {
+ return "not_downloaded";
+ } else if (selectedIDs.some(context.hasHiddenConnections)) {
+ return "connected_to_hidden";
+ }
+ return false;
+ function tooSmall() {
+ if (isUp)
+ return false;
+ let dLon = Math.abs(extent2[1][0] - extent2[0][0]);
+ let dLat = Math.abs(extent2[1][1] - extent2[0][1]);
+ return dLon < geoMetersToLon(1, extent2[1][1]) && dLat < geoMetersToLat(1);
+ }
+ function someMissing() {
+ if (context.inIntro())
+ return false;
+ let osm = context.connection();
+ if (osm) {
+ let missing = nodes.filter(function(n2) {
+ return !osm.isDataLoaded(n2.loc);
+ });
+ if (missing.length) {
+ missing.forEach(function(loc2) {
+ context.loadTileAtLoc(loc2);
+ });
+ return true;
}
+ }
+ return false;
+ }
+ function incompleteRelation(id2) {
+ let entity = context.entity(id2);
+ return entity.type === "relation" && !entity.isComplete(context.graph());
+ }
+ }
+ const disabled = scalingDisabled();
+ if (disabled) {
+ let multi = selectedIDs.length === 1 ? "single" : "multiple";
+ context.ui().flash.duration(4e3).iconName("#iD-icon-no").iconClass("operation disabled").label(_t.html("operations.scale." + disabled + "." + multi))();
+ } else {
+ const pivot = context.projection(extent2.center());
+ const annotation = _t("operations.scale.annotation." + (isUp ? "up" : "down") + ".feature", { n: selectedIDs.length });
+ context.perform(actionScale(selectedIDs, pivot, factor, context.projection), annotation);
+ context.validator().validate();
+ }
+ };
+ }
+ function didDoubleUp(d3_event, loc2) {
+ if (!context.map().withinEditableZoom())
+ return;
+ var target = select_default2(d3_event.target);
+ var datum2 = target.datum();
+ var entity = datum2 && datum2.properties && datum2.properties.entity;
+ if (!entity)
+ return;
+ if (entity instanceof osmWay && target.classed("target")) {
+ var choice = geoChooseEdge(context.graph().childNodes(entity), loc2, context.projection);
+ var prev = entity.nodes[choice.index - 1];
+ var next = entity.nodes[choice.index];
+ context.perform(actionAddMidpoint({ loc: choice.loc, edge: [prev, next] }, osmNode()), _t("operations.add.annotation.vertex"));
+ context.validator().validate();
+ } else if (entity.type === "midpoint") {
+ context.perform(actionAddMidpoint({ loc: entity.loc, edge: entity.edge }, osmNode()), _t("operations.add.annotation.vertex"));
+ context.validator().validate();
+ }
+ }
+ function selectElements() {
+ if (!checkSelectedIDs())
+ return;
+ var surface = context.surface();
+ surface.selectAll(".selected-member").classed("selected-member", false);
+ surface.selectAll(".selected").classed("selected", false);
+ surface.selectAll(".related").classed("related", false);
+ checkFocusedParent();
+ if (_focusedParentWayId) {
+ surface.selectAll(utilEntitySelector([_focusedParentWayId])).classed("related", true);
+ }
+ if (context.map().withinEditableZoom()) {
+ surface.selectAll(utilDeepMemberSelector(selectedIDs, context.graph(), true)).classed("selected-member", true);
+ surface.selectAll(utilEntityOrDeepMemberSelector(selectedIDs, context.graph())).classed("selected", true);
+ }
+ }
+ function esc() {
+ if (context.container().select(".combobox").size())
+ return;
+ context.enter(modeBrowse(context));
+ }
+ function firstVertex(d3_event) {
+ d3_event.preventDefault();
+ var entity = singular();
+ var parentId = parentWayIdForVertexNavigation();
+ var way;
+ if (entity && entity.type === "way") {
+ way = entity;
+ } else if (parentId) {
+ way = context.entity(parentId);
+ }
+ _focusedParentWayId = way && way.id;
+ if (way) {
+ context.enter(mode.selectedIDs([way.first()]).follow(true));
+ }
+ }
+ function lastVertex(d3_event) {
+ d3_event.preventDefault();
+ var entity = singular();
+ var parentId = parentWayIdForVertexNavigation();
+ var way;
+ if (entity && entity.type === "way") {
+ way = entity;
+ } else if (parentId) {
+ way = context.entity(parentId);
+ }
+ _focusedParentWayId = way && way.id;
+ if (way) {
+ context.enter(mode.selectedIDs([way.last()]).follow(true));
+ }
+ }
+ function previousVertex(d3_event) {
+ d3_event.preventDefault();
+ var parentId = parentWayIdForVertexNavigation();
+ _focusedParentWayId = parentId;
+ if (!parentId)
+ return;
+ var way = context.entity(parentId);
+ var length = way.nodes.length;
+ var curr = way.nodes.indexOf(selectedIDs[0]);
+ var index = -1;
+ if (curr > 0) {
+ index = curr - 1;
+ } else if (way.isClosed()) {
+ index = length - 2;
+ }
+ if (index !== -1) {
+ context.enter(mode.selectedIDs([way.nodes[index]]).follow(true));
+ }
+ }
+ function nextVertex(d3_event) {
+ d3_event.preventDefault();
+ var parentId = parentWayIdForVertexNavigation();
+ _focusedParentWayId = parentId;
+ if (!parentId)
+ return;
+ var way = context.entity(parentId);
+ var length = way.nodes.length;
+ var curr = way.nodes.indexOf(selectedIDs[0]);
+ var index = -1;
+ if (curr < length - 1) {
+ index = curr + 1;
+ } else if (way.isClosed()) {
+ index = 0;
+ }
+ if (index !== -1) {
+ context.enter(mode.selectedIDs([way.nodes[index]]).follow(true));
+ }
+ }
+ function focusNextParent(d3_event) {
+ d3_event.preventDefault();
+ var parents = parentWaysIdsOfSelection(true);
+ if (!parents || parents.length < 2)
+ return;
+ var index = parents.indexOf(_focusedParentWayId);
+ if (index < 0 || index > parents.length - 2) {
+ _focusedParentWayId = parents[0];
+ } else {
+ _focusedParentWayId = parents[index + 1];
+ }
+ var surface = context.surface();
+ surface.selectAll(".related").classed("related", false);
+ if (_focusedParentWayId) {
+ surface.selectAll(utilEntitySelector([_focusedParentWayId])).classed("related", true);
+ }
+ }
+ function selectParent(d3_event) {
+ d3_event.preventDefault();
+ var currentSelectedIds = mode.selectedIDs();
+ var parentIds = _focusedParentWayId ? [_focusedParentWayId] : parentWaysIdsOfSelection(false);
+ if (!parentIds.length)
+ return;
+ context.enter(mode.selectedIDs(parentIds));
+ _focusedVertexIds = currentSelectedIds;
+ }
+ function selectChild(d3_event) {
+ d3_event.preventDefault();
+ var currentSelectedIds = mode.selectedIDs();
+ var childIds = _focusedVertexIds ? _focusedVertexIds.filter((id2) => context.hasEntity(id2)) : childNodeIdsOfSelection(true);
+ if (!childIds || !childIds.length)
+ return;
+ if (currentSelectedIds.length === 1)
+ _focusedParentWayId = currentSelectedIds[0];
+ context.enter(mode.selectedIDs(childIds));
+ }
+ };
+ mode.exit = function() {
+ _newFeature = false;
+ _focusedVertexIds = null;
+ _operations.forEach(function(operation) {
+ if (operation.behavior) {
+ context.uninstall(operation.behavior);
+ }
+ });
+ _operations = [];
+ _behaviors.forEach(context.uninstall);
+ select_default2(document).call(keybinding.unbind);
+ context.ui().closeEditMenu();
+ context.history().on("change.select", null).on("undone.select", null).on("redone.select", null);
+ var surface = context.surface();
+ surface.selectAll(".selected-member").classed("selected-member", false);
+ surface.selectAll(".selected").classed("selected", false);
+ surface.selectAll(".highlighted").classed("highlighted", false);
+ surface.selectAll(".related").classed("related", false);
+ context.map().on("drawn.select", null);
+ context.ui().sidebar.hide();
+ context.features().forceVisible([]);
+ var entity = singular();
+ if (_newFeature && entity && entity.type === "relation" && Object.keys(entity.tags).length === 0 && context.graph().parentRelations(entity).length === 0 && (entity.members.length === 0 || entity.members.length === 1 && !entity.members[0].role)) {
+ var deleteAction = actionDeleteRelation(entity.id, true);
+ context.perform(deleteAction, _t("operations.delete.annotation.relation"));
+ context.validator().validate();
+ }
+ };
+ return mode;
+ }
+
+ // modules/behavior/lasso.js
+ function behaviorLasso(context) {
+ var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
+ var behavior = function(selection2) {
+ var lasso;
+ function pointerdown(d3_event) {
+ var button = 0;
+ if (d3_event.button === button && d3_event.shiftKey === true) {
+ lasso = null;
+ select_default2(window).on(_pointerPrefix + "move.lasso", pointermove).on(_pointerPrefix + "up.lasso", pointerup);
+ d3_event.stopPropagation();
+ }
+ }
+ function pointermove() {
+ if (!lasso) {
+ lasso = uiLasso(context);
+ context.surface().call(lasso);
+ }
+ lasso.p(context.map().mouse());
+ }
+ function normalize2(a, b) {
+ return [
+ [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
+ [Math.max(a[0], b[0]), Math.max(a[1], b[1])]
+ ];
+ }
+ function lassoed() {
+ if (!lasso)
+ return [];
+ var graph = context.graph();
+ var limitToNodes;
+ if (context.map().editableDataEnabled(true) && context.map().isInWideSelection()) {
+ limitToNodes = new Set(utilGetAllNodes(context.selectedIDs(), graph));
+ } else if (!context.map().editableDataEnabled()) {
+ return [];
+ }
+ var bounds = lasso.extent().map(context.projection.invert);
+ var extent = geoExtent(normalize2(bounds[0], bounds[1]));
+ var intersects = context.history().intersects(extent).filter(function(entity) {
+ return entity.type === "node" && (!limitToNodes || limitToNodes.has(entity)) && geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) && !context.features().isHidden(entity, graph, entity.geometry(graph));
+ });
+ intersects.sort(function(node1, node2) {
+ var parents1 = graph.parentWays(node1);
+ var parents2 = graph.parentWays(node2);
+ if (parents1.length && parents2.length) {
+ var sharedParents = utilArrayIntersection(parents1, parents2);
+ if (sharedParents.length) {
+ var sharedParentNodes = sharedParents[0].nodes;
+ return sharedParentNodes.indexOf(node1.id) - sharedParentNodes.indexOf(node2.id);
+ } else {
+ return parseFloat(parents1[0].id.slice(1)) - parseFloat(parents2[0].id.slice(1));
}
+ } else if (parents1.length || parents2.length) {
+ return parents1.length - parents2.length;
+ }
+ return node1.loc[0] - node2.loc[0];
+ });
+ return intersects.map(function(entity) {
+ return entity.id;
+ });
+ }
+ function pointerup() {
+ select_default2(window).on(_pointerPrefix + "move.lasso", null).on(_pointerPrefix + "up.lasso", null);
+ if (!lasso)
+ return;
+ var ids = lassoed();
+ lasso.close();
+ if (ids.length) {
+ context.enter(modeSelect(context, ids));
+ }
+ }
+ selection2.on(_pointerPrefix + "down.lasso", pointerdown);
+ };
+ behavior.off = function(selection2) {
+ selection2.on(_pointerPrefix + "down.lasso", null);
+ };
+ return behavior;
+ }
+
+ // modules/modes/browse.js
+ function modeBrowse(context) {
+ var mode = {
+ button: "browse",
+ id: "browse",
+ title: _t("modes.browse.title"),
+ description: _t("modes.browse.description")
+ };
+ var sidebar;
+ var _selectBehavior;
+ var _behaviors = [];
+ mode.selectBehavior = function(val) {
+ if (!arguments.length)
+ return _selectBehavior;
+ _selectBehavior = val;
+ return mode;
+ };
+ mode.enter = function() {
+ if (!_behaviors.length) {
+ if (!_selectBehavior)
+ _selectBehavior = behaviorSelect(context);
+ _behaviors = [
+ behaviorPaste(context),
+ behaviorHover(context).on("hover", context.ui().sidebar.hover),
+ _selectBehavior,
+ behaviorLasso(context),
+ modeDragNode(context).behavior,
+ modeDragNote(context).behavior
+ ];
+ }
+ _behaviors.forEach(context.install);
+ if (document.activeElement && document.activeElement.blur) {
+ document.activeElement.blur();
+ }
+ if (sidebar) {
+ context.ui().sidebar.show(sidebar);
+ } else {
+ context.ui().sidebar.select(null);
+ }
+ };
+ mode.exit = function() {
+ context.ui().sidebar.hover.cancel();
+ _behaviors.forEach(context.uninstall);
+ if (sidebar) {
+ context.ui().sidebar.hide();
+ }
+ };
+ mode.sidebar = function(_) {
+ if (!arguments.length)
+ return sidebar;
+ sidebar = _;
+ return mode;
+ };
+ mode.operations = function() {
+ return [operationPaste(context)];
+ };
+ return mode;
+ }
+
+ // modules/behavior/add_way.js
+ function behaviorAddWay(context) {
+ var dispatch10 = dispatch_default("start", "startFromWay", "startFromNode");
+ var draw = behaviorDraw(context);
+ function behavior(surface) {
+ draw.on("click", function() {
+ dispatch10.apply("start", this, arguments);
+ }).on("clickWay", function() {
+ dispatch10.apply("startFromWay", this, arguments);
+ }).on("clickNode", function() {
+ dispatch10.apply("startFromNode", this, arguments);
+ }).on("cancel", behavior.cancel).on("finish", behavior.cancel);
+ context.map().dblclickZoomEnable(false);
+ surface.call(draw);
+ }
+ behavior.off = function(surface) {
+ surface.call(draw.off);
+ };
+ behavior.cancel = function() {
+ window.setTimeout(function() {
+ context.map().dblclickZoomEnable(true);
+ }, 1e3);
+ context.enter(modeBrowse(context));
+ };
+ return utilRebind(behavior, dispatch10, "on");
+ }
+
+ // modules/behavior/hash.js
+ function behaviorHash(context) {
+ var _cachedHash = null;
+ var _latitudeLimit = 90 - 1e-8;
+ function computedHashParameters() {
+ var map2 = context.map();
+ var center = map2.center();
+ var zoom = map2.zoom();
+ var precision2 = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
+ var oldParams = utilObjectOmit(utilStringQs(window.location.hash), ["comment", "source", "hashtags", "walkthrough"]);
+ var newParams = {};
+ delete oldParams.id;
+ var selected = context.selectedIDs().filter(function(id2) {
+ return context.hasEntity(id2);
+ });
+ if (selected.length) {
+ newParams.id = selected.join(",");
+ }
+ newParams.map = zoom.toFixed(2) + "/" + center[1].toFixed(precision2) + "/" + center[0].toFixed(precision2);
+ return Object.assign(oldParams, newParams);
+ }
+ function computedHash() {
+ return "#" + utilQsString(computedHashParameters(), true);
+ }
+ function computedTitle(includeChangeCount) {
+ var baseTitle = context.documentTitleBase() || "iD";
+ var contextual;
+ var changeCount;
+ var titleID;
+ var selected = context.selectedIDs().filter(function(id2) {
+ return context.hasEntity(id2);
+ });
+ if (selected.length) {
+ var firstLabel = utilDisplayLabel(context.entity(selected[0]), context.graph());
+ if (selected.length > 1) {
+ contextual = _t("title.labeled_and_more", {
+ labeled: firstLabel,
+ count: selected.length - 1
+ });
+ } else {
+ contextual = firstLabel;
+ }
+ titleID = "context";
+ }
+ if (includeChangeCount) {
+ changeCount = context.history().difference().summary().length;
+ if (changeCount > 0) {
+ titleID = contextual ? "changes_context" : "changes";
+ }
+ }
+ if (titleID) {
+ return _t("title.format." + titleID, {
+ changes: changeCount,
+ base: baseTitle,
+ context: contextual
+ });
+ }
+ return baseTitle;
+ }
+ function updateTitle(includeChangeCount) {
+ if (!context.setsDocumentTitle())
+ return;
+ var newTitle = computedTitle(includeChangeCount);
+ if (document.title !== newTitle) {
+ document.title = newTitle;
+ }
+ }
+ function updateHashIfNeeded() {
+ if (context.inIntro())
+ return;
+ var latestHash = computedHash();
+ if (_cachedHash !== latestHash) {
+ _cachedHash = latestHash;
+ window.history.replaceState(null, computedTitle(false), latestHash);
+ updateTitle(true);
+ }
+ }
+ var _throttledUpdate = throttle_default(updateHashIfNeeded, 500);
+ var _throttledUpdateTitle = throttle_default(function() {
+ updateTitle(true);
+ }, 500);
+ function hashchange() {
+ if (window.location.hash === _cachedHash)
+ return;
+ _cachedHash = window.location.hash;
+ var q = utilStringQs(_cachedHash);
+ var mapArgs = (q.map || "").split("/").map(Number);
+ if (mapArgs.length < 3 || mapArgs.some(isNaN)) {
+ updateHashIfNeeded();
+ } else {
+ if (_cachedHash === computedHash())
+ return;
+ var mode = context.mode();
+ context.map().centerZoom([mapArgs[2], Math.min(_latitudeLimit, Math.max(-_latitudeLimit, mapArgs[1]))], mapArgs[0]);
+ if (q.id && mode) {
+ var ids = q.id.split(",").filter(function(id2) {
+ return context.hasEntity(id2);
+ });
+ if (ids.length && (mode.id === "browse" || mode.id === "select" && !utilArrayIdentical(mode.selectedIDs(), ids))) {
+ context.enter(modeSelect(context, ids));
+ return;
+ }
}
+ var center = context.map().center();
+ var dist = geoSphericalDistance(center, [mapArgs[2], mapArgs[1]]);
+ var maxdist = 500;
+ if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
+ context.enter(modeBrowse(context));
+ return;
+ }
+ }
+ }
+ function behavior() {
+ context.map().on("move.behaviorHash", _throttledUpdate);
+ context.history().on("change.behaviorHash", _throttledUpdateTitle);
+ context.on("enter.behaviorHash", _throttledUpdate);
+ select_default2(window).on("hashchange.behaviorHash", hashchange);
+ if (window.location.hash) {
+ var q = utilStringQs(window.location.hash);
+ if (q.id) {
+ context.zoomToEntity(q.id.split(",")[0], !q.map);
+ }
+ if (q.walkthrough === "true") {
+ behavior.startWalkthrough = true;
+ }
+ if (q.map) {
+ behavior.hadHash = true;
+ }
+ hashchange();
+ updateTitle(false);
+ }
+ }
+ behavior.off = function() {
+ _throttledUpdate.cancel();
+ _throttledUpdateTitle.cancel();
+ context.map().on("move.behaviorHash", null);
+ context.on("enter.behaviorHash", null);
+ select_default2(window).on("hashchange.behaviorHash", null);
+ window.location.hash = "";
+ };
+ return behavior;
+ }
+
+ // node_modules/d3-brush/src/brush.js
+ var { abs: abs2, max: max2, min: min2 } = Math;
+ function number1(e) {
+ return [+e[0], +e[1]];
+ }
+ function number22(e) {
+ return [number1(e[0]), number1(e[1])];
+ }
+ var X = {
+ name: "x",
+ handles: ["w", "e"].map(type2),
+ input: function(x, e) {
+ return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]];
+ },
+ output: function(xy) {
+ return xy && [xy[0][0], xy[1][0]];
+ }
+ };
+ var Y = {
+ name: "y",
+ handles: ["n", "s"].map(type2),
+ input: function(y, e) {
+ return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]];
+ },
+ output: function(xy) {
+ return xy && [xy[0][1], xy[1][1]];
+ }
+ };
+ var XY = {
+ name: "xy",
+ handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type2),
+ input: function(xy) {
+ return xy == null ? null : number22(xy);
+ },
+ output: function(xy) {
+ return xy;
}
-};
\ No newline at end of file
+ };
+ function type2(t) {
+ return { type: t };
+ }
+
+ // modules/index.js
+ var debug = false;
+ var d3 = {
+ dispatch: dispatch_default,
+ geoMercator: mercator_default,
+ geoProjection: projection,
+ polygonArea: area_default3,
+ polygonCentroid: centroid_default2,
+ select: select_default2,
+ selectAll: selectAll_default2,
+ timerFlush
+ };
+
+ // modules/id.js
+ window.requestIdleCallback = window.requestIdleCallback || function(cb) {
+ var start2 = Date.now();
+ return window.requestAnimationFrame(function() {
+ cb({
+ didTimeout: false,
+ timeRemaining: function() {
+ return Math.max(0, 50 - (Date.now() - start2));
+ }
+ });
+ });
+ };
+ window.cancelIdleCallback = window.cancelIdleCallback || function(id2) {
+ window.cancelAnimationFrame(id2);
+ };
+ window.iD = modules_exports;
+})();
+//# sourceMappingURL=iD.js.map