mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2026-02-06 10:31:23 +01:00
- Configured `vite.config.ts` for relative base path support. - Initialized `mobile_app` Flutter project with `webview_flutter`. - Added `assets/www` to Flutter assets configuration. - Implemented `mobile_app/lib/main.dart` with WebView and Bridge API integration (Water Level Slider). - Updated `.gitignore` for Flutter artifacts. - Successfully built APK artifacts. Co-authored-by: kliffdafunkfacekilla-arch <239708976+kliffdafunkfacekilla-arch@users.noreply.github.com>
7 lines
229 KiB
JavaScript
7 lines
229 KiB
JavaScript
(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))t(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const s of o.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&t(s)}).observe(document,{childList:!0,subtree:!0});function n(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function t(i){if(i.ep)return;i.ep=!0;const o=n(i);fetch(i.href,o)}})();String.prototype.replaceAll===void 0&&(String.prototype.replaceAll=function(e,a){return Object.prototype.toString.call(e).toLowerCase()==="[object regexp]"?this.replace(e,a):this.replace(new RegExp(e,"g"),a)});Array.prototype.flat===void 0&&(Array.prototype.flat=function(e){return this.reduce((a,n)=>Array.isArray(n)?a.concat(n.flat(e)):a.concat(n),[])});Array.prototype.at===void 0&&(Array.prototype.at=function(e){if(e<0&&(e+=this.length),!(e<0||e>=this.length))return this[e]});ReadableStream.prototype[Symbol.asyncIterator]===void 0&&(ReadableStream.prototype[Symbol.asyncIterator]=async function*(){const e=this.getReader();try{for(;;){const{done:a,value:n}=await e.read();if(a)return;yield n}}finally{e.releaseLock()}});const N=(e,a=0)=>{const n=10**a;return Math.round(e*n)/n},ma=(e,a,n)=>Math.min(Math.max(e,a),n),V=e=>ma(e,0,100),ee=(e,a,n)=>ma((e-a)/(n-a),0,1),Ut=(e,a,n)=>e+(a-e)*n,Ea=e=>e[e.length-1],jn=e=>[...new Set(e)],Vt=e=>{const a=h=>h,n=h=>h.map(a),t=h=>Object.fromEntries(Object.entries(h).map(([u,l])=>[u,i(l)])),i=h=>h instanceof Object?(s.get(h.constructor)||a)(h):h,o=h=>[...h.entries()].map(([u,l])=>[u,i(l)]),s=new Map([[Int8Array,n],[Uint8Array,n],[Uint8ClampedArray,n],[Int16Array,n],[Uint16Array,n],[Int32Array,n],[Uint32Array,n],[Float32Array,n],[Float64Array,n],[BigInt64Array,n],[BigUint64Array,n],[Map,h=>new Map(o(h))],[WeakMap,h=>new WeakMap(o(h))],[Array,h=>h.map(i)],[Set,h=>[...h.values()].map(i)],[Date,h=>new Date(h.getTime())],[Object,t]]);return i(e)},Un=e=>(console.assert(Number.isInteger(e)&&e>=0&&e<=ea.UINT32_MAX,`Array maxValue must be an integer between 0 and ${ea.UINT32_MAX}, got ${e}`),e<=ea.UINT8_MAX?Uint8Array:e<=ea.UINT16_MAX?Uint16Array:(e<=ea.UINT32_MAX,Uint32Array)),pe=({maxValue:e,length:a,from:n})=>{const t=Un(e);return n?t.from(n):new t(a)},ea={INT8_MAX:127,UINT8_MAX:255,UINT16_MAX:65535,UINT32_MAX:4294967295};function Ft(e,a){return e==null||a==null?NaN:e<a?-1:e>a?1:e>=a?0:NaN}const Yt=Math.sqrt(50),$t=Math.sqrt(10),Wt=Math.sqrt(2);function ne(e,a,n){const t=(a-e)/Math.max(0,n),i=Math.floor(Math.log10(t)),o=t/Math.pow(10,i),s=o>=Yt?10:o>=$t?5:o>=Wt?2:1;let h,u,l;return i<0?(l=Math.pow(10,-i)/s,h=Math.round(e*l),u=Math.round(a*l),h/l<e&&++h,u/l>a&&--u,l=-l):(l=Math.pow(10,i)*s,h=Math.round(e/l),u=Math.round(a/l),h*l<e&&++h,u*l>a&&--u),u<h&&.5<=n&&n<2?ne(e,a,n*2):[h,u,l]}function Zt(e,a,n){if(a=+a,e=+e,n=+n,!(n>0))return[];if(e===a)return[e];const t=a<e,[i,o,s]=t?ne(a,e,n):ne(e,a,n);if(!(o>=i))return[];const h=o-i+1,u=new Array(h);if(t)if(s<0)for(let l=0;l<h;++l)u[l]=(o-l)/-s;else for(let l=0;l<h;++l)u[l]=(o-l)*s;else if(s<0)for(let l=0;l<h;++l)u[l]=(i+l)/-s;else for(let l=0;l<h;++l)u[l]=(i+l)*s;return u}function Ee(e,a,n){return a=+a,e=+e,n=+n,ne(e,a,n)[2]}function Qt(e,a,n){a=+a,e=+e,n=+n;const t=a<e,i=t?Ee(a,e,n):Ee(e,a,n);return(t?-1:1)*(i<0?1/-i:i)}function Vn(e,a){let n;for(const t of e)t!=null&&(n<t||n===void 0&&t>=t)&&(n=t);return n}function Ba(e,a){let n;for(const t of e)t!=null&&(n>t||n===void 0&&t>=t)&&(n=t);return n}function Jt(e,a){let n,t=-1,i=-1;if(a===void 0)for(const o of e)++i,o!=null&&(n>o||n===void 0&&o>=o)&&(n=o,t=i);else for(let o of e)(o=a(o,++i,e))!=null&&(n>o||n===void 0&&o>=o)&&(n=o,t=i);return t}function Ha(e,a){let n=0,t=0;for(let i of e)i!=null&&(i=+i)>=i&&(++n,t+=i);if(n)return t/n}function Ra(e,a,n){e=+e,a=+a,n=(i=arguments.length)<2?(a=e,e=0,1):i<3?1:+n;for(var t=-1,i=Math.max(0,Math.ceil((a-e)/n))|0,o=new Array(i);++t<i;)o[t]=e+t*n;return o}function ln(e,a=Ft){if(a.length===1)return Jt(e,a);let n,t=-1,i=-1;for(const o of e)++i,(t<0?a(o,o)===0:a(o,n)<0)&&(n=o,t=i);return t}function Xt(e){return function(n,t=0,i=n.length){let o=i-(t=+t);for(;o;){const s=e()*o--|0,h=n[o+t];n[o+t]=n[s+t],n[s+t]=h}return n}}function ai(e,a){let n=0;for(let t of e)(t=+t)&&(n+=t);return n}var ei={value:()=>{}};function Fn(){for(var e=0,a=arguments.length,n={},t;e<a;++e){if(!(t=arguments[e]+"")||t in n||/[\s.]/.test(t))throw new Error("illegal type: "+t);n[t]=[]}return new $a(n)}function $a(e){this._=e}function ni(e,a){return e.trim().split(/^|\s+/).map(function(n){var t="",i=n.indexOf(".");if(i>=0&&(t=n.slice(i+1),n=n.slice(0,i)),n&&!a.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:t}})}$a.prototype=Fn.prototype={constructor:$a,on:function(e,a){var n=this._,t=ni(e+"",n),i,o=-1,s=t.length;if(arguments.length<2){for(;++o<s;)if((i=(e=t[o]).type)&&(i=ti(n[i],e.name)))return i;return}if(a!=null&&typeof a!="function")throw new Error("invalid callback: "+a);for(;++o<s;)if(i=(e=t[o]).type)n[i]=un(n[i],e.name,a);else if(a==null)for(i in n)n[i]=un(n[i],e.name,null);return this},copy:function(){var e={},a=this._;for(var n in a)e[n]=a[n].slice();return new $a(e)},call:function(e,a){if((i=arguments.length-2)>0)for(var n=new Array(i),t=0,i,o;t<i;++t)n[t]=arguments[t+2];if(!this._.hasOwnProperty(e))throw new Error("unknown type: "+e);for(o=this._[e],t=0,i=o.length;t<i;++t)o[t].value.apply(a,n)},apply:function(e,a,n){if(!this._.hasOwnProperty(e))throw new Error("unknown type: "+e);for(var t=this._[e],i=0,o=t.length;i<o;++i)t[i].value.apply(a,n)}};function ti(e,a){for(var n=0,t=e.length,i;n<t;++n)if((i=e[n]).name===a)return i.value}function un(e,a,n){for(var t=0,i=e.length;t<i;++t)if(e[t].name===a){e[t]=ei,e=e.slice(0,t).concat(e.slice(t+1));break}return n!=null&&e.push({name:a,value:n}),e}var He="http://www.w3.org/1999/xhtml";const hn={svg:"http://www.w3.org/2000/svg",xhtml:He,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function ye(e){var a=e+="",n=a.indexOf(":");return n>=0&&(a=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),hn.hasOwnProperty(a)?{space:hn[a],local:e}:e}function ii(e){return function(){var a=this.ownerDocument,n=this.namespaceURI;return n===He&&a.documentElement.namespaceURI===He?a.createElement(e):a.createElementNS(n,e)}}function ri(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function Yn(e){var a=ye(e);return(a.local?ri:ii)(a)}function oi(){}function Ve(e){return e==null?oi:function(){return this.querySelector(e)}}function si(e){typeof e!="function"&&(e=Ve(e));for(var a=this._groups,n=a.length,t=new Array(n),i=0;i<n;++i)for(var o=a[i],s=o.length,h=t[i]=new Array(s),u,l,c=0;c<s;++c)(u=o[c])&&(l=e.call(u,u.__data__,c,o))&&("__data__"in u&&(l.__data__=u.__data__),h[c]=l);return new W(t,this._parents)}function li(e){return e==null?[]:Array.isArray(e)?e:Array.from(e)}function ui(){return[]}function $n(e){return e==null?ui:function(){return this.querySelectorAll(e)}}function hi(e){return function(){return li(e.apply(this,arguments))}}function ci(e){typeof e=="function"?e=hi(e):e=$n(e);for(var a=this._groups,n=a.length,t=[],i=[],o=0;o<n;++o)for(var s=a[o],h=s.length,u,l=0;l<h;++l)(u=s[l])&&(t.push(e.call(u,u.__data__,l,s)),i.push(u));return new W(t,i)}function Wn(e){return function(){return this.matches(e)}}function Zn(e){return function(a){return a.matches(e)}}var di=Array.prototype.find;function gi(e){return function(){return di.call(this.children,e)}}function fi(){return this.firstElementChild}function mi(e){return this.select(e==null?fi:gi(typeof e=="function"?e:Zn(e)))}var pi=Array.prototype.filter;function yi(){return Array.from(this.children)}function ki(e){return function(){return pi.call(this.children,e)}}function bi(e){return this.selectAll(e==null?yi:ki(typeof e=="function"?e:Zn(e)))}function vi(e){typeof e!="function"&&(e=Wn(e));for(var a=this._groups,n=a.length,t=new Array(n),i=0;i<n;++i)for(var o=a[i],s=o.length,h=t[i]=[],u,l=0;l<s;++l)(u=o[l])&&e.call(u,u.__data__,l,o)&&h.push(u);return new W(t,this._parents)}function Qn(e){return new Array(e.length)}function wi(){return new W(this._enter||this._groups.map(Qn),this._parents)}function te(e,a){this.ownerDocument=e.ownerDocument,this.namespaceURI=e.namespaceURI,this._next=null,this._parent=e,this.__data__=a}te.prototype={constructor:te,appendChild:function(e){return this._parent.insertBefore(e,this._next)},insertBefore:function(e,a){return this._parent.insertBefore(e,a)},querySelector:function(e){return this._parent.querySelector(e)},querySelectorAll:function(e){return this._parent.querySelectorAll(e)}};function Ai(e){return function(){return e}}function Si(e,a,n,t,i,o){for(var s=0,h,u=a.length,l=o.length;s<l;++s)(h=a[s])?(h.__data__=o[s],t[s]=h):n[s]=new te(e,o[s]);for(;s<u;++s)(h=a[s])&&(i[s]=h)}function _i(e,a,n,t,i,o,s){var h,u,l=new Map,c=a.length,d=o.length,r=new Array(c),g;for(h=0;h<c;++h)(u=a[h])&&(r[h]=g=s.call(u,u.__data__,h,a)+"",l.has(g)?i[h]=u:l.set(g,u));for(h=0;h<d;++h)g=s.call(e,o[h],h,o)+"",(u=l.get(g))?(t[h]=u,u.__data__=o[h],l.delete(g)):n[h]=new te(e,o[h]);for(h=0;h<c;++h)(u=a[h])&&l.get(r[h])===u&&(i[h]=u)}function Mi(e){return e.__data__}function zi(e,a){if(!arguments.length)return Array.from(this,Mi);var n=a?_i:Si,t=this._parents,i=this._groups;typeof e!="function"&&(e=Ai(e));for(var o=i.length,s=new Array(o),h=new Array(o),u=new Array(o),l=0;l<o;++l){var c=t[l],d=i[l],r=d.length,g=Ti(e.call(c,c&&c.__data__,l,t)),m=g.length,f=h[l]=new Array(m),p=s[l]=new Array(m),y=u[l]=new Array(r);n(c,d,f,p,y,g,a);for(var k=0,b=0,v,w;k<m;++k)if(v=f[k]){for(k>=b&&(b=k+1);!(w=p[b])&&++b<m;);v._next=w||null}}return s=new W(s,t),s._enter=h,s._exit=u,s}function Ti(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function xi(){return new W(this._exit||this._groups.map(Qn),this._parents)}function Ni(e,a,n){var t=this.enter(),i=this,o=this.exit();return typeof e=="function"?(t=e(t),t&&(t=t.selection())):t=t.append(e+""),a!=null&&(i=a(i),i&&(i=i.selection())),n==null?o.remove():n(o),t&&i?t.merge(i).order():i}function Ci(e){for(var a=e.selection?e.selection():e,n=this._groups,t=a._groups,i=n.length,o=t.length,s=Math.min(i,o),h=new Array(i),u=0;u<s;++u)for(var l=n[u],c=t[u],d=l.length,r=h[u]=new Array(d),g,m=0;m<d;++m)(g=l[m]||c[m])&&(r[m]=g);for(;u<i;++u)h[u]=n[u];return new W(h,this._parents)}function Ki(){for(var e=this._groups,a=-1,n=e.length;++a<n;)for(var t=e[a],i=t.length-1,o=t[i],s;--i>=0;)(s=t[i])&&(o&&s.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(s,o),o=s);return this}function Bi(e){e||(e=Ei);function a(d,r){return d&&r?e(d.__data__,r.__data__):!d-!r}for(var n=this._groups,t=n.length,i=new Array(t),o=0;o<t;++o){for(var s=n[o],h=s.length,u=i[o]=new Array(h),l,c=0;c<h;++c)(l=s[c])&&(u[c]=l);u.sort(a)}return new W(i,this._parents).order()}function Ei(e,a){return e<a?-1:e>a?1:e>=a?0:NaN}function Hi(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function Ri(){return Array.from(this)}function Li(){for(var e=this._groups,a=0,n=e.length;a<n;++a)for(var t=e[a],i=0,o=t.length;i<o;++i){var s=t[i];if(s)return s}return null}function Pi(){let e=0;for(const a of this)++e;return e}function Ii(){return!this.node()}function Di(e){for(var a=this._groups,n=0,t=a.length;n<t;++n)for(var i=a[n],o=0,s=i.length,h;o<s;++o)(h=i[o])&&e.call(h,h.__data__,o,i);return this}function Gi(e){return function(){this.removeAttribute(e)}}function Oi(e){return function(){this.removeAttributeNS(e.space,e.local)}}function qi(e,a){return function(){this.setAttribute(e,a)}}function ji(e,a){return function(){this.setAttributeNS(e.space,e.local,a)}}function Ui(e,a){return function(){var n=a.apply(this,arguments);n==null?this.removeAttribute(e):this.setAttribute(e,n)}}function Vi(e,a){return function(){var n=a.apply(this,arguments);n==null?this.removeAttributeNS(e.space,e.local):this.setAttributeNS(e.space,e.local,n)}}function Fi(e,a){var n=ye(e);if(arguments.length<2){var t=this.node();return n.local?t.getAttributeNS(n.space,n.local):t.getAttribute(n)}return this.each((a==null?n.local?Oi:Gi:typeof a=="function"?n.local?Vi:Ui:n.local?ji:qi)(n,a))}function Jn(e){return e.ownerDocument&&e.ownerDocument.defaultView||e.document&&e||e.defaultView}function Yi(e){return function(){this.style.removeProperty(e)}}function $i(e,a,n){return function(){this.style.setProperty(e,a,n)}}function Wi(e,a,n){return function(){var t=a.apply(this,arguments);t==null?this.style.removeProperty(e):this.style.setProperty(e,t,n)}}function Zi(e,a,n){return arguments.length>1?this.each((a==null?Yi:typeof a=="function"?Wi:$i)(e,a,n??"")):Aa(this.node(),e)}function Aa(e,a){return e.style.getPropertyValue(a)||Jn(e).getComputedStyle(e,null).getPropertyValue(a)}function Qi(e){return function(){delete this[e]}}function Ji(e,a){return function(){this[e]=a}}function Xi(e,a){return function(){var n=a.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function ar(e,a){return arguments.length>1?this.each((a==null?Qi:typeof a=="function"?Xi:Ji)(e,a)):this.node()[e]}function Xn(e){return e.trim().split(/^|\s+/)}function Fe(e){return e.classList||new at(e)}function at(e){this._node=e,this._names=Xn(e.getAttribute("class")||"")}at.prototype={add:function(e){var a=this._names.indexOf(e);a<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var a=this._names.indexOf(e);a>=0&&(this._names.splice(a,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function et(e,a){for(var n=Fe(e),t=-1,i=a.length;++t<i;)n.add(a[t])}function nt(e,a){for(var n=Fe(e),t=-1,i=a.length;++t<i;)n.remove(a[t])}function er(e){return function(){et(this,e)}}function nr(e){return function(){nt(this,e)}}function tr(e,a){return function(){(a.apply(this,arguments)?et:nt)(this,e)}}function ir(e,a){var n=Xn(e+"");if(arguments.length<2){for(var t=Fe(this.node()),i=-1,o=n.length;++i<o;)if(!t.contains(n[i]))return!1;return!0}return this.each((typeof a=="function"?tr:a?er:nr)(n,a))}function rr(){this.textContent=""}function or(e){return function(){this.textContent=e}}function sr(e){return function(){var a=e.apply(this,arguments);this.textContent=a??""}}function lr(e){return arguments.length?this.each(e==null?rr:(typeof e=="function"?sr:or)(e)):this.node().textContent}function ur(){this.innerHTML=""}function hr(e){return function(){this.innerHTML=e}}function cr(e){return function(){var a=e.apply(this,arguments);this.innerHTML=a??""}}function dr(e){return arguments.length?this.each(e==null?ur:(typeof e=="function"?cr:hr)(e)):this.node().innerHTML}function gr(){this.nextSibling&&this.parentNode.appendChild(this)}function fr(){return this.each(gr)}function mr(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function pr(){return this.each(mr)}function yr(e){var a=typeof e=="function"?e:Yn(e);return this.select(function(){return this.appendChild(a.apply(this,arguments))})}function kr(){return null}function br(e,a){var n=typeof e=="function"?e:Yn(e),t=a==null?kr:typeof a=="function"?a:Ve(a);return this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})}function vr(){var e=this.parentNode;e&&e.removeChild(this)}function wr(){return this.each(vr)}function Ar(){var e=this.cloneNode(!1),a=this.parentNode;return a?a.insertBefore(e,this.nextSibling):e}function Sr(){var e=this.cloneNode(!0),a=this.parentNode;return a?a.insertBefore(e,this.nextSibling):e}function _r(e){return this.select(e?Sr:Ar)}function Mr(e){return arguments.length?this.property("__data__",e):this.node().__data__}function zr(e){return function(a){e.call(this,a,this.__data__)}}function Tr(e){return e.trim().split(/^|\s+/).map(function(a){var n="",t=a.indexOf(".");return t>=0&&(n=a.slice(t+1),a=a.slice(0,t)),{type:a,name:n}})}function xr(e){return function(){var a=this.__on;if(a){for(var n=0,t=-1,i=a.length,o;n<i;++n)o=a[n],(!e.type||o.type===e.type)&&o.name===e.name?this.removeEventListener(o.type,o.listener,o.options):a[++t]=o;++t?a.length=t:delete this.__on}}}function Nr(e,a,n){return function(){var t=this.__on,i,o=zr(a);if(t){for(var s=0,h=t.length;s<h;++s)if((i=t[s]).type===e.type&&i.name===e.name){this.removeEventListener(i.type,i.listener,i.options),this.addEventListener(i.type,i.listener=o,i.options=n),i.value=a;return}}this.addEventListener(e.type,o,n),i={type:e.type,name:e.name,value:a,listener:o,options:n},t?t.push(i):this.__on=[i]}}function Cr(e,a,n){var t=Tr(e+""),i,o=t.length,s;if(arguments.length<2){var h=this.node().__on;if(h){for(var u=0,l=h.length,c;u<l;++u)for(i=0,c=h[u];i<o;++i)if((s=t[i]).type===c.type&&s.name===c.name)return c.value}return}for(h=a?Nr:xr,i=0;i<o;++i)this.each(h(t[i],a,n));return this}function tt(e,a,n){var t=Jn(e),i=t.CustomEvent;typeof i=="function"?i=new i(a,n):(i=t.document.createEvent("Event"),n?(i.initEvent(a,n.bubbles,n.cancelable),i.detail=n.detail):i.initEvent(a,!1,!1)),e.dispatchEvent(i)}function Kr(e,a){return function(){return tt(this,e,a)}}function Br(e,a){return function(){return tt(this,e,a.apply(this,arguments))}}function Er(e,a){return this.each((typeof a=="function"?Br:Kr)(e,a))}function*Hr(){for(var e=this._groups,a=0,n=e.length;a<n;++a)for(var t=e[a],i=0,o=t.length,s;i<o;++i)(s=t[i])&&(yield s)}var Rr=[null];function W(e,a){this._groups=e,this._parents=a}function Da(){return new W([[document.documentElement]],Rr)}function Lr(){return this}W.prototype=Da.prototype={constructor:W,select:si,selectAll:ci,selectChild:mi,selectChildren:bi,filter:vi,data:zi,enter:wi,exit:xi,join:Ni,merge:Ci,selection:Lr,order:Ki,sort:Bi,call:Hi,nodes:Ri,node:Li,size:Pi,empty:Ii,each:Di,attr:Fi,style:Zi,property:ar,classed:ir,text:lr,html:dr,raise:fr,lower:pr,append:yr,insert:br,remove:wr,clone:_r,datum:Mr,on:Cr,dispatch:Er,[Symbol.iterator]:Hr};function ke(e,a,n){e.prototype=a.prototype=n,n.constructor=e}function Ye(e,a){var n=Object.create(e.prototype);for(var t in a)n[t]=a[t];return n}function za(){}var ga=.7,Sa=1/ga,va="\\s*([+-]?\\d+)\\s*",La="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",na="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Pr=/^#([0-9a-f]{3,8})$/,Ir=new RegExp(`^rgb\\(${va},${va},${va}\\)$`),Dr=new RegExp(`^rgb\\(${na},${na},${na}\\)$`),Gr=new RegExp(`^rgba\\(${va},${va},${va},${La}\\)$`),Or=new RegExp(`^rgba\\(${na},${na},${na},${La}\\)$`),qr=new RegExp(`^hsl\\(${La},${na},${na}\\)$`),jr=new RegExp(`^hsla\\(${La},${na},${na},${La}\\)$`),cn={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};ke(za,Z,{copy(e){return Object.assign(new this.constructor,this,e)},displayable(){return this.rgb().displayable()},hex:dn,formatHex:dn,formatHex8:Ur,formatHsl:Vr,formatRgb:gn,toString:gn});function dn(){return this.rgb().formatHex()}function Ur(){return this.rgb().formatHex8()}function Vr(){return rt(this).formatHsl()}function gn(){return this.rgb().formatRgb()}function Z(e){var a,n;return e=(e+"").trim().toLowerCase(),(a=Pr.exec(e))?(n=a[1].length,a=parseInt(a[1],16),n===6?fn(a):n===3?new P(a>>8&15|a>>4&240,a>>4&15|a&240,(a&15)<<4|a&15,1):n===8?Oa(a>>24&255,a>>16&255,a>>8&255,(a&255)/255):n===4?Oa(a>>12&15|a>>8&240,a>>8&15|a>>4&240,a>>4&15|a&240,((a&15)<<4|a&15)/255):null):(a=Ir.exec(e))?new P(a[1],a[2],a[3],1):(a=Dr.exec(e))?new P(a[1]*255/100,a[2]*255/100,a[3]*255/100,1):(a=Gr.exec(e))?Oa(a[1],a[2],a[3],a[4]):(a=Or.exec(e))?Oa(a[1]*255/100,a[2]*255/100,a[3]*255/100,a[4]):(a=qr.exec(e))?yn(a[1],a[2]/100,a[3]/100,1):(a=jr.exec(e))?yn(a[1],a[2]/100,a[3]/100,a[4]):cn.hasOwnProperty(e)?fn(cn[e]):e==="transparent"?new P(NaN,NaN,NaN,0):null}function fn(e){return new P(e>>16&255,e>>8&255,e&255,1)}function Oa(e,a,n,t){return t<=0&&(e=a=n=NaN),new P(e,a,n,t)}function it(e){return e instanceof za||(e=Z(e)),e?(e=e.rgb(),new P(e.r,e.g,e.b,e.opacity)):new P}function Re(e,a,n,t){return arguments.length===1?it(e):new P(e,a,n,t??1)}function P(e,a,n,t){this.r=+e,this.g=+a,this.b=+n,this.opacity=+t}ke(P,Re,Ye(za,{brighter(e){return e=e==null?Sa:Math.pow(Sa,e),new P(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?ga:Math.pow(ga,e),new P(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new P(ca(this.r),ca(this.g),ca(this.b),ie(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:mn,formatHex:mn,formatHex8:Fr,formatRgb:pn,toString:pn}));function mn(){return`#${ha(this.r)}${ha(this.g)}${ha(this.b)}`}function Fr(){return`#${ha(this.r)}${ha(this.g)}${ha(this.b)}${ha((isNaN(this.opacity)?1:this.opacity)*255)}`}function pn(){const e=ie(this.opacity);return`${e===1?"rgb(":"rgba("}${ca(this.r)}, ${ca(this.g)}, ${ca(this.b)}${e===1?")":`, ${e})`}`}function ie(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function ca(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function ha(e){return e=ca(e),(e<16?"0":"")+e.toString(16)}function yn(e,a,n,t){return t<=0?e=a=n=NaN:n<=0||n>=1?e=a=NaN:a<=0&&(e=NaN),new F(e,a,n,t)}function rt(e){if(e instanceof F)return new F(e.h,e.s,e.l,e.opacity);if(e instanceof za||(e=Z(e)),!e)return new F;if(e instanceof F)return e;e=e.rgb();var a=e.r/255,n=e.g/255,t=e.b/255,i=Math.min(a,n,t),o=Math.max(a,n,t),s=NaN,h=o-i,u=(o+i)/2;return h?(a===o?s=(n-t)/h+(n<t)*6:n===o?s=(t-a)/h+2:s=(a-n)/h+4,h/=u<.5?o+i:2-o-i,s*=60):h=u>0&&u<1?0:s,new F(s,h,u,e.opacity)}function Yr(e,a,n,t){return arguments.length===1?rt(e):new F(e,a,n,t??1)}function F(e,a,n,t){this.h=+e,this.s=+a,this.l=+n,this.opacity=+t}ke(F,Yr,Ye(za,{brighter(e){return e=e==null?Sa:Math.pow(Sa,e),new F(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?ga:Math.pow(ga,e),new F(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,a=isNaN(e)||isNaN(this.s)?0:this.s,n=this.l,t=n+(n<.5?n:1-n)*a,i=2*n-t;return new P(Ne(e>=240?e-240:e+120,i,t),Ne(e,i,t),Ne(e<120?e+240:e-120,i,t),this.opacity)},clamp(){return new F(kn(this.h),qa(this.s),qa(this.l),ie(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 e=ie(this.opacity);return`${e===1?"hsl(":"hsla("}${kn(this.h)}, ${qa(this.s)*100}%, ${qa(this.l)*100}%${e===1?")":`, ${e})`}`}}));function kn(e){return e=(e||0)%360,e<0?e+360:e}function qa(e){return Math.max(0,Math.min(1,e||0))}function Ne(e,a,n){return(e<60?a+(n-a)*e/60:e<180?n:e<240?a+(n-a)*(240-e)/60:a)*255}const $r=Math.PI/180,Wr=180/Math.PI;var ot=-.14861,$e=1.78277,We=-.29227,be=-.90649,Pa=1.97294,bn=Pa*be,vn=Pa*$e,wn=$e*We-be*ot;function Zr(e){if(e instanceof da)return new da(e.h,e.s,e.l,e.opacity);e instanceof P||(e=it(e));var a=e.r/255,n=e.g/255,t=e.b/255,i=(wn*t+bn*a-vn*n)/(wn+bn-vn),o=t-i,s=(Pa*(n-i)-We*o)/be,h=Math.sqrt(s*s+o*o)/(Pa*i*(1-i)),u=h?Math.atan2(s,o)*Wr-120:NaN;return new da(u<0?u+360:u,h,i,e.opacity)}function sa(e,a,n,t){return arguments.length===1?Zr(e):new da(e,a,n,t??1)}function da(e,a,n,t){this.h=+e,this.s=+a,this.l=+n,this.opacity=+t}ke(da,sa,Ye(za,{brighter(e){return e=e==null?Sa:Math.pow(Sa,e),new da(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?ga:Math.pow(ga,e),new da(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=isNaN(this.h)?0:(this.h+120)*$r,a=+this.l,n=isNaN(this.s)?0:this.s*a*(1-a),t=Math.cos(e),i=Math.sin(e);return new P(255*(a+n*(ot*t+$e*i)),255*(a+n*(We*t+be*i)),255*(a+n*(Pa*t)),this.opacity)}}));const ve=e=>()=>e;function st(e,a){return function(n){return e+n*a}}function Qr(e,a,n){return e=Math.pow(e,n),a=Math.pow(a,n)-e,n=1/n,function(t){return Math.pow(e+t*a,n)}}function Jr(e,a){var n=a-e;return n?st(e,n>180||n<-180?n-360*Math.round(n/360):n):ve(isNaN(e)?a:e)}function Xr(e){return(e=+e)==1?wa:function(a,n){return n-a?Qr(a,n,e):ve(isNaN(a)?n:a)}}function wa(e,a){var n=a-e;return n?st(e,n):ve(isNaN(e)?a:e)}const re=(function e(a){var n=Xr(a);function t(i,o){var s=n((i=Re(i)).r,(o=Re(o)).r),h=n(i.g,o.g),u=n(i.b,o.b),l=wa(i.opacity,o.opacity);return function(c){return i.r=s(c),i.g=h(c),i.b=u(c),i.opacity=l(c),i+""}}return t.gamma=e,t})(1);function ao(e,a){a||(a=[]);var n=e?Math.min(a.length,e.length):0,t=a.slice(),i;return function(o){for(i=0;i<n;++i)t[i]=e[i]*(1-o)+a[i]*o;return t}}function eo(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function no(e,a){var n=a?a.length:0,t=e?Math.min(n,e.length):0,i=new Array(t),o=new Array(n),s;for(s=0;s<t;++s)i[s]=we(e[s],a[s]);for(;s<n;++s)o[s]=a[s];return function(h){for(s=0;s<t;++s)o[s]=i[s](h);return o}}function to(e,a){var n=new Date;return e=+e,a=+a,function(t){return n.setTime(e*(1-t)+a*t),n}}function aa(e,a){return e=+e,a=+a,function(n){return e*(1-n)+a*n}}function io(e,a){var n={},t={},i;(e===null||typeof e!="object")&&(e={}),(a===null||typeof a!="object")&&(a={});for(i in a)i in e?n[i]=we(e[i],a[i]):t[i]=a[i];return function(o){for(i in n)t[i]=n[i](o);return t}}var Le=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Ce=new RegExp(Le.source,"g");function ro(e){return function(){return e}}function oo(e){return function(a){return e(a)+""}}function lt(e,a){var n=Le.lastIndex=Ce.lastIndex=0,t,i,o,s=-1,h=[],u=[];for(e=e+"",a=a+"";(t=Le.exec(e))&&(i=Ce.exec(a));)(o=i.index)>n&&(o=a.slice(n,o),h[s]?h[s]+=o:h[++s]=o),(t=t[0])===(i=i[0])?h[s]?h[s]+=i:h[++s]=i:(h[++s]=null,u.push({i:s,x:aa(t,i)})),n=Ce.lastIndex;return n<a.length&&(o=a.slice(n),h[s]?h[s]+=o:h[++s]=o),h.length<2?u[0]?oo(u[0].x):ro(a):(a=u.length,function(l){for(var c=0,d;c<a;++c)h[(d=u[c]).i]=d.x(l);return h.join("")})}function we(e,a){var n=typeof a,t;return a==null||n==="boolean"?ve(a):(n==="number"?aa:n==="string"?(t=Z(a))?(a=t,re):lt:a instanceof Z?re:a instanceof Date?to:eo(a)?ao:Array.isArray(a)?no:typeof a.valueOf!="function"&&typeof a.toString!="function"||isNaN(a)?io:aa)(e,a)}function so(e,a){return e=+e,a=+a,function(n){return Math.round(e*(1-n)+a*n)}}var An=180/Math.PI,Pe={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function ut(e,a,n,t,i,o){var s,h,u;return(s=Math.sqrt(e*e+a*a))&&(e/=s,a/=s),(u=e*n+a*t)&&(n-=e*u,t-=a*u),(h=Math.sqrt(n*n+t*t))&&(n/=h,t/=h,u/=h),e*t<a*n&&(e=-e,a=-a,u=-u,s=-s),{translateX:i,translateY:o,rotate:Math.atan2(a,e)*An,skewX:Math.atan(u)*An,scaleX:s,scaleY:h}}var ja;function lo(e){const a=new(typeof DOMMatrix=="function"?DOMMatrix:WebKitCSSMatrix)(e+"");return a.isIdentity?Pe:ut(a.a,a.b,a.c,a.d,a.e,a.f)}function uo(e){return e==null||(ja||(ja=document.createElementNS("http://www.w3.org/2000/svg","g")),ja.setAttribute("transform",e),!(e=ja.transform.baseVal.consolidate()))?Pe:(e=e.matrix,ut(e.a,e.b,e.c,e.d,e.e,e.f))}function ht(e,a,n,t){function i(l){return l.length?l.pop()+" ":""}function o(l,c,d,r,g,m){if(l!==d||c!==r){var f=g.push("translate(",null,a,null,n);m.push({i:f-4,x:aa(l,d)},{i:f-2,x:aa(c,r)})}else(d||r)&&g.push("translate("+d+a+r+n)}function s(l,c,d,r){l!==c?(l-c>180?c+=360:c-l>180&&(l+=360),r.push({i:d.push(i(d)+"rotate(",null,t)-2,x:aa(l,c)})):c&&d.push(i(d)+"rotate("+c+t)}function h(l,c,d,r){l!==c?r.push({i:d.push(i(d)+"skewX(",null,t)-2,x:aa(l,c)}):c&&d.push(i(d)+"skewX("+c+t)}function u(l,c,d,r,g,m){if(l!==d||c!==r){var f=g.push(i(g)+"scale(",null,",",null,")");m.push({i:f-4,x:aa(l,d)},{i:f-2,x:aa(c,r)})}else(d!==1||r!==1)&&g.push(i(g)+"scale("+d+","+r+")")}return function(l,c){var d=[],r=[];return l=e(l),c=e(c),o(l.translateX,l.translateY,c.translateX,c.translateY,d,r),s(l.rotate,c.rotate,d,r),h(l.skewX,c.skewX,d,r),u(l.scaleX,l.scaleY,c.scaleX,c.scaleY,d,r),l=c=null,function(g){for(var m=-1,f=r.length,p;++m<f;)d[(p=r[m]).i]=p.x(g);return d.join("")}}}var ho=ht(lo,"px, ","px)","deg)"),co=ht(uo,", ",")",")");function ct(e){return(function a(n){n=+n;function t(i,o){var s=e((i=sa(i)).h,(o=sa(o)).h),h=wa(i.s,o.s),u=wa(i.l,o.l),l=wa(i.opacity,o.opacity);return function(c){return i.h=s(c),i.s=h(c),i.l=u(Math.pow(c,n)),i.opacity=l(c),i+""}}return t.gamma=a,t})(1)}ct(Jr);var dt=ct(wa),_a=0,Na=0,Ta=0,gt=1e3,oe,Ca,se=0,fa=0,Ae=0,Ia=typeof performance=="object"&&performance.now?performance:Date,ft=typeof window=="object"&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(e){setTimeout(e,17)};function Ze(){return fa||(ft(go),fa=Ia.now()+Ae)}function go(){fa=0}function le(){this._call=this._time=this._next=null}le.prototype=mt.prototype={constructor:le,restart:function(e,a,n){if(typeof e!="function")throw new TypeError("callback is not a function");n=(n==null?Ze():+n)+(a==null?0:+a),!this._next&&Ca!==this&&(Ca?Ca._next=this:oe=this,Ca=this),this._call=e,this._time=n,Ie()},stop:function(){this._call&&(this._call=null,this._time=1/0,Ie())}};function mt(e,a,n){var t=new le;return t.restart(e,a,n),t}function fo(){Ze(),++_a;for(var e=oe,a;e;)(a=fa-e._time)>=0&&e._call.call(void 0,a),e=e._next;--_a}function Sn(){fa=(se=Ia.now())+Ae,_a=Na=0;try{fo()}finally{_a=0,po(),fa=0}}function mo(){var e=Ia.now(),a=e-se;a>gt&&(Ae-=a,se=e)}function po(){for(var e,a=oe,n,t=1/0;a;)a._call?(t>a._time&&(t=a._time),e=a,a=a._next):(n=a._next,a._next=null,a=e?e._next=n:oe=n);Ca=e,Ie(t)}function Ie(e){if(!_a){Na&&(Na=clearTimeout(Na));var a=e-fa;a>24?(e<1/0&&(Na=setTimeout(Sn,e-Ia.now()-Ae)),Ta&&(Ta=clearInterval(Ta))):(Ta||(se=Ia.now(),Ta=setInterval(mo,gt)),_a=1,ft(Sn))}}function _n(e,a,n){var t=new le;return a=a==null?0:+a,t.restart(i=>{t.stop(),e(i+a)},a,n),t}var yo=Fn("start","end","cancel","interrupt"),ko=[],pt=0,Mn=1,De=2,Wa=3,zn=4,Ge=5,Za=6;function Se(e,a,n,t,i,o){var s=e.__transition;if(!s)e.__transition={};else if(n in s)return;bo(e,n,{name:a,index:t,group:i,on:yo,tween:ko,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:pt})}function Qe(e,a){var n=Q(e,a);if(n.state>pt)throw new Error("too late; already scheduled");return n}function ta(e,a){var n=Q(e,a);if(n.state>Wa)throw new Error("too late; already running");return n}function Q(e,a){var n=e.__transition;if(!n||!(n=n[a]))throw new Error("transition not found");return n}function bo(e,a,n){var t=e.__transition,i;t[a]=n,n.timer=mt(o,0,n.time);function o(l){n.state=Mn,n.timer.restart(s,n.delay,n.time),n.delay<=l&&s(l-n.delay)}function s(l){var c,d,r,g;if(n.state!==Mn)return u();for(c in t)if(g=t[c],g.name===n.name){if(g.state===Wa)return _n(s);g.state===zn?(g.state=Za,g.timer.stop(),g.on.call("interrupt",e,e.__data__,g.index,g.group),delete t[c]):+c<a&&(g.state=Za,g.timer.stop(),g.on.call("cancel",e,e.__data__,g.index,g.group),delete t[c])}if(_n(function(){n.state===Wa&&(n.state=zn,n.timer.restart(h,n.delay,n.time),h(l))}),n.state=De,n.on.call("start",e,e.__data__,n.index,n.group),n.state===De){for(n.state=Wa,i=new Array(r=n.tween.length),c=0,d=-1;c<r;++c)(g=n.tween[c].value.call(e,e.__data__,n.index,n.group))&&(i[++d]=g);i.length=d+1}}function h(l){for(var c=l<n.duration?n.ease.call(null,l/n.duration):(n.timer.restart(u),n.state=Ge,1),d=-1,r=i.length;++d<r;)i[d].call(e,c);n.state===Ge&&(n.on.call("end",e,e.__data__,n.index,n.group),u())}function u(){n.state=Za,n.timer.stop(),delete t[a];for(var l in t)return;delete e.__transition}}function vo(e,a){var n=e.__transition,t,i,o=!0,s;if(n){a=a==null?null:a+"";for(s in n){if((t=n[s]).name!==a){o=!1;continue}i=t.state>De&&t.state<Ge,t.state=Za,t.timer.stop(),t.on.call(i?"interrupt":"cancel",e,e.__data__,t.index,t.group),delete n[s]}o&&delete e.__transition}}function wo(e){return this.each(function(){vo(this,e)})}function Ao(e,a){var n,t;return function(){var i=ta(this,e),o=i.tween;if(o!==n){t=n=o;for(var s=0,h=t.length;s<h;++s)if(t[s].name===a){t=t.slice(),t.splice(s,1);break}}i.tween=t}}function So(e,a,n){var t,i;if(typeof n!="function")throw new Error;return function(){var o=ta(this,e),s=o.tween;if(s!==t){i=(t=s).slice();for(var h={name:a,value:n},u=0,l=i.length;u<l;++u)if(i[u].name===a){i[u]=h;break}u===l&&i.push(h)}o.tween=i}}function _o(e,a){var n=this._id;if(e+="",arguments.length<2){for(var t=Q(this.node(),n).tween,i=0,o=t.length,s;i<o;++i)if((s=t[i]).name===e)return s.value;return null}return this.each((a==null?Ao:So)(n,e,a))}function Je(e,a,n){var t=e._id;return e.each(function(){var i=ta(this,t);(i.value||(i.value={}))[a]=n.apply(this,arguments)}),function(i){return Q(i,t).value[a]}}function yt(e,a){var n;return(typeof a=="number"?aa:a instanceof Z?re:(n=Z(a))?(a=n,re):lt)(e,a)}function Mo(e){return function(){this.removeAttribute(e)}}function zo(e){return function(){this.removeAttributeNS(e.space,e.local)}}function To(e,a,n){var t,i=n+"",o;return function(){var s=this.getAttribute(e);return s===i?null:s===t?o:o=a(t=s,n)}}function xo(e,a,n){var t,i=n+"",o;return function(){var s=this.getAttributeNS(e.space,e.local);return s===i?null:s===t?o:o=a(t=s,n)}}function No(e,a,n){var t,i,o;return function(){var s,h=n(this),u;return h==null?void this.removeAttribute(e):(s=this.getAttribute(e),u=h+"",s===u?null:s===t&&u===i?o:(i=u,o=a(t=s,h)))}}function Co(e,a,n){var t,i,o;return function(){var s,h=n(this),u;return h==null?void this.removeAttributeNS(e.space,e.local):(s=this.getAttributeNS(e.space,e.local),u=h+"",s===u?null:s===t&&u===i?o:(i=u,o=a(t=s,h)))}}function Ko(e,a){var n=ye(e),t=n==="transform"?co:yt;return this.attrTween(e,typeof a=="function"?(n.local?Co:No)(n,t,Je(this,"attr."+e,a)):a==null?(n.local?zo:Mo)(n):(n.local?xo:To)(n,t,a))}function Bo(e,a){return function(n){this.setAttribute(e,a.call(this,n))}}function Eo(e,a){return function(n){this.setAttributeNS(e.space,e.local,a.call(this,n))}}function Ho(e,a){var n,t;function i(){var o=a.apply(this,arguments);return o!==t&&(n=(t=o)&&Eo(e,o)),n}return i._value=a,i}function Ro(e,a){var n,t;function i(){var o=a.apply(this,arguments);return o!==t&&(n=(t=o)&&Bo(e,o)),n}return i._value=a,i}function Lo(e,a){var n="attr."+e;if(arguments.length<2)return(n=this.tween(n))&&n._value;if(a==null)return this.tween(n,null);if(typeof a!="function")throw new Error;var t=ye(e);return this.tween(n,(t.local?Ho:Ro)(t,a))}function Po(e,a){return function(){Qe(this,e).delay=+a.apply(this,arguments)}}function Io(e,a){return a=+a,function(){Qe(this,e).delay=a}}function Do(e){var a=this._id;return arguments.length?this.each((typeof e=="function"?Po:Io)(a,e)):Q(this.node(),a).delay}function Go(e,a){return function(){ta(this,e).duration=+a.apply(this,arguments)}}function Oo(e,a){return a=+a,function(){ta(this,e).duration=a}}function qo(e){var a=this._id;return arguments.length?this.each((typeof e=="function"?Go:Oo)(a,e)):Q(this.node(),a).duration}function jo(e,a){if(typeof a!="function")throw new Error;return function(){ta(this,e).ease=a}}function Uo(e){var a=this._id;return arguments.length?this.each(jo(a,e)):Q(this.node(),a).ease}function Vo(e,a){return function(){var n=a.apply(this,arguments);if(typeof n!="function")throw new Error;ta(this,e).ease=n}}function Fo(e){if(typeof e!="function")throw new Error;return this.each(Vo(this._id,e))}function Yo(e){typeof e!="function"&&(e=Wn(e));for(var a=this._groups,n=a.length,t=new Array(n),i=0;i<n;++i)for(var o=a[i],s=o.length,h=t[i]=[],u,l=0;l<s;++l)(u=o[l])&&e.call(u,u.__data__,l,o)&&h.push(u);return new oa(t,this._parents,this._name,this._id)}function $o(e){if(e._id!==this._id)throw new Error;for(var a=this._groups,n=e._groups,t=a.length,i=n.length,o=Math.min(t,i),s=new Array(t),h=0;h<o;++h)for(var u=a[h],l=n[h],c=u.length,d=s[h]=new Array(c),r,g=0;g<c;++g)(r=u[g]||l[g])&&(d[g]=r);for(;h<t;++h)s[h]=a[h];return new oa(s,this._parents,this._name,this._id)}function Wo(e){return(e+"").trim().split(/^|\s+/).every(function(a){var n=a.indexOf(".");return n>=0&&(a=a.slice(0,n)),!a||a==="start"})}function Zo(e,a,n){var t,i,o=Wo(a)?Qe:ta;return function(){var s=o(this,e),h=s.on;h!==t&&(i=(t=h).copy()).on(a,n),s.on=i}}function Qo(e,a){var n=this._id;return arguments.length<2?Q(this.node(),n).on.on(e):this.each(Zo(n,e,a))}function Jo(e){return function(){var a=this.parentNode;for(var n in this.__transition)if(+n!==e)return;a&&a.removeChild(this)}}function Xo(){return this.on("end.remove",Jo(this._id))}function as(e){var a=this._name,n=this._id;typeof e!="function"&&(e=Ve(e));for(var t=this._groups,i=t.length,o=new Array(i),s=0;s<i;++s)for(var h=t[s],u=h.length,l=o[s]=new Array(u),c,d,r=0;r<u;++r)(c=h[r])&&(d=e.call(c,c.__data__,r,h))&&("__data__"in c&&(d.__data__=c.__data__),l[r]=d,Se(l[r],a,n,r,l,Q(c,n)));return new oa(o,this._parents,a,n)}function es(e){var a=this._name,n=this._id;typeof e!="function"&&(e=$n(e));for(var t=this._groups,i=t.length,o=[],s=[],h=0;h<i;++h)for(var u=t[h],l=u.length,c,d=0;d<l;++d)if(c=u[d]){for(var r=e.call(c,c.__data__,d,u),g,m=Q(c,n),f=0,p=r.length;f<p;++f)(g=r[f])&&Se(g,a,n,f,r,m);o.push(r),s.push(c)}return new oa(o,s,a,n)}var ns=Da.prototype.constructor;function ts(){return new ns(this._groups,this._parents)}function is(e,a){var n,t,i;return function(){var o=Aa(this,e),s=(this.style.removeProperty(e),Aa(this,e));return o===s?null:o===n&&s===t?i:i=a(n=o,t=s)}}function kt(e){return function(){this.style.removeProperty(e)}}function rs(e,a,n){var t,i=n+"",o;return function(){var s=Aa(this,e);return s===i?null:s===t?o:o=a(t=s,n)}}function os(e,a,n){var t,i,o;return function(){var s=Aa(this,e),h=n(this),u=h+"";return h==null&&(u=h=(this.style.removeProperty(e),Aa(this,e))),s===u?null:s===t&&u===i?o:(i=u,o=a(t=s,h))}}function ss(e,a){var n,t,i,o="style."+a,s="end."+o,h;return function(){var u=ta(this,e),l=u.on,c=u.value[o]==null?h||(h=kt(a)):void 0;(l!==n||i!==c)&&(t=(n=l).copy()).on(s,i=c),u.on=t}}function ls(e,a,n){var t=(e+="")=="transform"?ho:yt;return a==null?this.styleTween(e,is(e,t)).on("end.style."+e,kt(e)):typeof a=="function"?this.styleTween(e,os(e,t,Je(this,"style."+e,a))).each(ss(this._id,e)):this.styleTween(e,rs(e,t,a),n).on("end.style."+e,null)}function us(e,a,n){return function(t){this.style.setProperty(e,a.call(this,t),n)}}function hs(e,a,n){var t,i;function o(){var s=a.apply(this,arguments);return s!==i&&(t=(i=s)&&us(e,s,n)),t}return o._value=a,o}function cs(e,a,n){var t="style."+(e+="");if(arguments.length<2)return(t=this.tween(t))&&t._value;if(a==null)return this.tween(t,null);if(typeof a!="function")throw new Error;return this.tween(t,hs(e,a,n??""))}function ds(e){return function(){this.textContent=e}}function gs(e){return function(){var a=e(this);this.textContent=a??""}}function fs(e){return this.tween("text",typeof e=="function"?gs(Je(this,"text",e)):ds(e==null?"":e+""))}function ms(e){return function(a){this.textContent=e.call(this,a)}}function ps(e){var a,n;function t(){var i=e.apply(this,arguments);return i!==n&&(a=(n=i)&&ms(i)),a}return t._value=e,t}function ys(e){var a="text";if(arguments.length<1)return(a=this.tween(a))&&a._value;if(e==null)return this.tween(a,null);if(typeof e!="function")throw new Error;return this.tween(a,ps(e))}function ks(){for(var e=this._name,a=this._id,n=bt(),t=this._groups,i=t.length,o=0;o<i;++o)for(var s=t[o],h=s.length,u,l=0;l<h;++l)if(u=s[l]){var c=Q(u,a);Se(u,e,n,l,s,{time:c.time+c.delay+c.duration,delay:0,duration:c.duration,ease:c.ease})}return new oa(t,this._parents,e,n)}function bs(){var e,a,n=this,t=n._id,i=n.size();return new Promise(function(o,s){var h={value:s},u={value:function(){--i===0&&o()}};n.each(function(){var l=ta(this,t),c=l.on;c!==e&&(a=(e=c).copy(),a._.cancel.push(h),a._.interrupt.push(h),a._.end.push(u)),l.on=a}),i===0&&o()})}var vs=0;function oa(e,a,n,t){this._groups=e,this._parents=a,this._name=n,this._id=t}function bt(){return++vs}var ia=Da.prototype;oa.prototype={constructor:oa,select:as,selectAll:es,selectChild:ia.selectChild,selectChildren:ia.selectChildren,filter:Yo,merge:$o,selection:ts,transition:ks,call:ia.call,nodes:ia.nodes,node:ia.node,size:ia.size,empty:ia.empty,each:ia.each,on:Qo,attr:Ko,attrTween:Lo,style:ls,styleTween:cs,text:fs,textTween:ys,remove:Xo,tween:_o,delay:Do,duration:qo,ease:Uo,easeVarying:Fo,end:bs,[Symbol.iterator]:ia[Symbol.iterator]};function ws(e){return((e*=2)<=1?e*e*e:(e-=2)*e*e+2)/2}var As={time:null,delay:0,duration:250,ease:ws};function Ss(e,a){for(var n;!(n=e.__transition)||!(n=n[a]);)if(!(e=e.parentNode))throw new Error(`transition ${a} not found`);return n}function _s(e){var a,n;e instanceof oa?(a=e._id,e=e._name):(a=bt(),(n=As).time=Ze(),e=e==null?null:e+"");for(var t=this._groups,i=t.length,o=0;o<i;++o)for(var s=t[o],h=s.length,u,l=0;l<h;++l)(u=s[l])&&Se(u,e,a,l,s,n||Ss(u,a));return new oa(t,this._parents,e,a)}Da.prototype.interrupt=wo;Da.prototype.transition=_s;const Oe=Math.PI,qe=2*Oe,la=1e-6,Ms=qe-la;function vt(e){this._+=e[0];for(let a=1,n=e.length;a<n;++a)this._+=arguments[a]+e[a]}function zs(e){let a=Math.floor(e);if(!(a>=0))throw new Error(`invalid digits: ${e}`);if(a>15)return vt;const n=10**a;return function(t){this._+=t[0];for(let i=1,o=t.length;i<o;++i)this._+=Math.round(arguments[i]*n)/n+t[i]}}class Ts{constructor(a){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=a==null?vt:zs(a)}moveTo(a,n){this._append`M${this._x0=this._x1=+a},${this._y0=this._y1=+n}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(a,n){this._append`L${this._x1=+a},${this._y1=+n}`}quadraticCurveTo(a,n,t,i){this._append`Q${+a},${+n},${this._x1=+t},${this._y1=+i}`}bezierCurveTo(a,n,t,i,o,s){this._append`C${+a},${+n},${+t},${+i},${this._x1=+o},${this._y1=+s}`}arcTo(a,n,t,i,o){if(a=+a,n=+n,t=+t,i=+i,o=+o,o<0)throw new Error(`negative radius: ${o}`);let s=this._x1,h=this._y1,u=t-a,l=i-n,c=s-a,d=h-n,r=c*c+d*d;if(this._x1===null)this._append`M${this._x1=a},${this._y1=n}`;else if(r>la)if(!(Math.abs(d*u-l*c)>la)||!o)this._append`L${this._x1=a},${this._y1=n}`;else{let g=t-s,m=i-h,f=u*u+l*l,p=g*g+m*m,y=Math.sqrt(f),k=Math.sqrt(r),b=o*Math.tan((Oe-Math.acos((f+r-p)/(2*y*k)))/2),v=b/k,w=b/y;Math.abs(v-1)>la&&this._append`L${a+v*c},${n+v*d}`,this._append`A${o},${o},0,0,${+(d*g>c*m)},${this._x1=a+w*u},${this._y1=n+w*l}`}}arc(a,n,t,i,o,s){if(a=+a,n=+n,t=+t,s=!!s,t<0)throw new Error(`negative radius: ${t}`);let h=t*Math.cos(i),u=t*Math.sin(i),l=a+h,c=n+u,d=1^s,r=s?i-o:o-i;this._x1===null?this._append`M${l},${c}`:(Math.abs(this._x1-l)>la||Math.abs(this._y1-c)>la)&&this._append`L${l},${c}`,t&&(r<0&&(r=r%qe+qe),r>Ms?this._append`A${t},${t},0,1,${d},${a-h},${n-u}A${t},${t},0,1,${d},${this._x1=l},${this._y1=c}`:r>la&&this._append`A${t},${t},0,${+(r>=Oe)},${d},${this._x1=a+t*Math.cos(o)},${this._y1=n+t*Math.sin(o)}`)}rect(a,n,t,i){this._append`M${this._x0=this._x1=+a},${this._y0=this._y1=+n}h${t=+t}v${+i}h${-t}Z`}toString(){return this._}}const ra=11102230246251565e-32,L=134217729,xs=(3+8*ra)*ra;function Ke(e,a,n,t,i){let o,s,h,u,l=a[0],c=t[0],d=0,r=0;c>l==c>-l?(o=l,l=a[++d]):(o=c,c=t[++r]);let g=0;if(d<e&&r<n)for(c>l==c>-l?(s=l+o,h=o-(s-l),l=a[++d]):(s=c+o,h=o-(s-c),c=t[++r]),o=s,h!==0&&(i[g++]=h);d<e&&r<n;)c>l==c>-l?(s=o+l,u=s-o,h=o-(s-u)+(l-u),l=a[++d]):(s=o+c,u=s-o,h=o-(s-u)+(c-u),c=t[++r]),o=s,h!==0&&(i[g++]=h);for(;d<e;)s=o+l,u=s-o,h=o-(s-u)+(l-u),l=a[++d],o=s,h!==0&&(i[g++]=h);for(;r<n;)s=o+c,u=s-o,h=o-(s-u)+(c-u),c=t[++r],o=s,h!==0&&(i[g++]=h);return(o!==0||g===0)&&(i[g++]=o),g}function Ns(e,a){let n=a[0];for(let t=1;t<e;t++)n+=a[t];return n}function Ga(e){return new Float64Array(e)}const Cs=(3+16*ra)*ra,Ks=(2+12*ra)*ra,Bs=(9+64*ra)*ra*ra,pa=Ga(4),Tn=Ga(8),xn=Ga(12),Nn=Ga(16),I=Ga(4);function Es(e,a,n,t,i,o,s){let h,u,l,c,d,r,g,m,f,p,y,k,b,v,w,_,M,T;const S=e-i,z=n-i,A=a-o,x=t-o;v=S*x,r=L*S,g=r-(r-S),m=S-g,r=L*x,f=r-(r-x),p=x-f,w=m*p-(v-g*f-m*f-g*p),_=A*z,r=L*A,g=r-(r-A),m=A-g,r=L*z,f=r-(r-z),p=z-f,M=m*p-(_-g*f-m*f-g*p),y=w-M,d=w-y,pa[0]=w-(y+d)+(d-M),k=v+y,d=k-v,b=v-(k-d)+(y-d),y=b-_,d=b-y,pa[1]=b-(y+d)+(d-_),T=k+y,d=T-k,pa[2]=k-(T-d)+(y-d),pa[3]=T;let C=Ns(4,pa),E=Ks*s;if(C>=E||-C>=E||(d=e-S,h=e-(S+d)+(d-i),d=n-z,l=n-(z+d)+(d-i),d=a-A,u=a-(A+d)+(d-o),d=t-x,c=t-(x+d)+(d-o),h===0&&u===0&&l===0&&c===0)||(E=Bs*s+xs*Math.abs(C),C+=S*c+x*h-(A*l+z*u),C>=E||-C>=E))return C;v=h*x,r=L*h,g=r-(r-h),m=h-g,r=L*x,f=r-(r-x),p=x-f,w=m*p-(v-g*f-m*f-g*p),_=u*z,r=L*u,g=r-(r-u),m=u-g,r=L*z,f=r-(r-z),p=z-f,M=m*p-(_-g*f-m*f-g*p),y=w-M,d=w-y,I[0]=w-(y+d)+(d-M),k=v+y,d=k-v,b=v-(k-d)+(y-d),y=b-_,d=b-y,I[1]=b-(y+d)+(d-_),T=k+y,d=T-k,I[2]=k-(T-d)+(y-d),I[3]=T;const O=Ke(4,pa,4,I,Tn);v=S*c,r=L*S,g=r-(r-S),m=S-g,r=L*c,f=r-(r-c),p=c-f,w=m*p-(v-g*f-m*f-g*p),_=A*l,r=L*A,g=r-(r-A),m=A-g,r=L*l,f=r-(r-l),p=l-f,M=m*p-(_-g*f-m*f-g*p),y=w-M,d=w-y,I[0]=w-(y+d)+(d-M),k=v+y,d=k-v,b=v-(k-d)+(y-d),y=b-_,d=b-y,I[1]=b-(y+d)+(d-_),T=k+y,d=T-k,I[2]=k-(T-d)+(y-d),I[3]=T;const K=Ke(O,Tn,4,I,xn);v=h*c,r=L*h,g=r-(r-h),m=h-g,r=L*c,f=r-(r-c),p=c-f,w=m*p-(v-g*f-m*f-g*p),_=u*l,r=L*u,g=r-(r-u),m=u-g,r=L*l,f=r-(r-l),p=l-f,M=m*p-(_-g*f-m*f-g*p),y=w-M,d=w-y,I[0]=w-(y+d)+(d-M),k=v+y,d=k-v,b=v-(k-d)+(y-d),y=b-_,d=b-y,I[1]=b-(y+d)+(d-_),T=k+y,d=T-k,I[2]=k-(T-d)+(y-d),I[3]=T;const H=Ke(K,xn,4,I,Nn);return Nn[H-1]}function Ua(e,a,n,t,i,o){const s=(a-o)*(n-i),h=(e-i)*(t-o),u=s-h,l=Math.abs(s+h);return Math.abs(u)>=Cs*l?u:-Es(e,a,n,t,i,o,l)}const Cn=Math.pow(2,-52),Va=new Uint32Array(512);class Xe{static from(a,n=Is,t=Ds){const i=a.length,o=new Float64Array(i*2);for(let s=0;s<i;s++){const h=a[s];o[2*s]=n(h),o[2*s+1]=t(h)}return new Xe(o)}constructor(a){const n=a.length>>1;if(n>0&&typeof a[0]!="number")throw new Error("Expected coords to contain numbers.");this.coords=a;const t=Math.max(2*n-5,0);this._triangles=new Uint32Array(t*3),this._halfedges=new Int32Array(t*3),this._hashSize=Math.ceil(Math.sqrt(n)),this._hullPrev=new Uint32Array(n),this._hullNext=new Uint32Array(n),this._hullTri=new Uint32Array(n),this._hullHash=new Int32Array(this._hashSize),this._ids=new Uint32Array(n),this._dists=new Float64Array(n),this.update()}update(){const{coords:a,_hullPrev:n,_hullNext:t,_hullTri:i,_hullHash:o}=this,s=a.length>>1;let h=1/0,u=1/0,l=-1/0,c=-1/0;for(let S=0;S<s;S++){const z=a[2*S],A=a[2*S+1];z<h&&(h=z),A<u&&(u=A),z>l&&(l=z),A>c&&(c=A),this._ids[S]=S}const d=(h+l)/2,r=(u+c)/2;let g,m,f;for(let S=0,z=1/0;S<s;S++){const A=Be(d,r,a[2*S],a[2*S+1]);A<z&&(g=S,z=A)}const p=a[2*g],y=a[2*g+1];for(let S=0,z=1/0;S<s;S++){if(S===g)continue;const A=Be(p,y,a[2*S],a[2*S+1]);A<z&&A>0&&(m=S,z=A)}let k=a[2*m],b=a[2*m+1],v=1/0;for(let S=0;S<s;S++){if(S===g||S===m)continue;const z=Ls(p,y,k,b,a[2*S],a[2*S+1]);z<v&&(f=S,v=z)}let w=a[2*f],_=a[2*f+1];if(v===1/0){for(let A=0;A<s;A++)this._dists[A]=a[2*A]-a[0]||a[2*A+1]-a[1];ka(this._ids,this._dists,0,s-1);const S=new Uint32Array(s);let z=0;for(let A=0,x=-1/0;A<s;A++){const C=this._ids[A],E=this._dists[C];E>x&&(S[z++]=C,x=E)}this.hull=S.subarray(0,z),this.triangles=new Uint32Array(0),this.halfedges=new Uint32Array(0);return}if(Ua(p,y,k,b,w,_)<0){const S=m,z=k,A=b;m=f,k=w,b=_,f=S,w=z,_=A}const M=Ps(p,y,k,b,w,_);this._cx=M.x,this._cy=M.y;for(let S=0;S<s;S++)this._dists[S]=Be(a[2*S],a[2*S+1],M.x,M.y);ka(this._ids,this._dists,0,s-1),this._hullStart=g;let T=3;t[g]=n[f]=m,t[m]=n[g]=f,t[f]=n[m]=g,i[g]=0,i[m]=1,i[f]=2,o.fill(-1),o[this._hashKey(p,y)]=g,o[this._hashKey(k,b)]=m,o[this._hashKey(w,_)]=f,this.trianglesLen=0,this._addTriangle(g,m,f,-1,-1,-1);for(let S=0,z,A;S<this._ids.length;S++){const x=this._ids[S],C=a[2*x],E=a[2*x+1];if(S>0&&Math.abs(C-z)<=Cn&&Math.abs(E-A)<=Cn||(z=C,A=E,x===g||x===m||x===f))continue;let O=0;for(let xe=0,jt=this._hashKey(C,E);xe<this._hashSize&&(O=o[(jt+xe)%this._hashSize],!(O!==-1&&O!==t[O]));xe++);O=n[O];let K=O,H;for(;H=t[K],Ua(C,E,a[2*K],a[2*K+1],a[2*H],a[2*H+1])>=0;)if(K=H,K===O){K=-1;break}if(K===-1)continue;let U=this._addTriangle(K,x,t[K],-1,-1,i[K]);i[x]=this._legalize(U+2),i[K]=U,T++;let R=t[K];for(;H=t[R],Ua(C,E,a[2*R],a[2*R+1],a[2*H],a[2*H+1])<0;)U=this._addTriangle(R,x,H,i[x],-1,i[R]),i[x]=this._legalize(U+2),t[R]=R,T--,R=H;if(K===O)for(;H=n[K],Ua(C,E,a[2*H],a[2*H+1],a[2*K],a[2*K+1])<0;)U=this._addTriangle(H,x,K,-1,i[K],i[H]),this._legalize(U+2),i[H]=U,t[K]=K,T--,K=H;this._hullStart=n[x]=K,t[K]=n[R]=x,t[x]=R,o[this._hashKey(C,E)]=x,o[this._hashKey(a[2*K],a[2*K+1])]=K}this.hull=new Uint32Array(T);for(let S=0,z=this._hullStart;S<T;S++)this.hull[S]=z,z=t[z];this.triangles=this._triangles.subarray(0,this.trianglesLen),this.halfedges=this._halfedges.subarray(0,this.trianglesLen)}_hashKey(a,n){return Math.floor(Hs(a-this._cx,n-this._cy)*this._hashSize)%this._hashSize}_legalize(a){const{_triangles:n,_halfedges:t,coords:i}=this;let o=0,s=0;for(;;){const h=t[a],u=a-a%3;if(s=u+(a+2)%3,h===-1){if(o===0)break;a=Va[--o];continue}const l=h-h%3,c=u+(a+1)%3,d=l+(h+2)%3,r=n[s],g=n[a],m=n[c],f=n[d];if(Rs(i[2*r],i[2*r+1],i[2*g],i[2*g+1],i[2*m],i[2*m+1],i[2*f],i[2*f+1])){n[a]=f,n[h]=r;const y=t[d];if(y===-1){let b=this._hullStart;do{if(this._hullTri[b]===d){this._hullTri[b]=a;break}b=this._hullPrev[b]}while(b!==this._hullStart)}this._link(a,y),this._link(h,t[s]),this._link(s,d);const k=l+(h+1)%3;o<Va.length&&(Va[o++]=k)}else{if(o===0)break;a=Va[--o]}}return s}_link(a,n){this._halfedges[a]=n,n!==-1&&(this._halfedges[n]=a)}_addTriangle(a,n,t,i,o,s){const h=this.trianglesLen;return this._triangles[h]=a,this._triangles[h+1]=n,this._triangles[h+2]=t,this._link(h,i),this._link(h+1,o),this._link(h+2,s),this.trianglesLen+=3,h}}function Hs(e,a){const n=e/(Math.abs(e)+Math.abs(a));return(a>0?3-n:1+n)/4}function Be(e,a,n,t){const i=e-n,o=a-t;return i*i+o*o}function Rs(e,a,n,t,i,o,s,h){const u=e-s,l=a-h,c=n-s,d=t-h,r=i-s,g=o-h,m=u*u+l*l,f=c*c+d*d,p=r*r+g*g;return u*(d*p-f*g)-l*(c*p-f*r)+m*(c*g-d*r)<0}function Ls(e,a,n,t,i,o){const s=n-e,h=t-a,u=i-e,l=o-a,c=s*s+h*h,d=u*u+l*l,r=.5/(s*l-h*u),g=(l*c-h*d)*r,m=(s*d-u*c)*r;return g*g+m*m}function Ps(e,a,n,t,i,o){const s=n-e,h=t-a,u=i-e,l=o-a,c=s*s+h*h,d=u*u+l*l,r=.5/(s*l-h*u),g=e+(l*c-h*d)*r,m=a+(s*d-u*c)*r;return{x:g,y:m}}function ka(e,a,n,t){if(t-n<=20)for(let i=n+1;i<=t;i++){const o=e[i],s=a[o];let h=i-1;for(;h>=n&&a[e[h]]>s;)e[h+1]=e[h--];e[h+1]=o}else{const i=n+t>>1;let o=n+1,s=t;xa(e,i,o),a[e[n]]>a[e[t]]&&xa(e,n,t),a[e[o]]>a[e[t]]&&xa(e,o,t),a[e[n]]>a[e[o]]&&xa(e,n,o);const h=e[o],u=a[h];for(;;){do o++;while(a[e[o]]<u);do s--;while(a[e[s]]>u);if(s<o)break;xa(e,o,s)}e[n+1]=e[s],e[s]=h,t-o+1>=s-n?(ka(e,a,o,t),ka(e,a,n,s-1)):(ka(e,a,n,s-1),ka(e,a,o,t))}}function xa(e,a,n){const t=e[a];e[a]=e[n],e[n]=t}function Is(e){return e[0]}function Ds(e){return e[1]}function Gs(e){const a=+this._x.call(null,e),n=+this._y.call(null,e);return wt(this.cover(a,n),a,n,e)}function wt(e,a,n,t){if(isNaN(a)||isNaN(n))return e;var i,o=e._root,s={data:t},h=e._x0,u=e._y0,l=e._x1,c=e._y1,d,r,g,m,f,p,y,k;if(!o)return e._root=s,e;for(;o.length;)if((f=a>=(d=(h+l)/2))?h=d:l=d,(p=n>=(r=(u+c)/2))?u=r:c=r,i=o,!(o=o[y=p<<1|f]))return i[y]=s,e;if(g=+e._x.call(null,o.data),m=+e._y.call(null,o.data),a===g&&n===m)return s.next=o,i?i[y]=s:e._root=s,e;do i=i?i[y]=new Array(4):e._root=new Array(4),(f=a>=(d=(h+l)/2))?h=d:l=d,(p=n>=(r=(u+c)/2))?u=r:c=r;while((y=p<<1|f)===(k=(m>=r)<<1|g>=d));return i[k]=o,i[y]=s,e}function Os(e){var a,n,t=e.length,i,o,s=new Array(t),h=new Array(t),u=1/0,l=1/0,c=-1/0,d=-1/0;for(n=0;n<t;++n)isNaN(i=+this._x.call(null,a=e[n]))||isNaN(o=+this._y.call(null,a))||(s[n]=i,h[n]=o,i<u&&(u=i),i>c&&(c=i),o<l&&(l=o),o>d&&(d=o));if(u>c||l>d)return this;for(this.cover(u,l).cover(c,d),n=0;n<t;++n)wt(this,s[n],h[n],e[n]);return this}function qs(e,a){if(isNaN(e=+e)||isNaN(a=+a))return this;var n=this._x0,t=this._y0,i=this._x1,o=this._y1;if(isNaN(n))i=(n=Math.floor(e))+1,o=(t=Math.floor(a))+1;else{for(var s=i-n||1,h=this._root,u,l;n>e||e>=i||t>a||a>=o;)switch(l=(a<t)<<1|e<n,u=new Array(4),u[l]=h,h=u,s*=2,l){case 0:i=n+s,o=t+s;break;case 1:n=i-s,o=t+s;break;case 2:i=n+s,t=o-s;break;case 3:n=i-s,t=o-s;break}this._root&&this._root.length&&(this._root=h)}return this._x0=n,this._y0=t,this._x1=i,this._y1=o,this}function js(){var e=[];return this.visit(function(a){if(!a.length)do e.push(a.data);while(a=a.next)}),e}function Us(e){return arguments.length?this.cover(+e[0][0],+e[0][1]).cover(+e[1][0],+e[1][1]):isNaN(this._x0)?void 0:[[this._x0,this._y0],[this._x1,this._y1]]}function D(e,a,n,t,i){this.node=e,this.x0=a,this.y0=n,this.x1=t,this.y1=i}function Vs(e,a,n){var t,i=this._x0,o=this._y0,s,h,u,l,c=this._x1,d=this._y1,r=[],g=this._root,m,f;for(g&&r.push(new D(g,i,o,c,d)),n==null?n=1/0:(i=e-n,o=a-n,c=e+n,d=a+n,n*=n);m=r.pop();)if(!(!(g=m.node)||(s=m.x0)>c||(h=m.y0)>d||(u=m.x1)<i||(l=m.y1)<o))if(g.length){var p=(s+u)/2,y=(h+l)/2;r.push(new D(g[3],p,y,u,l),new D(g[2],s,y,p,l),new D(g[1],p,h,u,y),new D(g[0],s,h,p,y)),(f=(a>=y)<<1|e>=p)&&(m=r[r.length-1],r[r.length-1]=r[r.length-1-f],r[r.length-1-f]=m)}else{var k=e-+this._x.call(null,g.data),b=a-+this._y.call(null,g.data),v=k*k+b*b;if(v<n){var w=Math.sqrt(n=v);i=e-w,o=a-w,c=e+w,d=a+w,t=g.data}}return t}function Fs(e){if(isNaN(c=+this._x.call(null,e))||isNaN(d=+this._y.call(null,e)))return this;var a,n=this._root,t,i,o,s=this._x0,h=this._y0,u=this._x1,l=this._y1,c,d,r,g,m,f,p,y;if(!n)return this;if(n.length)for(;;){if((m=c>=(r=(s+u)/2))?s=r:u=r,(f=d>=(g=(h+l)/2))?h=g:l=g,a=n,!(n=n[p=f<<1|m]))return this;if(!n.length)break;(a[p+1&3]||a[p+2&3]||a[p+3&3])&&(t=a,y=p)}for(;n.data!==e;)if(i=n,!(n=n.next))return this;return(o=n.next)&&delete n.next,i?(o?i.next=o:delete i.next,this):a?(o?a[p]=o:delete a[p],(n=a[0]||a[1]||a[2]||a[3])&&n===(a[3]||a[2]||a[1]||a[0])&&!n.length&&(t?t[y]=n:this._root=n),this):(this._root=o,this)}function Ys(e){for(var a=0,n=e.length;a<n;++a)this.remove(e[a]);return this}function $s(){return this._root}function Ws(){var e=0;return this.visit(function(a){if(!a.length)do++e;while(a=a.next)}),e}function Zs(e){var a=[],n,t=this._root,i,o,s,h,u;for(t&&a.push(new D(t,this._x0,this._y0,this._x1,this._y1));n=a.pop();)if(!e(t=n.node,o=n.x0,s=n.y0,h=n.x1,u=n.y1)&&t.length){var l=(o+h)/2,c=(s+u)/2;(i=t[3])&&a.push(new D(i,l,c,h,u)),(i=t[2])&&a.push(new D(i,o,c,l,u)),(i=t[1])&&a.push(new D(i,l,s,h,c)),(i=t[0])&&a.push(new D(i,o,s,l,c))}return this}function Qs(e){var a=[],n=[],t;for(this._root&&a.push(new D(this._root,this._x0,this._y0,this._x1,this._y1));t=a.pop();){var i=t.node;if(i.length){var o,s=t.x0,h=t.y0,u=t.x1,l=t.y1,c=(s+u)/2,d=(h+l)/2;(o=i[0])&&a.push(new D(o,s,h,c,d)),(o=i[1])&&a.push(new D(o,c,h,u,d)),(o=i[2])&&a.push(new D(o,s,d,c,l)),(o=i[3])&&a.push(new D(o,c,d,u,l))}n.push(t)}for(;t=n.pop();)e(t.node,t.x0,t.y0,t.x1,t.y1);return this}function Js(e){return e[0]}function Xs(e){return arguments.length?(this._x=e,this):this._x}function al(e){return e[1]}function el(e){return arguments.length?(this._y=e,this):this._y}function ue(e,a,n){var t=new an(a??Js,n??al,NaN,NaN,NaN,NaN);return e==null?t:t.addAll(e)}function an(e,a,n,t,i,o){this._x=e,this._y=a,this._x0=n,this._y0=t,this._x1=i,this._y1=o,this._root=void 0}function Kn(e){for(var a={data:e.data},n=a;e=e.next;)n=n.next={data:e.data};return a}var G=ue.prototype=an.prototype;G.copy=function(){var e=new an(this._x,this._y,this._x0,this._y0,this._x1,this._y1),a=this._root,n,t;if(!a)return e;if(!a.length)return e._root=Kn(a),e;for(n=[{source:a,target:e._root=new Array(4)}];a=n.pop();)for(var i=0;i<4;++i)(t=a.source[i])&&(t.length?n.push({source:t,target:a.target[i]=new Array(4)}):a.target[i]=Kn(t));return e};G.add=Gs;G.addAll=Os;G.cover=qs;G.data=js;G.extent=Us;G.find=Vs;G.remove=Fs;G.removeAll=Ys;G.root=$s;G.size=Ws;G.visit=Zs;G.visitAfter=Qs;G.x=Xs;G.y=el;function nl(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString("en").replace(/,/g,""):e.toString(10)}function he(e,a){if((n=(e=a?e.toExponential(a-1):e.toExponential()).indexOf("e"))<0)return null;var n,t=e.slice(0,n);return[t.length>1?t[0]+t.slice(2):t,+e.slice(n+1)]}function Ma(e){return e=he(Math.abs(e)),e?e[1]:NaN}function tl(e,a){return function(n,t){for(var i=n.length,o=[],s=0,h=e[0],u=0;i>0&&h>0&&(u+h+1>t&&(h=Math.max(1,t-u)),o.push(n.substring(i-=h,i+h)),!((u+=h+1)>t));)h=e[s=(s+1)%e.length];return o.reverse().join(a)}}function il(e){return function(a){return a.replace(/[0-9]/g,function(n){return e[+n]})}}var rl=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function ce(e){if(!(a=rl.exec(e)))throw new Error("invalid format: "+e);var a;return new en({fill:a[1],align:a[2],sign:a[3],symbol:a[4],zero:a[5],width:a[6],comma:a[7],precision:a[8]&&a[8].slice(1),trim:a[9],type:a[10]})}ce.prototype=en.prototype;function en(e){this.fill=e.fill===void 0?" ":e.fill+"",this.align=e.align===void 0?">":e.align+"",this.sign=e.sign===void 0?"-":e.sign+"",this.symbol=e.symbol===void 0?"":e.symbol+"",this.zero=!!e.zero,this.width=e.width===void 0?void 0:+e.width,this.comma=!!e.comma,this.precision=e.precision===void 0?void 0:+e.precision,this.trim=!!e.trim,this.type=e.type===void 0?"":e.type+""}en.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};function ol(e){a:for(var a=e.length,n=1,t=-1,i;n<a;++n)switch(e[n]){case".":t=i=n;break;case"0":t===0&&(t=n),i=n;break;default:if(!+e[n])break a;t>0&&(t=0);break}return t>0?e.slice(0,t)+e.slice(i+1):e}var At;function sl(e,a){var n=he(e,a);if(!n)return e+"";var t=n[0],i=n[1],o=i-(At=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,s=t.length;return o===s?t:o>s?t+new Array(o-s+1).join("0"):o>0?t.slice(0,o)+"."+t.slice(o):"0."+new Array(1-o).join("0")+he(e,Math.max(0,a+o-1))[0]}function Bn(e,a){var n=he(e,a);if(!n)return e+"";var t=n[0],i=n[1];return i<0?"0."+new Array(-i).join("0")+t:t.length>i+1?t.slice(0,i+1)+"."+t.slice(i+1):t+new Array(i-t.length+2).join("0")}const En={"%":(e,a)=>(e*100).toFixed(a),b:e=>Math.round(e).toString(2),c:e=>e+"",d:nl,e:(e,a)=>e.toExponential(a),f:(e,a)=>e.toFixed(a),g:(e,a)=>e.toPrecision(a),o:e=>Math.round(e).toString(8),p:(e,a)=>Bn(e*100,a),r:Bn,s:sl,X:e=>Math.round(e).toString(16).toUpperCase(),x:e=>Math.round(e).toString(16)};function Hn(e){return e}var Rn=Array.prototype.map,Ln=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function ll(e){var a=e.grouping===void 0||e.thousands===void 0?Hn:tl(Rn.call(e.grouping,Number),e.thousands+""),n=e.currency===void 0?"":e.currency[0]+"",t=e.currency===void 0?"":e.currency[1]+"",i=e.decimal===void 0?".":e.decimal+"",o=e.numerals===void 0?Hn:il(Rn.call(e.numerals,String)),s=e.percent===void 0?"%":e.percent+"",h=e.minus===void 0?"−":e.minus+"",u=e.nan===void 0?"NaN":e.nan+"";function l(d){d=ce(d);var r=d.fill,g=d.align,m=d.sign,f=d.symbol,p=d.zero,y=d.width,k=d.comma,b=d.precision,v=d.trim,w=d.type;w==="n"?(k=!0,w="g"):En[w]||(b===void 0&&(b=12),v=!0,w="g"),(p||r==="0"&&g==="=")&&(p=!0,r="0",g="=");var _=f==="$"?n:f==="#"&&/[boxX]/.test(w)?"0"+w.toLowerCase():"",M=f==="$"?t:/[%p]/.test(w)?s:"",T=En[w],S=/[defgprs%]/.test(w);b=b===void 0?6:/[gprs]/.test(w)?Math.max(1,Math.min(21,b)):Math.max(0,Math.min(20,b));function z(A){var x=_,C=M,E,O,K;if(w==="c")C=T(A)+C,A="";else{A=+A;var H=A<0||1/A<0;if(A=isNaN(A)?u:T(Math.abs(A),b),v&&(A=ol(A)),H&&+A==0&&m!=="+"&&(H=!1),x=(H?m==="("?m:h:m==="-"||m==="("?"":m)+x,C=(w==="s"?Ln[8+At/3]:"")+C+(H&&m==="("?")":""),S){for(E=-1,O=A.length;++E<O;)if(K=A.charCodeAt(E),48>K||K>57){C=(K===46?i+A.slice(E+1):A.slice(E))+C,A=A.slice(0,E);break}}}k&&!p&&(A=a(A,1/0));var U=x.length+A.length+C.length,R=U<y?new Array(y-U+1).join(r):"";switch(k&&p&&(A=a(R+A,R.length?y-C.length:1/0),R=""),g){case"<":A=x+A+C+R;break;case"=":A=x+R+A+C;break;case"^":A=R.slice(0,U=R.length>>1)+x+A+C+R.slice(U);break;default:A=R+x+A+C;break}return o(A)}return z.toString=function(){return d+""},z}function c(d,r){var g=l((d=ce(d),d.type="f",d)),m=Math.max(-8,Math.min(8,Math.floor(Ma(r)/3)))*3,f=Math.pow(10,-m),p=Ln[8+m/3];return function(y){return g(f*y)+p}}return{format:l,formatPrefix:c}}var Fa,St,_t;ul({thousands:",",grouping:[3],currency:["$",""]});function ul(e){return Fa=ll(e),St=Fa.format,_t=Fa.formatPrefix,Fa}function hl(e){return Math.max(0,-Ma(Math.abs(e)))}function cl(e,a){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(Ma(a)/3)))*3-Ma(Math.abs(e)))}function dl(e,a){return e=Math.abs(e),a=Math.abs(a)-e,Math.max(0,Ma(a)-Ma(e))+1}function gl(e){for(var a=-1,n=e.length,t,i=e[n-1],o=0;++a<n;)t=i,i=e[a],o+=t[1]*i[0]-t[0]*i[1];return o/2}const fl=Math.random,ml=(function e(a){function n(t,i){var o,s;return t=t==null?0:+t,i=i==null?1:+i,function(){var h;if(o!=null)h=o,o=null;else do o=a()*2-1,h=a()*2-1,s=o*o+h*h;while(!s||s>1);return t+i*h*Math.sqrt(-2*Math.log(s)/s)}}return n.source=e,n})(fl);function pl(e,a){switch(arguments.length){case 0:break;case 1:{typeof e=="function"?this.interpolator(e):this.range(e);break}default:{this.domain(e),typeof a=="function"?this.interpolator(a):this.range(a);break}}return this}function Mt(e){return e}function yl(e,a,n,t){var i=Qt(e,a,n),o;switch(t=ce(t??",f"),t.type){case"s":{var s=Math.max(Math.abs(e),Math.abs(a));return t.precision==null&&!isNaN(o=cl(i,s))&&(t.precision=o),_t(t,s)}case"":case"e":case"g":case"p":case"r":{t.precision==null&&!isNaN(o=dl(i,Math.max(Math.abs(e),Math.abs(a))))&&(t.precision=o-(t.type==="e"));break}case"f":case"%":{t.precision==null&&!isNaN(o=hl(i))&&(t.precision=o-(t.type==="%")*2);break}}return St(t)}function kl(e){var a=e.domain;return e.ticks=function(n){var t=a();return Zt(t[0],t[t.length-1],n??10)},e.tickFormat=function(n,t){var i=a();return yl(i[0],i[i.length-1],n??10,t)},e.nice=function(n){n==null&&(n=10);var t=a(),i=0,o=t.length-1,s=t[i],h=t[o],u,l,c=10;for(h<s&&(l=s,s=h,h=l,l=i,i=o,o=l);c-- >0;){if(l=Ee(s,h,n),l===u)return t[i]=s,t[o]=h,a(t);if(l>0)s=Math.floor(s/l)*l,h=Math.ceil(h/l)*l;else if(l<0)s=Math.ceil(s*l)/l,h=Math.floor(h*l)/l;else break;u=l}return e},e}function bl(){var e=0,a=1,n,t,i,o,s=Mt,h=!1,u;function l(d){return d==null||isNaN(d=+d)?u:s(i===0?.5:(d=(o(d)-n)*i,h?Math.max(0,Math.min(1,d)):d))}l.domain=function(d){return arguments.length?([e,a]=d,n=o(e=+e),t=o(a=+a),i=n===t?0:1/(t-n),l):[e,a]},l.clamp=function(d){return arguments.length?(h=!!d,l):h},l.interpolator=function(d){return arguments.length?(s=d,l):s};function c(d){return function(r){var g,m;return arguments.length?([g,m]=r,s=d(g,m),l):[s(0),s(1)]}}return l.range=c(we),l.rangeRound=c(so),l.unknown=function(d){return arguments.length?(u=d,l):u},function(d){return o=d,n=d(e),t=d(a),i=n===t?0:1/(t-n),l}}function vl(e,a){return a.domain(e.domain()).interpolator(e.interpolator()).clamp(e.clamp()).unknown(e.unknown())}function nn(){var e=kl(bl()(Mt));return e.copy=function(){return vl(e,nn())},pl.apply(e,arguments)}dt(sa(-100,.75,.35),sa(80,1.5,.8));dt(sa(260,.75,.35),sa(80,1.5,.8));var Ya=sa();function zt(e){(e<0||e>1)&&(e-=Math.floor(e));var a=Math.abs(e-.5);return Ya.h=360*e-100,Ya.s=1.5-1.5*a,Ya.l=.8-.9*a,Ya+""}function ya(e){return function(){return e}}const Pn=1e-12;function wl(e){let a=3;return e.digits=function(n){if(!arguments.length)return a;if(n==null)a=null;else{const t=Math.floor(n);if(!(t>=0))throw new RangeError(`invalid digits: ${n}`);a=t}return e},()=>new Ts(a)}function Al(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function Tt(e){this._context=e}Tt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,a){switch(e=+e,a=+a,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,a):this._context.moveTo(e,a);break;case 1:this._point=2;default:this._context.lineTo(e,a);break}}};function Sl(e){return new Tt(e)}function _l(e){return e[0]}function Ml(e){return e[1]}function tn(e,a){var n=ya(!0),t=null,i=Sl,o=null,s=wl(h);e=typeof e=="function"?e:e===void 0?_l:ya(e),a=typeof a=="function"?a:a===void 0?Ml:ya(a);function h(u){var l,c=(u=Al(u)).length,d,r=!1,g;for(t==null&&(o=i(g=s())),l=0;l<=c;++l)!(l<c&&n(d=u[l],l,u))===r&&((r=!r)?o.lineStart():o.lineEnd()),r&&o.point(+e(d,l,u),+a(d,l,u));if(g)return o=null,g+""||null}return h.x=function(u){return arguments.length?(e=typeof u=="function"?u:ya(+u),h):e},h.y=function(u){return arguments.length?(a=typeof u=="function"?u:ya(+u),h):a},h.defined=function(u){return arguments.length?(n=typeof u=="function"?u:ya(!!u),h):n},h.curve=function(u){return arguments.length?(i=u,t!=null&&(o=i(t)),h):i},h.context=function(u){return arguments.length?(u==null?t=o=null:o=i(t=u),h):t},h}function In(){}function je(e,a,n){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+a)/6,(e._y0+4*e._y1+n)/6)}function _e(e){this._context=e}_e.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:je(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,a){switch(e=+e,a=+a,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,a):this._context.moveTo(e,a);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:je(this,e,a);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=a}};function zl(e){return new _e(e)}function xt(e){this._context=e}xt.prototype={areaStart:In,areaEnd:In,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,a){switch(e=+e,a=+a,this._point){case 0:this._point=1,this._x2=e,this._y2=a;break;case 1:this._point=2,this._x3=e,this._y3=a;break;case 2:this._point=3,this._x4=e,this._y4=a,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+a)/6);break;default:je(this,e,a);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=a}};function Tl(e){return new xt(e)}function Nt(e,a){this._basis=new _e(e),this._beta=a}Nt.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var e=this._x,a=this._y,n=e.length-1;if(n>0)for(var t=e[0],i=a[0],o=e[n]-t,s=a[n]-i,h=-1,u;++h<=n;)u=h/n,this._basis.point(this._beta*e[h]+(1-this._beta)*(t+u*o),this._beta*a[h]+(1-this._beta)*(i+u*s));this._x=this._y=null,this._basis.lineEnd()},point:function(e,a){this._x.push(+e),this._y.push(+a)}};const xl=(function e(a){function n(t){return a===1?new _e(t):new Nt(t,a)}return n.beta=function(t){return e(+t)},n})(.85);function Dn(e,a,n){e._context.bezierCurveTo(e._x1+e._k*(e._x2-e._x0),e._y1+e._k*(e._y2-e._y0),e._x2+e._k*(e._x1-a),e._y2+e._k*(e._y1-n),e._x2,e._y2)}function rn(e,a){this._context=e,this._k=(1-a)/6}rn.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Dn(this,this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,a){switch(e=+e,a=+a,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,a):this._context.moveTo(e,a);break;case 1:this._point=2,this._x1=e,this._y1=a;break;case 2:this._point=3;default:Dn(this,e,a);break}this._x0=this._x1,this._x1=this._x2,this._x2=e,this._y0=this._y1,this._y1=this._y2,this._y2=a}};(function e(a){function n(t){return new rn(t,a)}return n.tension=function(t){return e(+t)},n})(0);function Nl(e,a,n){var t=e._x1,i=e._y1,o=e._x2,s=e._y2;if(e._l01_a>Pn){var h=2*e._l01_2a+3*e._l01_a*e._l12_a+e._l12_2a,u=3*e._l01_a*(e._l01_a+e._l12_a);t=(t*h-e._x0*e._l12_2a+e._x2*e._l01_2a)/u,i=(i*h-e._y0*e._l12_2a+e._y2*e._l01_2a)/u}if(e._l23_a>Pn){var l=2*e._l23_2a+3*e._l23_a*e._l12_a+e._l12_2a,c=3*e._l23_a*(e._l23_a+e._l12_a);o=(o*l+e._x1*e._l23_2a-a*e._l12_2a)/c,s=(s*l+e._y1*e._l23_2a-n*e._l12_2a)/c}e._context.bezierCurveTo(t,i,o,s,e._x2,e._y2)}function Ct(e,a){this._context=e,this._alpha=a}Ct.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,a){if(e=+e,a=+a,this._point){var n=this._x2-e,t=this._y2-a;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+t*t,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,a):this._context.moveTo(e,a);break;case 1:this._point=2;break;case 2:this._point=3;default:Nl(this,e,a);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=e,this._y0=this._y1,this._y1=this._y2,this._y2=a}};const Cl=(function e(a){function n(t){return a?new Ct(t,a):new rn(t,0)}return n.alpha=function(t){return e(+t)},n})(.5);function Ka(e,a,n){this.k=e,this.x=a,this.y=n}Ka.prototype={constructor:Ka,scale:function(e){return e===1?this:new Ka(this.k*e,this.x,this.y)},translate:function(e,a){return e===0&a===0?this:new Ka(this.k,this.x+this.k*e,this.y+this.k*a)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};Ka.prototype;const Y=(e,a)=>e===void 0&&a===void 0?Math.random():(a===void 0&&(a=e,e=0),Math.floor(Math.random()*(a-e+1))+e),B=e=>e>=1?!0:e<=0?!1:Math.random()<e,ba=e=>a=>a%e===0,Qa=(e=100,a=30,n=0,t=300,i=0)=>N(ma(ml.source(()=>Math.random())(e,a)(),n,t),i),Kl=e=>~~e+ +B(e%1),Ja=e=>e[Math.floor(Math.random()*e.length)],de=e=>{const a=[];for(const n in e)for(let t=0;t<e[n];t++)a.push(n);return a[Math.floor(Math.random()*a.length)]},Kt=(e,a,n)=>Math.round(e+(a-e)*Math.random()**n),J=e=>{if(typeof e!="string")return 0;if(!Number.isNaN(+e))return~~e+ +B(+e-~~e);const a=e[0]==="-"?-1:1;Number.isNaN(+e[0])&&(e=e.slice(1));const n=e.includes("-")?e.split("-"):null;if(!n)return 0;const t=Y(parseFloat(n[0])*a,+parseFloat(n[1]));return Number.isNaN(t)||t<0?0:t},Bl=()=>String(Math.floor(Math.random()*1e9)),q=e=>"aeiouyɑ'əøɛœæɶɒɨɪɔɐʊɤɯаоиеёэыуюяàèìòùỳẁȁȅȉȍȕáéíóúýẃőűâêîôûŷŵäëïöüÿẅãẽĩõũỹąęįǫųāēīōūȳăĕĭŏŭǎěǐǒǔȧėȯẏẇạẹịọụỵẉḛḭṵṳ".includes(e),ua=(e,a=3)=>{for(;e.length>a&&q(Ea(Array.from(e)));)e=e.slice(0,-1);return e},El=e=>{const a=[{name:"guo",probability:1,condition:/ Guo$/,action:n=>n.slice(0,-4)},{name:"orszag",probability:1,condition:/orszag$/,action:n=>n.length<9?`${n}ian`:n.slice(0,-6)},{name:"stan",probability:1,condition:/stan$/,action:n=>n.length<9?`${n}i`:ua(n.slice(0,-4))},{name:"land",probability:1,condition:/land$/,action:n=>{if(n.length>9)return n.slice(0,-4);const t=ua(n.slice(0,-4),0);return t.length<3?`${n}ic`:t.length<4?`${t}lish`:`${t}ish`}},{name:"que",probability:1,condition:/que$/,action:n=>n.replace(/que$/,"can")},{name:"a",probability:1,condition:/a$/,action:n=>`${n}n`},{name:"o",probability:1,condition:/o$/,action:n=>n.replace(/o$/,"an")},{name:"u",probability:1,condition:/u$/,action:n=>`${n}an`},{name:"i",probability:1,condition:/i$/,action:n=>`${n}an`},{name:"e",probability:1,condition:/e$/,action:n=>`${n}an`},{name:"ay",probability:1,condition:/ay$/,action:n=>`${n}an`},{name:"os",probability:1,condition:/os$/,action:n=>{const t=ua(n.slice(0,-2),0);return t.length<4?n.slice(0,-1):`${t}ian`}},{name:"es",probability:1,condition:/es$/,action:n=>{const t=ua(n.slice(0,-2),0);return t.length>7?n.slice(0,-1):`${t}ian`}},{name:"l",probability:.8,condition:/l$/,action:n=>`${n}ese`},{name:"n",probability:.8,condition:/n$/,action:n=>`${n}ese`},{name:"ad",probability:.8,condition:/ad$/,action:n=>`${n}ian`},{name:"an",probability:.8,condition:/an$/,action:n=>`${n}ian`},{name:"ish",probability:.25,condition:/^[a-zA-Z]{6}$/,action:n=>`${ua(n.slice(0,-1))}ish`},{name:"an",probability:.5,condition:/^[a-zA-Z]{0,7}$/,action:n=>`${ua(n)}an`}];for(const n of a)if(B(n.probability)&&n.condition.test(e))return n.action(e);return e},Hl=e=>e+(["st","nd","rd"][((e+90)%100-10)%10-1]||"th"),Ue=(e,a=[])=>{const t=e.replace("Old ","O ").replace(/[()]/g,"").split(" "),i=t.join("");let o=t.length===2?t[0][0]+t[1][0]:i.slice(0,2);for(let s=1;s<i.length-1&&a.includes(o);s++)o=i[0]+i[s].toUpperCase();return o},Rl=e=>Intl.ListFormat?new Intl.ListFormat(document.documentElement.lang||"en",{style:"long",type:"conjunction"}).format(e):e.join(", "),Ll=(e,a="°C")=>({"°C":t=>`${N(t)}°C`,"°F":t=>`${N(t*9/5+32)}°F`,K:t=>`${N(t+273.15)}K`,"°R":t=>`${N((t+273.15)*9/5)}°R`,"°De":t=>`${N((100-t)*3/2)}°De`,"°N":t=>`${N(t*33/100)}°N`,"°Ré":t=>`${N(t*4/5)}°Ré`,"°Rø":t=>`${N(t*21/40+7.5)}°Rø`})[a](e),Pl=e=>e>=1e9?`${N(e/1e9,1)}B`:e>=1e8?`${N(e/1e6)}M`:e>=1e6?`${N(e/1e6,1)}M`:e>=1e4?`${N(e/1e3)}K`:e>=1e3?`${N(e/1e3,1)}K`:N(e).toString(),Il=e=>{const a=e.slice(-1);return a==="K"?parseInt(e.slice(0,-1),10)*1e3:a==="M"?parseInt(e.slice(0,-1),10)*1e6:a==="B"?parseInt(e.slice(0,-1),10)*1e9:parseInt(e,10)},Dl=e=>{if(e.charAt(0)==="#")return e;const a=e.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i);return a&&a.length===4?"#"+`0${parseInt(a[1],10).toString(16)}`.slice(-2)+`0${parseInt(a[2],10).toString(16)}`.slice(-2)+`0${parseInt(a[3],10).toString(16)}`.slice(-2):""},on=["#dababf","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#c6b9c1","#bc80bd","#ccebc5","#ffed6f","#8dd3c7","#eb8de7"],Bt=e=>{const a=nn(zt);return Xt(()=>Math.random())(Ra(e).map(i=>i<12?on[i]:Z(a((i-12)/(e-12)))?.formatHex())).filter(i=>typeof i=="string")},ge=()=>Z(nn(zt)(Math.random())).formatHex(),Gl=(e,a=.2,n=.3)=>{const t=e&&e[0]==="#"?e:ge();return Z(we(t,ge())(a)).brighter(n).formatHex()},Et=e=>{let a;return e.parentNode?a=e.parentNode:e.host?a=e.host:e.defaultView&&(a=e.defaultView),a!==void 0?[e].concat(Et(a)):[e]},Ol=(e,a=1)=>{for(;document.getElementById(e+a);)a++;return e+a},ql=(e,a,...n)=>jl(e,Array.from,a,n),jl=(e,a,n,t)=>(function i(o,s){if(s>=t.length)return n(o);const h=new Map,u=t[s++];let l=-1;for(const c of o){const d=u(c,++l,o),r=h.get(d);r?r.push(c):h.set(d,[c])}for(const[c,d]of h)h.set(c,i(d,s));return a(h)})(e,0),fe=([e,a],[n,t])=>(e-n)**2+(a-t)**2;class Ul{constructor(a=[],n=(t,i)=>t<i?-1:t>i?1:0){if(this.data=a,this.length=this.data.length,this.compare=n,this.length>0)for(let t=(this.length>>1)-1;t>=0;t--)this._down(t)}push(a){this.data.push(a),this._up(this.length++)}pop(){if(this.length===0)return;const a=this.data[0],n=this.data.pop();return--this.length>0&&(this.data[0]=n,this._down(0)),a}peek(){return this.data[0]}_up(a){const{data:n,compare:t}=this,i=n[a];for(;a>0;){const o=a-1>>1,s=n[o];if(t(i,s)>=0)break;n[a]=s,a=o}n[a]=i}_down(a){const{data:n,compare:t}=this,i=this.length>>1,o=n[a];for(;a<i;){let s=(a<<1)+1;const h=s+1;if(h<this.length&&t(n[h],n[s])<0&&(s=h),t(n[s],o)>=0)break;n[a]=n[s],a=s}n[a]=o}}function Vl(e,a=1,n=!1){let t=1/0,i=1/0,o=-1/0,s=-1/0;for(const[y,k]of e[0])y<t&&(t=y),k<i&&(i=k),y>o&&(o=y),k>s&&(s=k);const h=o-t,u=s-i,l=Math.max(a,Math.min(h,u));if(l===a){const y=[t,i];return y.distance=0,y}const c=new Ul([],(y,k)=>k.max-y.max);let d=Yl(e);const r=new me(t+h/2,i+u/2,0,e);r.d>d.d&&(d=r);let g=2;function m(y,k,b){const v=new me(y,k,b,e);g++,v.max>d.d+a&&c.push(v),v.d>d.d&&(d=v,n&&console.log(`found best ${Math.round(1e4*v.d)/1e4} after ${g} probes`))}let f=l/2;for(let y=t;y<o;y+=l)for(let k=i;k<s;k+=l)m(y+f,k+f,f);for(;c.length;){const{max:y,x:k,y:b,h:v}=c.pop();if(y-d.d<=a)break;f=v/2,m(k-f,b-f,f),m(k+f,b-f,f),m(k-f,b+f,f),m(k+f,b+f,f)}n&&console.log(`num probes: ${g}
|
||
best distance: ${d.d}`);const p=[d.x,d.y];return p.distance=d.d,p}function me(e,a,n,t){this.x=e,this.y=a,this.h=n,this.d=Fl(e,a,t),this.max=this.d+this.h*Math.SQRT2}function Fl(e,a,n){let t=!1,i=1/0;for(const o of n)for(let s=0,h=o.length,u=h-1;s<h;u=s++){const l=o[s],c=o[u];l[1]>a!=c[1]>a&&e<(c[0]-l[0])*(a-l[1])/(c[1]-l[1])+l[0]&&(t=!t),i=Math.min(i,$l(e,a,l,c))}return i===0?0:(t?1:-1)*Math.sqrt(i)}function Yl(e){let a=0,n=0,t=0;const i=e[0];for(let s=0,h=i.length,u=h-1;s<h;u=s++){const l=i[s],c=i[u],d=l[0]*c[1]-c[0]*l[1];n+=(l[0]+c[0])*d,t+=(l[1]+c[1])*d,a+=d*3}const o=new me(n/a,t/a,0,e);return a===0||o.d<0?new me(i[0][0],i[0][1],0,e):o}function $l(e,a,n,t){let i=n[0],o=n[1],s=t[0]-i,h=t[1]-o;if(s!==0||h!==0){const u=((e-i)*s+(a-o)*h)/(s*s+h*h);u>1?(i=t[0],o=t[1]):u>0&&(i+=s*u,o+=h*u)}return s=e-i,h=a-o,s*s+h*h}const Ht=(e,a)=>{const n=a.map(i=>e.p[i]);return`M${n.shift()} L${n.join(" ")} Z`},Gn=(e,a,n)=>{let t=!0,i="";return a.map(s=>{if(n(s))return t=!0,"";const h=t?"M":"L";return t=!1,i=h,` ${h==="L"&&h===i?"":h}${e.p[s]}`}).join("").trim()},Wl=(e,a,n)=>{const t=[];let i=e,o=e;for(;i!==a;)t.push(i),o=n[i],i=o;return t.push(i),t.reverse()},Rt=(e,a,n={polygons:!1,fill:!1,halo:!1,waterGap:!1})=>{const{cells:t,vertices:i}=e,o={},s=new Uint8Array(t.i.length),h=c=>{s[c]=1},u=c=>s[c]===1;for(const c of t.i){if(u(c)||!a(c))continue;h(c);const d=a(c),r=k=>a(k)===d,g=k=>a(k)!==d,m=t.c[c].find(g);if(m===void 0)continue;const f=e.features[t.f[m]];if(f.type==="lake"&&f.shoreline?.every(r))continue;const p=t.v[c].find(k=>i.c[k].some(g));if(p===void 0)throw new Error(`Starting vertex for cell ${c} is not found`);const y=Me({vertices:i,startingVertex:p,ofSameType:r,addToChecked:h,closeRing:!0});y.length<3||l(d,i,y,o,n)}return o;function l(c,d,r,g,m){if(g[c]||(g[c]={}),m.polygons&&(g[c].polygons||(g[c].polygons=[]),g[c].polygons.push(r.map(f=>d.p[f]))),m.fill&&(g[c].fill||(g[c].fill=""),g[c].fill+=Ht(d,r)),m.waterGap){g[c].waterGap||(g[c].waterGap="");const f=p=>d.c[p].every(y=>t.h[y]>=20);g[c].waterGap+=Gn(d,r,f)}if(m.halo){g[c].halo||(g[c].halo="");const f=p=>d.c[p].some(y=>t.b[y]);g[c].halo+=Gn(d,r,f)}}},Zl=(e,a={})=>{const{cells:n,vertices:t}=a,i=Object.fromEntries(e.map(d=>[d,!0])),o=d=>i[d],s=d=>!i[d],h=new Uint8Array(n.c.length),u=d=>{h[d]=1},l=d=>h[d]===1;let c="";for(const d of e){if(l(d))continue;const r=n.c[d].find(s);if(r===void 0)continue;const g=a.features[n.f[r]];if(g.type==="lake"&&g.shoreline&&g.shoreline.every(o))continue;const m=n.v[d].find(p=>t.c[p].some(s));if(m===void 0)throw new Error(`Starting vertex for cell ${d} is not found`);const f=Me({vertices:t,startingVertex:m,ofSameType:o,addToChecked:u,closeRing:!0});f.length<3||(c+=Ht(t,f))}return c},Ql=(e,a)=>{const n=Rt(e,a,{polygons:!0}),t=Object.entries(n).map(([i,o])=>{const s=o.polygons.sort((l,c)=>c.length-l.length),[h,u]=Vl(s,20);return[i,[N(h),N(u)]]});return Object.fromEntries(t)},Me=({vertices:e,startingVertex:a,ofSameType:n,addToChecked:t,closeRing:i})=>{const o=e.c.length,s=[];let h=a;for(let u=0;u===0||h!==a;u++){const l=s.at(-1),c=h;s.push(c);const d=e.c[c];t&&d.filter(n).forEach(t);const[r,g,m]=d.map(n),[f,p,y]=e.v[c];if(f!==l&&r!==g?h=f:p!==l&&g!==m?h=p:y!==l&&r!==m&&(h=y),h>=e.c.length){window.ERROR&&console.error("ConnectVertices: next vertex is out of bounds");break}if(h===c){window.ERROR&&console.error("ConnectVertices: next vertex is not found");break}if(u===o){window.ERROR&&console.error("ConnectVertices: max iterations reached",o);break}}return i&&s.push(a),s},Jl=(e,a,n,t={})=>{if(a(e))return null;const i=[],o=[],s=new window.FlatQueue;for(s.push(e,0);s.length;){const h=s.peekValue(),u=s.pop();for(const l of t.cells.c[u]){if(a(l))return i[l]=u,Wl(l,e,i);const c=n(u,l);if(c===1/0)continue;const d=h+c;d>=o[l]||(i[l]=u,o[l]=d,s.push(l,d))}}return null},ze=(e="",a=1)=>e.replace(/[\d.-][\d.e-]*/g,n=>N(parseFloat(n),a).toString()),Lt=e=>e.charAt(0).toUpperCase()+e.slice(1),Xl=e=>{const a=e.length/2,n=e.split(" ");if(n.length<2)return n;let t="",i="",o="",s="";return n.forEach((h,u)=>{u+1!==n.length&&(h+=" "),s+=h,!t||s.length<a?t+=h:o?i+=h:o=h}),i?t.length<i.length?[t+o,i]:[t,o+i]:[t,o]},au=e=>{if(!e)return[0,0,0,0,0,1];const a=e.replace(/[a-z()]/g,"").replace(/[ ]/g,",").split(",");return[a[0]||0,a[1]||0,a[2]||0,a[3]||0,a[4]||0,a[5]||1]},eu=e=>{try{return JSON.parse(e),!0}catch{return!1}},nu=e=>{try{return JSON.parse(e)}catch{return null}},tu=e=>{if(!e)throw new Error("No string provided");let a=e.toLowerCase().trim().replace(/[^a-z0-9-_]/g,"").replace(/\s+/g,"-");return a.match(/^\d/)&&(a=`_${a}`),a},j=document.getElementById.bind(document);function iu(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Xa={exports:{}},ru=Xa.exports,On;function ou(){return On||(On=1,(function(e,a){(function(n,t){e.exports=t()})(ru,function(){return n.importState=function(i){var o=new n;return o.importState(i),o},n;function n(){return(function(i){var o=0,s=0,h=0,u=1;i.length==0&&(i=[+new Date]);var l=t();o=l(" "),s=l(" "),h=l(" ");for(var c=0;c<i.length;c++)o-=l(i[c]),o<0&&(o+=1),s-=l(i[c]),s<0&&(s+=1),h-=l(i[c]),h<0&&(h+=1);l=null;var d=function(){var r=2091639*o+u*23283064365386963e-26;return o=s,s=h,h=r-(u=r|0)};return d.next=d,d.uint32=function(){return d()*4294967296},d.fract53=function(){return d()+(d()*2097152|0)*11102230246251565e-32},d.version="Alea 0.9",d.args=i,d.exportState=function(){return[o,s,h,u]},d.importState=function(r){o=+r[0]||0,s=+r[1]||0,h=+r[2]||0,u=+r[3]||0},d})(Array.prototype.slice.call(arguments))}function t(){var i=4022871197,o=function(s){s=s.toString();for(var h=0;h<s.length;h++){i+=s.charCodeAt(h);var u=.02519603282416938*i;i=u>>>0,u-=i,u*=i,i=u>>>0,u-=i,i+=u*4294967296}return(i>>>0)*23283064365386963e-26};return o.version="Mash 0.9",o}})})(Xa)),Xa.exports}var su=ou();const Te=iu(su);class lu{delaunay;points;pointsN;cells={v:[],c:[],b:[],i:new Uint32Array};vertices={p:[],v:[],c:[]};constructor(a,n,t){this.delaunay=a,this.points=n,this.pointsN=t,this.vertices;for(let i=0;i<this.delaunay.triangles.length;i++){const o=this.delaunay.triangles[this.nextHalfedge(i)];if(o<this.pointsN&&!this.cells.c[o]){const h=this.edgesAroundPoint(i);this.cells.v[o]=h.map(u=>this.triangleOfEdge(u)),this.cells.c[o]=h.map(u=>this.delaunay.triangles[u]).filter(u=>u<this.pointsN),this.cells.b[o]=h.length>this.cells.c[o].length?1:0}const s=this.triangleOfEdge(i);this.vertices.p[s]||(this.vertices.p[s]=this.triangleCenter(s),this.vertices.v[s]=this.trianglesAdjacentToTriangle(s),this.vertices.c[s]=this.pointsOfTriangle(s))}}pointsOfTriangle(a){return this.edgesOfTriangle(a).map(n=>this.delaunay.triangles[n])}trianglesAdjacentToTriangle(a){const n=[];for(const t of this.edgesOfTriangle(a)){const i=this.delaunay.halfedges[t];n.push(this.triangleOfEdge(i))}return n}edgesAroundPoint(a){const n=[];let t=a;do{n.push(t);const i=this.nextHalfedge(t);t=this.delaunay.halfedges[i]}while(t!==-1&&t!==a&&n.length<20);return n}triangleCenter(a){const n=this.pointsOfTriangle(a).map(t=>this.points[t]);return this.circumcenter(n[0],n[1],n[2])}edgesOfTriangle(a){return[3*a,3*a+1,3*a+2]}triangleOfEdge(a){return Math.floor(a/3)}nextHalfedge(a){return a%3===2?a-2:a+1}circumcenter(a,n,t){const[i,o]=a,[s,h]=n,[u,l]=t,c=i*i+o*o,d=s*s+h*h,r=u*u+l*l,g=2*(i*(h-l)+s*(l-o)+u*(o-h));return[Math.floor(1/g*(c*(h-l)+d*(l-o)+r*(o-h))),Math.floor(1/g*(c*(u-s)+d*(i-u)+r*(s-i)))]}}const uu=(e,a,n)=>{const t=N(-1*n),i=n*2,o=e-t*2,s=a-t*2,h=Math.ceil(o/i)-1,u=Math.ceil(s/i)-1,l=[];for(let c=.5;c<h;c++){const d=Math.ceil(o*c/h+t);l.push([d,t],[d,s+t])}for(let c=.5;c<u;c++){const d=Math.ceil(s*c/u+t);l.push([t,d],[o+t,d])}return l},hu=(e,a,n)=>{const t=n/2,i=t*.9,o=i*2,s=()=>Math.random()*o-i,h=[];for(let u=t;u<a;u+=n)for(let l=t;l<e;l+=n){const c=Math.min(N(l+s(),2),e),d=Math.min(N(u+s(),2),a);h.push([c,d])}return h},cu=(e,a)=>{TIME&&console.time("placePoints");const n=+(j("pointsInput")?.dataset.cells||0),t=N(Math.sqrt(e*a/n),2),i=uu(e,a,t),o=hu(e,a,t),s=Math.floor((e+.5*t-1e-10)/t),h=Math.floor((a+.5*t-1e-10)/t);return TIME&&console.timeEnd("placePoints"),{spacing:t,cellsDesired:n,boundary:i,points:o,cellsX:s,cellsY:h}},du=(e,a,n,t)=>{if(a&&a!==e.seed)return!0;const i=+(j("pointsInput")?.dataset?.cells||0);if(i!==e.cellsDesired)return!0;const o=N(Math.sqrt(n*t/i),2),s=Math.floor((n+.5*o-1e-10)/o),h=Math.floor((t+.5*o-1e-10)/o);return e.spacing!==o||e.cellsX!==s||e.cellsY!==h},gu=(e,a,n)=>{Math.random=Te(e);const{spacing:t,cellsDesired:i,boundary:o,points:s,cellsX:h,cellsY:u}=cu(a,n),{cells:l,vertices:c}=Pt(s,o);return{spacing:t,cellsDesired:i,boundary:o,points:s,cellsX:h,cellsY:u,cells:l,vertices:c,seed:e}},Pt=(e,a)=>{TIME&&console.time("calculateDelaunay");const n=e.concat(a),t=Xe.from(n);TIME&&console.timeEnd("calculateDelaunay"),TIME&&console.time("calculateVoronoi");const i=new lu(t,n,e.length),o=i.cells;o.i=pe({maxValue:e.length,length:e.length}).map((h,u)=>u);const s=i.vertices;return TIME&&console.timeEnd("calculateVoronoi"),{cells:o,vertices:s}},X=(e,a,n)=>Math.floor(Math.min(a/n.spacing,n.cellsY-1))*n.cellsX+Math.floor(Math.min(e/n.spacing,n.cellsX-1)),fu=(e,a,n,t)=>{const i=t.cells.c;let o=Math.floor(n/t.spacing),s=[X(e,a,t)];if(!o||n===1)return s;if(o>0&&(s=s.concat(i[s[0]])),o>1){let h=i[s[0]];for(;o>1;){const u=h.slice();h=[],u.forEach(l=>{i[l].forEach(c=>{s.indexOf(c)===-1&&(s.push(c),h.push(c))})}),o--}}return s},mu=(e,a,n=1/0,t)=>{if(!t.cells?.q)return;const i=t.cells.q.find(e,a,n);return i?i[2]:void 0},It=(e,a,n,t)=>{let i,o,s;const h=(d,r)=>{d.result=[],d.x0=d.x-r,d.y0=d.y-r,d.x3=d.x+r,d.y3=d.y+r,d.radius=r*r},u=(d,r)=>{if(d.node.data.scanned=!0,r<d.radius)for(;d.node;)d.result.push(d.node.data),d.node.data.selected=!0,d.node=d.node.next};class l{node;x0;y0;x1;y1;constructor(r,g,m,f,p){this.node=r,this.x0=g,this.y0=m,this.x1=f,this.y1=p}}const c={x:e,y:a,x0:t._x0,y0:t._y0,x3:t._x1,y3:t._y1,quads:[],node:t._root};for(c.node&&c.quads.push(new l(c.node,c.x0,c.y0,c.x3,c.y3)),h(c,n),c.q=c.quads.pop();c.q;){if(c.node=c.q.node,c.x1=c.q.x0,c.y1=c.q.y0,c.x2=c.q.x1,c.y2=c.q.y1,!c.node||c.x1>c.x3||c.y1>c.y3||c.x2<c.x0||c.y2<c.y0){c.q=c.quads.pop();continue}if(c.node.length){c.node.explored=!0;const d=(c.x1+c.x2)/2,r=(c.y1+c.y2)/2;c.quads.push(new l(c.node[3],d,r,c.x2,c.y2),new l(c.node[2],c.x1,r,d,c.y2),new l(c.node[1],d,c.y1,c.x2,r),new l(c.node[0],c.x1,c.y1,d,r)),c.i=+(a>=r)<<1|+(e>=d),c.i&&(c.q=c.quads[c.quads.length-1],c.quads[c.quads.length-1]=c.quads[c.quads.length-1-c.i],c.quads[c.quads.length-1-c.i]=c.q)}else i=e-+t._x.call(null,c.node.data),o=a-+t._y.call(null,c.node.data),s=i*i+o*o,u(c,s);c.q=c.quads.pop()}return c.result},pu=(e,a,n,t)=>It(e,a,n,t.cells.q).map(o=>o[2]),yu=(e,a)=>a.cells.v[e].map(n=>a.vertices.p[n]),Dt=(e,a)=>a.cells.v[e].map(n=>a.vertices.p[n]);function*ku(e,a,n,t,i,o=3){if(!(n>=e)||!(t>=a)||!(i>0))throw new Error;const s=n-e,h=t-a,u=i*i,l=3*u,c=i*Math.SQRT1_2,d=Math.ceil(s/c),r=Math.ceil(h/c),g=new Array(d*r),m=[];function f(y,k){const b=y/c|0,v=k/c|0,w=Math.max(b-2,0),_=Math.max(v-2,0),M=Math.min(b+3,d),T=Math.min(v+3,r);for(let S=_;S<T;++S){const z=S*d;for(let A=w;A<M;++A){const x=g[z+A];if(x){const C=x[0]-y,E=x[1]-k;if(C*C+E*E<u)return!1}}}return!0}function p(y,k){const b=[y,k];return g[d*(k/c|0)+(y/c|0)]=b,m.push(b),[y+e,k+a]}yield p(s/2,h/2);a:for(;m.length;){const y=Math.random()*m.length|0,k=m[y];for(let v=0;v<o;++v){const w=2*Math.PI*Math.random(),_=Math.sqrt(Math.random()*l+u),M=k[0]+_*Math.cos(w),T=k[1]+_*Math.sin(w);if(0<=M&&M<s&&0<=T&&T<h&&f(M,T)){yield p(M,T);continue a}}const b=m.pop();b!==void 0&&y<m.length&&(m[y]=b)}}const ae=(e,a)=>a.cells.h[e]>=20,Gt=(e,a)=>a.cells.h[e]<20,bu=({heights:e,width:a,height:n,scheme:t,renderOcean:i})=>{const o=document.createElement("canvas");o.width=a,o.height=n;const s=o.getContext("2d"),h=s.createImageData(a,n),u=l=>l<20?i?l:0:l;for(let l=0;l<e.length;l++){const c=t(1-u(e[l])/100),{r:d,g:r,b:g}=Z(c)?.rgb()??{r:0,g:0,b:0},m=l*4;h.data[m]=d,h.data[m+1]=r,h.data[m+2]=g,h.data[m+3]=255}return s.putImageData(h,0,0),o.toDataURL("image/png")},sn=(e,a,n,t=0)=>e.length<2?e:e.some(i=>i===void 0)?(window.ERROR&&console.error("Undefined point in clipPoly",e),e):window.polygonclip(e,[0,0,a,n],t),vu=(e,a,n=10)=>{if(e.length===2)return 1;let t=1,i=1/0;for(let o=0;o<e.length-1;o++){const s=e[o],h=e[o+1],u=Math.sqrt(fe(s,h)),l=Math.ceil(u/n),c=(h[0]-s[0])/l,d=(h[1]-s[1])/l;for(let r=0;r<l;r++){const g=s[0]+r*c,m=s[1]+r*d,f=fe(a,[g,m]);f>=i||(i=f,t=o+1)}}return t},wu=(e,a)=>{let n=!1;return function(...t){n||(e.apply(this,t),n=!0,setTimeout(()=>{n=!1},a))}},Au=(e,a)=>{let n=!1,t=null,i=null;function o(...s){if(n){t=s,i=this;return}e.apply(this,s),n=!0,setTimeout(()=>{n=!1,t&&(o.apply(i,t),t=i=null)},a)}return o},Su=e=>{const n=navigator.userAgent.toLowerCase().indexOf("firefox")>-1?`${e.toString()} ${e.stack}`:e.stack||"",t=/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/gi;return n.replace(t,s=>`<i>${Ea(s.split("/"))}</i>`).replace(/at /gi,"<br> at ")},_u=(e,a)=>{const n=new XMLHttpRequest;n.onload=()=>{const t=new FileReader;t.onloadend=()=>{a(t.result)},t.readAsDataURL(n.response)},n.open("GET",e),n.responseType="blob",n.send()},Mu=e=>{window.open(e,"_blank")},zu=e=>{window.open(`https://github.com/Azgaar/Fantasy-Map-Generator/wiki/${e}`,"_blank")},Tu=(e,a)=>`<a href="${e}" rel="noopener" target="_blank">${a}</a>`,xu=e=>e.ctrlKey||e.metaKey,Nu=(e=100,a=1e3)=>new Date(Y(e,a),Y(12),Y(31)).toLocaleDateString("en",{year:"numeric",month:"long",day:"numeric"}),Ot=(e,a,n,t=2)=>N(a.lonW+e/n*a.lonT,t),qt=(e,a,n,t=2)=>N(a.latN-e/n*a.latT,t),Cu=(e,a,n,t,i,o=2)=>[Ot(e,n,t,o),qt(a,n,i,o)],qn=()=>{const e=document.getElementById("prompt");if(!e)return;const a=e.querySelector("#promptForm");if(!a)return;const n="Please provide an input",t={default:1,step:.01,min:0,max:100,required:!0};window.prompt=(o=n,s=t,h)=>{if(s.default===void 0)return window.ERROR&&console.error("Prompt: options object does not have default value defined");const u=e.querySelector("#promptInput"),l=e.querySelector("#promptText");if(!u||!l)return;l.innerHTML=o;const c=typeof s.default=="number"?"number":"text";u.type=c,s.step!==void 0&&(u.step=s.step.toString()),s.min!==void 0&&(u.min=s.min.toString()),s.max!==void 0&&(u.max=s.max.toString()),u.required=s.required!==!1,u.placeholder=`type a ${c}`,u.value=s.default.toString(),u.style.width=o.length>10?"100%":"auto",e.style.display="block",a.addEventListener("submit",d=>{d.preventDefault(),e.style.display="none";const r=c==="number"?+u.value:u.value;h&&h(r)},{once:!0})};const i=e.querySelector("#promptCancel");i&&i.addEventListener("click",()=>{e.style.display="none"})},Ku=(e,a)=>{window.debug.selectAll("text").remove(),window.debug.selectAll("text").data(e).enter().append("text").attr("x",(n,t)=>a.cells.p[t][0]).attr("y",(n,t)=>a.cells.p[t][1]).text(n=>n)},Bu=(e,a,n)=>{const t=Vn(e),i=Ba(e),o=window.getColorScheme(a.select("#landHeights").attr("scheme"));e=e.map(s=>1-ee(s,i,t)),window.debug.selectAll("polygon").remove(),window.debug.selectAll("polygon").data(e).enter().append("polygon").attr("points",(s,h)=>Dt(h,n)).attr("fill",s=>o(s)).attr("stroke",s=>o(s))},Eu=e=>{window.debug.select("#connections").remove();const a=window.debug.append("g").attr("id","connections").attr("stroke-width",.8),n=e.cells.p,t=e.cells.routes;for(const i in t)for(const o in t[i]){const[s,h]=n[i],[u,l]=n[o],[c,d]=[(s+u)/2,(h+l)/2],r=t[i][o];a.append("line").attr("x1",s).attr("y1",h).attr("x2",c).attr("y2",d).attr("data-id",r).attr("stroke",on[r%12])}},Hu=([e,a],{color:n="red",radius:t=.5})=>{window.debug.append("circle").attr("cx",e).attr("cy",a).attr("r",t).attr("fill",n)},Ru=(e,{color:a="red",width:n=.5})=>{const t=tn().curve(xl);window.debug.append("path").attr("d",ze(t(e))).attr("stroke",a).attr("stroke-width",n).attr("fill","none")};window.rn=N;window.lim=V;window.minmax=ma;window.normalize=ee;window.lerp=Ut;window.vowel=q;window.trimVowels=ua;window.getAdjective=El;window.nth=Hl;window.abbreviate=Ue;window.list=Rl;window.last=Ea;window.unique=jn;window.deepCopy=Vt;window.getTypedArray=Un;window.createTypedArray=pe;window.INT8_MAX=ea.INT8_MAX;window.UINT8_MAX=ea.UINT8_MAX;window.UINT16_MAX=ea.UINT16_MAX;window.UINT32_MAX=ea.UINT32_MAX;window.rand=Y;window.P=B;window.each=ba;window.gauss=Qa;window.Pint=Kl;window.ra=Ja;window.rw=de;window.biased=Kt;window.getNumberInRange=J;window.generateSeed=Bl;window.convertTemperature=(e,a=window.temperatureScale.value||"°C")=>Ll(e,a);window.si=Pl;window.getInteger=Il;window.toHEX=Dl;window.getColors=Bt;window.getRandomColor=ge;window.getMixedColor=Gl;window.C_12=on;window.getComposedPath=Et;window.getNextId=Ol;window.rollups=ql;window.dist2=fe;window.getIsolines=Rt;window.getPolesOfInaccessibility=Ql;window.connectVertices=Me;window.findPath=(e,a,n)=>Jl(e,a,n,window.pack);window.getVertexPath=e=>Zl(e,window.pack);window.round=ze;window.capitalize=Lt;window.splitInTwo=Xl;window.parseTransform=au;window.sanitizeId=tu;JSON.isValid=eu;JSON.safeParse=nu;window.byId=j;Node.prototype.on=function(e,a,n){return this.addEventListener(e,a,n),this};Node.prototype.off=function(e,a){return this.removeEventListener(e,a),this};window.shouldRegenerateGrid=(e,a)=>du(e,a,window.graphWidth,window.graphHeight);window.generateGrid=()=>gu(window.seed,window.graphWidth,window.graphHeight);window.findGridAll=(e,a,n)=>fu(e,a,n,window.grid);window.findGridCell=(e,a)=>X(e,a,window.grid);window.findCell=(e,a,n)=>mu(e,a,n,window.pack);window.findAll=(e,a,n)=>pu(e,a,n,window.pack);window.getPackPolygon=e=>yu(e,window.pack);window.getGridPolygon=e=>Dt(e,window.grid);window.calculateVoronoi=Pt;window.poissonDiscSampler=ku;window.findAllInQuadtree=It;window.drawHeights=bu;window.isLand=e=>ae(e,window.pack);window.isWater=e=>Gt(e,window.pack);window.clipPoly=(e,a)=>sn(e,graphWidth,graphHeight,a);window.getSegmentId=vu;window.debounce=wu;window.throttle=Au;window.parseError=Su;window.getBase64=_u;window.openURL=Mu;window.wiki=zu;window.link=Tu;window.isCtrlClick=xu;window.generateDate=Nu;window.getLongitude=(e,a)=>Ot(e,mapCoordinates,graphWidth,a);window.getLatitude=(e,a)=>qt(e,mapCoordinates,graphHeight,a);window.getCoordinates=(e,a,n)=>Cu(e,a,mapCoordinates,graphWidth,graphHeight,n);document.readyState==="loading"?document.addEventListener("DOMContentLoaded",qn):qn();window.drawCellsValue=e=>Ku(e,window.pack);window.drawPolygons=e=>Bu(e,window.terrs,window.grid);window.drawRouteConnections=()=>Eu(window.packedGraph);window.drawPoint=Hu;window.drawPath=Ru;class Lu{grid=null;heights=null;blobPower=0;linePower=0;clearData(){this.heights=null,this.grid=null}getBlobPower(a){return{1e3:.93,2e3:.95,5e3:.97,1e4:.98,2e4:.99,3e4:.991,4e4:.993,5e4:.994,6e4:.995,7e4:.9955,8e4:.996,9e4:.9964,1e5:.9973}[a]||.98}getLinePower(a){return{1e3:.75,2e3:.77,5e3:.79,1e4:.81,2e4:.82,3e4:.83,4e4:.84,5e4:.86,6e4:.87,7e4:.88,8e4:.91,9e4:.92,1e5:.93}[a]||.81}getPointInRange(a,n){if(typeof a!="string"){window.ERROR&&console.error("Range should be a string");return}const t=parseInt(a.split("-")[0],10)/100||0,i=parseInt(a.split("-")[1],10)/100||t;return Y(t*n,i*n)}setGraph(a){const{cellsDesired:n,cells:t,points:i}=a;this.heights=t.h?Uint8Array.from(t.h):pe({maxValue:100,length:i.length}),this.blobPower=this.getBlobPower(n),this.linePower=this.getLinePower(n),this.grid=a}addHill(a,n,t,i){const o=()=>{if(!this.heights||!this.grid)return;const h=new Uint8Array(this.heights.length);let u=0,l;const c=V(J(n));do{const r=this.getPointInRange(t,graphWidth),g=this.getPointInRange(i,graphHeight);if(r===void 0||g===void 0)return;l=X(r,g,this.grid),u++}while(this.heights[l]+c>90&&u<50);h[l]=c;const d=[l];for(;d.length;){const r=d.shift();for(const g of this.grid.cells.c[r])h[g]||(h[g]=h[r]**this.blobPower*(Math.random()*.2+.9),h[g]>1&&d.push(g))}this.heights=this.heights.map((r,g)=>V(r+h[g]))},s=J(a);for(let h=0;h<s;h++)o()}addPit(a,n,t,i){const o=()=>{if(!this.heights||!this.grid)return;const h=new Uint8Array(this.heights.length);let u=0,l,c=V(J(n));do{const r=this.getPointInRange(t,graphWidth),g=this.getPointInRange(i,graphHeight);if(r===void 0||g===void 0)return;l=X(r,g,this.grid),u++}while(this.heights[l]<20&&u<50);const d=[l];for(;d.length;){const r=d.shift();if(c=c**this.blobPower*(Math.random()*.2+.9),c<1)return;this.grid.cells.c[r].forEach(g=>{h[g]||this.heights===null||(this.heights[g]=V(this.heights[g]-c*(Math.random()*.2+.9)),h[g]=1,d.push(g))})}},s=J(a);for(let h=0;h<s;h++)o()}addRange(a,n,t,i,o,s){if(!this.heights||!this.grid)return;const h=()=>{if(!this.heights||!this.grid)return;const l=(f,p)=>{const y=[f],k=this.grid.points;for(c[f]=1;f!==p;){let b=1/0;if(this.grid.cells.c[f].forEach(v=>{if(c[v])return;let w=(k[p][0]-k[v][0])**2+(k[p][1]-k[v][1])**2;Math.random()>.85&&(w=w/2),w<b&&(b=w,f=v)}),b===1/0)return y;y.push(f),c[f]=1}return y},c=new Uint8Array(this.heights.length);let d=V(J(n));if(t&&i){const f=this.getPointInRange(t,graphWidth),p=this.getPointInRange(i,graphHeight);let y=0,k=0,b,v;do v=Math.random()*graphWidth*.8+graphWidth*.1,b=Math.random()*graphHeight*.7+graphHeight*.15,y=Math.abs(b-p)+Math.abs(v-f),k++;while((y<graphWidth/8||y>graphWidth/3)&&k<50);o=X(f,p,this.grid),s=X(v,b,this.grid)}const r=l(o,s);let g=r.slice(),m=0;for(;g.length;){const f=g.slice();if(g=[],m++,f.forEach(p=>{this.heights&&(this.heights[p]=V(this.heights[p]+d*(Math.random()*.3+.85)))}),d=d**this.linePower-1,d<2)break;f.forEach(p=>{this.grid.cells.c[p].forEach(y=>{c[y]||(g.push(y),c[y]=1)})})}r.forEach((f,p)=>{if(p%6===0)for(const y of Ra(m)){const k=ln(this.grid.cells.c[f],(v,w)=>this.heights[v]-this.heights[w]);if(k===void 0)continue;const b=this.grid.cells.c[f][k];this.heights[b]=(this.heights[f]*2+this.heights[b])/3,f=b}})},u=J(a);for(let l=0;l<u;l++)h()}addTrough(a,n,t,i,o,s){const h=()=>{if(!this.heights||!this.grid)return;const l=(f,p)=>{const y=[f],k=this.grid.points;for(c[f]=1;f!==p;){let b=1/0;if(this.grid.cells.c[f].forEach(v=>{if(c[v])return;let w=(k[p][0]-k[v][0])**2+(k[p][1]-k[v][1])**2;Math.random()>.8&&(w=w/2),w<b&&(b=w,f=v)}),b===1/0)return y;y.push(f),c[f]=1}return y},c=new Uint8Array(this.heights.length);let d=V(J(n));if(t&&i){let f=0,p,y,k=0,b,v;do p=this.getPointInRange(t,graphWidth),y=this.getPointInRange(i,graphHeight),o=X(p,y,this.grid),f++;while(this.heights[o]<20&&f<50);f=0;do b=Math.random()*graphWidth*.8+graphWidth*.1,v=Math.random()*graphHeight*.7+graphHeight*.15,k=Math.abs(v-y)+Math.abs(b-p),f++;while((k<graphWidth/8||k>graphWidth/2)&&f<50);s=X(b,v,this.grid)}const r=l(o,s);let g=r.slice(),m=0;for(;g.length;){const f=g.slice();if(g=[],m++,f.forEach(p=>{this.heights[p]=V(this.heights[p]-d*(Math.random()*.3+.85))}),d=d**this.linePower-1,d<2)break;f.forEach(p=>{this.grid.cells.c[p].forEach(y=>{c[y]||(g.push(y),c[y]=1)})})}r.forEach((f,p)=>{if(p%6===0)for(const y of Ra(m)){const k=ln(this.grid.cells.c[f],(v,w)=>this.heights[v]-this.heights[w]);if(k===void 0)continue;const b=this.grid.cells.c[f][k];this.heights[b]=(this.heights[f]*2+this.heights[b])/3,f=b}})},u=J(a);for(let l=0;l<u;l++)h()}addStrait(a,n="vertical"){if(!this.heights||!this.grid)return;const t=Math.min(J(a),this.grid.cellsX/3);if(t<1&&B(t))return;const i=new Uint8Array(this.heights.length),o=n==="vertical",s=o?Math.floor(Math.random()*graphWidth*.4+graphWidth*.3):5,h=o?5:Math.floor(Math.random()*graphHeight*.4+graphHeight*.3),u=o?Math.floor(graphWidth-s-graphWidth*.1+Math.random()*graphWidth*.2):graphWidth-5,l=o?graphHeight-5:Math.floor(graphHeight-h-graphHeight*.1+Math.random()*graphHeight*.2),c=X(s,h,this.grid),d=X(u,l,this.grid);let g=((p,y)=>{const k=[],b=this.grid.points;for(;p!==y;){let v=1/0;this.grid.cells.c[p].forEach(w=>{let _=(b[y][0]-b[w][0])**2+(b[y][1]-b[w][1])**2;Math.random()>.8&&(_=_/2),_<v&&(v=_,p=w)}),k.push(p)}return k})(c,d);const m=[],f=.1/t;for(let p=0;p<t;p++){const y=.9-f*t;g.forEach(k=>{this.grid.cells.c[k].forEach(b=>{i[b]||(i[b]=1,m.push(b),this.heights[b]**=y,this.heights[b]>100&&(this.heights[b]=5))})}),g=m.slice()}}modify(a,n,t,i){if(!this.heights)return;const o=a==="land"?20:a==="all"?0:+a.split("-")[0],s=a==="land"||a==="all"?100:+a.split("-")[1],h=o===20;this.heights=this.heights.map(u=>u<o||u>s?u:(n&&(u=h?Math.max(u+n,20):u+n),t!==1&&(u=h?(u-20)*t+20:u*t),i&&(u=h?(u-20)**i+20:u**i),V(u)))}smooth(a=2,n=0){!this.heights||!this.grid||(this.heights=this.heights.map((t,i)=>{const o=[t];return this.grid.cells.c[i].forEach(s=>{o.push(this.heights[s])}),a===1?Ha(o)+n:V((t*(a-1)+Ha(o)+n)/a)}))}mask(a=1){if(!this.heights||!this.grid)return;const n=a?Math.abs(a):1;this.heights=this.heights.map((t,i)=>{const[o,s]=this.grid.points[i],h=2*o/graphWidth-1,u=2*s/graphHeight-1;let l=(1-h**2)*(1-u**2);a<0&&(l=1-l);const c=t*l;return V((t*(n-1)+c)/n)})}invert(a,n){if(!B(a)||!this.heights||!this.grid)return;const t=n!=="y",i=n!=="x",{cellsX:o,cellsY:s}=this.grid,h=this.heights.map((u,l)=>{if(!this.heights)return 0;const c=l%o,d=Math.floor(l/o),r=t?o-c-1:c,g=i?s-d-1:d,m=r+g*o;return this.heights[m]});this.heights=h}addStep(a,n,t,i,o){if(a==="Hill"){this.addHill(n,t,i,o);return}if(a==="Pit"){this.addPit(n,t,i,o);return}if(a==="Range"){this.addRange(n,t,i,o);return}if(a==="Trough"){this.addTrough(n,t,i,o);return}if(a==="Strait"){this.addStrait(n,t);return}if(a==="Mask"){this.mask(+n);return}if(a==="Invert"){this.invert(+n,t);return}if(a==="Add"){this.modify(t,+n,1);return}if(a==="Multiply"){this.modify(t,0,+n);return}if(a==="Smooth"){this.smooth(+n);return}}async generate(a){TIME&&console.time("defineHeightmap");const n=j("templateInput").value;Math.random=Te(seed);const i=n in heightmapTemplates?this.fromTemplate(a,n):await this.fromPrecreated(a,n);return TIME&&console.timeEnd("defineHeightmap"),this.clearData(),i}fromTemplate(a,n){const i=(heightmapTemplates[n]?.template||"").split(`
|
||
`);if(!i.length)throw new Error(`Heightmap template: no steps. Template: ${n}. Steps: ${i}`);this.setGraph(a);for(const o of i){const s=o.trim().split(" ");if(s.length<2)throw new Error(`Heightmap template: steps < 2. Template: ${n}. Step: ${s}`);this.addStep(...s)}return this.heights}getHeightsFromImageData(a){if(this.heights)for(let n=0;n<this.heights.length;n++){const t=a[n*4]/255,i=t<.2?t:.2+(t-.2)**.8;this.heights[n]=ma(Math.floor(i*100),0,100)}}fromPrecreated(a,n){return new Promise(t=>{const i=document.createElement("canvas"),o=i.getContext("2d"),{cellsX:s,cellsY:h}=a;i.width=s,i.height=h;const u=new Image;u.src=`./heightmaps/${n}.png`,u.onload=()=>{if(!o)throw new Error("Could not get canvas context");this.heights=this.heights||new Uint8Array(s*h),o.drawImage(u,0,0,s,h);const l=o.getImageData(0,0,s,h);this.setGraph(a),this.getHeightsFromImageData(l.data),i.remove(),u.remove(),t(this.heights)}})}getHeights(){return this.heights}}window.HeightmapGenerator=new Lu;class Pu{DEEPER_LAND=3;LANDLOCKED=2;LAND_COAST=1;UNMARKED=0;WATER_COAST=-1;DEEP_WATER=-2;markup({distanceField:a,neighbors:n,start:t,increment:i,limit:o=ea.INT8_MAX}){for(let s=t,h=1/0;h>0&&s!==o;s+=i){h=0;const u=s-i;for(let l=0;l<n.length;l++)if(a[l]===u)for(const c of n[l])a[c]===this.UNMARKED&&(a[c]=s,h++)}}markupGrid(){TIME&&console.time("markupGrid"),Math.random=Te(seed);const{h:a,c:n,b:t,i}=grid.cells,o=i.length,s=new Int8Array(o),h=new Uint16Array(o),u=[],l=[0];for(let c=1;l[0]!==-1;c++){const d=l[0];h[d]=c;const r=a[d]>=20;let g=!1;for(;l.length;){const f=l.pop();!g&&t[f]&&(g=!0);for(const p of n[f]){const y=a[p]>=20;r===y&&h[p]===this.UNMARKED?(h[p]=c,l.push(p)):r&&!y&&(s[f]=this.LAND_COAST,s[p]=this.WATER_COAST)}}const m=r?"island":g?"ocean":"lake";u.push({i:c,land:r,border:g,type:m}),l[0]=h.indexOf(this.UNMARKED)}this.markup({distanceField:s,neighbors:n,start:this.DEEP_WATER,increment:-1,limit:-10}),grid.cells.t=s,grid.cells.f=h,grid.features=[0,...u],TIME&&console.timeEnd("markupGrid")}markupPack(){const a=p=>{const y=s[p].filter(v=>Gt(v,pack)),k=y.map(v=>fe(i.p[p],i.p[v])),b=k.indexOf(Math.min.apply(Math,k));r[p]=y[b],g[p]=y.length},n=(p,y)=>{if(p==="ocean")return[y,[]];const k=z=>d[z],b=k(y),v=z=>k(z)===b,w=z=>k(z)!==b,_=T(y),M=S(_);return[_,M];function T(z){const A=C=>h[C]||s[C].some(w);if(A(z))return z;const x=i.i.filter(v).find(A);if(x===void 0)throw new Error(`Markup: firstCell ${z} is not on the feature or map border`);return x}function S(z){const A=i.v[z].find(x=>o.c[x].some(w));if(A===void 0)throw new Error(`Markup: startingVertex for cell ${z} is not found`);return Me({vertices:o,startingVertex:A,ofSameType:v,closeRing:!1})}},t=({firstCell:p,land:y,border:k,featureId:b,totalCells:v})=>{const w=y?"island":k?"ocean":"lake",[_,M]=n(w,p),T=sn(M.map(x=>o.p[x])),S=gl(T),z=Math.abs(N(S)),A={i:b,type:w,land:y,border:k,cells:v,firstCell:_,vertices:M,area:z,shoreline:[],height:0};return w==="lake"&&(S>0&&(A.vertices=A.vertices.reverse()),A.shoreline=jn(A.vertices.flatMap(x=>o.c[x].filter(C=>ae(C,pack)))),A.height=Lakes.getHeight(A)),{...A}};TIME&&console.time("markupPack");const{cells:i,vertices:o}=pack,{c:s,b:h,i:u}=i,l=u.length;if(!l)return;const c=new Int8Array(l),d=new Uint16Array(l),r=pe({maxValue:l,length:l}),g=new Uint8Array(l),m=[],f=[0];for(let p=1;f[0]!==-1;p++){const y=f[0];d[y]=p;const k=ae(y,pack);let b=!!h[y],v=1;for(;f.length;){const w=f.pop();h[w]&&(b=!0);for(const _ of s[w]){const M=ae(_,pack);k&&!M?(c[w]=this.LAND_COAST,c[_]=this.WATER_COAST,r[w]||a(w)):k&&M&&(c[_]===this.UNMARKED&&c[w]===this.LAND_COAST?c[_]=this.LANDLOCKED:c[w]===this.UNMARKED&&c[_]===this.LAND_COAST&&(c[w]=this.LANDLOCKED)),!d[_]&&k===M&&(f.push(_),d[_]=p,v++)}}m.push(t({firstCell:y,land:k,border:b,featureId:p,totalCells:v})),f[0]=d.indexOf(this.UNMARKED)}this.markup({distanceField:c,neighbors:s,start:this.DEEPER_LAND,increment:1}),this.markup({distanceField:c,neighbors:s,start:this.DEEP_WATER,increment:-1,limit:-10}),pack.cells.t=c,pack.cells.f=d,pack.cells.haven=r,pack.cells.harbor=g,pack.features=[0,...m],TIME&&console.timeEnd("markupPack")}defineGroups(){const a=grid.cells.i.length,n=a/25,t=a/1e3,i=a/10,o=a/1e3,s=c=>{const d=pack.features[pack.cells.f[c.firstCell-1]];return d&&d.type==="lake"?"lake_island":c.cells>i?"continent":c.cells>o?"island":"isle"},h=c=>c.cells>n?"ocean":c.cells>t?"sea":"gulf",u=c=>{if(c.temp<-3)return"frozen";if(c.height>60&&c.cells<10&&c.firstCell%10===0)return"lava";if(!c.inlets&&!c.outlet){if(c.evaporation>c.flux*4)return"dry";if(c.cells<3&&c.firstCell%10===0)return"sinkhole"}return!c.outlet&&c.evaporation>c.flux?"salt":"freshwater"},l=c=>{if(c.type==="island")return s(c);if(c.type==="ocean")return h(c);if(c.type==="lake")return u(c);throw new Error(`Markup: unknown feature type ${c.type}`)};for(const c of pack.features)!c||c.type==="ocean"||(c.type==="lake"&&(c.height=Lakes.getHeight(c)),c.group=l(c))}}window.Features=new Pu;class Iu{chains=[];calculateChain(a){const n=[],t=a.split(",");for(const i of t){const o=i.trim().toLowerCase(),s=!/[^\x20-\x7e]/.test(o);for(let h=-1,u="";h<o.length;h+=u.length||1,u=""){const l=o[h]||"";let c=0;for(let d=h+1;o[d]&&u.length<5;d++){const r=o[d],g=o[d+1];if(u+=r,u===" "||u==="-"||!g||g===" "||g==="-")break;if(q(r)&&(c=1),!(r==="y"&&g==="e")&&!(s&&(r==="o"&&g==="o"||r==="e"&&g==="e"||r==="a"&&g==="e"||r==="c"&&g==="h"))&&(q(r)===g||c&&q(o[d+2])))break}n[l]||(n[l]=[]),n[l].push(u)}}return n}updateChain(a){this.chains[a]=nameBases[a]?.b?this.calculateChain(nameBases[a].b):null}clearChains(){this.chains=[]}getBase(a,n,t,i){if(a===void 0)return ERROR&&console.error("Please define a base"),"ERROR";if(nameBases[a]===void 0)if(nameBases[0])WARN&&console.warn(`Namebase ${a} is not found. First available namebase will be used`),a=0;else return ERROR&&console.error(`Namebase ${a} is not found`),"ERROR";this.chains[a]||this.updateChain(a);const o=this.chains[a];if(!o||o[""]===void 0)return tip(`Namesbase ${a} is incorrect. Please check in namesbase editor`,!1,"error"),ERROR&&console.error(`Namebase ${a} is incorrect!`),"ERROR";n||(n=nameBases[a].min),t||(t=nameBases[a].max),i!==""&&(i=nameBases[a].d);let s=o[""],h=Ja(s),u="";for(let d=0;d<20;d++){if(h==="")if(u.length<n)h="",u="",s=o[""];else break;else if(u.length+h.length>t){u.length<n&&(u+=h);break}else s=o[Ea(h.split(""))]||o[""];u+=h,h=Ja(s)}const l=Ea(u.split(""));(l==="'"||l===" "||l==="-")&&(u=u.slice(0,-1));let c=[...u].reduce((d,r,g,m)=>r===m[g+1]&&!i.includes(r)?d:d.length?d.slice(-1)==="-"&&r===" "?d:d.slice(-1)===" "||d.slice(-1)==="-"?d+r.toUpperCase():r==="a"&&m[g+1]==="e"||g+2<m.length&&r===m[g+1]&&r===m[g+2]?d:d+r:r.toUpperCase(),"");return c.split(" ").some(d=>d.length<2)&&(c=c.split(" ").map((d,r)=>r?d.toLowerCase():d).join("")),c.length<2&&(ERROR&&console.error("Name is too short! Random name will be selected"),c=Ja(nameBases[a].b.split(","))),c}getCulture(a,n,t,i){if(a===void 0)return ERROR&&console.error("Please define a culture"),"ERROR";const o=pack.cultures[a].base;return this.getBase(o,n,t,i)}getCultureShort(a){return a===void 0?(ERROR&&console.error("Please define a culture"),"ERROR"):this.getBaseShort(pack.cultures[a].base)}getBaseShort(a){const n=nameBases[a]?nameBases[a].min-1:void 0,t=n?Math.max(nameBases[a].max-2,n):void 0;return this.getBase(a,n,t,"")}validateSuffix(a,n){if(a.slice(-1*n.length)===n)return a;const t=n.charAt(0);return a.slice(-1)===t&&(a=a.slice(0,-1)),q(t)===q(a.slice(-1))&&q(t)===q(a.slice(-2,-1))&&(a=a.slice(0,-1)),a.slice(-1)===t&&(a=a.slice(0,-1)),a+n}addSuffix(a){const n=B(.8)?"ia":"land";return n==="ia"&&a.length>6?a=a.slice(0,-(a.length-3)):n==="land"&&a.length>6&&(a=a.slice(0,-(a.length-5))),this.validateSuffix(a,n)}getState(a,n,t){if(a===void 0)return ERROR&&console.error("Please define a base name"),"ERROR";if(n===void 0&&t===void 0)return ERROR&&console.error("Please define a culture"),"ERROR";if(t===void 0&&(t=pack.cultures[n].base),a.includes(" ")&&(a=Lt(a.replace(/ /g,"").toLowerCase())),a.length>6&&a.slice(-4)==="berg"&&(a=a.slice(0,-4)),a.length>5&&a.slice(-3)==="ton"&&(a=a.slice(0,-3)),t===5&&["sk","ev","ov"].includes(a.slice(-2)))a=a.slice(0,-2);else{if(t===12)return q(a.slice(-1))?a:`${a}u`;t===18&&B(.4)&&(a=q(a.slice(0,1).toLowerCase())?`Al${a.toLowerCase()}`:`Al ${a}`)}if(t>32&&t<42)return a;if(a.length>3&&q(a.slice(-1)))if(q(a.slice(-2,-1))&&B(.85))a=a.slice(0,-2);else if(B(.7))a=a.slice(0,-1);else return a;else if(B(.4))return a;let i="ia";const o=Math.random(),s=a.length;return t===3&&o<.03&&s<7||t===4&&o<.03&&s<7||t===13&&o<.03&&s<7?i="terra":t===2&&o<.03&&s<7?i="terre":t===0&&o<.5&&s<7||t===1&&o<.4&&s<7||t===6&&o<.3&&s<7||t===32&&o<.1&&s<7?i="land":t===7&&o<.1?i="eia":t===9&&o<.35?i="maa":t===15&&o<.4&&s<6?i="orszag":t===16?i=o<.6?"yurt":"eli":t===10?i="guk":t===11?i=" Guo":t===14?i=o<.5&&s<6?"tlan":"co":(t===17&&o<.8||t===18&&o<.8)&&(i="a"),this.validateSuffix(a,i)}getMapName(a){if(!a&&locked("mapName"))return;a&&locked("mapName")&&unlock("mapName");const n=B(.7)?2:B(.5)?Y(0,6):Y(0,31);if(!nameBases[n])return tip("Namebase is not found",!1,"error"),"";const t=nameBases[n].min-1,i=Math.max(nameBases[n].max-3,t),o=this.getBase(n,t,i,""),s=B(.7)?this.addSuffix(o):o;mapName.value=s}getNameBases(){return[{name:"German",i:0,min:5,max:12,d:"lt",m:0,b:"Achern,Aichhalden,Aitern,Albbruck,Alpirsbach,Altensteig,Althengstett,Appenweier,Auggen,Badenen,Badenweiler,Baiersbronn,Ballrechten,Bellingen,Berghaupten,Bernau,Biberach,Biederbach,Binzen,Birkendorf,Birkenfeld,Bischweier,Blumberg,Bollen,Bollschweil,Bonndorf,Bosingen,Braunlingen,Breisach,Breisgau,Breitnau,Brigachtal,Buchenbach,Buggingen,Buhl,Buhlertal,Calw,Dachsberg,Dobel,Donaueschingen,Dornhan,Dornstetten,Dottingen,Dunningen,Durbach,Durrheim,Ebhausen,Ebringen,Efringen,Egenhausen,Ehrenkirchen,Ehrsberg,Eimeldingen,Eisenbach,Elzach,Elztal,Emmendingen,Endingen,Engelsbrand,Enz,Enzklosterle,Eschbronn,Ettenheim,Ettlingen,Feldberg,Fischerbach,Fischingen,Fluorn,Forbach,Freiamt,Freiburg,Freudenstadt,Friedenweiler,Friesenheim,Frohnd,Furtwangen,Gaggenau,Geisingen,Gengenbach,Gernsbach,Glatt,Glatten,Glottertal,Gorwihl,Gottenheim,Grafenhausen,Grenzach,Griesbach,Gutach,Gutenbach,Hag,Haiterbach,Hardt,Harmersbach,Hasel,Haslach,Hausach,Hausen,Hausern,Heitersheim,Herbolzheim,Herrenalb,Herrischried,Hinterzarten,Hochenschwand,Hofen,Hofstetten,Hohberg,Horb,Horben,Hornberg,Hufingen,Ibach,Ihringen,Inzlingen,Kandern,Kappel,Kappelrodeck,Karlsbad,Karlsruhe,Kehl,Keltern,Kippenheim,Kirchzarten,Konigsfeld,Krozingen,Kuppenheim,Kussaberg,Lahr,Lauchringen,Lauf,Laufenburg,Lautenbach,Lauterbach,Lenzkirch,Liebenzell,Loffenau,Loffingen,Lorrach,Lossburg,Mahlberg,Malsburg,Malsch,March,Marxzell,Marzell,Maulburg,Monchweiler,Muhlenbach,Mullheim,Munstertal,Murg,Nagold,Neubulach,Neuenburg,Neuhausen,Neuried,Neuweiler,Niedereschach,Nordrach,Oberharmersbach,Oberkirch,Oberndorf,Oberbach,Oberried,Oberwolfach,Offenburg,Ohlsbach,Oppenau,Ortenberg,otigheim,Ottenhofen,Ottersweier,Peterstal,Pfaffenweiler,Pfalzgrafenweiler,Pforzheim,Rastatt,Renchen,Rheinau,Rheinfelden,Rheinmunster,Rickenbach,Rippoldsau,Rohrdorf,Rottweil,Rummingen,Rust,Sackingen,Sasbach,Sasbachwalden,Schallbach,Schallstadt,Schapbach,Schenkenzell,Schiltach,Schliengen,Schluchsee,Schomberg,Schonach,Schonau,Schonenberg,Schonwald,Schopfheim,Schopfloch,Schramberg,Schuttertal,Schwenningen,Schworstadt,Seebach,Seelbach,Seewald,Sexau,Simmersfeld,Simonswald,Sinzheim,Solden,Staufen,Stegen,Steinach,Steinen,Steinmauern,Straubenhardt,Stuhlingen,Sulz,Sulzburg,Teinach,Tiefenbronn,Tiengen,Titisee,Todtmoos,Todtnau,Todtnauberg,Triberg,Tunau,Tuningen,uhlingen,Unterkirnach,Reichenbach,Utzenfeld,Villingen,Villingendorf,Vogtsburg,Vohrenbach,Waldachtal,Waldbronn,Waldkirch,Waldshut,Wehr,Weil,Weilheim,Weisenbach,Wembach,Wieden,Wiesental,Wildbad,Wildberg,Winzeln,Wittlingen,Wittnau,Wolfach,Wutach,Wutoschingen,Wyhlen,Zavelstein"},{name:"English",i:1,min:6,max:11,d:"",m:.1,b:"Abingdon,Albrighton,Alcester,Almondbury,Altrincham,Amersham,Andover,Appleby,Ashboume,Atherstone,Aveton,Axbridge,Aylesbury,Baldock,Bamburgh,Barton,Basingstoke,Berden,Bere,Berkeley,Berwick,Betley,Bideford,Bingley,Birmingham,Blandford,Blechingley,Bodmin,Bolton,Bootham,Boroughbridge,Boscastle,Bossinney,Bramber,Brampton,Brasted,Bretford,Bridgetown,Bridlington,Bromyard,Bruton,Buckingham,Bungay,Burton,Calne,Cambridge,Canterbury,Carlisle,Castleton,Caus,Charmouth,Chawleigh,Chichester,Chillington,Chinnor,Chipping,Chisbury,Cleobury,Clifford,Clifton,Clitheroe,Cockermouth,Coleshill,Combe,Congleton,Crafthole,Crediton,Cuddenbeck,Dalton,Darlington,Dodbrooke,Drax,Dudley,Dunstable,Dunster,Dunwich,Durham,Dymock,Exeter,Exning,Faringdon,Felton,Fenny,Finedon,Flookburgh,Fowey,Frampton,Gateshead,Gatton,Godmanchester,Grampound,Grantham,Guildford,Halesowen,Halton,Harbottle,Harlow,Hatfield,Hatherleigh,Haydon,Helston,Henley,Hertford,Heytesbury,Hinckley,Hitchin,Holme,Hornby,Horsham,Kendal,Kenilworth,Kilkhampton,Kineton,Kington,Kinver,Kirby,Knaresborough,Knutsford,Launceston,Leighton,Lewes,Linton,Louth,Luton,Lyme,Lympstone,Macclesfield,Madeley,Malborough,Maldon,Manchester,Manningtree,Marazion,Marlborough,Marshfield,Mere,Merryfield,Middlewich,Midhurst,Milborne,Mitford,Modbury,Montacute,Mousehole,Newbiggin,Newborough,Newbury,Newenden,Newent,Norham,Northleach,Noss,Oakham,Olney,Orford,Ormskirk,Oswestry,Padstow,Paignton,Penkneth,Penrith,Penzance,Pershore,Petersfield,Pevensey,Pickering,Pilton,Pontefract,Portsmouth,Preston,Quatford,Reading,Redcliff,Retford,Rockingham,Romney,Rothbury,Rothwell,Salisbury,Saltash,Seaford,Seasalter,Sherston,Shifnal,Shoreham,Sidmouth,Skipsea,Skipton,Solihull,Somerton,Southam,Southwark,Standon,Stansted,Stapleton,Stottesdon,Sudbury,Swavesey,Tamerton,Tarporley,Tetbury,Thatcham,Thaxted,Thetford,Thornbury,Tintagel,Tiverton,Torksey,Totnes,Towcester,Tregoney,Trematon,Tutbury,Uxbridge,Wallingford,Wareham,Warenmouth,Wargrave,Warton,Watchet,Watford,Wendover,Westbury,Westcheap,Weymouth,Whitford,Wickwar,Wigan,Wigmore,Winchelsea,Winkleigh,Wiscombe,Witham,Witheridge,Wiveliscombe,Woodbury,Yeovil"},{name:"French",i:2,min:5,max:13,d:"nlrs",m:.1,b:"Adon,Aillant,Amilly,Andonville,Ardon,Artenay,Ascheres,Ascoux,Attray,Aubin,Audeville,Aulnay,Autruy,Auvilliers,Auxy,Aveyron,Baccon,Bardon,Barville,Batilly,Baule,Bazoches,Beauchamps,Beaugency,Beaulieu,Beaune,Bellegarde,Boesses,Boigny,Boiscommun,Boismorand,Boisseaux,Bondaroy,Bonnee,Bonny,Bordes,Bou,Bougy,Bouilly,Boulay,Bouzonville,Bouzy,Boynes,Bray,Breteau,Briare,Briarres,Bricy,Bromeilles,Bucy,Cepoy,Cercottes,Cerdon,Cernoy,Cesarville,Chailly,Chaingy,Chalette,Chambon,Champoulet,Chanteau,Chantecoq,Chapell,Charme,Charmont,Charsonville,Chateau,Chateauneuf,Chatel,Chatenoy,Chatillon,Chaussy,Checy,Chevannes,Chevillon,Chevilly,Chevry,Chilleurs,Choux,Chuelles,Clery,Coinces,Coligny,Combleux,Combreux,Conflans,Corbeilles,Corquilleroy,Cortrat,Coudroy,Coullons,Coulmiers,Courcelles,Courcy,Courtemaux,Courtempierre,Courtenay,Cravant,Crottes,Dadonville,Dammarie,Dampierre,Darvoy,Desmonts,Dimancheville,Donnery,Dordives,Dossainville,Douchy,Dry,Echilleuses,Egry,Engenville,Epieds,Erceville,Ervauville,Escrennes,Escrignelles,Estouy,Faverelles,Fay,Feins,Ferolles,Ferrieres,Fleury,Fontenay,Foret,Foucherolles,Freville,Gatinais,Gaubertin,Gemigny,Germigny,Gidy,Gien,Girolles,Givraines,Gondreville,Grangermont,Greneville,Griselles,Guigneville,Guilly,Gyleslonains,Huetre,Huisseau,Ingrannes,Ingre,Intville,Isdes,Ivre,Jargeau,Jouy,Juranville,Bussiere,Laas,Ladon,Lailly,Langesse,Leouville,Ligny,Lombreuil,Lorcy,Lorris,Loury,Louzouer,Malesherbois,Marcilly,Mardie,Mareau,Marigny,Marsainvilliers,Melleroy,Menestreau,Merinville,Messas,Meung,Mezieres,Migneres,Mignerette,Mirabeau,Montargis,Montbarrois,Montbouy,Montcresson,Montereau,Montigny,Montliard,Mormant,Morville,Moulinet,Moulon,Nancray,Nargis,Nesploy,Neuville,Neuvy,Nevoy,Nibelle,Nogent,Noyers,Ocre,Oison,Olivet,Ondreville,Onzerain,Orleans,Ormes,Orville,Oussoy,Outarville,Ouzouer,Pannecieres,Pannes,Patay,Paucourt,Pers,Pierrefitte,Pithiverais,Pithiviers,Poilly,Potier,Prefontaines,Presnoy,Pressigny,Puiseaux,Quiers,Ramoulu,Rebrechien,Rouvray,Rozieres,Rozoy,Ruan,Sandillon,Santeau,Saran,Sceaux,Seichebrieres,Semoy,Sennely,Sermaises,Sigloy,Solterre,Sougy,Sully,Sury,Tavers,Thignonville,Thimory,Thorailles,Thou,Tigy,Tivernon,Tournoisis,Trainou,Treilles,Trigueres,Trinay,Vannes,Varennes,Vennecy,Vieilles,Vienne,Viglain,Vignes,Villamblain,Villemandeur,Villemoutiers,Villemurlin,Villeneuve,Villereau,Villevoques,Villorceau,Vimory,Vitry,Vrigny"},{name:"Italian",i:3,min:5,max:12,d:"cltr",m:.1,b:"Accumoli,Acquafondata,Acquapendente,Acuto,Affile,Agosta,Alatri,Albano,Allumiere,Alvito,Amaseno,Amatrice,Anagni,Anguillara,Anticoli,Antrodoco,Anzio,Aprilia,Aquino,Arcinazzo,Ariccia,Arpino,Arsoli,Ausonia,Bagnoregio,Bassiano,Bellegra,Belmonte,Bolsena,Bomarzo,Borgorose,Boville,Bracciano,Broccostella,Calcata,Camerata,Campagnano,Campoli,Canale,Canino,Cantalice,Cantalupo,Capranica,Caprarola,Carbognano,Casalattico,Casalvieri,Castelforte,Castelnuovo,Castiglione,Castro,Castrocielo,Ceccano,Celleno,Cellere,Cerreto,Cervara,Cerveteri,Ciampino,Ciciliano,Cittaducale,Cittareale,Civita,Civitella,Colfelice,Colleferro,Collepardo,Colonna,Concerviano,Configni,Contigliano,Cori,Cottanello,Esperia,Faleria,Farnese,Ferentino,Fiamignano,Filacciano,Fiuggi,Fiumicino,Fondi,Fontana,Fonte,Fontechiari,Formia,Frascati,Frasso,Frosinone,Fumone,Gaeta,Gallese,Gavignano,Genazzano,Giuliano,Gorga,Gradoli,Grottaferrata,Grotte,Guarcino,Guidonia,Ischia,Isola,Labico,Labro,Ladispoli,Latera,Lenola,Leonessa,Licenza,Longone,Lubriano,Maenza,Magliano,Marano,Marcellina,Marcetelli,Marino,Mazzano,Mentana,Micigliano,Minturno,Montalto,Montasola,Montebuono,Monteflavio,Montelanico,Monteleone,Montenero,Monterosi,Moricone,Morlupo,Nazzano,Nemi,Nerola,Nespolo,Nettuno,Norma,Olevano,Onano,Oriolo,Orte,Orvinio,Paganico,Paliano,Palombara,Patrica,Pescorocchiano,Petrella,Piansano,Picinisco,Pico,Piedimonte,Piglio,Pignataro,Poggio,Poli,Pomezia,Pontecorvo,Pontinia,Ponzano,Posta,Pozzaglia,Priverno,Proceno,Rignano,Riofreddo,Ripi,Rivodutri,Rocca,Roccagorga,Roccantica,Roccasecca,Roiate,Ronciglione,Roviano,Salisano,Sambuci,Santa,Santini,Scandriglia,Segni,Selci,Sermoneta,Serrone,Settefrati,Sezze,Sgurgola,Sonnino,Sora,Soriano,Sperlonga,Spigno,Subiaco,Supino,Sutri,Tarano,Tarquinia,Terelle,Terracina,Tivoli,Toffia,Tolfa,Torrice,Torricella,Trevi,Trevignano,Trivigliano,Turania,Tuscania,Valentano,Vallecorsa,Vallemaio,Vallepietra,Vallerano,Vasanello,Vejano,Velletri,Ventotene,Veroli,Vetralla,Vicalvi,Vico,Vicovaro,Vignanello,Viterbo,Viticuso,Vitorchiano,Vivaro,Zagarolo"},{name:"Castillian",i:4,min:5,max:11,d:"lr",m:0,b:"Ajofrin,Alameda,Alaminos,Albares,Albarreal,Albendiego,Alcanizo,Alcaudete,Alcolea,Aldea,Aldeanueva,Algar,Algora,Alhondiga,Almadrones,Almendral,Alovera,Anguita,Arbancon,Argecilla,Arges,Arroyo,Atanzon,Atienza,Azuqueca,Baides,Banos,Bargas,Barriopedro,Belvis,Berninches,Brihuega,Buenaventura,Burgos,Burguillos,Bustares,Cabanillas,Calzada,Camarena,Campillo,Cantalojas,Cardiel,Carmena,Casas,Castejon,Castellar,Castilforte,Castillo,Castilnuevo,Cazalegas,Centenera,Cervera,Checa,Chozas,Chueca,Cifuentes,Cincovillas,Ciruelas,Cogollor,Cogolludo,Consuegra,Copernal,Corral,Cuerva,Domingo,Dosbarrios,Driebes,Duron,Escalona,Escalonilla,Escamilla,Escopete,Espinosa,Esplegares,Esquivias,Estables,Estriegana,Fontanar,Fuembellida,Fuensalida,Fuentelsaz,Gajanejos,Galvez,Gascuena,Gerindote,Guadamur,Heras,Herreria,Herreruela,Hinojosa,Hita,Hombrados,Hontanar,Hormigos,Huecas,Huerta,Humanes,Illana,Illescas,Iniestola,Irueste,Jadraque,Jirueque,Lagartera,Ledanca,Lillo,Lominchar,Loranca,Lucillos,Luzaga,Luzon,Madrid,Magan,Malaga,Malpica,Manzanar,Maqueda,Masegoso,Matillas,Medranda,Megina,Mejorada,Millana,Milmarcos,Mirabueno,Miralrio,Mocejon,Mochales,Molina,Mondejar,Montarron,Mora,Moratilla,Morenilla,Navas,Negredo,Noblejas,Numancia,Nuno,Ocana,Ocentejo,Olias,Olmeda,Ontigola,Orea,Orgaz,Oropesa,Otero,Palma,Pardos,Paredes,Penalver,Pepino,Peralejos,Pinilla,Pioz,Piqueras,Portillo,Poveda,Pozo,Pradena,Prados,Puebla,Puerto,Quero,Quintanar,Rebollosa,Retamoso,Riba,Riofrio,Robledo,Romanillos,Romanones,Rueda,Salmeron,Santiuste,Santo,Sauca,Segura,Selas,Semillas,Sesena,Setiles,Sevilla,Siguenza,Solanillos,Somolinos,Sonseca,Sotillo,Talavera,Taravilla,Tembleque,Tendilla,Tierzo,Torralba,Torre,Torrejon,Torrijos,Tortola,Tortuera,Totanes,Trillo,Uceda,Ugena,Urda,Utande,Valdesotos,Valhermoso,Valtablado,Valverde,Velada,Viana,Yebra,Yuncos,Yunquera,Zaorejas,Zarzuela,Zorita"},{name:"Ruthenian",i:5,min:5,max:10,d:"",m:0,b:"Belgorod,Beloberezhye,Belyi,Belz,Berestiy,Berezhets,Berezovets,Berezutsk,Bobruisk,Bolonets,Borisov,Borovsk,Bozhesk,Bratslav,Bryansk,Brynsk,Buryn,Byhov,Chechersk,Chemesov,Cheremosh,Cherlen,Chern,Chernigov,Chernitsa,Chernobyl,Chernogorod,Chertoryesk,Chetvertnia,Demyansk,Derevesk,Devyagoresk,Dichin,Dmitrov,Dorogobuch,Dorogobuzh,Drestvin,Drokov,Drutsk,Dubechin,Dubichi,Dubki,Dubkov,Dveren,Galich,Glebovo,Glinsk,Goloty,Gomiy,Gorodets,Gorodische,Gorodno,Gorohovets,Goroshin,Gorval,Goryshon,Holm,Horobor,Hoten,Hotin,Hotmyzhsk,Ilovech,Ivan,Izborsk,Izheslavl,Kamenets,Kanev,Karachev,Karna,Kavarna,Klechesk,Klyapech,Kolomyya,Kolyvan,Kopyl,Korec,Kornik,Korochunov,Korshev,Korsun,Koshkin,Kotelno,Kovyla,Kozelsk,Kozelsk,Kremenets,Krichev,Krylatsk,Ksniatin,Kulatsk,Kursk,Kursk,Lebedev,Lida,Logosko,Lomihvost,Loshesk,Loshichi,Lubech,Lubno,Lubutsk,Lutsk,Luchin,Luki,Lukoml,Luzha,Lvov,Mtsensk,Mdin,Medniki,Melecha,Merech,Meretsk,Mescherskoe,Meshkovsk,Metlitsk,Mezetsk,Mglin,Mihailov,Mikitin,Mikulino,Miloslavichi,Mogilev,Mologa,Moreva,Mosalsk,Moschiny,Mozyr,Mstislav,Mstislavets,Muravin,Nemech,Nemiza,Nerinsk,Nichan,Novgorod,Novogorodok,Obolichi,Obolensk,Obolensk,Oleshsk,Olgov,Omelnik,Opoka,Opoki,Oreshek,Orlets,Osechen,Oster,Ostrog,Ostrov,Perelai,Peremil,Peremyshl,Pererov,Peresechen,Perevitsk,Pereyaslav,Pinsk,Ples,Polotsk,Pronsk,Proposhesk,Punia,Putivl,Rechitsa,Rodno,Rogachev,Romanov,Romny,Roslavl,Rostislavl,Rostovets,Rsha,Ruza,Rybchesk,Rylsk,Rzhavesk,Rzhev,Rzhischev,Sambor,Serensk,Serensk,Serpeysk,Shilov,Shuya,Sinech,Sizhka,Skala,Slovensk,Slutsk,Smedin,Sneporod,Snitin,Snovsk,Sochevo,Sokolec,Starica,Starodub,Stepan,Sterzh,Streshin,Sutesk,Svinetsk,Svisloch,Terebovl,Ternov,Teshilov,Teterin,Tiversk,Torchevsk,Toropets,Torzhok,Tripolye,Trubchevsk,Tur,Turov,Usvyaty,Uteshkov,Vasilkov,Velil,Velye,Venev,Venicha,Verderev,Vereya,Veveresk,Viazma,Vidbesk,Vidychev,Voino,Volodimer,Volok,Volyn,Vorobesk,Voronich,Voronok,Vorotynsk,Vrev,Vruchiy,Vselug,Vyatichsk,Vyatka,Vyshegorod,Vyshgorod,Vysokoe,Yagniatin,Yaropolch,Yasenets,Yuryev,Yuryevets,Zaraysk,Zhitomel,Zholvazh,Zizhech,Zubkov,Zudechev,Zvenigorod"},{name:"Nordic",i:6,min:6,max:10,d:"kln",m:.1,b:"Akureyri,Aldra,Alftanes,Andenes,Austbo,Auvog,Bakkafjordur,Ballangen,Bardal,Beisfjord,Bifrost,Bildudalur,Bjerka,Bjerkvik,Bjorkosen,Bliksvaer,Blokken,Blonduos,Bolga,Bolungarvik,Borg,Borgarnes,Bosmoen,Bostad,Bostrand,Botsvika,Brautarholt,Breiddalsvik,Bringsli,Brunahlid,Budardalur,Byggdakjarni,Dalvik,Djupivogur,Donnes,Drageid,Drangsnes,Egilsstadir,Eiteroga,Elvenes,Engavogen,Ertenvog,Eskifjordur,Evenes,Eyrarbakki,Fagernes,Fallmoen,Fellabaer,Fenes,Finnoya,Fjaer,Fjelldal,Flakstad,Flateyri,Flostrand,Fludir,Gardaber,Gardur,Gimstad,Givaer,Gjeroy,Gladstad,Godoya,Godoynes,Granmoen,Gravdal,Grenivik,Grimsey,Grindavik,Grytting,Hafnir,Halsa,Hauganes,Haugland,Hauknes,Hella,Helland,Hellissandur,Hestad,Higrav,Hnifsdalur,Hofn,Hofsos,Holand,Holar,Holen,Holkestad,Holmavik,Hopen,Hovden,Hrafnagil,Hrisey,Husavik,Husvik,Hvammstangi,Hvanneyri,Hveragerdi,Hvolsvollur,Igeroy,Indre,Inndyr,Innhavet,Innes,Isafjordur,Jarklaustur,Jarnsreykir,Junkerdal,Kaldvog,Kanstad,Karlsoy,Kavosen,Keflavik,Kjelde,Kjerstad,Klakk,Kopasker,Kopavogur,Korgen,Kristnes,Krutoga,Krystad,Kvina,Lande,Laugar,Laugaras,Laugarbakki,Laugarvatn,Laupstad,Leines,Leira,Leiren,Leland,Lenvika,Loding,Lodingen,Lonsbakki,Lopsmarka,Lovund,Luroy,Maela,Melahverfi,Meloy,Mevik,Misvaer,Mornes,Mosfellsber,Moskenes,Myken,Naurstad,Nesberg,Nesjahverfi,Nesset,Nevernes,Obygda,Ofoten,Ogskardet,Okervika,Oknes,Olafsfjordur,Oldervika,Olstad,Onstad,Oppeid,Oresvika,Orsnes,Orsvog,Osmyra,Overdal,Prestoya,Raudalaekur,Raufarhofn,Reipo,Reykholar,Reykholt,Reykjahlid,Rif,Rinoya,Rodoy,Rognan,Rosvika,Rovika,Salhus,Sanden,Sandgerdi,Sandoker,Sandset,Sandvika,Saudarkrokur,Selfoss,Selsoya,Sennesvik,Setso,Siglufjordur,Silvalen,Skagastrond,Skjerstad,Skonland,Skorvogen,Skrova,Sleneset,Snubba,Softing,Solheim,Solheimar,Sorarnoy,Sorfugloy,Sorland,Sormela,Sorvaer,Sovika,Stamsund,Stamsvika,Stave,Stokka,Stokkseyri,Storjord,Storo,Storvika,Strand,Straumen,Strendene,Sudavik,Sudureyri,Sundoya,Sydalen,Thingeyri,Thorlakshofn,Thorshofn,Tjarnabyggd,Tjotta,Tosbotn,Traelnes,Trofors,Trones,Tverro,Ulvsvog,Unnstad,Utskor,Valla,Vandved,Varmahlid,Vassos,Vevelstad,Vidrek,Vik,Vikholmen,Vogar,Vogehamn,Vopnafjordur"},{name:"Greek",i:7,min:5,max:11,d:"s",m:.1,b:"Abdera,Acharnae,Aegae,Aegina,Agrinion,Aigosthena,Akragas,Akroinon,Akrotiri,Alalia,Alexandria,Amarynthos,Amaseia,Amphicaea,Amphigeneia,Amphipolis,Antipatrea,Antiochia,Apamea,Aphidna,Apollonia,Argos,Artemita,Argyropolis,Asklepios,Athenai,Athmonia,Bhrytos,Borysthenes,Brauron,Byblos,Byzantion,Bythinion,Calydon,Chamaizi,Chalcis,Chios,Cleona,Corcyra,Croton,Cyrene,Cythera,Decelea,Delos,Delphi,Dicaearchia,Didyma,Dion,Dioscurias,Dodona,Dorylaion,Elateia,Eleusis,Eleutherna,Emporion,Ephesos,Epidamnos,Epidauros,Epizephyrian,Erythrae,Eubea,Golgi,Gonnos,Gorgippia,Gournia,Gortyn,Gytion,Hagios,Halicarnassos,Heliopolis,Hellespontos,Heloros,Heraclea,Hierapolis,Himera,Histria,Hubla,Hyele,Ialysos,Iasos,Idalion,Imbros,Iolcos,Itanos,Ithaca,Juktas,Kallipolis,Kameiros,Karistos,Kasmenai,Kepoi,Kimmerikon,Knossos,Korinthos,Kos,Kourion,Kydonia,Kyrenia,Lamia,Lampsacos,Laodicea,Lapithos,Larissa,Lebena,Lefkada,Lekhaion,Leibethra,Leontinoi,Lilaea,Lindos,Lissos,Magnesia,Mantineia,Marathon,Marmara,Massalia,Megalopolis,Megara,Metapontion,Methumna,Miletos,Morgantina,Mulai,Mukenai,Myonia,Myra,Myrmekion,Myos,Nauplios,Naucratis,Naupaktos,Naxos,Neapolis,Nemea,Nicaea,Nicopolis,Nymphaion,Nysa,Odessos,Olbia,Olympia,Olynthos,Opos,Orchomenos,Oricos,Orestias,Oreos,Onchesmos,Pagasae,Palaikastro,Pandosia,Panticapaion,Paphos,Pargamon,Paros,Pegai,Pelion,Peiraies,Phaistos,Phaleron,Pharos,Pithekussa,Philippopolis,Phocaea,Pinara,Pisa,Pitane,Plataea,Poseidonia,Potidaea,Pseira,Psychro,Pteleos,Pydna,Pylos,Pyrgos,Rhamnos,Rhithymna,Rhypae,Rizinia,Rodos,Salamis,Samos,Skyllaion,Seleucia,Semasos,Sestos,Scidros,Sicyon,,Sinope,Siris,Smyrna,Sozopolis,Sparta,Stagiros,Stratos,Stymphalos,Sybaris,Surakousai,Taras,Tanagra,Tanais,Tauromenion,Tegea,Temnos,Teos,Thapsos,Thassos,Thebai,Theodosia,Therma,Thespian,Thronion,Thoricos,Thurii,Thyreum,Thyria,Tithoraea,Tomis,Tragurion,Tripolis,Troliton,Troy,Tylissos,Tyros,Vathypetros,Zakynthos,Zakros"},{name:"Roman",i:8,min:6,max:11,d:"ln",m:.1,b:"Abila,Adflexum,Adnicrem,Aelia,Aelius,Aeminium,Aequum,Agrippina,Agrippinae,Ala,Albanianis,Aleria,Ambianum,Andautonia,Apulum,Aquae,Aquaegranni,Aquensis,Aquileia,Aquincum,Arae,Argentoratum,Ariminum,Ascrivium,Asturica,Atrebatum,Atuatuca,Augusta,Aurelia,Aurelianorum,Batavar,Batavorum,Belum,Biriciana,Blestium,Bonames,Bonna,Bononia,Borbetomagus,Bovium,Bracara,Brigantium,Burgodunum,Caesaraugusta,Caesarea,Caesaromagus,Calleva,Camulodunum,Cannstatt,Cantiacorum,Capitolina,Caralis,Castellum,Castra,Castrum,Cibalae,Clausentum,Colonia,Concangis,Condate,Confluentes,Conimbriga,Corduba,Coria,Corieltauvorum,Corinium,Coriovallum,Cornoviorum,Danum,Deva,Dianium,Divodurum,Dobunnorum,Drusi,Dubris,Dumnoniorum,Durnovaria,Durocobrivis,Durocornovium,Duroliponte,Durovernum,Durovigutum,Eboracum,Ebusus,Edetanorum,Emerita,Emona,Emporiae,Euracini,Faventia,Flaviae,Florentia,Forum,Gerulata,Gerunda,Gesoscribate,Glevensium,Hadriani,Herculanea,Isca,Italica,Iulia,Iuliobrigensium,Iuvavum,Lactodurum,Lagentium,Lapurdum,Lauri,Legionis,Lemanis,Lentia,Lepidi,Letocetum,Lindinis,Lindum,Lixus,Londinium,Lopodunum,Lousonna,Lucus,Lugdunum,Luguvalium,Lutetia,Mancunium,Marsonia,Martius,Massa,Massilia,Matilo,Mattiacorum,Mediolanum,Mod,Mogontiacum,Moridunum,Mursa,Naissus,Nervia,Nida,Nigrum,Novaesium,Noviomagus,Olicana,Olisippo,Ovilava,Parisiorum,Partiscum,Paterna,Pistoria,Placentia,Pollentia,Pomaria,Pompeii,Pons,Portus,Praetoria,Praetorium,Pullum,Ragusium,Ratae,Raurica,Ravenna,Regina,Regium,Regulbium,Rigomagus,Roma,Romula,Rutupiae,Salassorum,Salernum,Salona,Scalabis,Segovia,Silurum,Sirmium,Siscia,Sorviodurum,Sumelocenna,Tarraco,Taurinorum,Theranda,Traiectum,Treverorum,Tungrorum,Turicum,Ulpia,Valentia,Venetiae,Venta,Verulamium,Vesontio,Vetera,Victoriae,Victrix,Villa,Viminacium,Vindelicorum,Vindobona,Vinovia,Viroconium"},{name:"Finnic",i:9,min:5,max:11,d:"akiut",m:0,b:"Aanekoski,Ahlainen,Aholanvaara,Ahtari,Aijala,Akaa,Alajarvi,Antsla,Aspo,Bennas,Bjorkoby,Elva,Emasalo,Espoo,Esse,Evitskog,Forssa,Haapamaki,Haapavesi,Haapsalu,Hameenlinna,Hanko,Harjavalta,Hattuvaara,Hautajarvi,Havumaki,Heinola,Hetta,Hinkabole,Hirmula,Hossa,Huittinen,Husula,Hyryla,Hyvinkaa,Ikaalinen,Iskmo,Itakoski,Jamsa,Jarvenpaa,Jeppo,Jioesuu,Jiogeva,Joensuu,Jokikyla,Jungsund,Jyvaskyla,Kaamasmukka,Kajaani,Kalajoki,Kallaste,Kankaanpaa,Karkku,Karpankyla,Kaskinen,Kasnas,Kauhajoki,Kauhava,Kauniainen,Kauvatsa,Kehra,Kellokoski,Kelottijarvi,Kemi,Kemijarvi,Kerava,Keuruu,Kiljava,Kiuruvesi,Kivesjarvi,Kiviioli,Kivisuo,Klaukkala,Klovskog,Kohtlajarve,Kokemaki,Kokkola,Kolho,Koskue,Kotka,Kouva,Kaupunki,Kuhmo,Kunda,Kuopio,Kuressaare,Kurikka,Kuusamo,Kylmalankyla,Lahti,Laitila,Lankipohja,Lansikyla,Lapua,Laurila,Lautiosaari,Lempaala,Lepsama,Liedakkala,Lieksa,Littoinen,Lohja,Loimaa,Loksa,Loviisa,Malmi,Mantta,Matasvaara,Maula,Miiluranta,Mioisakula,Munapirtti,Mustvee,Muurahainen,Naantali,Nappa,Narpio,Niinimaa,Niinisalo,Nikkila,Nilsia,Nivala,Nokia,Nummela,Nuorgam,Nuvvus,Obbnas,Oitti,Ojakkala,Onninen,Orimattila,Orivesi,Otanmaki,Otava,Otepaa,Oulainen,Oulu,Paavola,Paide,Paimio,Pakankyla,Paldiski,Parainen,Parkumaki,Parola,Perttula,Pieksamaki,Pioltsamaa,Piolva,Pohjavaara,Porhola,Porrasa,Porvoo,Pudasjarvi,Purmo,Pyhajarvi,Raahe,Raasepori,Raisio,Rajamaki,Rakvere,Rapina,Rapla,Rauma,Rautio,Reposaari,Riihimaki,Rovaniemi,Roykka,Ruonala,Ruottala,Rutalahti,Saarijarvi,Salo,Sastamala,Saue,Savonlinna,Seinajoki,Sillamae,Siuntio,Sompujarvi,Suonenjoki,Suurejaani,Syrjantaka,Tamsalu,Tapa,Temmes,Tiorva,Tormasenvaara,Tornio,Tottijarvi,Tulppio,Turenki,Turi,Tuukkala,Tuurala,Tuuri,Tuuski,Tuusniemi,Ulvila,Unari,Upinniemi,Utti,Uusikaupunki,Vaaksy,Vaalimaa,Vaarinmaja,Vaasa,Vainikkala,Valga,Valkeakoski,Vantaa,Varkaus,Vehkapera,Vehmasmaki,Vieki,Vierumaki,Viitasaari,Viljandi,Vilppula,Viohma,Vioru,Virrat,Ylike,Ylivieska,Ylojarvi"},{name:"Korean",i:10,min:5,max:11,d:"",m:0,b:"Anjung,Ansan,Anseong,Anyang,Aphae,Apo,Baekseok,Baeksu,Beolgyo,Boeun,Boseong,Busan,Buyeo,Changnyeong,Changwon,Cheonan,Cheongdo,Cheongjin,Cheongsong,Cheongyang,Cheorwon,Chirwon,Chuncheon,Chungju,Daedeok,Daegaya,Daejeon,Damyang,Dangjin,Dasa,Donghae,Dongsong,Doyang,Eonyang,Gaeseong,Ganggyeong,Ganghwa,Gangneung,Ganseong,Gaun,Geochang,Geoje,Geoncheon,Geumho,Geumil,Geumwang,Gijang,Gimcheon,Gimhwa,Gimje,Goa,Gochang,Gohan,Gongdo,Gongju,Goseong,Goyang,Gumi,Gunpo,Gunsan,Guri,Gurye,Gwangju,Gwangyang,Gwansan,Gyeongseong,Hadong,Hamchang,Hampyeong,Hamyeol,Hanam,Hapcheon,Hayang,Heungnam,Hongnong,Hongseong,Hwacheon,Hwando,Hwaseong,Hwasun,Hwawon,Hyangnam,Incheon,Inje,Iri,Janghang,Jangheung,Jangseong,Jangseungpo,Jangsu,Jecheon,Jeju,Jeomchon,Jeongeup,Jeonggwan,Jeongju,Jeongok,Jeongseon,Jeonju,Jido,Jiksan,Jinan,Jincheon,Jindo,Jingeon,Jinjeop,Jinnampo,Jinyeong,Jocheon,Jochiwon,Jori,Maepo,Mangyeong,Mokpo,Muju,Munsan,Naesu,Naju,Namhae,Namwon,Namyang,Namyangju,Nongong,Nonsan,Ocheon,Okcheon,Okgu,Onam,Onsan,Onyang,Opo,Paengseong,Pogok,Poseung,Pungsan,Pyeongchang,Pyeonghae,Pyeongyang,Sabi,Sacheon,Samcheok,Samho,Samrye,Sancheong,Sangdong,Sangju,Sapgyo,Sariwon,Sejong,Seocheon,Seogwipo,Seonghwan,Seongjin,Seongju,Seongnam,Seongsan,Seosan,Seungju,Siheung,Sindong,Sintaein,Soheul,Sokcho,Songak,Songjeong,Songnim,Songtan,Suncheon,Taean,Taebaek,Tongjin,Uijeongbu,Uiryeong,Uiwang,Uljin,Ulleung,Unbong,Ungcheon,Ungjin,Waegwan,Wando,Wayang,Wiryeseong,Wondeok,Yangju,Yangsan,Yangyang,Yecheon,Yeomchi,Yeoncheon,Yeongam,Yeongcheon,Yeongdeok,Yeongdong,Yeonggwang,Yeongju,Yeongwol,Yeongyang,Yeonil,Yongin,Yongjin,Yugu"},{name:"Chinese",i:11,min:5,max:10,d:"",m:0,b:"Anding,Anlu,Anqing,Anshun,Baixing,Banyang,Baoqing,Binzhou,Caozhou,Changbai,Changchun,Changde,Changling,Changsha,Changzhou,Chengdu,Chenzhou,Chizhou,Chongqing,Chuxiong,Chuzhou,Dading,Daming,Datong,Daxing,Dengzhou,Deqing,Dihua,Dingli,Dongan,Dongchang,Dongchuan,Dongping,Duyun,Fengtian,Fengxiang,Fengyang,Fenzhou,Funing,Fuzhou,Ganzhou,Gaoyao,Gaozhou,Gongchang,Guangnan,Guangning,Guangping,Guangxin,Guangzhou,Guiyang,Hailong,Hangzhou,Hanyang,Hanzhong,Heihe,Hejian,Henan,Hengzhou,Hezhong,Huaian,Huaiqing,Huanglong,Huangzhou,Huining,Hulan,Huzhou,Jiading,Jian,Jianchang,Jiangning,Jiankang,Jiaxing,Jiayang,Jilin,Jinan,Jingjiang,Jingzhao,Jinhua,Jinzhou,Jiujiang,Kaifeng,Kaihua,Kangding,Kuizhou,Laizhou,Lianzhou,Liaoyang,Lijiang,Linan,Linhuang,Lintao,Liping,Liuzhou,Longan,Longjiang,Longxing,Luan,Lubin,Luzhou,Mishan,Nanan,Nanchang,Nandian,Nankang,Nanyang,Nenjiang,Ningbo,Ningguo,Ningwu,Ningxia,Ningyuan,Pingjiang,Pingliang,Pingyang,Puer,Puzhou,Qianzhou,Qingyang,Qingyuan,Qingzhou,Qujing,Quzhou,Raozhou,Rende,Ruian,Ruizhou,Shafeng,Shajing,Shaoqing,Shaowu,Shaoxing,Shaozhou,Shinan,Shiqian,Shouchun,Shuangcheng,Shulei,Shunde,Shuntian,Shuoping,Sicheng,Sinan,Sizhou,Songjiang,Suiding,Suihua,Suining,Suzhou,Taian,Taibei,Taiping,Taiwan,Taiyuan,Taizhou,Taonan,Tengchong,Tingzhou,Tongchuan,Tongqing,Tongzhou,Weihui,Wensu,Wenzhou,Wuchang,Wuding,Wuzhou,Xian,Xianchun,Xianping,Xijin,Xiliang,Xincheng,Xingan,Xingde,Xinghua,Xingjing,Xingyi,Xingyuan,Xingzhong,Xining,Xinmen,Xiping,Xuanhua,Xunzhou,Xuzhou,Yanan,Yangzhou,Yanji,Yanping,Yanzhou,Yazhou,Yichang,Yidu,Yilan,Yili,Yingchang,Yingde,Yingtian,Yingzhou,Yongchang,Yongping,Yongshun,Yuanzhou,Yuezhou,Yulin,Yunnan,Yunyang,Zezhou,Zhang,Zhangzhou,Zhaoqing,Zhaotong,Zhenan,Zhending,Zhenhai,Zhenjiang,Zhenxi,Zhenyun,Zhongshan,Zunyi"},{name:"Japanese",i:12,min:4,max:10,d:"",m:0,b:"Abira,Aga,Aikawa,Aizumisato,Ajigasawa,Akkeshi,Amagi,Ami,Ando,Asakawa,Ashikita,Bandai,Biratori,Chonan,Esashi,Fuchu,Fujimi,Funagata,Genkai,Godo,Goka,Gonohe,Gyokuto,Haboro,Hamatonbetsu,Harima,Hashikami,Hayashima,Heguri,Hidaka,Higashiura,Hiranai,Hirogawa,Hiroo,Hodatsushimizu,Hoki,Hokuei,Hokuryu,Horokanai,Ibigawa,Ichikai,Ichikawa,Ichinohe,Iijima,Iizuna,Ikawa,Inagawa,Itakura,Iwaizumi,Iwate,Kaisei,Kamifurano,Kamiita,Kamijima,Kamikawa,Kamishihoro,Kamiyama,Kanda,Kanna,Kasagi,Kasuya,Katsuura,Kawabe,Kawamoto,Kawanehon,Kawanishi,Kawara,Kawasaki,Kawatana,Kawazu,Kihoku,Kikonai,Kin,Kiso,Kitagata,Kitajima,Kiyama,Kiyosato,Kofu,Koge,Kohoku,Kokonoe,Kora,Kosa,Kotohira,Kudoyama,Kumejima,Kumenan,Kumiyama,Kunitomi,Kurate,Kushimoto,Kutchan,Kyonan,Kyotamba,Mashike,Matsumae,Mifune,Mihama,Minabe,Minami,Minamiechizen,Minamitane,Misaki,Misasa,Misato,Miyashiro,Miyoshi,Mori,Moseushi,Mutsuzawa,Nagaizumi,Nagatoro,Nagayo,Nagomi,Nakadomari,Nakanojo,Nakashibetsu,Namegawa,Nanbu,Nanporo,Naoshima,Nasu,Niseko,Nishihara,Nishiizu,Nishikatsura,Nishikawa,Nishinoshima,Nishiwaga,Nogi,Noto,Nyuzen,Oarai,Obuse,Odai,Ogawara,Oharu,Oirase,Oishida,Oiso,Oizumi,Oji,Okagaki,Okutama,Omu,Ono,Osaka,Otobe,Otsuki,Owani,Reihoku,Rifu,Rikubetsu,Rishiri,Rokunohe,Ryuo,Saka,Sakuho,Samani,Satsuma,Sayo,Saza,Setana,Shakotan,Shibayama,Shikama,Shimamoto,Shimizu,Shintomi,Shirakawa,Shisui,Shitara,Sobetsu,Sue,Sumita,Suooshima,Suttsu,Tabuse,Tachiarai,Tadami,Tadaoka,Taiji,Taiki,Takachiho,Takahama,Taketoyo,Taragi,Tateshina,Tatsugo,Tawaramoto,Teshikaga,Tobe,Tokigawa,Toma,Tomioka,Tonosho,Tosa,Toyokoro,Toyotomi,Toyoyama,Tsubata,Tsubetsu,Tsukigata,Tsuno,Tsuwano,Umi,Wakasa,Yamamoto,Yamanobe,Yamatsuri,Yanaizu,Yasuda,Yoichi,Yonaguni,Yoro,Yoshino,Yubetsu,Yugawara,Yuni,Yusuhara,Yuza"},{name:"Portuguese",i:13,min:5,max:11,d:"",m:.1,b:"Abrigada,Afonsoeiro,Agueda,Aguilada,Alagoas,Alagoinhas,Albufeira,Alcanhoes,Alcobaca,Alcoutim,Aldoar,Alenquer,Alfeizerao,Algarve,Almada,Almagreira,Almeirim,Alpalhao,Alpedrinha,Alvorada,Amieira,Anapolis,Apelacao,Aranhas,Arganil,Armacao,Assenceira,Aveiro,Avelar,Balsas,Barcarena,Barreiras,Barretos,Batalha,Beira,Benavente,Betim,Braga,Braganca,Brasilia,Brejo,Cabeceiras,Cabedelo,Cachoeiras,Cadafais,Calhandriz,Calheta,Caminha,Campinas,Canidelo,Canoas,Capinha,Carmoes,Cartaxo,Carvalhal,Carvoeiro,Cascavel,Castanhal,Caxias,Chapadinha,Chaves,Cocais,Coentral,Coimbra,Comporta,Conde,Coqueirinho,Coruche,Damaia,Dourados,Enxames,Ericeira,Ervidel,Escalhao,Esmoriz,Espinhal,Estela,Estoril,Eunapolis,Evora,Famalicao,Fanhoes,Faro,Fatima,Felgueiras,Ferreira,Figueira,Flecheiras,Florianopolis,Fornalhas,Fortaleza,Freiria,Freixeira,Fronteira,Fundao,Gracas,Gradil,Grainho,Gralheira,Guimaraes,Horta,Ilhavo,Ilheus,Lages,Lagos,Laranjeiras,Lavacolhos,Leiria,Limoeiro,Linhares,Lisboa,Lomba,Lorvao,Lourical,Lourinha,Luziania,Macedo,Machava,Malveira,Marinhais,Maxial,Mealhada,Milharado,Mira,Mirandela,Mogadouro,Montalegre,Mourao,Nespereira,Nilopolis,Obidos,Odemira,Odivelas,Oeiras,Oleiros,Olhalvo,Olinda,Olival,Oliveira,Oliveirinha,Palheiros,Palmeira,Palmital,Pampilhosa,Pantanal,Paradinha,Parelheiros,Pedrosinho,Pegoes,Penafiel,Peniche,Pinhao,Pinheiro,Pombal,Pontal,Pontinha,Portel,Portimao,Quarteira,Queluz,Ramalhal,Reboleira,Recife,Redinha,Ribadouro,Ribeira,Ribeirao,Rosais,Sabugal,Sacavem,Sagres,Sandim,Sangalhos,Santarem,Santos,Sarilhos,Seixas,Seixezelo,Seixo,Silvares,Silveira,Sinhaem,Sintra,Sobral,Sobralinho,Tabuaco,Tabuleiro,Taveiro,Teixoso,Telhado,Telheiro,Tomar,Torreira,Trancoso,Troviscal,Vagos,Varzea,Velas,Viamao,Viana,Vidigal,Vidigueira,Vidual,Vilamar,Vimeiro,Vinhais,Vitoria"},{name:"Nahuatl",i:14,min:6,max:13,d:"l",m:0,b:"Acapulco,Acatepec,Acatlan,Acaxochitlan,Acolman,Actopan,Acuamanala,Ahuacatlan,Almoloya,Amacuzac,Amanalco,Amaxac,Apaxco,Apetatitlan,Apizaco,Atenco,Atizapan,Atlacomulco,Atlapexco,Atotonilco,Axapusco,Axochiapan,Axocomanitla,Axutla,Azcapotzalco,Aztahuacan,Calimaya,Calnali,Calpulalpan,Camotlan,Capulhuac,Chalco,Chapulhuacan,Chapultepec,Chiapan,Chiautempan,Chiconautla,Chihuahua,Chilcuautla,Chimalhuacan,Cholollan,Cihuatlan,Coahuila,Coatepec,Coatetelco,Coatlan,Coatlinchan,Coatzacoalcos,Cocotitlan,Cohetzala,Colima,Colotlan,Coyoacan,Coyohuacan,Cuapiaxtla,Cuauhnahuac,Cuauhtemoc,Cuauhtitlan,Cuautepec,Cuautla,Cuaxomulco,Culhuacan,Ecatepec,Eloxochitlan,Epatlan,Epazoyucan,Huamantla,Huascazaloya,Huatlatlauca,Huautla,Huehuetlan,Huehuetoca,Huexotla,Hueyapan,Hueyotlipan,Hueypoxtla,Huichapan,Huimilpan,Huitzilac,Ixtapallocan,Iztacalco,Iztaccihuatl,Iztapalapa,Lolotla,Malinalco,Mapachtlan,Mazatepec,Mazatlan,Metepec,Metztitlan,Mexico,Miacatlan,Michoacan,Minatitlan,Mixcoac,Mixtla,Molcaxac,Nanacamilpa,Naucalpan,Naupan,Nextlalpan,Nezahualcoyotl,Nopalucan,Oaxaca,Ocotepec,Ocotitlan,Ocotlan,Ocoyoacac,Ocuilan,Ocuituco,Omitlan,Otompan,Otzoloapan,Pacula,Pahuatlan,Panotla,Papalotla,Patlachican,Piaztla,Popocatepetl,Sultepec,Tecamac,Tecolotlan,Tecozautla,Temamatla,Temascalapa,Temixco,Temoac,Temoaya,Tenayuca,Tenochtitlan,Teocuitlatlan,Teotihuacan,Teotlalco,Tepeacac,Tepeapulco,Tepehuacan,Tepetitlan,Tepeyanco,Tepotzotlan,Tepoztlan,Tetecala,Tetlatlahuca,Texcalyacac,Texcoco,Tezontepec,Tezoyuca,Timilpan,Tizapan,Tizayuca,Tlacopan,Tlacotenco,Tlahuac,Tlahuelilpan,Tlahuiltepa,Tlalmanalco,Tlalnepantla,Tlalpan,Tlanchinol,Tlatelolco,Tlaxcala,Tlaxcoapan,Tlayacapan,Tocatlan,Tolcayuca,Toluca,Tonanitla,Tonantzintla,Tonatico,Totolac,Totolapan,Tototlan,Tuchtlan,Tulantepec,Tultepec,Tzompantepec,Xalatlaco,Xaloztoc,Xaltocan,Xiloxoxtla,Xochiatipan,Xochicoatlan,Xochimilco,Xochitepec,Xolotlan,Xonacatlan,Yahualica,Yautepec,Yecapixtla,Yehaultepec,Zacatecas,Zacazonapan,Zacoalco,Zacualpan,Zacualtipan,Zapotlan,Zimapan,Zinacantepec,Zoyaltepec,Zumpahuacan"},{name:"Hungarian",i:15,min:6,max:13,d:"",m:.1,b:"Aba,Abadszalok,Adony,Ajak,Albertirsa,Alsozsolca,Aszod,Babolna,Bacsalmas,Baktaloranthaza,Balassagyarmat,Balatonalmadi,Balatonboglar,Balkany,Balmazujvaros,Barcs,Bataszek,Batonyterenye,Battonya,Bekes,Berettyoujfalu,Berhida,Biatorbagy,Bicske,Biharkeresztes,Bodajk,Boly,Bonyhad,Budakalasz,Budakeszi,Celldomolk,Csakvar,Csenger,Csongrad,Csorna,Csorvas,Csurgo,Dabas,Demecser,Derecske,Devavanya,Devecser,Dombovar,Dombrad,Dunafoldvar,Dunaharaszti,Dunavarsany,Dunavecse,Edeleny,Elek,Emod,Encs,Enying,Ercsi,Fegyvernek,Fehergyarmat,Felsozsolca,Fertoszentmiklos,Fonyod,Fot,Fuzesabony,Fuzesgyarmat,Gardony,God,Gyal,Gyomaendrod,Gyomro,Hajdudorog,Hajduhadhaz,Hajdusamson,Hajduszoboszlo,Halasztelek,Harkany,Hatvan,Heves,Heviz,Ibrany,Isaszeg,Izsak,Janoshalma,Janossomorja,Jaszapati,Jaszarokszallas,Jaszfenyszaru,Jaszkiser,Kaba,Kalocsa,Kapuvar,Karcag,Kecel,Kemecse,Kenderes,Kerekegyhaza,Keszthely,Kisber,Kiskunmajsa,Kistarcsa,Kistelek,Kisujszallas,Kisvarda,Komadi,Komarom,Komlo,Kormend,Korosladany,Koszeg,Kozarmisleny,Kunhegyes,Kunszentmarton,Kunszentmiklos,Labatlan,Lajosmizse,Lenti,Letavertes,Letenye,Lorinci,Maglod,Mako,Mandok,Marcali,Martonvasar,Mateszalka,Melykut,Mezobereny,Mezocsat,Mezohegyes,Mezokeresztes,Mezokovesd,Mezotur,Mindszent,Mohacs,Monor,Mor,Morahalom,Nadudvar,Nagyatad,Nagyecsed,Nagyhalasz,Nagykallo,Nagykoros,Nagymaros,Nyekladhaza,Nyergesujfalu,Nyirbator,Nyirmada,Nyirtelek,Ocsa,Orkeny,Oroszlany,Paks,Pannonhalma,Paszto,Pecel,Pecsvarad,Pilisvorosvar,Polgar,Polgardi,Pomaz,Puspokladany,Pusztaszabolcs,Putnok,Racalmas,Rackeve,Rakamaz,Rakoczifalva,Sajoszent,Sandorfalva,Sarbogard,Sarkad,Sarospatak,Sarvar,Satoraljaujhely,Siklos,Simontornya,Soltvadkert,Sumeg,Szabadszallas,Szarvas,Szazhalombatta,Szecseny,Szeghalom,Szentgotthard,Szentlorinc,Szerencs,Szigethalom,Szigetvar,Szikszo,Tab,Tamasi,Tapioszele,Tapolca,Teglas,Tet,Tiszafoldvar,Tiszafured,Tiszakecske,Tiszalok,Tiszaujvaros,Tiszavasvari,Tokaj,Tokol,Tompa,Torokbalint,Torokszentmiklos,Totkomlos,Tura,Turkeve,Ujkigyos,ujszasz,Vamospercs,Varpalota,Vasarosnameny,Vasvar,Vecses,Veresegyhaz,Verpelet,Veszto,Zahony,Zalaszentgrot,Zirc,Zsambek"},{name:"Turkish",i:16,min:4,max:10,d:"",m:0,b:"Yelkaya,Buyrukkaya,Erdemtepe,Alakesen,Baharbeyli,Bozbay,Karaoklu,Altunbey,Yalkale,Yalkut,Akardere,Altayburnu,Esentepe,Okbelen,Derinsu,Alaoba,Yamanbeyli,Aykor,Ekinova,Saztepe,Baharkale,Devrekdibi,Alpseki,Ormanseki,Erkale,Yalbelen,Aytay,Yamanyaka,Altaydelen,Esen,Yedieli,Alpkor,Demirkor,Yediyol,Erdemkaya,Yayburnu,Ganiler,Bayatyurt,Kopuzteke,Aytepe,Deniz,Ayan,Ayazdere,Tepe,Kayra,Ayyaka,Deren,Adatepe,Kalkaneli,Bozkale,Yedidelen,Kocayolu,Sazdere,Bozkesen,Oguzeli,Yayladibi,Uluyol,Altay,Ayvar,Alazyaka,Yaloba,Suyaka,Baltaberi,Poyrazdelen,Eymir,Yediyuva,Kurt,Yeltepe,Oktar,Kara Ok,Ekinberi,Er Yurdu,Eren,Erenler,Ser,Oguz,Asay,Bozokeli,Aykut,Ormanyol,Yazkaya,Kalkanova,Yazbeyli,Dokuz Teke,Bilge,Ertensuyu,Kopuzyuva,Buyrukkut,Akardiken,Aybaray,Aslanbeyli,Altun Kaynak,Atikobasi,Yayla Eli,Kor Tepe,Salureli,Kor Kaya,Aybarberi,Kemerev,Yanaray,Beydileli,Buyrukoba,Yolduman,Tengri Tepe,Dokuzsu,Uzunkor,Erdem Yurdu,Kemer,Korteke,Bozokev,Bozoba,Ormankale,Askale,Oguztoprak,Yolberi,Kumseki,Esenobasi,Turkbelen,Ayazseki,Cereneli,Taykut,Bayramdelen,Beydilyaka,Boztepe,Uluoba,Yelyaka,Ulgardiken,Esensu,Baykale,Cerenkor,Bozyol,Duranoba,Aladuman,Denizli,Bahar,Yarkesen,Dokuzer,Yamankaya,Kocatarla,Alayaka,Toprakeli,Sarptarla,Sarpkoy,Serkaynak,Adayaka,Ayazkaynak,Kopuz,Turk,Kart,Kum,Erten,Buyruk,Yel,Ada,Alazova,Ayvarduman,Buyrukok,Ayvartoprak,Uzuntepe,Binseki,Yedibey,Durankale,Alaztoprak,Sarp Ok,Yaparobasi,Yaytepe,Asberi,Kalkankor,Beydiltepe,Adaberi,Bilgeyolu,Ganiyurt,Alkanteke,Esenerler,Asbey,Erdemkale,Erenkaynak,Oguzkoyu,Ayazoba,Boynuztoprak,Okova,Yaloklu,Sivriberi,Yuladiken,Sazbey,Karakaynak,Kopuzkoyu,Buyrukay,Kocakaya,Tepeduman,Yanarseki,Atikyurt,Esenev,Akarbeyli,Yayteke,Devreksungur,Akseki,Baykut,Kalkandere,Ulgarova,Devrekev,Yulabey,Bayatev,Yazsu,Vuraleli,Sivribeyli,Alaova,Alpobasi,Yalyurt,Elmatoprak,Alazkaynak,Esenay,Ertenev,Salurkor,Ekinok,Yalbey,Yeldere,Ganibay,Altaykut,Baltaboy,Ereli,Ayvarsu,Uzunsaz,Bayeli,Erenyol,Kocabay,Derintay,Ayazyol,Aslanoba,Esenkaynak,Ekinlik,Alpyolu,Alayunt,Bozeski,Erkil,Duransuyu,Yulak,Kut,Dodurga,Kutlubey,Kutluyurt,Boynuz,Alayol,Aybar,Aslaneli,Kemerseki,Baltasuyu,Akarer,Ayvarburnu,Boynuzbeyli,Adasungur,Esenkor,Yamanoba,Toprakkor,Uzunyurt,Sungur,Bozok,Kemerli,Alaz,Demirci,Kartepe"},{name:"Berber",i:17,min:4,max:10,d:"s",m:.2,b:"Abkhouch,Adrar,Aeraysh,Afrag,Agadir,Agelmam,Aghmat,Agrakal,Agulmam,Ahaggar,Ait Baha,Ajdir,Akka,Almou,Amegdul,Amizmiz,Amknas,Amlil,Amurakush,Anfa,Annaba,Aousja,Arbat,Arfud,Argoub,Arif,Asfi,Asfru,Ashawen,Assamer,Assif,Awlluz,Ayt Melel,Azaghar,Azila,Azilal,Azmour,Azro,Azrou,Beccar,Beja,Bennour,Benslimane,Berkane,Berrechid,Bizerte,Bjaed,Bouayach,Boudenib,Boufrah,Bouskoura,Boutferda,Darallouch,Dar Bouazza,Darchaabane,Dcheira,Demnat,Denden,Djebel,Djedeida,Drargua,Elhusima,Essaouira,Ezzahra,Fas,Fnideq,Ghezeze,Goubellat,Grisaffen,Guelmim,Guercif,Hammamet,Harrouda,Hdifa,Hoceima,Houara,Idhan,Idurar,Ifendassen,Ifoghas,Ifrane,Ighoud,Ikbir,Imilchil,Imzuren,Inezgane,Irherm,Izoughar,Jendouba,Kacem,Kelibia,Kenitra,Kerrando,Khalidia,Khemisset,Khenifra,Khouribga,Khourigba,Kidal,Korba,Korbous,Lahraouyine,Larache,Leyun,Lqliaa,Manouba,Martil,Mazagan,Mcherga,Mdiq,Megrine,Mellal,Melloul,Midelt,Misur,Mohammedia,Mornag,Mrirt,Nabeul,Nadhour,Nador,Nawaksut,Nefza,Ouarzazate,Ouazzane,Oued Zem,Oujda,Ouladteima,Qsentina,Rades,Rafraf,Safi,Sefrou,Sejnane,Settat,Sijilmassa,Skhirat,Slimane,Somaa,Sraghna,Susa,Tabarka,Tadrart,Taferka,Tafilalt,Tafrawt,Tafza,Tagbalut,Tagerdayt,Taghzut,Takelsa,Taliouine,Tanja,Tantan,Taourirt,Targuist,Taroudant,Tarudant,Tasfelalayt,Tassort,Tata,Tattiwin,Tawnat,Taza,Tazagurt,Tazerka,Tazizawt,Taznakht,Tebourba,Teboursouk,Temara,Testour,Tetouan,Tibeskert,Tifelt,Tijdit,Tinariwen,Tinduf,Tinja,Tittawan,Tiznit,Toubkal,Trables,Tubqal,Tunes,Ultasila,Urup,Wagguten,Wararni,Warzazat,Watlas,Wehran,Wejda,Xamida,Yedder,Youssoufia,Zaghouan,Zahret,Zemmour,Zriba"},{name:"Arabic",i:18,min:4,max:9,d:"ae",m:.2,b:"Abha,Ajman,Alabar,Alarjam,Alashraf,Alawali,Albawadi,Albirk,Aldhabiyah,Alduwaid,Alfareeq,Algayed,Alhazim,Alhrateem,Alhudaydah,Alhuwaya,Aljahra,Aljubail,Alkhafah,Alkhalas,Alkhawaneej,Alkhen,Alkhobar,Alkhuznah,Allisafah,Almshaykh,Almurjan,Almuwayh,Almuzaylif,Alnaheem,Alnashifah,Alqah,Alqouz,Alqurayyat,Alradha,Alraqmiah,Alsadyah,Alsafa,Alshagab,Alshuqaiq,Alsilaa,Althafeer,Alwasqah,Amaq,Amran,Annaseem,Aqbiyah,Arafat,Arar,Ardah,Asfan,Ashayrah,Askar,Ayaar,Aziziyah,Baesh,Bahrah,Balhaf,Banizayd,Bidiyah,Bisha,Biyatah,Buqhayq,Burayda,Dafiyat,Damad,Dammam,Dariyah,Dhafar,Dhahran,Dhalkut,Dhurma,Dibab,Doha,Dukhan,Duwaibah,Enaker,Fadhla,Fahaheel,Fanateer,Farasan,Fardah,Fujairah,Ghalilah,Ghar,Ghizlan,Ghomgyah,Ghran,Hadiyah,Haffah,Hajanbah,Hajrah,Haqqaq,Haradh,Hasar,Hawiyah,Hebaa,Hefar,Hijal,Husnah,Huwailat,Huwaitah,Irqah,Isharah,Ithrah,Jamalah,Jarab,Jareef,Jazan,Jeddah,Jiblah,Jihanah,Jilah,Jizan,Joraibah,Juban,Jumeirah,Kamaran,Keyad,Khab,Khaiybar,Khasab,Khathirah,Khawarah,Khulais,Kumzar,Limah,Linah,Madrak,Mahab,Mahalah,Makhtar,Mashwar,Masirah,Masliyah,Mastabah,Mazhar,Medina,Meeqat,Mirbah,Mokhtara,Muharraq,Muladdah,Musaykah,Mushayrif,Musrah,Mussafah,Nafhan,Najran,Nakhab,Nizwa,Oman,Qadah,Qalhat,Qamrah,Qasam,Qosmah,Qurain,Quriyat,Qurwa,Radaa,Rafha,Rahlah,Rakamah,Rasheedah,Rasmadrakah,Risabah,Rustaq,Ryadh,Sabtaljarah,Sadah,Safinah,Saham,Saihat,Salalah,Salmiya,Shabwah,Shalim,Shaqra,Sharjah,Sharurah,Shatifiyah,Shidah,Shihar,Shoqra,Shuwaq,Sibah,Sihmah,Sinaw,Sirwah,Sohar,Suhailah,Sulaibiya,Sunbah,Tabuk,Taif,Taqah,Tarif,Tharban,Thuqbah,Thuwal,Tubarjal,Turaif,Turbah,Tuwaiq,Ubar,Umaljerem,Urayarah,Urwah,Wabrah,Warbah,Yabreen,Yadamah,Yafur,Yarim,Yemen,Yiyallah,Zabid,Zahwah,Zallaq,Zinjibar,Zulumah"},{name:"Inuit",i:19,min:5,max:15,d:"alutsn",m:0,b:"Aaluik,Aappilattoq,Aasiaat,Agissat,Agssaussat,Akuliarutsip,Akunnaaq,Alluitsup,Alluttoq,Amitsorsuaq,Ammassalik,Anarusuk,Anguniartarfik,Annertussoq,Annikitsoq,Apparsuit,Apusiaajik,Arsivik,Arsuk,Atammik,Ateqanaq,Atilissuaq,Attu,Augpalugtoq,Aukarnersuaq,Aumat,Auvilkikavsaup,Avadtlek,Avallersuaq,Bjornesk,Blabaerdalen,Blomsterdalen,Brattalhid,Bredebrae,Brededal,Claushavn,Edderfulegoer,Egger,Eqalugalinnguit,Eqalugarssuit,Eqaluit,Eqqua,Etah,Graah,Hakluyt,Haredalen,Hareoen,Hundeo,Igaliku,Igdlorssuit,Igdluluarssuk,Iginniafik,Ikamiut,Ikarissat,Ikateq,Ikermiut,Ikermoissuaq,Ikorfarssuit,Ilimanaq,Illorsuit,Illunnguit,Iluileq,Ilulissat,Imaarsivik,Imartunarssuk,Immikkoortukajik,Innaarsuit,Inneruulalik,Inussullissuaq,Iperaq,Ippik,Iqek,Isortok,Isungartussoq,Itileq,Itissaalik,Itivdleq,Ittit,Ittoqqortoormiit,Ivingmiut,Ivittuut,Kanajoorartuut,Kangaamiut,Kangeq,Kangerluk,Kangerlussuaq,Kanglinnguit,Kapisillit,Kekertamiut,Kiatak,Kiataussaq,Kigatak,Kinaussak,Kingittorsuaq,Kitak,Kitsissuarsuit,Kitsissut,Klenczner,Kook,Kraulshavn,Kujalleq,Kullorsuaq,Kulusuk,Kuurmiit,Kuusuaq,Laksedalen,Maniitsoq,Marrakajik,Mattaangassut,Mernoq,Mittivakkat,Moriusaq,Myggbukta,Naajaat,Nangissat,Nanuuseq,Nappassoq,Narsarmijt,Narsarsuaq,Narssaq,Nasiffik,Natsiarsiorfik,Naujanguit,Niaqornaarsuk,Niaqornat,Nordfjordspasset,Nugatsiaq,Nunarssit,Nunarsuaq,Nunataaq,Nunatakavsaup,Nutaarmiut,Nuugaatsiaq,Nuuk,Nuukullak,Olonkinbyen,Oodaaq,Oqaatsut,Oqaitsunguit,Oqonermiut,Paagussat,Paamiut,Paatuut,Palungataq,Pamialluk,Perserajoq,Pituffik,Puugutaa,Puulkuip,Qaanaq,Qaasuitsup,Qaersut,Qajartalik,Qallunaat,Qaneq,Qaqortok,Qasigiannguit,Qassimiut,Qeertartivaq,Qeqertaq,Qeqertasussuk,Qeqqata,Qernertoq,Qernertunnguit,Qianarreq,Qingagssat,Qoornuup,Qorlortorsuaq,Qullikorsuit,Qunnerit,Qutdleq,Ravnedalen,Ritenbenk,Rypedalen,Saarloq,Saatorsuaq,Saattut,Salliaruseq,Sammeqqat,Sammisoq,Sanningassoq,Saqqaq,Saqqarlersuaq,Saqqarliit,Sarfannguit,Sattiaatteq,Savissivik,Serfanguaq,Sermersooq,Sermiligaaq,Sermilik,Sermitsiaq,Simitakaja,Simiutaq,Singamaq,Siorapaluk,Sisimiut,Sisuarsuit,Sullorsuaq,Suunikajik,Sverdrup,Taartoq,Takiseeq,Tasirliaq,Tasiusak,Tiilerilaaq,Timilersua,Timmiarmiut,Tukingassoq,Tussaaq,Tuttulissuup,Tuujuk,Uiivaq,Uilortussoq,Ujuaakajiip,Ukkusissat,Upernavik,Uttorsiutit,Uumannaq,Uunartoq,Uvkusigssat,Ymer"},{name:"Basque",i:20,min:4,max:11,d:"r",m:.1,b:"Agurain,Aia,Aiara,Albiztur,Alkiza,Altzaga,Amorebieta,Amurrio,Andoain,Anoeta,Antzuola,Arakaldo,Arantzazu,Arbatzegi,Areatza,Arratzua,Arrieta,Artea,Artziniega,Asteasu,Astigarraga,Ataun,Atxondo,Aulesti,Azkoitia,Azpeitia,Bakio,Baliarrain,Barakaldo,Barrika,Barrundia,Basauri,Beasain,Bedia,Beizama,Belauntza,Berastegi,Bergara,Bermeo,Bernedo,Berriatua,Berriz,Bidania,Bilar,Bilbao,Busturia,Deba,Derio,Donostia,Dulantzi,Durango,Ea,Eibar,Elantxobe,Elduain,Elgeta,Elgoibar,Elorrio,Erandio,Ergoitia,Ermua,Errenteria,Errezil,Eskoriatza,Eskuernaga,Etxebarri,Etxebarria,Ezkio,Forua,Gabiria,Gaintza,Galdakao,Gamiz,Garai,Gasteiz,Gatzaga,Gaubea,Gautegiz,Gaztelu,Gernika,Gerrikaitz,Getaria,Getxo,Gizaburuaga,Goiatz,Gorliz,Gorriaga,Harana,Hernani,Hondarribia,Ibarra,Ibarrangelu,Idiazabal,Iekora,Igorre,Ikaztegieta,Irun,Irura,Iruraiz,Itsaso,Itsasondo,Iurreta,Izurtza,Jatabe,Kanpezu,Karrantza,Kortezubi,Kripan,Kuartango,Lanestosa,Lantziego,Larrabetzu,Lasarte,Laukiz,Lazkao,Leaburu,Legazpi,Legorreta,Legutio,Leintz,Leioa,Lekeitio,Lemoa,Lemoiz,Leza,Lezama,Lezo,Lizartza,Maeztu,Mallabia,Manaria,Markina,Maruri,Menaka,Mendaro,Mendata,Mendexa,Morga,Mundaka,Mungia,Munitibar,Murueta,Muskiz,Mutiloa,Mutriku,Nabarniz,Oiartzun,Oion,Okondo,Olaberria,Onati,Ondarroa,Ordizia,Orendain,Orexa,Oria,Orio,Ormaiztegi,Orozko,Ortuella,Otegi,Otxandio,Pasaia,Plentzia,Santurtzi,Sestao,Sondika,Soraluze,Sukarrieta,Tolosa,Trapagaran,Turtzioz,Ubarrundia,Ubide,Ugao,Urdua,Urduliz,Urizaharra,Urkabustaiz,Urnieta,Urretxu,Usurbil,Xemein,Zabaleta,Zaia,Zaldibar,Zambrana,Zamudio,Zaratamo,Zarautz,Zeberio,Zegama,Zerain,Zestoa,Zierbena,Zigoitia,Ziortza,Zuia,Zumaia,Zumarraga"},{name:"Nigerian",i:21,min:4,max:10,d:"",m:.3,b:"Abadogo,Abafon,Adealesu,Adeto,Adyongo,Afaga,Afamju,Agigbigi,Agogoke,Ahute,Aiyelaboro,Ajebe,Ajola,Akarekwu,Akunuba,Alawode,Alkaijji,Amangam,Amgbaye,Amtasa,Amunigun,Animahun,Anyoko,Arapagi,Asande,Awgbagba,Awhum,Awodu,Babateduwa,Bandakwai,Bangdi,Bilikani,Birnindodo,Braidu,Bulakawa,Buriburi,Cainnan,Chakum,Chondugh,Dagwarga,Darpi,Dokatofa,Dozere,Ebelibri,Efem,Ekoku,Ekpe,Ewhoeviri,Galea,Gamen,Ganjin,Gantetudu,Gargar,Garinbode,Gbure,Gerti,Gidan,Gitabaremu,Giyagiri,Giyawa,Gmawa,Golakochi,Golumba,Gunji,Gwambula,Gwodoti,Hayinlere,Hayinmaialewa,Hirishi,Hombo,Ibefum,Iberekodo,Icharge,Idofin,Idofinoka,Igbogo,Ijoko,Ijuwa,Ikawga,Ikhin,Ikpakidout,Ikpeoniong,Imuogo,Ipawo,Ipinlerere,Isicha,Itakpa,Jangi,Jare,Jataudakum,Jaurogomki,Jepel,Kafinmalama,Katab,Katanga,Katinda,Katirije,Kaurakimba,Keffinshanu,Kellumiri,Kiagbodor,Kirbutu,Kita,Kogogo,Kopje,Korokorosei,Kotoku,Kuata,Kujum,Kukau,Kunboon,Kuonubogbene,Kurawe,Kushinahu,Kwaramakeri,Ladimeji,Lafiaro,Lahaga,Laindebajanle,Laindegoro,Lakati,Litenswa,Maba,Madarzai,Maianita,Malikansaa,Mata,Megoyo,Meku,Miama,Modi,Mshi,Msugh,Muduvu,Murnachehu,Namnai,Ndamanma,Ndiwulunbe,Ndonutim,Ngbande,Nguengu,Ntoekpe,Nyajo,Nyior,Odajie,Ogbaga,Ogultu,Ogunbunmi,Ojopode,Okehin,Olugunna,Omotunde,Onipede,Onma,Orhere,Orya,Otukwang,Otunade,Rampa,Rimi,Rugan,Rumbukawa,Sabiu,Sangabama,Sarabe,Seboregetore,Shafar,Shagwa,Shata,Shengu,Sokoron,Sunnayu,Tafoki,Takula,Talontan,Tarhemba,Tayu,Ter,Timtim,Timyam,Tindirke,Tokunbo,Torlwam,Tseakaadza,Tseanongo,Tsebeeve,Tsepaegh,Tuba,Tumbo,Tungalombo,Tunganyakwe,Uhkirhi,Umoru,Umuabai,Umuajuju,Unchida,Ungua,Unguwar,Unongo,Usha,Utongbo,Vembera,Wuro,Yanbashi,Yanmedi,Yoku,Zarunkwari,Zilumo,Zulika"},{name:"Celtic",i:22,min:4,max:12,d:"nld",m:0,b:"Aberaman,Aberangell,Aberarth,Aberavon,Aberbanc,Aberbargoed,Aberbeeg,Abercanaid,Abercarn,Abercastle,Abercegir,Abercraf,Abercregan,Abercych,Abercynon,Aberdare,Aberdaron,Aberdaugleddau,Aberdeen,Aberdulais,Aberdyfi,Aberedw,Abereiddy,Abererch,Abereron,Aberfan,Aberffraw,Aberffrwd,Abergavenny,Abergele,Aberglasslyn,Abergorlech,Abergwaun,Abergwesyn,Abergwili,Abergwynfi,Abergwyngregyn,Abergynolwyn,Aberhafesp,Aberhonddu,Aberkenfig,Aberllefenni,Abermain,Abermaw,Abermorddu,Abermule,Abernant,Aberpennar,Aberporth,Aberriw,Abersoch,Abersychan,Abertawe,Aberteifi,Aberthin,Abertillery,Abertridwr,Aberystwyth,Achininver,Afonhafren,Alisaha,Anfosadh,Antinbhearmor,Ardenna,Attacon,Banwen,Beira,Bhrura,Bleddfa,Boioduro,Bona,Boskyny,Boslowenpolbrogh,Boudobriga,Bravon,Brigant,Briganta,Briva,Brosnach,Caersws,Cambodunum,Cambra,Caracta,Catumagos,Centobriga,Ceredigion,Chalain,Chearbhallain,Chlasaigh,Chormaic,Cuileannach,Dinn,Diwa,Dubingen,Duibhidighe,Duro,Ebora,Ebruac,Eburodunum,Eccles,Egloskuri,Eighe,Eireann,Elerghi,Ferkunos,Fhlaithnin,Gallbhuaile,Genua,Ghrainnse,Gwyles,Heartsease,Hebron,Hordh,Inbhear,Inbhir,Inbhirair,Innerleithen,Innerleven,Innerwick,Inver,Inveraldie,Inverallan,Inveralmond,Inveramsay,Inveran,Inveraray,Inverarnan,Inverbervie,Inverclyde,Inverell,Inveresk,Inverfarigaig,Invergarry,Invergordon,Invergowrie,Inverhaddon,Inverkeilor,Inverkeithing,Inverkeithney,Inverkip,Inverleigh,Inverleith,Inverloch,Inverlochlarig,Inverlochy,Invermay,Invermoriston,Inverness,Inveroran,Invershin,Inversnaid,Invertrossachs,Inverugie,Inveruglas,Inverurie,Iubhrach,Karardhek,Kilninver,Kirkcaldy,Kirkintilloch,Krake,Lanngorrow,Latense,Leming,Lindomagos,Llanaber,Llandidiwg,Llandyrnog,Llanfarthyn,Llangadwaldr,Llansanwyr,Lochinver,Lugduno,Magoduro,Mheara,Monmouthshire,Nanshiryarth,Narann,Novioduno,Nowijonago,Octoduron,Penning,Pheofharain,Ponsmeur,Raithin,Ricomago,Rossinver,Salodurum,Seguia,Sentica,Theorsa,Tobargeal,Trealaw,Trefesgob,Trewedhenek,Trewythelan,Tuaisceart,Uige,Vitodurum,Windobona"},{name:"Mesopotamian",i:23,min:4,max:9,d:"srpl",m:.1,b:"Adab,Adamndun,Adma,Admatum,Agrab,Akkad,Akshak,Amnanum,Andarig,Anshan,Apiru,Apum,Arantu,Arbid,Arpachiyah,Arpad,Arrapha,Ashlakka,Assur,Awan,Babilim,Bad-Tibira,Balawat,Barsip,Birtu,Bit-Bunakki,Borsippa,Chuera,Dashrah,Der,Dilbat,Diniktum,Doura,Dur-Kurigalzu,Dur-Sharrukin,Dur-Untash,Dûr-gurgurri,Ebla,Ekallatum,Ekalte,Emar,Erbil,Eresh,Eridu,Eshnunn,Eshnunna,Gargamish,Gasur,Gawra,Gibil,Girsu,Gizza,Habirun,Habur,Hadatu,Hakkulan,Halab,Halabit,Hamazi,Hamoukar,Haradum,Harbidum,Harran,Harranu,Hassuna,Hatarikka,Hatra,Hissar,Hiyawa,Hormirzad,Ida-Maras,Idamaraz,Idu,Imerishu,Imgur-Enlil,Irisagrig,Irnina,Irridu,Isin,Issinnitum,Iturungal,Izubitum,Jarmo,Jemdet,Kabnak,Kadesh,Kahat,Kalhu,Kar-Shulmanu-Asharedu,Kar-Tukulti-Ninurta,Kar-shulmanu-asharedu,Karana,Karatepe,Kartukulti,Kazallu,Kesh,Kidsha,Kinza,Kish,Kisiga,Kisurra,Kuara,Kurda,Kurruhanni,Kutha,Lagaba,Lagash,Larak,Larsa,Leilan,Malgium,Marad,Mardaman,Mari,Marlik,Mashkan,Mashkan-shapir,Matutem,Me-Turan,Meliddu,Mumbaqat,Nabada,Nagar,Nanagugal,Nerebtum,Nigin,Nimrud,Nina,Nineveh,Ninua,Nippur,Niru,Niya,Nuhashe,Nuhasse,Nuzi,Puzrish-Dagan,Qalatjarmo,Qatara,Qatna,Qattunan,Qidshu,Rapiqum,Rawda,Sagaz,Shaduppum,Shaggaratum,Shalbatu,Shanidar,Sharrukin,Shawwan,Shehna,Shekhna,Shemshara,Shibaniba,Shubat-Enlil,Shurkutir,Shuruppak,Shusharra,Shushin,Sikan,Sippar,Sippar-Amnanum,Sippar-sha-Annunitum,Subatum,Susuka,Tadmor,Tarbisu,Telul,Terqa,Tirazish,Tisbon,Tuba,Tushhan,Tuttul,Tutub,Ubaid,Umma,Ur,Urah,Urbilum,Urkesh,Ursa'um,Uruk,Urum,Uzarlulu,Warka,Washukanni,Zabalam,Zarri-Amnan"},{name:"Iranian",i:24,min:5,max:11,d:"",m:.1,b:"Abali,Abrisham,Absard,Abuzeydabad,Afus,Alavicheh,Alikosh,Amol,Anarak,Anbar,Andisheh,Anshan,Aran,Ardabil,Arderica,Ardestan,Arjomand,Asgaran,Asgharabad,Ashian,Awan,Babajan,Badrud,Bafran,Baghestan,Baghshad,Bahadoran,Baharan Shahr,Baharestan,Bakun,Bam,Baqershahr,Barzok,Bastam,Behistun,Bitistar,Bumahen,Bushehr,Chadegan,Chahardangeh,Chamgardan,Chermahin,Choghabonut,Chugan,Damaneh,Damavand,Darabgard,Daran,Dastgerd,Dehaq,Dehaqan,Dezful,Dizicheh,Dorcheh,Dowlatabad,Duruntash,Ecbatana,Eslamshahr,Estakhr,Ezhiyeh,Falavarjan,Farrokhi,Fasham,Ferdowsieh,Fereydunshahr,Ferunabad,Firuzkuh,Fuladshahr,Ganjdareh,Ganzak,Gaz,Geoy,Godin,Goldasht,Golestan,Golpayegan,Golshahr,Golshan,Gorgab,Guged,Habibabad,Hafshejan,Hajjifiruz,Hana,Harand,Hasanabad,Hasanlu,Hashtgerd,Hecatompylos,Hormirzad,Imanshahr,Isfahan,Jandaq,Javadabad,Jiroft,Jowsheqan ,Jowzdan,Kabnak,Kahrizak,Kahriz Sang,Kangavar,Karaj,Karkevand,Kashan,Kelishad,Kermanshah,Khaledabad,Khansar,Khorramabad,Khur,Khvorzuq,Kilan,Komeh,Komeshcheh,Konar,Kuhpayeh,Kul,Kushk,Lavasan,Laybid,Liyan,Lyan,Mahabad,Mahallat,Majlesi,Malard,Manzariyeh,Marlik,Meshkat,Meymeh,Miandasht,Mish,Mobarakeh,Nahavand,Nain,Najafabad,Naqshe,Narezzash,Nasimshahr,Nasirshahr,Nasrabad,Natanz,Neyasar,Nikabad,Nimvar,Nushabad,Pakdasht,Parand,Pardis,Parsa,Pasargadai,Patigrabana,Pir Bakran,Pishva,Qahderijan,Qahjaverestan,Qamsar,Qarchak,Qods,Rabat,Ray-shahr,Rezvanshahr,Rhages,Robat Karim,Rozveh,Rudehen,Sabashahr,Safadasht,Sagzi,Salehieh,Sandal,Sarvestan,Sedeh,Sefidshahr,Semirom,Semnan,Shadpurabad,Shah,Shahdad,Shahedshahr,Shahin,Shahpour,Shahr,Shahreza,Shahriar,Sharifabad,Shemshak,Shiraz,Shushan,Shushtar,Sialk,Sin,Sukhteh,Tabas,Tabriz,Takhte,Talkhuncheh,Talli,Tarq,Temukan,Tepe,Tiran,Tudeshk,Tureng,Urmia,Vahidieh,Vahrkana,Vanak,Varamin,Varnamkhast,Varzaneh,Vazvan,Yahya,Yarim,Yasuj,Zarrin Shahr,Zavareh,Zayandeh,Zazeran,Ziar,Zibashahr,Zranka"},{name:"Hawaiian",i:25,min:5,max:10,d:"auo",m:1,b:"Aapueo,Ahoa,Ahuakaio,Ahupau,Alaakua,Alae,Alaeloa,Alamihi,Aleamai,Alena,Alio,Aupokopoko,Halakaa,Haleu,Haliimaile,Hamoa,Hanakaoo,Hanaulu,Hanawana,Hanehoi,Haou,Hikiaupea,Hokuula,Honohina,Honokahua,Honokeana,Honokohau,Honolulu,Honomaele,Hononana,Honopou,Hoolawa,Huelo,Kaalaea,Kaapahu,Kaeo,Kahalehili,Kahana,Kahuai,Kailua,Kainehe,Kakalahale,Kakanoni,Kalenanui,Kaleoaihe,Kalialinui,Kalihi,Kalimaohe,Kaloi,Kamani,Kamehame,Kanahena,Kaniaula,Kaonoulu,Kapaloa,Kapohue,Kapuaikini,Kapunakea,Kauau,Kaulalo,Kaulanamoa,Kauluohana,Kaumakani,Kaumanu,Kaunauhane,Kaupakulua,Kawaloa,Keaa,Keaaula,Keahua,Keahuapono,Kealahou,Keanae,Keauhou,Kelawea,Keokea,Keopuka,Kikoo,Kipapa,Koakupuna,Koali,Kolokolo,Kopili,Kou,Kualapa,Kuhiwa,Kuholilea,Kuhua,Kuia,Kuikui,Kukoae,Kukohia,Kukuiaeo,Kukuipuka,Kukuiula,Kulahuhu,Lapakea,Lapueo,Launiupoko,Lole,Maalo,Mahinahina,Mailepai,Makaakini,Makaalae,Makaehu,Makaiwa,Makaliua,Makapipi,Makapuu,Maluaka,Manawainui,Mehamenui,Moalii,Moanui,Mohopili,Mokae,Mokuia,Mokupapa,Mooiki,Mooloa,Moomuku,Muolea,Nakaaha,Nakalepo,Nakaohu,Nakapehu,Nakula,Napili,Niniau,Nuu,Oloewa,Olowalu,Omaopio,Onau,Onouli,Opaeula,Opana,Opikoula,Paakea,Paeahu,Paehala,Paeohi,Pahoa,Paia,Pakakia,Palauea,Palemo,Paniau,Papaaea,Papaanui,Papaauhau,Papaka,Papauluana,Pauku,Paunau,Pauwalu,Pauwela,Pohakanele,Polaiki,Polanui,Polapola,Poopoo,Poponui,Poupouwela,Puahoowali,Puakea,Puako,Pualaea,Puehuehu,Pueokauiki,Pukaauhuhu,Pukuilua,Pulehu,Puolua,Puou,Puuhaehae,Puuiki,Puuki,Puulani,Puunau,Puuomaile,Uaoa,Uhao,Ukumehame,Ulaino,Ulumalu,Wahikuli,Waianae,Waianu,Waiawa,Waiehu,Waieli,Waikapu,Wailamoa,Wailaulau,Wainee,Waiohole,Waiohonu,Waiohuli,Waiokama,Waiokila,Waiopai,Waiopua,Waipao,Waipionui,Waipouli"},{name:"Karnataka",i:26,min:5,max:11,d:"tnl",m:0,b:"Adityapatna,Adyar,Afzalpur,Aland,Alnavar,Alur,Ambikanagara,Anekal,Ankola,Annigeri,Arkalgud,Arsikere,Athni,Aurad,Badami,Bagalkot,Bagepalli,Bail,Bajpe,Bangalore,Bangarapet,Bankapura,Bannur,Bantval,Basavakalyan,Basavana,Belgaum,Beltangadi,Belur,Bhadravati,Bhalki,Bhatkal,Bhimarayanagudi,Bidar,Bijapur,Bilgi,Birur,Bommasandra,Byadgi,Challakere,Chamarajanagar,Channagiri,Channapatna,Channarayapatna,Chik,Chikmagalur,Chiknayakanhalli,Chikodi,Chincholi,Chintamani,Chitapur,Chitgoppa,Chitradurga,Dandeli,Dargajogihalli,Devadurga,Devanahalli,Dod,Donimalai,Gadag,Gajendragarh,Gangawati,Gauribidanur,Gokak,Gonikoppal,Gubbi,Gudibanda,Gulbarga,Guledgudda,Gundlupet,Gurmatkal,Haliyal,Hangal,Harapanahalli,Harihar,Hassan,Hatti,Haveri,Hebbagodi,Heggadadevankote,Hirekerur,Holalkere,Hole,Homnabad,Honavar,Honnali,Hoovina,Hosakote,Hosanagara,Hosdurga,Hospet,Hubli,Hukeri,Hungund,Hunsur,Ilkal,Indi,Jagalur,Jamkhandi,Jevargi,Jog,Kadigenahalli,Kadur,Kalghatgi,Kamalapuram,Kampli,Kanakapura,Karkal,Karwar,Khanapur,Kodiyal,Kolar,Kollegal,Konnur,Koppa,Koppal,Koratagere,Kotturu,Krishnarajanagara,Krishnarajasagara,Krishnarajpet,Kudchi,Kudligi,Kudremukh,Kumta,Kundapura,Kundgol,Kunigal,Kurgunta,Kushalnagar,Kushtagi,Lakshmeshwar,Lingsugur,Londa,Maddur,Madhugiri,Madikeri,Mahalingpur,Malavalli,Mallar,Malur,Mandya,Mangalore,Manvi,Molakalmuru,Mudalgi,Mudbidri,Muddebihal,Mudgal,Mudhol,Mudigere,Mulbagal,Mulgund,Mulki,Mulur,Mundargi,Mundgod,Munirabad,Mysore,Nagamangala,Nanjangud,Narasimharajapura,Naregal,Nargund,Navalgund,Nipani,Pandavapura,Pavagada,Piriyapatna,Pudu,Puttur,Rabkavi,Raichur,Ramanagaram,Ramdurg,Ranibennur,Raybag,Robertson,Ron,Sadalgi,Sagar,Sakleshpur,Saligram,Sandur,Sankeshwar,Saundatti,Savanur,Sedam,Shahabad,Shahpur,Shaktinagar,Shiggaon,Shikarpur,Shirhatti,Shorapur,Shrirangapattana,Siddapur,Sidlaghatta,Sindgi,Sindhnur,Sira,Siralkoppa,Sirsi,Siruguppa,Somvarpet,Sorab,Sringeri,Srinivaspur,Sulya,Talikota,Tarikere,Tekkalakote,Terdal,Thumbe,Tiptur,Tirthahalli,Tirumakudal,Tumkur,Turuvekere,Udupi,Vijayapura,Wadi,Yadgir,Yelandur,Yelbarga,Yellapur,Yenagudde"},{name:"Quechua",i:27,min:6,max:12,d:"l",m:0,b:"Alpahuaycco,Anchihuay,Anqea,Apurimac,Arequipa,Atahuallpa,Atawalpa,Atico,Ayacucho,Ayahuanco,Ayllu,Cajamarca,Canayre,Canchacancha,Carapo,Carhuac,Carhuacatac,Cashan,Caullaraju,Caxamalca,Cayesh,Ccahuasno,Ccarhuacc,Ccopayoc,Chacchapunta,Chacraraju,Challhuamayo,Champara,Chanchan,Chekiacraju,Chillihua,Chinchey,Chontah,Chopicalqui,Chucuito,Chuito,Chullo,Chumpi,Chuncho,Chupahuacho,Chuquiapo,Chuquisaca,Churup,Cocapata,Cochabamba,Cojup,Collota,Conococha,Corihuayrachina,Cuchoquesera,Cusichaca,Haika,Hanpiq,Hatun,Haywarisqa,Huaca,Huachinga,Hualcan,Hualchancca,Huamanga,Huamashraju,Huancarhuas,Huandoy,Huantsan,Huanupampa,Huarmihuanusca,Huascaran,Huaylas,Huayllabamba,Huayrana,Huaytara,Huichajanca,Huinayhuayna,Huinche,Huinioch,Illiasca,Intipunku,Iquicha,Ishinca,Jahuacocha,Jirishanca,Juli,Jurau,Kakananpunta,Kamasqa,Karpay,Kausay,Khuya,Kuelap,Lanccochayocc,Llaca,Llactapata,Llanganuco,Llaqta,Lloqllasca,Llupachayoc,Luricocha,Machu,Mallku,Matarraju,Mechecc,Mikhuy,Milluacocha,Morochuco,Munay,Ocshapalca,Ollantaytambo,Oroccahua,Oronccoy,Oyolo,Pacamayo,Pacaycasa,Paccharaju,Pachacamac,Pachakamaq,Pachakuteq,Pachakuti,Pachamama,Paititi,Pajaten,Palcaraju,Pallccas,Pampa,Panaka,Paqarina,Paqo,Parap,Paria,Patahuasi,Patallacta,Patibamba,Pisac,Pisco,Pongos,Pucacolpa,Pucahirca,Pucaranra,Pumatambo,Puscanturpa,Putaca,Puyupatamarca,Qawaq,Qayqa,Qochamoqo,Qollana,Qorihuayrachina,Qorimoqo,Qotupuquio,Quenuaracra,Queshque,Quillcayhuanca,Quillya,Quitaracsa,Quitaraju,Qusqu,Rajucolta,Rajutakanan,Rajutuna,Ranrahirca,Ranrapalca,Raria,Rasac,Rimarima,Riobamba,Runkuracay,Rurec,Sacsa,Sacsamarca,Saiwa,Sarapo,Sayacmarca,Sayripata,Sinakara,Sonccopa,Taripaypacha,Taulliraju,Tawantinsuyu,Taytanchis,Tiwanaku,Tocllaraju,Tsacra,Tuco,Tucubamba,Tullparaju,Tumbes,Uchuraccay,Uchuraqay,Ulta,Urihuana,Uruashraju,Vallunaraju,Vilcabamba,Wacho,Wankawillka,Wayra,Yachay,Yahuarraju,Yanamarey,Yanaqucha,Yanesha,Yerupaja"},{name:"Swahili",i:28,min:4,max:9,d:"",m:0,b:"Abim,Adjumani,Alebtong,Amolatar,Amuru,Apac,Arua,Arusha,Babati,Baragoi,Bombo,Budaka,Bugembe,Bugiri,Buikwe,Bukedea,Bukoba,Bukomansimbi,Bukungu,Buliisa,Bundibugyo,Bungoma,Busembatya,Bushenyi,Busia,Busolwe,Butaleja,Butambala,Butere,Buwenge,Buyende,Dadaab,Dodoma,Dokolo,Eldoret,Elegu,Emali,Embu,Entebbe,Garissa,Gede,Gulu,Handeni,Hima,Hoima,Hola,Ibanda,Iganga,Iringa,Isingiro,Isiolo,Jinja,Kaabong,Kabuyanda,Kabwohe,Kagadi,Kajiado,Kakinga,Kakiri,Kakuma,Kalangala,Kaliro,Kalongo,Kalungu,Kampala,Kamwenge,Kanungu,Kapchorwa,Kasese,Kasulu,Katakwi,Kayunga,Keroka,Kiambu,Kibaale,Kibaha,Kibingo,Kibwezi,Kigoma,Kihiihi,Kilifi,Kiruhura,Kiryandongo,Kisii,Kisoro,Kisumu,Kitale,Kitgum,Kitui,Koboko,Korogwe,Kotido,Kumi,Kyazanga,Kyegegwa,Kyenjojo,Kyotera,Lamu,Langata,Lindi,Lodwar,Lokichoggio,Londiani,Loyangalani,Lugazi,Lukaya,Luweero,Lwakhakha,Lwengo,Lyantonde,Machakos,Mafinga,Makambako,Makindu,Malaba,Malindi,Manafwa,Mandera,Marsabit,Masaka,Masindi,Masulita,Matugga,Mayuge,Mbale,Mbarara,Mbeya,Meru,Mitooma,Mityana,Mombasa,Morogoro,Moroto,Moyale,Moyo,Mpanda,Mpigi,Mpondwe,Mtwara,Mubende,Mukono,Muranga,Musoma,Mutomo,Mutukula,Mwanza,Nagongera,Nairobi,Naivasha,Nakapiripirit,Nakaseke,Nakasongola,Nakuru,Namanga,Namayingo,Namutumba,Nansana,Nanyuki,Narok,Naromoru,Nebbi,Ngora,Njeru,Njombe,Nkokonjeru,Ntungamo,Nyahururu,Nyeri,Oyam,Pader,Paidha,Pakwach,Pallisa,Rakai,Ruiru,Rukungiri,Rwimi,Sanga,Sembabule,Shimoni,Shinyanga,Singida,Sironko,Songea,Soroti,Ssabagabo,Sumbawanga,Tabora,Takaungu,Tanga,Thika,Tororo,Tunduma,Vihiga,Voi,Wajir,Wakiso,Watamu,Webuye,Wobulenzi,Wote,Wundanyi,Yumbe,Zanzibar"},{name:"Vietnamese",i:29,min:3,max:12,d:"",m:1,b:"An Giang,Anh Son,An Khe,An Nhon,Ayun Pa,Bac Giang,Bac Kan,Bac Lieu,Bac Ninh,Ba Don,Bao Loc,Ba Ria,Ba Ria-Vung Tau,Ba Thuoc,Ben Cat,Ben Tre,Bien Hoa,Bim Son,Binh Dinh,Binh Duong,Binh Long,Binh Minh,Binh Phuoc,Binh Thuan,Buon Ho,Buon Ma Thuot,Cai Lay,Ca Mau,Cam Khe,Cam Pha,Cam Ranh,Cam Thuy,Can Tho,Cao Bang,Cao Lanh,Cao Phong,Chau Doc,Chi Linh,Con Cuong,Cua Lo,Da Bac,Dak Lak,Da Lat,Da Nang,Di An,Dien Ban,Dien Bien,Dien Bien Phu,Dien Chau,Do Luong,Dong Ha,Dong Hoi,Dong Trieu,Duc Pho,Duyen Hai,Duy Tien,Gia Lai,Gia Nghia,Gia Rai,Go Cong,Ha Giang,Ha Hoa,Hai Duong,Hai Phong,Ha Long,Ha Nam,Ha Noi,Ha Tinh,Ha Trung,Hau Giang,Hoa Binh,Hoang Mai,Hoa Thanh,Ho Chi Minh,Hoi An,Hong Linh,Hong Ngu,Hue,Hung Nguyen,Hung Yen,Huong Thuy,Huong Tra,Khanh Hoa,Kien Tuong,Kim Boi,Kinh Mon,Kon Tum,Ky Anh,Ky Son,Lac Son,Lac Thuy,La Gi,Lai Chau,Lam Thao,Lang Chanh,Lang Son,Lao Cai,Long An,Long Khanh,Long My,Long Xuyen,Luong Son,Mai Chau,Mong Cai,Muong Lat,Muong Lay,My Hao,My Tho,Nam Dan,Nam Dinh,Nga Bay,Nga Nam,Nga Son,Nghe An,Nghia Dan,Nghia Lo,Nghi Loc,Nghi Son,Ngoc Lac,Nha Trang,Nhu Thanh,Nhu Xuan,Ninh Binh,Ninh Hoa,Nong Cong,Phan Rang Thap Cham,Phan Thiet,Pho Yen,Phu Ly,Phu My,Phu Ninh,Phuoc Long,Phu Tho,Phu Yen,Pleiku,Quang Binh,Quang Nam,Quang Ngai,Quang Ninh,Quang Tri,Quang Xuong,Quang Yen,Quan Hoa,Quan Son,Que Phong,Quy Chau,Quy Hop,Quynh Luu,Quy Nhon,Rach Gia,Sa Dec,Sai Gon,Sam Son,Sa Pa,Soc Trang,Song Cau,Song Cong,Son La,Son Tay,Tam Diep,Tam Ky,Tan An,Tan Chau,Tan Ky,Tan Lac,Tan Son,Tan Uyen,Tay Ninh,Thach Thanh,Thai Binh,Thai Hoa,Thai Nguyen,Thanh Chuong,Thanh Hoa,Thieu Hoa,Thuan An,Thua Thien-Hue,Thu Dau Mot,Thu Duc,Thuong Xuan,Tien Giang,Trang Bang,Tra Vinh,Trieu Son,Tu Son,Tuyen Quang,Tuy Hoa,Uong Bi,Viet Tri,Vinh,Vinh Chau,Vinh Loc,Vinh Long,Vinh Yen,Vi Thanh,Vung Tau,Yen Bai,Yen Dinh,Yen Thanh,Yen Thuy"},{name:"Cantonese",i:30,min:5,max:11,d:"",m:0,b:"Chaiwan,Chingchung,Chinghoi,Chingsen,Chingshing,Chiunam,Chiuon,Chiuyeung,Chiyuen,Choihung,Chuehoi,Chuiman,Chungfu,Chungsan,Chunguktsuen,Dakhing,Daopo,Daumun,Dingwu,Dinpak,Donggun,Dongyuen,Duenchau,Fachau,Fanling,Fatgong,Fatshan,Fotan,Fuktien,Fumun,Funggong,Funghoi,Fungshun,Fungtei,Gamtin,Gochau,Goming,Gonghoi,Gongshing,Goyiu,Hanghau,Hangmei,Hengon,Heungchau,Heunggong,Heungkiu,Hingning,Hohfuktong,Hoichue,Hoifung,Hoiping,Hokong,Hokshan,Hoyuen,Hunghom,Hungshuikiu,Jiuling,Kamsheung,Kamwan,Kaulongtong,Keilun,Kinon,Kinsang,Kityeung,Kongmun,Kukgong,Kwaifong,Kwaihing,Kwongchau,Kwongling,Kwongming,Kwuntong,Laichikok,Laiking,Laiwan,Lamtei,Lamtin,Leitung,Leungking,Limkong,Linping,Linshan,Loding,Lokcheong,Lokfu,Longchuen,Longgong,Longmun,Longping,Longwa,Longwu,Lowu,Luichau,Lukfung,Lukho,Lungmun,Macheung,Maliushui,Maonshan,Mauming,Maunam,Meifoo,Mingkum,Mogong,Mongkok,Muichau,Muigong,Muiyuen,Naiwai,Namcheong,Namhoi,Namhong,Namsha,Nganwai,Ngautaukok,Ngchuen,Ngwa,Onting,Pakwun,Paotoishan,Pingshan,Pingyuen,Poklo,Pongon,Poning,Potau,Puito,Punyue,Saiwanho,Saiyingpun,Samshing,Samshui,Samtsen,Samyuenlei,Sanfung,Sanhing,Sanhui,Sanwai,Seiwui,Shamshuipo,Shanmei,Shantau,Shauking,Shekmun,Shekpai,Sheungshui,Shingkui,Shiuhing,Shundak,Shunyi,Shupinwai,Simshing,Siuhei,Siuhong,Siukwan,Siulun,Suikai,Taihing,Taikoo,Taipo,Taishuihang,Taiwai,Taiwohau,Tinhau,Tinshuiwai,Tiukengleng,Toishan,Tongfong,Tonglowan,Tsakyoochung,Tsamgong,Tsangshing,Tseungkwano,Tsimshatsui,Tsinggong,Tsingshantsuen,Tsingwun,Tsingyi,Tsingyuen,Tsiuchau,Tsuenshekshan,Tsuenwan,Tuenmun,Tungchung,Waichap,Waichau,Waidong,Wailoi,Waishing,Waiyeung,Wanchai,Wanfau,Wanshing,Wingon,Wongpo,Wongtaisin,Woping,Wukaisha,Yano,Yaumatei,Yautong,Yenfa,Yeungchun,Yeungdong,Yeungsai,Yeungshan,Yimtin,Yingdak,Yiuping,Yongshing,Yongyuen,Yuenlong,Yuenshing,Yuetsau,Yuknam,Yunping"},{name:"Mongolian",i:31,min:5,max:12,d:"aou",m:.3,b:"Adaatsag,Airag,Alag Erdene,Altai,Altanshiree,Altantsogts,Arbulag,Baatsagaan,Batnorov,Batshireet,Battsengel,Bayan Adarga,Bayan Agt,Bayanbulag,Bayandalai,Bayandun,Bayangovi,Bayanjargalan,Bayankhongor,Bayankhutag,Bayanlig,Bayanmonkh,Bayannur,Bayannuur,Bayan Ondor,Bayan Ovoo,Bayantal,Bayantsagaan,Bayantumen,Bayan Uul,Bayanzurkh,Berkh,Biger,Binder,Bogd,Bombogor,Bor Ondor,Bugat,Bugt,Bulgan,Buregkhangai,Burentogtokh,Buutsagaan,Buyant,Chandmani,Chandmani Ondor,Choibalsan,Chuluunkhoroot,Chuluut,Dadal,Dalanjargalan,Dalanzadgad,Darhan Muminggan,Darkhan,Darvi,Dashbalbar,Dashinchilen,Delger,Delgerekh,Delgerkhaan,Delgerkhangai,Delgertsogt,Deluun,Deren,Dorgon,Duut,Erdene,Erdenebulgan,Erdeneburen,Erdenedalai,Erdenemandal,Erdenetsogt,Galshar,Galt,Galuut,Govi Ugtaal,Gurvan,Gurvanbulag,Gurvansaikhan,Gurvanzagal,Hinggan,Hodong,Holingol,Hondlon,Horin Ger,Horqin,Hulunbuir,Hure,Ikhkhet,Ikh Tamir,Ikh Uul,Jargalan,Jargalant,Jargaltkhaan,Jarud,Jinst,Khairkhan,Khalhgol,Khaliun,Khanbogd,Khangai,Khangal,Khankh,Khankhongor,Khashaat,Khatanbulag,Khatgal,Kherlen,Khishig Ondor,Khokh,Kholonbuir,Khongor,Khotont,Khovd,Khovsgol,Khuld,Khureemaral,Khurmen,Khutag Ondor,Luus,Mandakh,Mandal Ovoo,Mankhan,Manlai,Matad,Mogod,Monkhkhairkhan,Moron,Most,Myangad,Nogoonnuur,Nomgon,Norovlin,Noyon,Ogii,Olgii,Olziit,Omnodelger,Ondorkhaan,Ondorshil,Ondor Ulaan,Ongniud,Ordos,Orgon,Orkhon,Rashaant,Renchinlkhumbe,Sagsai,Saikhan,Saikhandulaan,Saikhan Ovoo,Sainshand,Saintsagaan,Selenge,Sergelen,Sevrei,Sharga,Sharyngol,Shine Ider,Shinejinst,Shiveegovi,Sumber,Taishir,Tarialan,Tariat,Teshig,Togrog,Togtoh,Tolbo,Tomorbulag,Tonkhil,Tosontsengel,Tsagaandelger,Tsagaannuur,Tsagaan Ovoo,Tsagaan Uur,Tsakhir,Tseel,Tsengel,Tsenkher,Tsenkhermandal,Tsetseg,Tsetserleg,Tsogt,Tsogt Ovoo,Tsogttsetsii,Tumed,Tunel,Tuvshruulekh,Ulaanbadrakh,Ulaankhus,Ulaan Uul,Ulanhad,Ulanqab,Uyench,Yesonbulag,Zag,Zalainur,Zamyn Uud,Zereg"},{name:"Human Generic",i:32,min:6,max:11,d:"peolst",m:0,b:"Amberglen,Angelhand,Arrowden,Autumnband,Autumnkeep,Basinfrost,Basinmore,Bayfrost,Beargarde,Bearmire,Bellcairn,Bellport,Bellreach,Blackwatch,Bleakward,Bonemouth,Boulder,Bridgefalls,Bridgeforest,Brinepeak,Brittlehelm,Bronzegrasp,Castlecross,Castlefair,Cavemire,Claymond,Claymouth,Clearguard,Cliffgate,Cliffshear,Cliffshield,Cloudbay,Cloudcrest,Cloudwood,Coldholde,Cragbury,Crowgrove,Crowvault,Crystalrock,Crystalspire,Cursefield,Curseguard,Cursespell,Dawnforest,Dawnwater,Deadford,Deadkeep,Deepcairn,Deerchill,Demonfall,Dewglen,Dewmere,Diredale,Direden,Dirtshield,Dogcoast,Dogmeadow,Dragonbreak,Dragonhold,Dragonward,Dryhost,Dustcross,Dustwatch,Eaglevein,Earthfield,Earthgate,Earthpass,Ebonfront,Edgehaven,Eldergate,Eldermere,Embervault,Everchill,Evercoast,Falsevale,Faypond,Fayvale,Fayyard,Fearpeak,Flameguard,Flamewell,Freyshell,Ghostdale,Ghostpeak,Gloomburn,Goldbreach,Goldyard,Grassplains,Graypost,Greeneld,Grimegrove,Grimeshire,Heartfall,Heartford,Heartvault,Highbourne,Hillpass,Hollowstorm,Honeywater,Houndcall,Houndholde,Iceholde,Icelight,Irongrave,Ironhollow,Knightlight,Knighttide,Lagoonpass,Lakecross,Lastmere,Laststar,Lightvale,Limeband,Littlehall,Littlehold,Littlemire,Lostcairn,Lostshield,Loststar,Madfair,Madham,Midholde,Mightglen,Millstrand,Mistvault,Mondpass,Moonacre,Moongulf,Moonwell,Mosshand,Mosstide,Mosswind,Mudford,Mudwich,Mythgulch,Mythshear,Nevercrest,Neverfront,Newfalls,Nighthall,Oakenbell,Oakenrun,Oceanstar,Oldreach,Oldwall,Oldwatch,Oxbrook,Oxlight,Pearlhaven,Pinepond,Pondfalls,Pondtown,Pureshell,Quickbell,Quickpass,Ravenside,Roguehaven,Roseborn,Rosedale,Rosereach,Rustmore,Saltmouth,Sandhill,Scorchpost,Scorchstall,Shadeforest,Shademeadow,Shadeville,Shimmerrun,Shimmerwood,Shroudrock,Silentkeep,Silvercairn,Silvergulch,Smallmire,Smoothcliff,Smoothgrove,Smoothtown,Snakemere,Snowbay,Snowshield,Snowtown,Southbreak,Springmire,Springview,Stagport,Steammouth,Steamwall,Steepmoor,Stillhall,Stoneguard,Stonespell,Stormhand,Stormhorn,Sungulf,Sunhall,Swampmaw,Swangarde,Swanwall,Swiftwell,Thorncairn,Thornhelm,Thornyard,Timberside,Tradewick,Westmeadow,Westpoint,Whiteshore,Whitvalley,Wildeden,Wildwell,Wildyard,Winterhaven,Wolfpass"},{name:"Elven",i:33,min:6,max:12,d:"lenmsrg",m:0,b:"Adrindest,Aethel,Afranthemar,Aiqua,Alari,Allanar,Almalian,Alora,Alyanasari,Alyelona,Alyran,Ammar,Anyndell,Arasari,Aren,Ashmebel,Aymlume,Bel-Didhel,Brinorion,Caelora,Chaulssad,Chaundra,Cyhmel,Cyrang,Dolarith,Dolonde,Draethe,Dranzan,Draugaust,E'ana,Eahil,Edhil,Eebel,Efranluma,Eld-Sinnocrin,Elelthyr,Ellanalin,Ellena,Ellorthond,Eltaesi,Elunore,Emyranserine,Entheas,Eriargond,Esari,Esath,Eserius,Eshsalin,Eshthalas,Evraland,Faellenor,Famelenora,Filranlean,Filsaqua,Gafetheas,Gaf Serine,Geliene,Gondorwin,Guallu,Haeth,Hanluna,Haulssad,Heloriath,Himlarien,Himliene,Hinnead,Hlinas,Hloireenil,Hluihei,Hlurthei,Hlynead,Iaenarion,Iaron,Illanathaes,Illfanora,Imlarlon,Imyse,Imyvelian,Inferius,Inlurth,innsshe,Iralserin,Irethtalos,Irholona,Ishal,Ishlashara,Ithelion,Ithlin,Iulil,Jaal,Jamkadi,Kaalume,Kaansera,Karanthanil,Karnosea,Kasethyr,Keatheas,Kelsya,Keth Aiqua,Kmlon,Kyathlenor,Kyhasera,Lahetheas,Lefdorei,Lelhamelle,Lilean,Lindeenil,Lindoress,Litys,Llaughei,Lya,Lyfa,Lylharion,Lynathalas,Machei,Masenoris,Mathethil,Mathentheas,Meethalas,Menyamar,Mithlonde,Mytha,Mythsemelle,Mythsthas,Naahona,Nalore,Nandeedil,Nasad Ilaurth,Nasin,Nathemar,Neadar,Neilon,Nelalon,Nellean,Nelnetaesi,Nilenathyr,Nionande,Nylm,Nytenanas,Nythanlenor,O'anlenora,Obeth,Ofaenathyr,Ollmnaes,Ollsmel,Olwen,Olyaneas,Omanalon,Onelion,Onelond,Orlormel,Ormrion,Oshana,Oshvamel,Raethei,Rauguall,Reisera,Reslenora,Ryanasera,Rymaserin,Sahnor,Saselune,Sel-Zedraazin,Selananor,Sellerion,Selmaluma,Shaeras,Shemnas,Shemserin,Sheosari,Sileltalos,Siriande,Siriathil,Srannor,Sshanntyr,Sshaulu,Syholume,Sylharius,Sylranbel,Taesi,Thalor,Tharenlon,Thelethlune,Thelhohil,Themar,Thene,Thilfalean,Thilnaenor,Thvethalas,Thylathlond,Tiregul,Tlauven,Tlindhe,Ulal,Ullve,Ulmetheas,Ulssin,Umnalin,Umye,Umyheserine,Unanneas,Unarith,Undraeth,Unysarion,Vel-Shonidor,Venas,Vin Argor,Wasrion,Wlalean,Yaeluma,Yeelume,Yethrion,Ymserine,Yueghed,Yuerran,Yuethin"},{name:"Dark Elven",i:34,min:6,max:14,d:"nrslamg",m:.2,b:"Abaethaggar,Abburth,Afranthemar,Aharasplit,Aidanat,Ald'ruhn,Ashamanu,Ashesari,Ashletheas,Baerario,Baereghel,Baethei,Bahashae,Balmora,Bel-Didhel,Borethanil,Buiyrandyn,Caellagith,Caellathala,Caergroth,Caldras,Chaggar,Chaggaust,Channtar,Charrvhel'raugaust,Chaulssin,Chaundra,ChedNasad,ChetarIthlin,ChethRrhinn,Chymaer,Clarkarond,Cloibbra,Commoragh,Cyrangroth,Cilben,D'eldarc,Daedhrog,Dalkyn,Do'Urden,Doladress,Dolarith,Dolonde,Draethe,Dranzan,Dranzithl,Draugaust,Dreghei,Drelhei,Dryndlu,Dusklyngh,DyonG'ennivalz,Edraithion,Eld-Sinnocrin,Ellorthond,Enhethyr,Entheas,ErrarIthinn,Eryndlyn,Faladhell,Faneadar,Fethalas,Filranlean,Formarion,Ferdor,Gafetheas,Ghrond,Gilranel,Glamordis,Gnaarmok,Gnisis,Golothaer,Gondorwin,Guallidurth,Guallu,Gulshin,Haeth,Haggraef,Harganeth,Harkaldra,Haulssad,Haundrauth,Heloriath,Hlammachar,Hlaughei,Hloireenil,Hluitar,Inferius,Innsshe,Ithilaughym,Iz'aiogith,Jaal,Jhachalkhyn,Kaerabrae,Karanthanil,Karondkar,Karsoluthiyl,Kellyth,Khuul,Lahetheas,Lidurth,Lindeenil,Lirillaquen,LithMy'athar,LlurthDreier,Lolth,Lothuial,Luihaulen'tar,Maeralyn,Maerimydra,Mathathlona,Mathethil,Mellodona,Menagith,Menegwen,Menerrendil,Menzithl,Menzoberranzan,Mila-Nipal,Mithryn,Molagmar,Mundor,Myvanas,Naggarond,Nandeedil,NasadIlaurth,Nauthor,Navethas,Neadar,Nurtaleewe,Nidiel,Noruiben,Olwen,O'lalona,Obeth,Ofaenathyr,Orlormel,Orlytlar,Pelagiad,Raethei,Raugaust,Rauguall,Rilauven,Rrharrvhei,Sadrith,Sel-Zedraazin,Seydaneen,Shaz'rir,Skaal,Sschindylryn,Shamath,Shamenz,Shanntur,Sshanntynlan,Sshanntyr,Shaulssin,SzithMorcane,Szithlin,Szobaeth,Sirdhemben,T'lindhet,Tebh'zhor,Telmere,Telnarquel,Tharlarast,Thylathlond,Tlaughe,Trizex,Tyrybblyn,Ugauth,Ughym,Uhaelben,Ullmatalos,Ulmetheas,Ulrenserine,Uluitur,Undraeth,Undraurth,Undrek'Thoz,Ungethal,UstNatha,Uthaessien,V'elddrinnsshar,Vaajha,Vel-Shonidor,Velddra,Velothi,Venead,Vhalth'vha,Vinargothr,Vojha,Waethe,Waethei,Xaalkis,Yakaridan,Yeelume,Yridhremben,Yuethin,Yuethindrynn,Zirnakaynin"},{name:"Dwarven",i:35,min:4,max:11,d:"dk",m:0,b:"Addundad,Ahagzad,Ahazil,Akil,Akzizad,Anumush,Araddush,Arar,Arbhur,Badushund,Baragzig,Baragzund,Barakinb,Barakzig,Barakzinb,Barakzir,Baramunz,Barazinb,Barazir,Bilgabar,Bilgatharb,Bilgathaz,Bilgila,Bilnaragz,Bilnulbar,Bilnulbun,Bizaddum,Bizaddush,Bizanarg,Bizaram,Bizinbiz,Biziram,Bunaram,Bundinar,Bundushol,Bundushund,Bundushur,Buzaram,Buzundab,Buzundush,Gabaragz,Gabaram,Gabilgab,Gabilgath,Gabizir,Gabunal,Gabunul,Gabuzan,Gatharam,Gatharbhur,Gathizdum,Gathuragz,Gathuraz,Gila,Giledzir,Gilukkhath,Gilukkhel,Gunala,Gunargath,Gunargil,Gundumunz,Gundusharb,Gundushizd,Kharbharbiln,Kharbhatharb,Kharbhela,Kharbilgab,Kharbuzadd,Khatharbar,Khathizdin,Khathundush,Khazanar,Khazinbund,Khaziragz,Khaziraz,Khizdabun,Khizdusharbh,Khizdushath,Khizdushel,Khizdushur,Kholedzar,Khundabiln,Khundabuz,Khundinarg,Khundushel,Khuragzig,Khuramunz,Kibarak,Kibilnal,Kibizar,Kibunarg,Kibundin,Kibuzan,Kinbadab,Kinbaragz,Kinbarakz,Kinbaram,Kinbizah,Kinbuzar,Nala,Naledzar,Naledzig,Naledzinb,Naragzah,Naragzar,Naragzig,Narakzah,Narakzar,Naramunz,Narazar,Nargabad,Nargabar,Nargatharb,Nargila,Nargundum,Nargundush,Nargunul,Narukthar,Narukthel,Nula,Nulbadush,Nulbaram,Nulbilnarg,Nulbunal,Nulbundab,Nulbundin,Nulbundum,Nulbuzah,Nuledzah,Nuledzig,Nulukkhaz,Nulukkhund,Nulukkhur,Sharakinb,Sharakzar,Sharamunz,Sharbarukth,Shatharbhizd,Shatharbiz,Shathazah,Shathizdush,Shathola,Shaziragz,Shizdinar,Shizdushund,Sholukkharb,Shundinulb,Shundushund,Shurakzund,Shuramunz,Tumunzadd,Tumunzan,Tumunzar,Tumunzinb,Tumunzir,Ukthad,Ulbirad,Ulbirar,Ulunzar,Ulur,Umunzad,Undalar,Undukkhil,Undun,Undur,Unduzur,Unzar,Unzathun,Usharar,Zaddinarg,Zaddushur,Zaharbad,Zaharbhizd,Zarakib,Zarakzar,Zaramunz,Zarukthel,Zinbarukth,Zirakinb,Zirakzir,Ziramunz,Ziruktharbh,Zirukthur,Zundumunz"},{name:"Goblin",i:36,min:4,max:9,d:"eag",m:0,b:"Asinx,Bhiagielt,Biokvish,Blix,Blus,Bratliaq,Breshass,Bridvelb,Brybsil,Bugbig,Buyagh,Cel,Chalk,Chiafzia,Chox,Cielb,Cosvil,Crekork,Crild,Croibieq,Diervaq,Dobruing,Driord,Eebligz,Een,Enissee,Esz,Far,Felhob,Froihiofz,Fruict,Fygsee,Gagablin,Gigganqi,Givzieqee,Glamzofs,Glernaahx,Gneabs,Gnoklig,Gobbledak,gobbok,Gobbrin,Heszai,Hiszils,Hobgar,Honk,Iahzaarm,Ialsirt,Ilm,Ish,Jasheafta,Joimtoilm,Kass,Katmelt,Kleabtong,Kleardeek,Klilm,Kluirm,Kuipuinx,Moft,Mogg,Nilbog,Oimzoishai,Onq,Ozbiard,Paas,Phax,Phigheldai,Preang,Prolkeh,Pyreazzi,Qeerags,Qosx,Rekx,Shaxi,Sios,Slehzit,Slofboif,Slukex,Srefs,Srurd,Stiaggaltia,Stiolx,Stioskurt,Stroir,Strytzakt,Stuikvact,Styrzangai,Suirx,Swaxi,Taxai,Thelt,Thresxea,Thult,Traglila,Treaq,Ulb,Ulm,Utha,Utiarm,Veekz,Vohniots,Vreagaald,Watvielx,Wrogdilk,Wruilt,Xurx,Ziggek,Zriokots"},{name:"Orc",i:37,min:4,max:8,d:"gzrcu",m:0,b:"Adgoz,Adgril-Gha,Adog,Adzurd,Agkadh,Agzil-Ghal,Akh,Ariz-Dru,Arkugzo,Arrordri,Ashnedh,Azrurdrekh,Bagzildre,Bashnud,Bedgez-Graz,Bhakh,Bhegh,Bhiccozdur,Bhicrur,Bhirgoshbel,Bhog,Bhurkrukh,Bod-Rugniz,Bogzel,Bozdra,Bozgrun,Bozziz,Bral-Lazogh,Brazadh,Brogved,Brogzozir,Brolzug,Brordegeg,Brorkril-Zrog,Brugroz,Brukh-Zrabrul,Brur-Korre,Bulbredh,Bulgragh,Chaz-Charard,Chegan-Khed,Chugga,Chuzar,Dhalgron-Mog,Dhazon-Ner,Dhezza,Dhoddud,Dhodh-Brerdrodh,Dhodh-Ghigin,Dhoggun-Bhogh,Dhulbazzol,Digzagkigh,Dirdrurd,Dodkakh,Dorgri,Drizdedh,Drobagh,Drodh-Ashnugh,Drogvukh-Drodh,Drukh-Qodgoz,Drurkuz,Dududh,Dur-Khaddol,Egmod,Ekh-Beccon,Ekh-Krerdrugh,Ekh-Mezred,Gagh-Druzred,Gazdrakh-Vrard,Gegnod,Gerkradh,Ghagrocroz,Ghared-Krin,Ghedgrolbrol,Gheggor,Ghizgil,Gho-Ugnud,Gholgard,Gidh-Ucceg,Goccogmurd,Golkon,Graz-Khulgag,Gribrabrokh,Gridkog,Grigh-Kaggaz,Grirkrun-Qur,Grughokh,Grurro,Gugh-Zozgrod,Gur-Ghogkagh,Ibagh-Chol,Ibruzzed,Ibul-Brad,Iggulzaz,Ikh-Ugnan,Irdrelzug,Irmekh-Bhor,Kacruz,Kalbrugh,Karkor-Zrid,Kazzuz-Zrar,Kezul-Bruz,Kharkiz,Khebun,Khorbric,Khuldrerra,Khuzdraz,Kirgol,Koggodh,Korkrir-Grar,Kraghird,Krar-Zurmurd,Krigh-Bhurdin,Kroddadh,Krudh-Khogzokh,Kudgroccukh,Kudrukh,Kudzal,Kuzgrurd-Dedh,Larud,Legvicrodh,Lorgran,Lugekh,Lulkore,Mazgar,Merkraz,Mocculdrer,Modh-Odod,Morbraz,Mubror,Muccug-Ghuz,Mughakh-Chil,Murmad,Nazad-Ludh,Negvidh,Nelzor-Zroz,Nirdrukh,Nogvolkar,Nubud,Nuccag,Nudh-Kuldra,Nuzecro,Oddigh-Krodh,Okh-Uggekh,Ordol,Orkudh-Bhur,Orrad,Qashnagh,Qiccad-Chal,Qiddolzog,Qidzodkakh,Qirzodh,Rarurd,Reradgri,Rezegh,Rezgrugh,Rodrekh,Rogh-Chirzaz,Rordrushnokh,Rozzez,Ruddirgrad,Rurguz-Vig,Ruzgrin,Ugh-Vruron,Ughudadh,Uldrukh-Bhudh,Ulgor,Ulkin,Ummugh-Ekh,Uzaggor,Uzdriboz,Uzdroz,Uzord,Uzron,Vaddog,Vagord-Khod,Velgrudh,Verrugh,Vrazin,Vrobrun,Vrugh-Nardrer,Vrurgu,Vuccidh,Vun-Gaghukh,Zacrad,Zalbrez,Zigmorbredh,Zordrordud,Zorrudh,Zradgukh,Zragmukh,Zragrizgrakh,Zraldrozzuz,Zrard-Krodog,Zrazzuz-Vaz,Zrigud,Zrulbukh-Dekh,Zubod-Ur,Zulbriz,Zun-Bergrord"},{name:"Giant",i:38,min:5,max:10,d:"kdtng",m:0,b:"Addund,Aerora,Agane,Anumush,Arangrim,Bahourg,Baragzund,Barakinb,Barakzig,Barakzinb,Baramunz,Barazinb,Beornelde,Beratira,Borgbert,Botharic,Bremrol,Brerstin,Brildung,Brozu,Bundushund,Burthug,Chazruc,Chergun,Churtec,Dagdhor,Dankuc,Darnaric,Debuch,Dina,Dinez,Diru,Drard,Druguk,Dugfast,Duhal,Dulkun,Eldond,Enuz,Eraddam,Eradhelm,Froththorn,Fynwyn,Gabaragz,Gabaram,Gabizir,Gabuzan,Gagkake,Galfald,Galgrim,Gatal,Gazin,Geru,Gila,Giledzir,Girkun,Glumvat,Gluthmark,Gomruch,Gorkege,Gortho,Gostuz,Grimor,Grimtira,Guddud,Gudgiz,Gulwo,Gunargath,Gundusharb,Guril,Gurkale,Guruge,Guzi,Hargarth,Hartreo,Heimfara,Hildlaug,Idgurth,Inez,Inginy,Iora,Irkin,Jaldhor,Jarwar,Jornangar,Jornmoth,Kakkek,Kaltoch,Kegkez,Kengord,Kharbharbiln,Khatharbar,Khathizdin,Khazanar,Khaziragz,Khizdabun,Khizdushel,Khundinarg,Kibarak,Kibizar,Kigine,Kilfond,Kilkan,Kinbadab,Kinbuzar,Koril,Kostand,Kuzake,Lindira,Lingarth,Maerdis,Magald,Marbold,Marbrand,Memron,Minu,Mistoch,Morluch,Mornkin,Morntaric,Nagu,Naragzah,Naramunz,Narazar,Nargabar,Nargatharb,Nargundush,Nargunul,Natan,Natil,Neliz,Nelkun,Noluch,Norginny,Nulbaram,Nulbilnarg,Nuledzah,Nuledzig,Nulukkhaz,Nulukkhur,Nurkel,Oci,Olane,Oldstin,Orga,Ranava,Ranhera,Rannerg,Rirkan,Rizen,Rurki,Rurkoc,Sadgach,Sgandrol,Sharakzar,Shatharbiz,Shathizdush,Shathola,Shizdinar,Sholukkharb,Shundushund,Shurakzund,Sidga,Sigbeorn,Sigbi,Solfod,Somrud,Srokvan,Stighere,Sulduch,Talkale,Theoddan,Theodgrim,Throtrek,Tigkiz,Tolkeg,Toren,Tozage,Tulkug,Tumunzar,Umunzad,Undukkhil,Usharar,Valdhere,Varkud,Velfirth,Velhera,Vigkan,Vorkige,Vozig,Vylwed,Widhyrde,Wylaeya,Yili,Yotane,Yudgor,Yulkake,Zigez,Zugkan,Zugke"},{name:"Draconic",i:39,min:6,max:14,d:"aliuszrox",m:0,b:"Aaronarra,Adalon,Adamarondor,Aeglyl,Aerosclughpalar,Aghazstamn,Aglaraerose,Agoshyrvor,Alduin,Alhazmabad,Altagos,Ammaratha,Amrennathed,Anaglathos,Andrathanach,Araemra,Araugauthos,Arauthator,Arharzel,Arngalor,Arveiaturace,Athauglas,Augaurath,Auntyrlothtor,Azarvilandral,Azhaq,Balagos,Baratathlaer,Bleucorundum,BrazzPolis,Canthraxis,Capnolithyl,Charvekkanathor,Chellewis,Chelnadatilar,Cirrothamalan,Claugiyliamatar,Cragnortherma,Dargentum,Dendeirmerdammarar,Dheubpurcwenpyl,Domborcojh,Draconobalen,Dragansalor,Dupretiskava,Durnehviir,Eacoathildarandus,Eldrisithain,Enixtryx,Eormennoth,Esmerandanna,Evenaelorathos,Faenphaele,Felgolos,Felrivenser,Firkraag,Fll'Yissetat,Furlinastis,Galadaeros,Galglentor,Garnetallisar,Garthammus,Gaulauntyr,Ghaulantatra,Glouroth,Greshrukk,Guyanothaz,Haerinvureem,Haklashara,Halagaster,Halaglathgar,Havarlan,Heltipyre,Hethcypressarvil,Hoondarrh,Icehauptannarthanyx,Iiurrendeem,Ileuthra,Iltharagh,Ingeloakastimizilian,Irdrithkryn,Ishenalyr,Iymrith,Jaerlethket,Jalanvaloss,Jharakkan,Kasidikal,Kastrandrethilian,Khavalanoth,Khuralosothantar,Kisonraathiisar,Kissethkashaan,Kistarianth,Klauth,Klithalrundrar,Krashos,Kreston,Kriionfanthicus,Krosulhah,Krustalanos,Kruziikrel,Kuldrak,Lareth,Latovenomer,Lhammaruntosz,Llimark,Ma'fel'no'sei'kedeh'naar,MaelestorRex,Magarovallanthanz,Mahatnartorian,Mahrlee,Malaeragoth,Malagarthaul,Malazan,Maldraedior,Maldrithor,MalekSalerno,Maughrysear,Mejas,Meliordianix,Merah,Mikkaalgensis,Mirmulnir,Mistinarperadnacles,Miteach,Mithbarazak,Morueme,Moruharzel,Naaslaarum,Nahagliiv,Nalavarauthatoryl,Naxorlytaalsxar,Nevalarich,Nolalothcaragascint,Nurvureem,Nymmurh,Odahviing,Olothontor,Ormalagos,Otaaryliakkarnos,Paarthurnax,Pelath,Pelendralaar,Praelorisstan,Praxasalandos,Protanther,Qiminstiir,Quelindritar,Ralionate,Rathalylaug,Rathguul,Rauglothgor,Raumorthadar,Relonikiv,Ringreemeralxoth,Roraurim,Rynnarvyx,Sablaxaahl,Sahloknir,Sahrotaar,Samdralyrion,Saryndalaghlothtor,Sawaka,Shalamalauth,Shammagar,Sharndrel,Shianax,Skarlthoon,Skurge,Smergadas,Ssalangan,Sssurist,Sussethilasis,Sylvallitham,Tamarand,Tantlevgithus,Tarlacoal,Tenaarlaktor,Thalagyrt,Tharas'kalagram,Thauglorimorgorus,Thoklastees,Thyka,Tsenshivah,Ueurwen,Uinnessivar,Urnalithorgathla,Velcuthimmorhar,Velora,Vendrathdammarar,Venomindhar,Viinturuth,Voaraghamanthar,Voslaarum,Vr'tark,Vrondahorevos,Vuljotnaak,Vulthuryol,Wastirek,Worlathaugh,Xargithorvar,Xavarathimius,Yemere,Ylithargathril,Ylveraasahlisar,Za-Jikku,Zarlandris,Zellenesterex,Zilanthar,Zormapalearath,Zundaerazylym,Zz'Pzora"},{name:"Arachnid",i:40,min:4,max:10,d:"erlsk",m:0,b:"Aaqok'ser,Aiced,Aizachis,Allinqel,As'taq,Ashrash,Caaqtos,Ceek'sax,Ceezuq,Cek'sier,Cen'qi,Ceqzocer,Cezeed,Chachocaq,Charis,Chashilieth,Checib,Chernul,Chezi,Chiazu,Chishros,Chixhi,Chizhi,Chollash,Choq'sha,Cinchichail,Collul,Ecush'taid,Ekiqe,Eqas,Er'uria,Erikas,Es'tase,Esrub,Exha,Haqsho,Hiavheesh,Hitha,Hok'thi,Hossa,Iacid,Iciever,Illuq,Isnir,Keezut,Kheellavas,Kheizoh,Khiachod,Khika,Khirzur,Khonrud,Khrakku,Khraqshis,Khrethish'ti,Khriashus,Khrika,Khrirni,Klashirel,Kleil'sha,Klishuth,Krarnit,Kras'tex,Krotieqas,Lais'tid,Laizuh,Lasnoth,Len'qeer,Leqanches,Lezad,Lhilir,Lhivhath,Lhok'thu,Lialliesed,Liaraq,Liceva,Lichorro,Lilla,Lokieqib,Nakur,Neerhaca,Neet'er,Neezoh,Nenchiled,Nerhalneth,Nir'ih,Nizus,Noreeqo,On'qix,Qalitho,Qas'tor,Qasol,Qavrud,Qavud,Qazar,Qazru,Qekno,Qeqravee,Qes'tor,Qhaik'sal,Qhak'sish,Qhazsakais,Qheliva,Qhenchaqes,Qherazal,Qhon'qos,Qhosh,Qish'tur,Qisih,Qorhoci,Qranchiq,Racith,Rak'zes,Ranchis,Rarhie,Rarzi,Rarzisiaq,Ras'tih,Ravosho,Recad,Rekid,Rernee,Rertachis,Rezhokketh,Reziel,Rhacish,Rhail'shel,Rhairhizse,Rhakivex,Rhaqeer,Rhartix,Rheciezsei,Rheevid,Rhel'shir,Rhevhie,Rhiavekot,Rhikkos,Rhiqese,Rhiqi,Rhiqracar,Rhisned,Rhousnateb,Riakeesnex,Rintachal,Rir'ul,Rourk'u,Rouzakri,Sailiqei,Sanchiqed,Saqshu,Sat'ier,Sazi,Seiqas,Shieth'i,Shiqsheh,Shizha,Shrachuvo,Shranqo,Shravhos,Shravuth,Shreerhod,Shrethuh,Shriantieth,Shronqash,Shrovarhir,Shrozih,Siacaqoh,Siezosh,Siq'sha,Sirro,Sornosi,Srachussi,Szaca,Szacih,Szaqova,Szasu,Szazhilos,Szeerrud,Szeezsad,Szeknur,Szesir,Szezhirros,Szilshith,Szon'qol,Szornuq,Xeekke,Yeek'su,Yeeq'zox,Yeqil,Yeqroq,Yeveed,Yevied,Yicaveeh,Yirresh,Yisie,Yithik'thaih,Yorhaqshes,Zacheek'sa,Zakkasa,Zelraq,Zeqo,Zharuncho,Zhath'arhish,Zhavirrit,Zhazilraq,Zhazsachiel,Zhek'tha,Zhequ,Zhias'ted,Zhicat,Zhicur,Zhirhacil,Zhizri,Zhochizses,Ziarih,Zirnib"},{name:"Serpents",i:41,min:5,max:11,d:"slrk",m:0,b:"Aj'ha,Aj'i,Aj'tiss,Ajakess,Aksas,Aksiss,Al'en,An'jeshe,Apjige,Arkkess,Athaz,Atus,Azras,Caji,Cakrasar,Cal'arrun,Capji,Cathras,Cej'han,Ces,Cez'jenta,Cij'te,Cinash,Cizran,Coth'jus,Cothrash,Culzanek,Cunaless,Ej'tesh,Elzazash,Ergek,Eshjuk,Ethris,Gan'jas,Gapja,Gar'thituph,Gopjeguss,Gor'thesh,Gragishaph,Grar'theness,Grath'ji,Gressinas,Grolzesh,Grorjar,Grozrash,Guj'ika,Harji,Hej'hez,Herkush,Horgarrez,Illuph,Ipjar,Ithashin,Kaj'ess,Kar'kash,Kepjusha,Ki'kintus,Kissere,Koph,Kopjess,Kra'kasher,Krak,Krapjez,Krashjuless,Kraz'ji,Krirrigis,Krussin,Ma'lush,Mage,Maj'tak,Mal'a,Mapja,Mar'kash,Mar'kis,Marjin,Mas,Mathan,Men'jas,Meth'jaresh,Mij'hegak,Min'jash,Mith'jas,Monassu,Moss,Naj'hass,Najugash,Nak,Napjiph,Nar'ka,Nar'thuss,Narrusha,Nash,Nashjekez,Nataph,Nij'ass,Nij'tessiph,Nishjiss,Norkkuss,Nus,Olluruss,Or'thi,Or'thuss,Paj'a,Parkka,Pas,Pathujen,Paz'jaz,Pepjerras,Pirkkanar,Pituk,Porjunek,Pu'ke,Ragen,Ran'jess,Rargush,Razjuph,Rilzan,Riss,Rithruz,Rorgiss,Rossez,Rraj'asesh,Rraj'tass,Rrar'kess,Rrar'thuph,Rras,Rrazresh,Rrej'hish,Rrigelash,Rris,Rris,Rroksurrush,Rukrussush,Rurri,Russa,Ruth'jes,Sa'kitesh,Sar'thass,Sarjas,Sazjuzush,Ser'thez,Sezrass,Shajas,Shas,Shashja,Shass,Shetesh,Shijek,Shun'jaler,Shurjarri,Skaler,Skalla,Skallentas,Skaph,Skar'kerriz,Skath'jeruk,Sker'kalas,Skor,Skoz'ji,Sku'lu,Skuph,Skur'thur,Slalli,Slalt'har,Slelziress,Slil'ar,Sloz'jisa,Sojesh,Solle,Sorge,Sral'e,Sran'ji,Srapjess,Srar'thazur,Srash,Srath'jess,Srathrarre,Srerkkash,Srus,Sruss'tugeph,Sun,Suss'tir,Uzrash,Vargush,Vek,Vess'tu,Viph,Vult'ha,Vupjer,Vushjesash,Xagez,Xassa,Xulzessu,Zaj'tiss,Zan'jer,Zarriss,Zassegus,Zirres,Zsor,Zurjass"},{name:"Levantine",i:42,min:4,max:12,d:"ankprs",m:0,b:"Adme,Adramet,Agadir,Akko,Akzib,Alimas,Alis-Ubbo,Alqosh,Amid,Ammon,Ampi,Amurru,Andarig,Anpa,Araden,Aram,Arwad,Ashkelon,Athar,Atiq,Aza,Azeka,Baalbek,Babel,Batrun,Beerot,Beersheba,Beit Shemesh,Berytus,Bet Agus,Bet Anya,Beth-Horon,Bethel,Bethlehem,Bethuel,Bet Nahrin,Bet Nohadra,Bet Zalin,Birmula,Biruta,Bit Agushi,Bitan,Bit Zamani,Cerne,Dammeseq,Darmsuq,Dor,Eddial,Eden Ekron,Elah,Emek,Emun,Ephratah,Eyn Ganim,Finike,Gades,Galatia,Gaza,Gebal,Gedera,Gerizzim,Gethsemane,Gibeon,Gilead,Gilgal,Golgotha,Goshen,Gytte,Hagalil,Haifa,Halab,Haqel Dma,Har Habayit,Har Nevo,Har Pisga,Havilah,Hazor,Hebron,Hormah,Iboshim,Iriho,Irinem,Irridu,Israel,Kadesh,Kanaan,Kapara,Karaly,Kart-Hadasht,Keret Chadeshet,Kernah,Kesed,Keysariya,Kfar,Kfar Nahum,Khalibon,Khalpe,Khamat,Kiryat,Kittim,Kurda,Lapethos,Larna,Lepqis,Lepriptza,Liksos,Lod,Luv,Malaka,Malet,Marat,Megido,Melitta,Merdin,Metsada,Mishmarot,Mitzrayim,Moab,Mopsos,Motye,Mukish,Nampigi,Nampigu,Natzrat,Nimrud,Nineveh,Nob,Nuhadra,Oea,Ofir,Oyat,Phineka,Phoenicus,Pleshet,Qart-Tubah Sarepta,Qatna,Rabat Amon,Rakkath,Ramat Aviv,Ramitha,Ramta,Rehovot,Reshef,Rushadir,Rushakad,Samrin,Sefarad,Sehyon,Sepat,Sexi,Sharon,Shechem,Shefelat,Shfanim,Shiloh,Shmaya,Shomron,Sidon,Sinay,Sis,Solki,Sur,Suria,Tabetu,Tadmur,Tarshish,Tartus,Teberya,Tefessedt,Tekoa,Teyman,Tinga,Tipasa,Tsabratan,Tur Abdin,Tzarfat,Tziyon,Tzor,Ugarit,Unubaal,Ureshlem,Urhay,Urushalim,Vaga,Yaffa,Yamhad,Yam hamelach,Yam Kineret,Yamutbal,Yathrib,Yaudi,Yavne,Yehuda,Yerushalayim,Yev,Yevus,Yizreel,Yurdnan,Zarefat,Zeboim,Zeurta,Zeytim,Zikhron,Zmurna"}]}}window.Names=new Iu;class Du{cells;vertices;pointsN;used;lineGen=tn().curve(Tl);oceanLayers;constructor(a){this.oceanLayers=a}randomizeOutline(){const a=[];let n=.2;for(let t=-9;t<0;t++)B(n)?(n=.2,a.push(t)):n*=2;return a}connectVertices(a,n){const t=[];for(let i=0,o=a;i===0||o!==a&&i<1e4;i++){const s=t[t.length-1];t.push(o);const h=this.vertices.c[o];h.filter(r=>this.cells.t[r]===n).forEach(r=>{this.used[r]=1});const u=this.vertices.v[o],l=!this.cells.t[h[0]]||this.cells.t[h[0]]===n-1,c=!this.cells.t[h[1]]||this.cells.t[h[1]]===n-1,d=!this.cells.t[h[2]]||this.cells.t[h[2]]===n-1;if(u[0]!==void 0&&u[0]!==s&&l!==c?o=u[0]:u[1]!==void 0&&u[1]!==s&&c!==d?o=u[1]:u[2]!==void 0&&u[2]!==s&&l!==d&&(o=u[2]),o===t[t.length-1]){ERROR&&console.error("Next vertex is not found");break}}return t.push(t[0]),t}findStart(a,n){return this.cells.b[a]?this.cells.v[a].find(t=>this.vertices.c[t].some(i=>i>=this.pointsN)):this.cells.v[a][this.cells.c[a].findIndex(t=>this.cells.t[t]<n||!this.cells.t[t])]}draw(){const a=this.oceanLayers.attr("layers");if(a==="none")return;TIME&&console.time("drawOceanLayers"),this.cells=grid.cells,this.pointsN=grid.cells.i.length,this.vertices=grid.vertices;const n=a==="random"?this.randomizeOutline():a.split(",").map(o=>+o),t=[],i=N(.4/n.length,2);this.used=new Uint8Array(this.pointsN);for(const o of this.cells.i){const s=this.cells.t[o];if(s>0||this.used[o]||!n.includes(s))continue;const h=this.findStart(o,s);if(!h)continue;this.used[o]=1;const u=this.connectVertices(h,s);if(u.length<4)continue;const l=1+s*-2,c=u.filter((r,g)=>!(g%l)||this.vertices.c[r].some(m=>m>=this.pointsN));if(c.length<4)continue;const d=sn(c.map(r=>this.vertices.p[r]),graphWidth,graphHeight,1);t.push([s,d])}for(const o of n){const h=t.filter(u=>u[0]===o).map(u=>ze(this.lineGen(u[1])||"")).join("");h&&this.oceanLayers.append("path").attr("d",h).attr("fill","#ecf2f9").attr("fill-opacity",i)}TIME&&console.timeEnd("drawOceanLayers")}}window.OceanLayers=()=>new Du(oceanLayers).draw();class Gu{LAKE_ELEVATION_DELTA=.1;getHeight(a){const n=pack.cells.h,t=Ba(a.shoreline.map(i=>n[i]))||20;return N(t-this.LAKE_ELEVATION_DELTA,2)}defineNames(){pack.features.forEach(a=>{a.type==="lake"&&(a.name=this.getName(a))})}getName(a){const n=a.shoreline[0],t=pack.cells.culture[n];return Names.getCulture(t)}cleanupLakeData=()=>{for(const a of pack.features){if(a.type!=="lake")continue;delete a.river,delete a.enteringFlux,delete a.outCell,delete a.closed,a.height=N(a.height,3);const n=a.inlets?.filter(i=>pack.rivers.find(o=>o.i===i));!n||!n.length?delete a.inlets:a.inlets=n,a.outlet&&pack.rivers.find(i=>i.i===a.outlet)||delete a.outlet}};defineClimateData(a){const{cells:n,features:t}=pack,i=new Uint16Array(n.i.length),o=l=>l.shoreline.reduce((c,d)=>c+grid.cells.prec[n.g[d]],0),s=l=>l.cells<6?grid.cells.temp[n.g[l.firstCell]]:N(Ha(l.shoreline.map(c=>grid.cells.temp[n.g[c]])),1),h=l=>{const c=(l.height-18)**Number(heightExponentInput.value),d=(700*(l.temp+.006*c)/50+75)/(80-l.temp);return N(d*l.cells)},u=l=>l.shoreline.sort((c,d)=>a[c]-a[d])[0];return t.forEach(l=>{l.type==="lake"&&(l.flux=o(l),l.temp=s(l),l.evaporation=h(l),!l.closed&&(l.outCell=u(l),i[l.outCell]=l.i))}),i}detectCloseLakes(a){const{cells:n}=pack,t=+j("lakeElevationLimitOutput")?.value;pack.features.forEach(i=>{if(i.type!=="lake")return;delete i.closed;const o=i.height+t;if(o>99){i.closed=!1;return}let s=!0;const h=i.shoreline.sort((c,d)=>a[c]-a[d])[0],u=[h],l=[];for(l[h]=!0;u.length&&s;){const c=u.pop();for(const d of n.c[c])if(!l[d]&&!(a[d]>=o)){if(a[d]<20){const r=pack.features[n.f[d]];(r.type==="ocean"||i.height>r.height)&&(s=!1)}l[d]=!0,u.push(d)}}i.closed=s})}}window.Lakes=new Gu;class Ou{FLUX_FACTOR=500;MAX_FLUX_WIDTH=1;LENGTH_FACTOR=200;LENGTH_STEP_WIDTH=1/this.LENGTH_FACTOR;LENGTH_PROGRESSION=[1,1,2,3,5,8,13,21,34].map(a=>a/this.LENGTH_FACTOR);lineGen=tn().curve(zl);riverTypes={main:{big:{River:1},small:{Creek:9,River:3,Brook:3,Stream:1}},fork:{big:{Fork:1},small:{Branch:1}}};smallLength=null;generate(a=!0){TIME&&console.time("generateRivers"),Math.random=Te(seed);const{cells:n,features:t}=pack,i={},o={},s=(m,f)=>{i[f]?i[f].push(m):i[f]=[m]},h=()=>{const f=(pointsInput.dataset.cells/1e4)**.25,p=grid.cells.prec,y=n.i.filter(b=>g[b]>=20).sort((b,v)=>g[v]-g[b]),k=Lakes.defineClimateData(g);for(const b of y){n.fl[b]+=p[n.g[b]]/f;const v=k[b]?t.filter(M=>b===M.outCell&&M.flux>M.evaporation):[];for(const M of v){const T=n.c[b].find(S=>g[S]<20&&n.f[S]===M.i);n.fl[T]+=Math.max(M.flux-M.evaporation,0),n.r[T]!==M.river&&(n.c[T].some(z=>n.r[z]===M.river)?(n.r[T]=M.river,s(T,M.river)):(n.r[T]=r,s(T,r),r++)),M.outlet=n.r[T],u(b,n.fl[T],M.outlet)}const w=v[0]?.outlet;for(const M of v)if(Array.isArray(M.inlets))for(const T of M.inlets)o[T]=w;if(n.b[b]&&n.r[b]){s(-1,n.r[b]);continue}let _=null;if(k[b]?_=n.c[b].filter(T=>!v.map(S=>S.i).includes(n.f[T])).sort((T,S)=>g[T]-g[S])[0]:n.haven[b]?_=n.haven[b]:_=n.c[b].sort((M,T)=>g[M]-g[T])[0],!(g[b]<=g[_])){if(n.fl[b]<30){g[_]>=20&&(n.fl[_]+=n.fl[b]);continue}n.r[b]||(n.r[b]=r,s(b,r),r++),u(_,n.fl[b],n.r[b])}}},u=(m,f,p)=>{const y=n.fl[m]-n.conf[m],k=n.r[m];if(k?f>y?(n.conf[m]+=n.fl[m],g[m]>=20&&(o[k]=p),n.r[m]=p):(n.conf[m]+=f,g[m]>=20&&(o[p]=k)):n.r[m]=p,g[m]<20){const b=t[n.f[m]];b.type==="lake"&&((!b.river||f>b.enteringFlux)&&(b.river=p,b.enteringFlux=f),b.flux=b.flux+f,b.inlets?b.inlets.push(p):b.inlets=[p])}else n.fl[m]+=f;s(m,p)},l=()=>{n.r=new Uint16Array(n.i.length),n.conf=new Uint16Array(n.i.length),pack.rivers=[];const m=N(1/(pointsInput.dataset.cells/1e4)**.25,2),f=m*1.2;for(const p in i){const y=i[p];if(y.length<3)continue;const k=+p;for(const x of y)x<0||n.h[x]<20||(n.r[x]?n.conf[x]=1:n.r[x]=k);const b=y[0],v=y[y.length-2],w=o[p]||0,_=!w||w===k?f:m,M=this.addMeandering(y),T=n.fl[v],S=this.getApproximateLength(M),z=this.getSourceWidth(n.fl[b]),A=this.getWidth(this.getOffset({flux:T,pointIndex:M.length,widthFactor:_,startingWidth:z}));pack.rivers.push({i:k,source:b,mouth:v,discharge:T,length:S,width:A,widthFactor:_,sourceWidth:z,parent:w,cells:y})}},c=()=>{for(const f of pack.cells.i){if(n.h[f]<35||!n.fl[f])continue;const p=n.c[f].filter(b=>n.h[b]>n.h[f]),y=p.reduce((b,v)=>b+n.fl[v],0)/p.length;if(!y)continue;const k=Math.floor(n.fl[f]/y);k&&(n.h[f]-=Math.min(k,5))}},d=()=>{for(const m of n.i){if(!n.conf[m])continue;const f=n.c[m].filter(p=>n.r[p]&&g[p]>g[m]).map(p=>n.fl[p]).sort((p,y)=>y-p);n.conf[m]=f.reduce((p,y,k)=>k?p+y:p,0)}};n.fl=new Uint16Array(n.i.length),n.r=new Uint16Array(n.i.length),n.conf=new Uint8Array(n.i.length);let r=1;const g=this.alterHeights();Lakes.detectCloseLakes(g),this.resolveDepressions(g),h(),l(),d(),Lakes.cleanupLakeData(),a&&(n.h=Uint8Array.from(g),c()),TIME&&console.timeEnd("generateRivers")}alterHeights(){const{h:a,c:n,t}=pack.cells;return Array.from(a).map((i,o)=>i<20||t[o]<1?i:i+t[o]/100+Ha(n[o].map(s=>t[s]))/1e4)}resolveDepressions(a){const{cells:n,features:t}=pack,i=+document.getElementById("resolveDepressionsStepsOutput")?.value,o=i*.85,s=i*.75,h=g=>t[n.f[g]].height||a[g],u=t.filter(g=>g.type==="lake"),l=n.i.filter(g=>a[g]>=20&&!n.b[g]);l.sort((g,m)=>a[g]-a[m]);const c=[];let d=1/0,r=null;for(let g=0;d&&g<i;g++){if(c.length>5&&ai(c)>0){a=this.alterHeights(),d=c[0];break}if(d=0,g<o)for(const m of u){if(m.closed)continue;const f=Ba(m.shoreline.map(p=>a[p]));if(!(f>=100||m.height>f)){if(g>s){m.shoreline.forEach(p=>{a[p]=n.h[p]}),m.height=Ba(m.shoreline.map(p=>a[p]))-1,m.closed=!0;continue}d++,m.height=f+.2}}for(const m of l){const f=Ba(n.c[m].map(p=>h(p)));f>=100||a[m]>f||(d++,a[m]=f+.1)}r!==null&&c.push(d-r),r=d}d&&WARN&&console.warn(`Unresolved depressions: ${d}. Edit heightmap to fix`)}addMeandering(a,n=null,t=.5){const{fl:i,h:o}=pack.cells,s=[],h=a.length-1,u=this.getRiverPoints(a,n);let l=o[a[0]]<20?1:10;for(let c=0;c<=h;c++,l++){const d=a[c],r=c===h,[g,m]=u[c];if(s.push([g,m,i[d]]),r)break;const f=a[c+1],[p,y]=u[c+1];if(f===-1){s.push([p,y,i[d]]);break}const k=(p-g)**2+(y-m)**2;if(k<=25&&a.length>=6)continue;const b=t+1/l+Math.max(t-l/100,0),v=Math.atan2(y-m,p-g),w=Math.sin(v)*b,_=Math.cos(v)*b;if(l<20&&(k>64||k>36&&a.length<5)){const M=(g*2+p)/3+-w,T=(m*2+y)/3+_,S=(g+p*2)/3+w/2,z=(m+y*2)/3-_/2;s.push([M,T,0],[S,z,0])}else if(k>25||a.length<6){const M=(g+p)/2+-w,T=(m+y)/2+_;s.push([M,T,0])}}return s}getRiverPoints(a,n){if(n)return n;const{p:t}=pack.cells;return a.map((i,o)=>i===-1?this.getBorderPoint(a[o-1]):t[i])}getBorderPoint(a){const[n,t]=pack.cells.p[a],i=Math.min(t,graphHeight-t,n,graphWidth-n);return i===t?[n,0]:i===graphHeight-t?[n,graphHeight]:i===n?[0,t]:[graphWidth,t]}getOffset({flux:a,pointIndex:n,widthFactor:t,startingWidth:i}){if(n===0)return i;const o=Math.min(a**.7/this.FLUX_FACTOR,this.MAX_FLUX_WIDTH),s=n*this.LENGTH_STEP_WIDTH+(this.LENGTH_PROGRESSION[n]||this.LENGTH_PROGRESSION.at(-1));return t*(s+o)+i}getSourceWidth(a){return N(Math.min(a**.9/this.FLUX_FACTOR,this.MAX_FLUX_WIDTH),2)}getRiverPath(a,n,t){this.lineGen.curve(Cl.alpha(.1));const i=[],o=[];let s=0;for(let l=0;l<a.length;l++){const[c,d]=a[l-1]||a[l],[r,g,m]=a[l],[f,p]=a[l+1]||a[l];m>s&&(s=m);const y=this.getOffset({flux:s,pointIndex:l,widthFactor:n,startingWidth:t}),k=Math.atan2(d-p,c-f),b=Math.sin(k)*y,v=Math.cos(k)*y;i.push([r-b,g+v]),o.push([r+b,g-v])}const h=this.lineGen(o.reverse());let u=this.lineGen(i)||"";return u=u.substring(u.indexOf("C")),ze(h+u,1)}specify(){const a=pack.rivers;if(a.length)for(const n of a)n.basin=this.getBasin(n.i),n.name=this.getName(n.mouth),n.type=this.getType(n)}getName(a){return Names.getCulture(pack.cells.culture[a])}getType({i:a,length:n,parent:t}){if(this.smallLength===null){const s=Math.ceil(pack.rivers.length*.15);this.smallLength=pack.rivers.map(h=>h.length||0).sort((h,u)=>h-u)[s]}const i=n<this.smallLength,o=ba(3)(a)&&t&&t!==a;return de(this.riverTypes[o?"fork":"main"][i?"small":"big"])}getApproximateLength(a){const n=a.reduce((t,i,o,s)=>t+(o?Math.hypot(i[0]-s[o-1][0],i[1]-s[o-1][1]):0),0);return N(n,2)}getWidth(a){return N((a/1.5)**1.8,2)}remove(a){const n=pack.cells,t=pack.rivers.filter(i=>i.i===a||i.parent===a||i.basin===a).map(i=>i.i);t.forEach(i=>{rivers.select(`#river${i}`).remove()}),n.r.forEach((i,o)=>{!i||!t.includes(i)||(n.r[o]=0,n.fl[o]=grid.cells.prec[n.g[o]],n.conf[o]=0)}),pack.rivers=pack.rivers.filter(i=>!t.includes(i.i))}getBasin(a){const n=pack.rivers.find(t=>t.i===a)?.parent;return!n||a===n?a:this.getBasin(n)}getNextId(a){return a.length?Math.max(...a.map(n=>n.i))+1:1}}window.Rivers=new Ou;class qu{shift(){const{cells:a,features:n,burgs:t}=pack,i=grid.cells.temp,o={};for(const h of t){if(!h.i||h.lock)continue;delete h.port;const u=h.cell,l=a.haven[u],c=a.harbor[u],d=a.f[l];if(!d)continue;const r=n[d].cells>1,g=c&&h.capital||c===1,m=i[a.g[u]]<=0;r&&g&&!m&&(o[d]||(o[d]=[]),o[d].push(h))}const s=(h,u)=>{const{cells:l,vertices:c}=pack,[d,r]=l.p[h],g=l.v[h].filter(_=>c.c[_].some(M=>M===u)),[m,f]=c.p[g[0]],[p,y]=c.p[g[1]],k=(m+p)/2,b=(f+y)/2,v=N(d+.95*(k-d),2),w=N(r+.95*(b-r),2);return[v,w]};Object.entries(o).forEach(([h,u])=>{u.length<2||u.forEach(l=>{l.port=h;const c=a.haven[l.cell],[d,r]=s(l.cell,c);l.x=d,l.y=r})});for(const h of t){if(!h.i||h.lock||h.port||!a.r[h.cell])continue;const u=h.cell,l=Math.min(a.fl[u]/150,1);h.x=u%2?N(h.x+l,2):N(h.x-l,2),h.y=a.r[u]%2?N(h.y+l,2):N(h.y-l,2)}}generate(){TIME&&console.time("generateBurgs");const{cells:a}=pack;let n=[0];a.burg=new Uint16Array(a.i.length);const t=a.i.filter(l=>a.s[l]>0&&a.culture[l]);if(!t.length)return ERROR&&console.error("There is no populated cells with culture assigned. Cannot generate states"),n;let i=ue();const o=()=>{const l=m=>m*(.5+Math.random()*.5),c=new Int16Array(a.s.map(l)),d=t.sort((m,f)=>c[f]-c[m]),r=h();let g=(graphWidth+graphHeight)/2/r;for(let m=0;n.length<=r;m++){const f=d[m],[p,y]=a.p[f];i.find(p,y,g)===void 0&&(n.push({cell:f,x:p,y}),i.add([p,y])),m===d.length-1&&(WARN&&console.warn("Cannot place capitals with current spacing. Trying again with reduced spacing"),i=ue(),m=-1,n=[0],g/=1.2)}n.forEach((m,f)=>{f&&(m.i=f,m.state=f,m.culture=a.culture[m.cell],m.name=Names.getCultureShort(m.culture),m.feature=a.f[m.cell],m.capital=1,a.burg[m.cell]=f)})},s=()=>{const l=m=>m*Qa(1,3,0,20,3),c=new Int16Array(a.s.map(l)),d=t.sort((m,f)=>c[f]-c[m]),r=u();let g=(graphWidth+graphHeight)/150/(r**.7/66);for(let m=0;m<r&&g>1;){for(let f=0;m<r&&f<d.length;f++){if(a.burg[d[f]])continue;const p=d[f],[y,k]=a.p[p],b=g*Qa(1,.3,.2,2,2);if(i.find(y,k,b)!==void 0)continue;const v=n.length,w=a.culture[p],_=Names.getCulture(w),M=a.f[p];n.push({cell:p,x:y,y:k,i:v,state:0,culture:w,name:_,feature:M,capital:0}),m++,a.burg[p]=v}g*=.5}};o(),s(),pack.burgs=n,this.shift(),TIME&&console.timeEnd("generateBurgs");function h(){let l=j("statesNumber").valueAsNumber;return t.length<l*10&&(l=Math.floor(t.length/10),WARN&&console.warn(`Not enough populated cells. Generating only ${l} capitals/states`)),l}function u(){const l=j("manorsInput");return l.value==="1000"?N(t.length/5/(grid.points.length/1e4)**.8):Math.min(l.valueAsNumber,t.length)}}getType(a,n){const{cells:t,features:i}=pack;if(n)return"Naval";const o=t.haven[a];if(o!==void 0&&i[t.f[o]].type==="lake")return"Lake";if(t.h[a]>60)return"Highland";if(t.r[a]&&t.fl[a]>=100)return"River";const s=t.biome[a],h=t.pop[a];if(!t.burg[a]||h<=5){if(h<5&&[1,2,3,4].includes(s))return"Nomadic";if(s>4&&s<10)return"Hunting"}return"Generic"}definePopulation(a){const n=a.cell;let t=pack.cells.s[n]/5;a.capital&&(t*=1.5);const i=Routes.getConnectivityRate(n);i&&(t*=i),t*=Qa(1,1,.25,4,5),t+=(a.i%100-n%100)/1e3,a.population=N(Math.max(t,.01),3)}defineEmblem(a){a.type=this.getType(a.cell,a.port);const n=pack.states[a.state],t=n.coa;let i=.25;a.capital?i+=.1:a.port&&(i-=.1),a.culture!==n.culture&&(i-=.25);const o=a.capital&&B(.2)?"Capital":a.type==="Generic"?"City":a.type;a.coa=COA.generate(t,i,null,o),a.coa.shield=COA.getShield(a.culture,a.state)}defineFeatures(a){const n=a.population;a.citadel=Number(a.capital||n>50&&B(.75)||n>15&&B(.5)||B(.1)),a.plaza=Number(Routes.isCrossroad(a.cell)||Routes.hasRoad(a.cell)&&B(.7)||n>20||n>10&&B(.8)),a.walls=Number(a.capital||n>30||n>20&&B(.75)||n>10&&B(.5)||B(.1)),a.shanty=Number(n>60||n>40&&B(.75)||n>20&&a.walls&&B(.4));const t=pack.cells.religion[a.cell],i=pack.states[a.state].form==="Theocracy";a.temple=Number(t&&i&&B(.5)||n>50||n>35&&B(.75)||n>20&&B(.5))}getDefaultGroups(){return[{name:"capital",active:!0,order:9,features:{capital:!0},preview:"watabou-city"},{name:"city",active:!0,order:8,percentile:90,min:5,preview:"watabou-city"},{name:"fort",active:!0,features:{citadel:!0,walls:!1,plaza:!1,port:!1},order:6,max:1},{name:"monastery",active:!0,features:{temple:!0,walls:!1,plaza:!1,port:!1},order:5,max:.8},{name:"caravanserai",active:!0,features:{port:!1,plaza:!0},order:4,max:.8,biomes:[1,2,3]},{name:"trading_post",active:!0,order:3,features:{plaza:!0},max:.8,biomes:[5,6,7,8,9,10,11,12]},{name:"village",active:!0,order:2,min:.1,max:2,preview:"watabou-village"},{name:"hamlet",active:!0,order:1,features:{plaza:!1},max:.1,preview:"watabou-village"},{name:"town",active:!0,order:7,isDefault:!0,preview:"watabou-city"}]}defineGroup(a,n){if(a.lock&&a.group&&options.burgs.groups.find(o=>o.name===a.group))return;const t=options.burgs.groups.find(i=>i.isDefault);if(!t){ERROR&&console.error("No default group defined");return}a.group=t.name;for(const i of options.burgs.groups)if(i.active&&!(i.min&&!(a.population>=i.min))&&!(i.max&&!(a.population<=i.max))&&!(i.features&&!Object.entries(i.features).every(([s,h])=>!!a[s]===h))&&!(i.biomes&&!i.biomes.includes(pack.cells.biome[a.cell]))&&!(i.percentile&&!(n.indexOf(a.population)>=Math.floor(n.length*i.percentile/100)))){a.group=i.name;return}}specify(){TIME&&console.time("specifyBurgs"),pack.burgs.forEach(n=>{!n.i||n.removed||n.lock||(this.definePopulation(n),this.defineEmblem(n),this.defineFeatures(n))});const a=pack.burgs.filter(n=>n.i&&!n.removed).map(n=>n.population).sort((n,t)=>n-t);pack.burgs.forEach(n=>{!n.i||n.removed||this.defineGroup(n,a)}),TIME&&console.timeEnd("specifyBurgs")}createWatabouCityLinks(a){const n=pack.cells,{i:t,name:i,population:o,cell:s}=a,h=a.MFCG||seed+String(a.i).padStart(4,"0"),u=2.13*(o*populationRate/urbanDensity)**.385,l=ma(Math.ceil(u),6,100),c=N(o*populationRate*urbanization),d=n.r[s]?1:0,r=+(parseInt(a.port,10)>0),g=(()=>{if(!r||!n.haven[s])return null;const[z,A]=n.p[s],[x,C]=n.p[n.haven[s]],E=Math.atan2(C-A,x-z)*180/Math.PI;return E<=0?N(ee(Math.abs(E),0,180),2):N(2-ee(E,0,180),2)})(),f=+(d?[1,2,3,4,5,6,7,8]:[5,6,7,8]).includes(n.biome[s]),p=+a.citadel,y=+(p&&ba(2)(t)),k=Routes.isCrossroad(s),b=+a.walls,v=+a.plaza,w=+a.temple,_=+a.shanty,M="natural",T=new URL("https://watabou.github.io/city-generator/");T.search=new URLSearchParams({name:i||"",population:c.toString(),size:l.toString(),seed:h,river:d.toString(),coast:r.toString(),farms:f.toString(),citadel:p.toString(),urban_castle:y.toString(),hub:k.toString(),plaza:v.toString(),temple:w.toString(),walls:b.toString(),shantytown:_.toString(),gates:"-1",style:M}).toString(),g&&T.searchParams.append("sea",g.toString());const S=T.toString();return{link:S,preview:`${S}&preview=1`}}createWatabouVillageLinks(a){const{cells:n,features:t}=pack,{i,population:o,cell:s}=a,h=seed+String(i).padStart(4,"0"),u=N(o*populationRate*urbanization),l=[];n.r[s]&&n.haven[s]?l.push("estuary"):n.haven[s]&&t[n.f[s]].cells===1?l.push("island,district"):a.port?l.push("coast"):n.conf[s]?l.push("confluence"):n.r[s]?l.push("river"):u<200&&ba(4)(s)&&l.push("pond");const c=Routes.getConnectivityRate(s);l.push(c>1?"highway":c===1?"dead end":"isolated");const d=n.biome[s];(n.r[s]?[1,2,3,4,5,6,7,8]:[5,6,7,8]).includes(d)?ba(6)(s)&&l.push("farmland"):l.push("uncultivated");const g=grid.cells.temp[n.g[s]];(g<=0||g>28||g>25&&ba(3)(s))&&l.push("no orchards"),a.plaza||l.push("no square"),a.walls&&l.push("palisade"),u<100?l.push("sparse"):u>300&&l.push("dense");const m=u>1500?1600:u>1e3?1400:u>500?1e3:u>200?800:u>100?600:400,f=N(m/2.05),p=[1,2].includes(d)?"sand":g<=5||[9,10,11].includes(d)?"snow":"default",y=new URL("https://watabou.github.io/village-generator/");y.search=new URLSearchParams({pop:u.toString(),name:a.name||"",seed:h,width:m.toString(),height:f.toString(),style:p,tags:l.join(",")}).toString();const k=y.toString();return{link:k,preview:`${k}&preview=1`}}createWatabouDwellingLinks(a){const n=seed+String(a.i).padStart(4,"0"),t=N(a.population*populationRate*urbanization),i=t>200?["large","tall"]:t>100?["large"]:t>50?["tall"]:t>20?["low"]:["small"],o=new URL("https://watabou.github.io/dwellings/");o.search=new URLSearchParams({pop:t.toString(),name:"",seed:n,tags:i.join(",")}).toString();const s=o.toString();return{link:s,preview:`${s}&preview=1`}}getPreview(a){const n={"watabou-city":i=>this.createWatabouCityLinks(i),"watabou-village":i=>this.createWatabouVillageLinks(i),"watabou-dwelling":i=>this.createWatabouDwellingLinks(i)};if(a.link)return{link:a.link,preview:a.link};const t=options.burgs.groups.find(i=>i.name===a.group);return!t?.preview||!n[t.preview]?{link:null,preview:null}:n[t.preview](a)}add([a,n]){const{cells:t}=pack,i=pack.burgs.length,o=window.findCell(a,n,void 0,pack),s=t.culture[o],h=Names.getCulture(s),u=t.state[o],l=t.f[o],c={cell:o,x:a,y:n,i,state:u,culture:s,name:h,feature:l,capital:0,port:"0"};this.definePopulation(c),this.defineEmblem(c),this.defineFeatures(c);const d=pack.burgs.filter(g=>g.i&&!g.removed).map(g=>g.population).sort((g,m)=>g-m);this.defineGroup(c,d),pack.burgs.push(c),t.burg[o]=i;const r=Routes.connect(o);return r&&layerIsOn("toggleRoutes")&&drawRoute(r),drawBurgIcon(c),drawBurgLabel(c),i}changeGroup(a,n){if(n)a.group=n;else{const i=pack.burgs.filter(o=>o.i&&!o.removed).map(o=>o.population).sort((o,s)=>o-s);this.defineGroup(a,i)}drawBurgIcon(a),drawBurgLabel(a)}remove(a){const n=pack.burgs[a];if(!n)return tip(`Burg ${a} not found`,!1,"error");pack.cells.burg[n.cell]=0,n.removed=!0;const t=notes.findIndex(i=>i.id===`burg${a}`);t!==-1&¬es.splice(t,1),n.coa&&(j(`burgCOA${a}`)?.remove(),emblems.select(`#burgEmblems > use[data-i='${a}']`).remove(),delete n.coa),removeBurgIcon(n.i),removeBurgLabel(n.i)}}window.Burgs=new qu;class ju{MIN_LAND_HEIGHT=20;getDefault(){const a=["Marine","Hot desert","Cold desert","Savanna","Grassland","Tropical seasonal forest","Temperate deciduous forest","Tropical rainforest","Temperate rainforest","Taiga","Tundra","Glacier","Wetland"],n=["#466eab","#fbe79f","#b5b887","#d2d082","#c8d68f","#b6d95d","#29bc56","#7dcb35","#409c43","#4b6b32","#96784b","#d5e7eb","#0b9131"],t=[0,4,10,22,30,50,100,80,90,12,4,0,12],i=[0,3,2,120,120,120,120,150,150,100,5,0,250],o=[{},{dune:3,cactus:6,deadTree:1},{dune:9,deadTree:1},{acacia:1,grass:9},{grass:1},{acacia:8,palm:1},{deciduous:1},{acacia:5,palm:3,deciduous:1,swamp:1},{deciduous:6,swamp:1},{conifer:1},{grass:1},{},{swamp:1}],s=[10,200,150,60,50,70,70,80,90,200,1e3,5e3,150],h=[new Uint8Array([1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10]),new Uint8Array([3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,9,9,9,9,10,10,10]),new Uint8Array([5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,9,9,9,9,9,10,10,10]),new Uint8Array([5,6,6,6,6,6,6,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,10,10,10]),new Uint8Array([7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,10,10])],u=[];for(let l=0;l<o.length;l++){const c=[];for(const d in o[l])for(let r=0;r<o[l][d];r++)c.push(d);u[l]=c}return{i:Ra(0,a.length),name:a,color:n,biomesMatrix:h,habitability:t,iconsDensity:i,icons:u,cost:s}}define(){TIME&&console.time("defineBiomes");const{fl:a,r:n,h:t,c:i,g:o}=pack.cells,{temp:s,prec:h}=grid.cells;pack.cells.biome=new Uint8Array(pack.cells.i.length);const u=l=>{let c=h[o[l]];n[l]&&(c+=Math.max(a[l]/10,2));const d=i[l].filter(r=>t[r]>=this.MIN_LAND_HEIGHT).map(r=>h[o[r]]).concat([c]);return N(4+Ha(d))};for(let l=0;l<t.length;l++){const c=t[l],d=c<this.MIN_LAND_HEIGHT?0:u(l),r=s[o[l]];pack.cells.biome[l]=this.getId(d,r,c,!!n[l])}TIME&&console.timeEnd("defineBiomes")}getId(a,n,t,i){if(t<20)return 0;if(n<-5)return 11;if(n>=25&&!i&&a<8)return 1;if(this.isWetland(a,n,t))return 12;const o=Math.min(a/5|0,4),s=Math.min(Math.max(20-n,0),25);return biomesData.biomesMatrix[o][s]}isWetland(a,n,t){return n<=-2?!1:a>40&&t<25||a>24&&t>24&&t<60}}window.Biomes=new ju;class Uu{cells;getRandomShield(){const a=de(COA.shields.types);return de(COA.shields[a])}getDefault(a=0){const n=pack.cells,t=n.s,i=Vn(t),o=n.t,s=n.h,h=grid.cells.temp,u=r=>Math.ceil(t[r]/i*3),l=(r,g)=>{const m=Math.abs(h[n.g[r]]-g);return m?m+1:1},c=(r,g,m=4)=>g.includes(n.biome[r])?1:m,d=(r,g=4)=>n.haven[r]&&pack.features[n.f[n.haven[r]]].type!=="lake"?1:g;if(culturesSet.value==="european")return[{name:"Shwazen",base:0,odd:1,sort:r=>u(r)/l(r,10)/c(r,[6,8]),shield:"swiss"},{name:"Angshire",base:1,odd:1,sort:r=>u(r)/l(r,10)/d(r),shield:"wedged"},{name:"Luari",base:2,odd:1,sort:r=>u(r)/l(r,12)/c(r,[6,8]),shield:"french"},{name:"Tallian",base:3,odd:1,sort:r=>u(r)/l(r,15),shield:"horsehead"},{name:"Astellian",base:4,odd:1,sort:r=>u(r)/l(r,16),shield:"spanish"},{name:"Slovan",base:5,odd:1,sort:r=>u(r)/l(r,6)*o[r],shield:"polish"},{name:"Norse",base:6,odd:1,sort:r=>u(r)/l(r,5),shield:"heater"},{name:"Elladan",base:7,odd:1,sort:r=>u(r)/l(r,18)*s[r],shield:"boeotian"},{name:"Romian",base:8,odd:.2,sort:r=>u(r)/l(r,15)/o[r],shield:"roman"},{name:"Soumi",base:9,odd:1,sort:r=>u(r)/l(r,5)/c(r,[9])*o[r],shield:"pavise"},{name:"Portuzian",base:13,odd:1,sort:r=>u(r)/l(r,17)/d(r),shield:"renaissance"},{name:"Vengrian",base:15,odd:1,sort:r=>u(r)/l(r,11)/c(r,[4])*o[r],shield:"horsehead2"},{name:"Turchian",base:16,odd:.05,sort:r=>u(r)/l(r,14),shield:"round"},{name:"Euskati",base:20,odd:.05,sort:r=>u(r)/l(r,15)*s[r],shield:"oldFrench"},{name:"Keltan",base:22,odd:.05,sort:r=>u(r)/l(r,11)/c(r,[6,8])*o[r],shield:"oval"}];if(culturesSet.value==="oriental")return[{name:"Koryo",base:10,odd:1,sort:r=>u(r)/l(r,12)/o[r],shield:"round"},{name:"Hantzu",base:11,odd:1,sort:r=>u(r)/l(r,13),shield:"banner"},{name:"Yamoto",base:12,odd:1,sort:r=>u(r)/l(r,15)/o[r],shield:"round"},{name:"Turchian",base:16,odd:1,sort:r=>u(r)/l(r,12),shield:"round"},{name:"Berberan",base:17,odd:.2,sort:r=>u(r)/l(r,19)/c(r,[1,2,3],7)*o[r],shield:"oval"},{name:"Eurabic",base:18,odd:1,sort:r=>u(r)/l(r,26)/c(r,[1,2],7)*o[r],shield:"oval"},{name:"Efratic",base:23,odd:.1,sort:r=>u(r)/l(r,22)*o[r],shield:"round"},{name:"Tehrani",base:24,odd:1,sort:r=>u(r)/l(r,18)*s[r],shield:"round"},{name:"Maui",base:25,odd:.2,sort:r=>u(r)/l(r,24)/d(r)/o[r],shield:"vesicaPiscis"},{name:"Carnatic",base:26,odd:.5,sort:r=>u(r)/l(r,26),shield:"round"},{name:"Vietic",base:29,odd:.8,sort:r=>u(r)/l(r,25)/c(r,[7],7)/o[r],shield:"banner"},{name:"Guantzu",base:30,odd:.5,sort:r=>u(r)/l(r,17),shield:"banner"},{name:"Ulus",base:31,odd:1,sort:r=>u(r)/l(r,5)/c(r,[2,4,10],7)*o[r],shield:"banner"}];if(culturesSet.value==="english"){const r=()=>Names.getBase(1,5,9,"");return[{name:r(),base:1,odd:1,shield:"heater"},{name:r(),base:1,odd:1,shield:"wedged"},{name:r(),base:1,odd:1,shield:"swiss"},{name:r(),base:1,odd:1,shield:"oldFrench"},{name:r(),base:1,odd:1,shield:"swiss"},{name:r(),base:1,odd:1,shield:"spanish"},{name:r(),base:1,odd:1,shield:"hessen"},{name:r(),base:1,odd:1,shield:"fantasy5"},{name:r(),base:1,odd:1,shield:"fantasy4"},{name:r(),base:1,odd:1,shield:"fantasy1"}]}return culturesSet.value==="antique"?[{name:"Roman",base:8,odd:1,sort:r=>u(r)/l(r,14)/o[r],shield:"roman"},{name:"Roman",base:8,odd:1,sort:r=>u(r)/l(r,15)/d(r),shield:"roman"},{name:"Roman",base:8,odd:1,sort:r=>u(r)/l(r,16)/d(r),shield:"roman"},{name:"Roman",base:8,odd:1,sort:r=>u(r)/l(r,17)/o[r],shield:"roman"},{name:"Hellenic",base:7,odd:1,sort:r=>u(r)/l(r,18)/d(r)*s[r],shield:"boeotian"},{name:"Hellenic",base:7,odd:1,sort:r=>u(r)/l(r,19)/d(r)*s[r],shield:"boeotian"},{name:"Macedonian",base:7,odd:.5,sort:r=>u(r)/l(r,12)*s[r],shield:"round"},{name:"Celtic",base:22,odd:1,sort:r=>u(r)/l(r,11)**.5/c(r,[6,8]),shield:"round"},{name:"Germanic",base:0,odd:1,sort:r=>u(r)/l(r,10)**.5/c(r,[6,8]),shield:"round"},{name:"Persian",base:24,odd:.8,sort:r=>u(r)/l(r,18)*s[r],shield:"oval"},{name:"Scythian",base:24,odd:.5,sort:r=>u(r)/l(r,11)**.5/c(r,[4]),shield:"round"},{name:"Cantabrian",base:20,odd:.5,sort:r=>u(r)/l(r,16)*s[r],shield:"oval"},{name:"Estian",base:9,odd:.2,sort:r=>u(r)/l(r,5)*o[r],shield:"pavise"},{name:"Carthaginian",base:42,odd:.3,sort:r=>u(r)/l(r,20)/d(r),shield:"oval"},{name:"Hebrew",base:42,odd:.2,sort:r=>u(r)/l(r,19)*d(r),shield:"oval"},{name:"Mesopotamian",base:23,odd:.2,sort:r=>u(r)/l(r,22)/c(r,[1,2,3]),shield:"oval"}]:culturesSet.value==="highFantasy"?[{name:"Quenian (Elfish)",base:33,odd:1,sort:r=>u(r)/c(r,[6,7,8,9],10)*o[r],shield:"gondor"},{name:"Eldar (Elfish)",base:33,odd:1,sort:r=>u(r)/c(r,[6,7,8,9],10)*o[r],shield:"noldor"},{name:"Trow (Dark Elfish)",base:34,odd:.9,sort:r=>u(r)/c(r,[7,8,9,12],10)*o[r],shield:"hessen"},{name:"Lothian (Dark Elfish)",base:34,odd:.3,sort:r=>u(r)/c(r,[7,8,9,12],10)*o[r],shield:"wedged"},{name:"Dunirr (Dwarven)",base:35,odd:1,sort:r=>u(r)+s[r],shield:"ironHills"},{name:"Khazadur (Dwarven)",base:35,odd:1,sort:r=>u(r)+s[r],shield:"erebor"},{name:"Kobold (Goblin)",base:36,odd:1,sort:r=>o[r]-t[r],shield:"moriaOrc"},{name:"Uruk (Orkish)",base:37,odd:1,sort:r=>s[r]*o[r],shield:"urukHai"},{name:"Ugluk (Orkish)",base:37,odd:.5,sort:r=>s[r]*o[r]/c(r,[1,2,10,11]),shield:"moriaOrc"},{name:"Yotunn (Giants)",base:38,odd:.7,sort:r=>l(r,-10),shield:"pavise"},{name:"Rake (Drakonic)",base:39,odd:.7,sort:r=>-t[r],shield:"fantasy2"},{name:"Arago (Arachnid)",base:40,odd:.7,sort:r=>o[r]-t[r],shield:"horsehead2"},{name:"Aj'Snaga (Serpents)",base:41,odd:.7,sort:r=>u(r)/c(r,[12],10),shield:"fantasy1"},{name:"Anor (Human)",base:32,odd:1,sort:r=>u(r)/l(r,10),shield:"fantasy5"},{name:"Dail (Human)",base:32,odd:1,sort:r=>u(r)/l(r,13),shield:"roman"},{name:"Rohand (Human)",base:16,odd:1,sort:r=>u(r)/l(r,16),shield:"round"},{name:"Dulandir (Human)",base:31,odd:1,sort:r=>u(r)/l(r,5)/c(r,[2,4,10],7)*o[r],shield:"easterling"}]:culturesSet.value==="darkFantasy"?[{name:"Angshire",base:1,odd:1,sort:r=>u(r)/l(r,10)/d(r),shield:"heater"},{name:"Enlandic",base:1,odd:1,sort:r=>u(r)/l(r,12),shield:"heater"},{name:"Westen",base:1,odd:1,sort:r=>u(r)/l(r,10),shield:"heater"},{name:"Nortumbic",base:1,odd:1,sort:r=>u(r)/l(r,7),shield:"heater"},{name:"Mercian",base:1,odd:1,sort:r=>u(r)/l(r,9),shield:"heater"},{name:"Kentian",base:1,odd:1,sort:r=>u(r)/l(r,12),shield:"heater"},{name:"Norse",base:6,odd:.7,sort:r=>u(r)/l(r,5)/d(r),shield:"oldFrench"},{name:"Schwarzen",base:0,odd:.3,sort:r=>u(r)/l(r,10)/c(r,[6,8]),shield:"gonfalon"},{name:"Luarian",base:2,odd:.3,sort:r=>u(r)/l(r,12)/c(r,[6,8]),shield:"oldFrench"},{name:"Hetallian",base:3,odd:.3,sort:r=>u(r)/l(r,15),shield:"oval"},{name:"Astellian",base:4,odd:.3,sort:r=>u(r)/l(r,16),shield:"spanish"},{name:"Kiswaili",base:28,odd:.05,sort:r=>u(r)/l(r,29)/c(r,[1,3,5,7]),shield:"vesicaPiscis"},{name:"Yoruba",base:21,odd:.05,sort:r=>u(r)/l(r,15)/c(r,[5,7]),shield:"vesicaPiscis"},{name:"Koryo",base:10,odd:.05,sort:r=>u(r)/l(r,12)/o[r],shield:"round"},{name:"Hantzu",base:11,odd:.05,sort:r=>u(r)/l(r,13),shield:"banner"},{name:"Yamoto",base:12,odd:.05,sort:r=>u(r)/l(r,15)/o[r],shield:"round"},{name:"Guantzu",base:30,odd:.05,sort:r=>u(r)/l(r,17),shield:"banner"},{name:"Ulus",base:31,odd:.05,sort:r=>u(r)/l(r,5)/c(r,[2,4,10],7)*o[r],shield:"banner"},{name:"Turan",base:16,odd:.05,sort:r=>u(r)/l(r,12),shield:"round"},{name:"Berberan",base:17,odd:.05,sort:r=>u(r)/l(r,19)/c(r,[1,2,3],7)*o[r],shield:"round"},{name:"Eurabic",base:18,odd:.05,sort:r=>u(r)/l(r,26)/c(r,[1,2],7)*o[r],shield:"round"},{name:"Slovan",base:5,odd:.05,sort:r=>u(r)/l(r,6)*o[r],shield:"round"},{name:"Keltan",base:22,odd:.1,sort:r=>u(r)/l(r,11)**.5/c(r,[6,8]),shield:"vesicaPiscis"},{name:"Elladan",base:7,odd:.2,sort:r=>u(r)/l(r,18)/d(r)*s[r],shield:"boeotian"},{name:"Romian",base:8,odd:.2,sort:r=>u(r)/l(r,14)/o[r],shield:"roman"},{name:"Eldar",base:33,odd:.5,sort:r=>u(r)/c(r,[6,7,8,9],10)*o[r],shield:"fantasy5"},{name:"Trow",base:34,odd:.8,sort:r=>u(r)/c(r,[7,8,9,12],10)*o[r],shield:"hessen"},{name:"Durinn",base:35,odd:.8,sort:r=>u(r)+s[r],shield:"erebor"},{name:"Kobblin",base:36,odd:.8,sort:r=>o[r]-t[r],shield:"moriaOrc"},{name:"Uruk",base:37,odd:.8,sort:r=>s[r]*o[r]/c(r,[1,2,10,11]),shield:"urukHai"},{name:"Yotunn",base:38,odd:.8,sort:r=>l(r,-10),shield:"pavise"},{name:"Drake",base:39,odd:.9,sort:r=>-t[r],shield:"fantasy2"},{name:"Rakhnid",base:40,odd:.9,sort:r=>o[r]-t[r],shield:"horsehead2"},{name:"Aj'Snaga",base:41,odd:.9,sort:r=>u(r)/c(r,[12],10),shield:"fantasy1"}]:culturesSet.value==="random"?Ra(a).map(()=>{const r=Y(nameBases.length-1);return{name:Names.getBaseShort(r),base:r,odd:1,shield:this.getRandomShield()}}):[{name:"Shwazen",base:0,odd:.7,sort:r=>u(r)/l(r,10)/c(r,[6,8]),shield:"hessen"},{name:"Angshire",base:1,odd:1,sort:r=>u(r)/l(r,10)/d(r),shield:"heater"},{name:"Luari",base:2,odd:.6,sort:r=>u(r)/l(r,12)/c(r,[6,8]),shield:"oldFrench"},{name:"Tallian",base:3,odd:.6,sort:r=>u(r)/l(r,15),shield:"horsehead2"},{name:"Astellian",base:4,odd:.6,sort:r=>u(r)/l(r,16),shield:"spanish"},{name:"Slovan",base:5,odd:.7,sort:r=>u(r)/l(r,6)*o[r],shield:"round"},{name:"Norse",base:6,odd:.7,sort:r=>u(r)/l(r,5),shield:"heater"},{name:"Elladan",base:7,odd:.7,sort:r=>u(r)/l(r,18)*s[r],shield:"boeotian"},{name:"Romian",base:8,odd:.7,sort:r=>u(r)/l(r,15),shield:"roman"},{name:"Soumi",base:9,odd:.3,sort:r=>u(r)/l(r,5)/c(r,[9])*o[r],shield:"pavise"},{name:"Koryo",base:10,odd:.1,sort:r=>u(r)/l(r,12)/o[r],shield:"round"},{name:"Hantzu",base:11,odd:.1,sort:r=>u(r)/l(r,13),shield:"banner"},{name:"Yamoto",base:12,odd:.1,sort:r=>u(r)/l(r,15)/o[r],shield:"round"},{name:"Portuzian",base:13,odd:.4,sort:r=>u(r)/l(r,17)/d(r),shield:"spanish"},{name:"Nawatli",base:14,odd:.1,sort:r=>s[r]/l(r,18)/c(r,[7]),shield:"square"},{name:"Vengrian",base:15,odd:.2,sort:r=>u(r)/l(r,11)/c(r,[4])*o[r],shield:"wedged"},{name:"Turchian",base:16,odd:.2,sort:r=>u(r)/l(r,13),shield:"round"},{name:"Berberan",base:17,odd:.1,sort:r=>u(r)/l(r,19)/c(r,[1,2,3],7)*o[r],shield:"round"},{name:"Eurabic",base:18,odd:.2,sort:r=>u(r)/l(r,26)/c(r,[1,2],7)*o[r],shield:"round"},{name:"Inuk",base:19,odd:.05,sort:r=>l(r,-1)/c(r,[10,11])/d(r),shield:"square"},{name:"Euskati",base:20,odd:.05,sort:r=>u(r)/l(r,15)*s[r],shield:"spanish"},{name:"Yoruba",base:21,odd:.05,sort:r=>u(r)/l(r,15)/c(r,[5,7]),shield:"vesicaPiscis"},{name:"Keltan",base:22,odd:.05,sort:r=>u(r)/l(r,11)/c(r,[6,8])*o[r],shield:"vesicaPiscis"},{name:"Efratic",base:23,odd:.05,sort:r=>u(r)/l(r,22)*o[r],shield:"diamond"},{name:"Tehrani",base:24,odd:.1,sort:r=>u(r)/l(r,18)*s[r],shield:"round"},{name:"Maui",base:25,odd:.05,sort:r=>u(r)/l(r,24)/d(r)/o[r],shield:"round"},{name:"Carnatic",base:26,odd:.05,sort:r=>u(r)/l(r,26),shield:"round"},{name:"Inqan",base:27,odd:.05,sort:r=>s[r]/l(r,13),shield:"square"},{name:"Kiswaili",base:28,odd:.1,sort:r=>u(r)/l(r,29)/c(r,[1,3,5,7]),shield:"vesicaPiscis"},{name:"Vietic",base:29,odd:.1,sort:r=>u(r)/l(r,25)/c(r,[7],7)/o[r],shield:"banner"},{name:"Guantzu",base:30,odd:.1,sort:r=>u(r)/l(r,17),shield:"banner"},{name:"Ulus",base:31,odd:.1,sort:r=>u(r)/l(r,5)/c(r,[2,4,10],7)*o[r],shield:"banner"},{name:"Hebrew",base:42,odd:.2,sort:r=>u(r)/l(r,18)*d(r),shield:"oval"}]}generate(){TIME&&console.time("generateCultures"),this.cells=pack.cells;const a=new Uint16Array(this.cells.i.length),n=+j("culturesInput").value,t=+(j("culturesSet").selectedOptions[0].dataset.max??"0");let i=Math.min(n,t);const o=this.cells.i.filter(f=>this.cells.s[f]);if(o.length<i*25)if(i=Math.floor(o.length/50),i)WARN&&console.warn(`Not enough populated cells (${o.length}). Will generate only ${i} cultures`),alertMessage.innerHTML=` There are only ${o.length} populated cells and it's insufficient livable area.<br />
|
||
Only ${i} out of ${culturesInput.value} requested cultures will be generated.<br />
|
||
Please consider changing climate settings in the World Configurator`,$("#alert").dialog({resizable:!1,title:"Extreme climate warning",buttons:{Ok:function(){$(this).dialog("close")}}});else{WARN&&console.warn("There are no populated cells. Cannot generate cultures"),pack.cultures=[{name:"Wildlands",i:0,base:1,shield:"round"}],this.cells.culture=a,alertMessage.innerHTML=`The climate is harsh and people cannot live in this world.<br />
|
||
No cultures, states and burgs will be created.<br />
|
||
Please consider changing climate settings in the World Configurator`,$("#alert").dialog({resizable:!1,title:"Extreme climate warning",buttons:{Ok:function(){$(this).dialog("close")}}});return}const h=(f=>{const p=this.getDefault(f),y=[];if(pack.cultures?.forEach(k=>{k.lock&&!k.removed&&y.push(k)}),!y.length){if(f===p.length)return p;if(p.every(k=>k.odd===1))return p.splice(0,f)}for(let k,b,v=0;y.length<f&&p.length>0;){do b=Y(p.length-1),k=p[b],v++;while(v<200&&!B(k.odd));y.push(k),p.splice(b,1)}return y})(i);pack.cultures=h;const u=ue(),l=Bt(i),c=j("emblemShape").value,d=[],r=f=>{let p=(graphWidth+graphHeight)/2/i;const y=100,k=[...o].sort((w,_)=>f(_)-f(w)),b=Math.floor(k.length/2);let v=0;for(let w=0;w<y&&(v=k[Kt(0,b,5)],p*=.9,!(!a[v]&&!u.find(this.cells.p[v][0],this.cells.p[v][1],p)));w++);return v},g=f=>{if(this.cells.h[f]<70&&[1,2,4].includes(this.cells.biome[f]))return"Nomadic";if(this.cells.h[f]>50)return"Highland";const p=pack.features[this.cells.f[this.cells.haven[f]]];return p.type==="lake"&&p.cells>5?"Lake":this.cells.harbor[f]&&p.type!=="lake"&&B(.1)||this.cells.harbor[f]===1&&B(.6)||pack.features[this.cells.f[f]].group==="isle"&&B(.4)?"Naval":this.cells.r[f]&&this.cells.fl[f]>100?"River":this.cells.t[f]>2&&[3,7,8,9,10,12].includes(this.cells.biome[f])?"Hunting":"Generic"},m=f=>{let p=1;return f==="Lake"?p=.8:f==="Naval"?p=1.5:f==="River"?p=.9:f==="Nomadic"?p=1.5:f==="Hunting"?p=.7:f==="Highland"&&(p=1.2),N((Math.random()*j("sizeVariety").valueAsNumber/2+1)*p,1)};h.forEach((f,p)=>{const y=p+1;if(f.lock){d.push(f.code),u.add(f.center);for(const v of this.cells.i)this.cells.culture[v]===f.i&&(a[v]=y);f.i=y;return}const k=f.sort?f.sort:v=>this.cells.s[v],b=r(k);u.add(this.cells.p[b]),f.center=b,f.i=y,delete f.odd,delete f.sort,f.color=l[p],f.type=g(b),f.expansionism=m(f.type),f.origins=[0],f.code=Ue(f.name,d),d.push(f.code),a[b]=y,c==="random"&&(f.shield=this.getRandomShield())}),this.cells.culture=a,h.unshift({name:"Wildlands",i:0,base:1,origins:[null],shield:"round"}),nameBases.length||(ERROR&&console.error("Name base is empty, default nameBases will be applied"),nameBases=Names.getNameBases()),h.forEach(f=>{f.base=f.base%nameBases.length}),TIME&&console.timeEnd("generateCultures")}add(a){const n=this.getDefault();let t,i,o;pack.cultures.length<n.length?(t=pack.cultures.length,i=n[t].base,o=n[t].name):(t=Y(pack.cultures.length-1),o=Names.getCulture(t,5,8,""),i=pack.cultures[t].base);const s=Ue(o,pack.cultures.map(c=>c.code)),h=pack.cultures.length,u=ge(),l=document.getElementById("emblemShape").value;pack.cultures.push({name:o,color:u,base:i,center:a,i:h,expansionism:1,type:"Generic",cells:0,area:0,rural:0,urban:0,origins:[pack.cells.culture[a]],code:s,shield:l==="random"?this.getRandomShield():""})}expand(){TIME&&console.time("expandCultures");const{cells:a,cultures:n}=pack,t=new FlatQueue,i=[],o=j("neutralRate")?.valueAsNumber||1,s=a.i.length*.6*o,h=n.some(r=>!r.removed&&r.lock);if(h)for(const r of a.i)n[a.culture[r]].lock||(a.culture[r]=0);else a.culture=new Uint16Array(a.i.length);for(const r of n)!r.i||r.removed||r.lock||t.push({cellId:r.center,cultureId:r.i,priority:0},0);const u=(r,g,m)=>a.biome[n[r].center]===g?10:m==="Hunting"?biomesData.cost[g]*5:m==="Nomadic"&&g>4&&g<10?biomesData.cost[g]*10:biomesData.cost[g]*2,l=(r,g,m)=>{const f=pack.features[a.f[r]],p=a.area[r];return m==="Lake"&&f.type==="lake"?10:m==="Naval"&&g<20?p*2:m==="Nomadic"&&g<20?p*50:g<20?p*6:m==="Highland"&&g<44?3e3:m==="Highland"&&g<62?200:m==="Highland"?0:g>=67?200:g>=44?30:0},c=(r,g,m)=>m==="River"?r?0:100:r?ma(a.fl[g]/10,20,100):0,d=(r,g)=>r===1?g==="Naval"||g==="Lake"?0:g==="Nomadic"?60:20:r===2?g==="Naval"||g==="Nomadic"?30:0:r!==-1&&(g==="Naval"||g==="Lake")?100:0;for(;t.length;){const{cellId:r,priority:g,cultureId:m}=t.pop(),{type:f,expansionism:p}=n[m];a.c[r].forEach(y=>{if(h){const z=a.culture[y];if(z&&n[z].lock)return}const k=a.biome[y],b=u(m,k,f),v=k===a.biome[y]?0:20,w=l(y,a.h[y],f),_=c(a.r[y],y,f),M=d(a.t[y],f),T=(b+v+w+_+M)/p,S=g+T;S>s||(!i[y]||S<i[y])&&(a.pop[y]>0&&(a.culture[y]=m),i[y]=S,t.push({cellId:y,cultureId:m,priority:S},S))})}TIME&&console.timeEnd("expandCultures")}}window.Cultures=new Uu;
|