tldts-icann
Version:
Library to work against complex domain names, subdomains and URIs. Only contains ICANN section.
566 lines (556 loc) • 131 kB
JavaScript
'use strict';
/**
* Check if `vhost` is a valid suffix of `hostname` (top-domain)
*
* It means that `vhost` needs to be a suffix of `hostname` and we then need to
* make sure that: either they are equal, or the character preceding `vhost` in
* `hostname` is a '.' (it should not be a partial label).
*
* * hostname = 'not.evil.com' and vhost = 'vil.com' => not ok
* * hostname = 'not.evil.com' and vhost = 'evil.com' => ok
* * hostname = 'not.evil.com' and vhost = 'not.evil.com' => ok
*/
function shareSameDomainSuffix(hostname, vhost) {
if (hostname.endsWith(vhost)) {
return (hostname.length === vhost.length ||
hostname[hostname.length - vhost.length - 1] === '.');
}
return false;
}
/**
* Given a hostname and its public suffix, extract the general domain.
*/
function extractDomainWithSuffix(hostname, publicSuffix) {
// Locate the index of the last '.' in the part of the `hostname` preceding
// the public suffix.
//
// examples:
// 1. not.evil.co.uk => evil.co.uk
// ^ ^
// | | start of public suffix
// | index of the last dot
//
// 2. example.co.uk => example.co.uk
// ^ ^
// | | start of public suffix
// |
// | (-1) no dot found before the public suffix
const publicSuffixIndex = hostname.length - publicSuffix.length - 2;
const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex);
// No '.' found, then `hostname` is the general domain (no sub-domain)
if (lastDotBeforeSuffixIndex === -1) {
return hostname;
}
// Extract the part between the last '.'
return hostname.slice(lastDotBeforeSuffixIndex + 1);
}
/**
* Detects the domain based on rules and upon and a host string
*/
function getDomain$1(suffix, hostname, options) {
// Check if `hostname` ends with a member of `validHosts`.
if (options.validHosts !== null) {
const validHosts = options.validHosts;
for (const vhost of validHosts) {
if ( /*@__INLINE__*/shareSameDomainSuffix(hostname, vhost)) {
return vhost;
}
}
}
let numberOfLeadingDots = 0;
if (hostname.startsWith('.')) {
while (numberOfLeadingDots < hostname.length &&
hostname[numberOfLeadingDots] === '.') {
numberOfLeadingDots += 1;
}
}
// If `hostname` is a valid public suffix, then there is no domain to return.
// Since we already know that `getPublicSuffix` returns a suffix of `hostname`
// there is no need to perform a string comparison and we only compare the
// size.
if (suffix.length === hostname.length - numberOfLeadingDots) {
return null;
}
// To extract the general domain, we start by identifying the public suffix
// (if any), then consider the domain to be the public suffix with one added
// level of depth. (e.g.: if hostname is `not.evil.co.uk` and public suffix:
// `co.uk`, then we take one more level: `evil`, giving the final result:
// `evil.co.uk`).
return /*@__INLINE__*/ extractDomainWithSuffix(hostname, suffix);
}
/**
* Return the part of domain without suffix.
*
* Example: for domain 'foo.com', the result would be 'foo'.
*/
function getDomainWithoutSuffix$1(domain, suffix) {
// Note: here `domain` and `suffix` cannot have the same length because in
// this case we set `domain` to `null` instead. It is thus safe to assume
// that `suffix` is shorter than `domain`.
return domain.slice(0, -suffix.length - 1);
}
/**
* @param url - URL we want to extract a hostname from.
* @param urlIsValidHostname - hint from caller; true if `url` is already a valid hostname.
*/
function extractHostname(url, urlIsValidHostname) {
let start = 0;
let end = url.length;
let hasUpper = false;
// If url is not already a valid hostname, then try to extract hostname.
if (!urlIsValidHostname) {
// Special handling of data URLs
if (url.startsWith('data:')) {
return null;
}
// Trim leading spaces
while (start < url.length && url.charCodeAt(start) <= 32) {
start += 1;
}
// Trim trailing spaces
while (end > start + 1 && url.charCodeAt(end - 1) <= 32) {
end -= 1;
}
// Skip scheme.
if (url.charCodeAt(start) === 47 /* '/' */ &&
url.charCodeAt(start + 1) === 47 /* '/' */) {
start += 2;
}
else {
const indexOfProtocol = url.indexOf(':/', start);
if (indexOfProtocol !== -1) {
// Implement fast-path for common protocols. We expect most protocols
// should be one of these 4 and thus we will not need to perform the
// more expansive validity check most of the time.
const protocolSize = indexOfProtocol - start;
const c0 = url.charCodeAt(start);
const c1 = url.charCodeAt(start + 1);
const c2 = url.charCodeAt(start + 2);
const c3 = url.charCodeAt(start + 3);
const c4 = url.charCodeAt(start + 4);
if (protocolSize === 5 &&
c0 === 104 /* 'h' */ &&
c1 === 116 /* 't' */ &&
c2 === 116 /* 't' */ &&
c3 === 112 /* 'p' */ &&
c4 === 115 /* 's' */) ;
else if (protocolSize === 4 &&
c0 === 104 /* 'h' */ &&
c1 === 116 /* 't' */ &&
c2 === 116 /* 't' */ &&
c3 === 112 /* 'p' */) ;
else if (protocolSize === 3 &&
c0 === 119 /* 'w' */ &&
c1 === 115 /* 's' */ &&
c2 === 115 /* 's' */) ;
else if (protocolSize === 2 &&
c0 === 119 /* 'w' */ &&
c1 === 115 /* 's' */) ;
else {
// Check that scheme is valid
for (let i = start; i < indexOfProtocol; i += 1) {
const lowerCaseCode = url.charCodeAt(i) | 32;
if (!(((lowerCaseCode >= 97 && lowerCaseCode <= 122) || // [a, z]
(lowerCaseCode >= 48 && lowerCaseCode <= 57) || // [0, 9]
lowerCaseCode === 46 || // '.'
lowerCaseCode === 45 || // '-'
lowerCaseCode === 43) // '+'
)) {
return null;
}
}
}
// Skip 0, 1 or more '/' after ':/'
start = indexOfProtocol + 2;
while (url.charCodeAt(start) === 47 /* '/' */) {
start += 1;
}
}
}
// Detect first occurrence of '/', '?' or '#'. We also keep track of the
// last occurrence of '@', ']' or ':' to speed-up subsequent parsing of
// (respectively), identifier, ipv6 or port.
let indexOfIdentifier = -1;
let indexOfClosingBracket = -1;
let indexOfPort = -1;
for (let i = start; i < end; i += 1) {
const code = url.charCodeAt(i);
if (code === 35 || // '#'
code === 47 || // '/'
code === 63 // '?'
) {
end = i;
break;
}
else if (code === 64) {
// '@'
indexOfIdentifier = i;
}
else if (code === 93) {
// ']'
indexOfClosingBracket = i;
}
else if (code === 58) {
// ':'
indexOfPort = i;
}
else if (code >= 65 && code <= 90) {
hasUpper = true;
}
}
// Detect identifier: '@'
if (indexOfIdentifier !== -1 &&
indexOfIdentifier > start &&
indexOfIdentifier < end) {
start = indexOfIdentifier + 1;
}
// Handle ipv6 addresses
if (url.charCodeAt(start) === 91 /* '[' */) {
if (indexOfClosingBracket !== -1) {
return url.slice(start + 1, indexOfClosingBracket).toLowerCase();
}
return null;
}
else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) {
// Detect port: ':'
end = indexOfPort;
}
}
// Trim trailing dots
while (end > start + 1 && url.charCodeAt(end - 1) === 46 /* '.' */) {
end -= 1;
}
const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url;
if (hasUpper) {
return hostname.toLowerCase();
}
return hostname;
}
/**
* Check if a hostname is an IP. You should be aware that this only works
* because `hostname` is already garanteed to be a valid hostname!
*/
function isProbablyIpv4(hostname) {
// Cannot be shorted than 1.1.1.1
if (hostname.length < 7) {
return false;
}
// Cannot be longer than: 255.255.255.255
if (hostname.length > 15) {
return false;
}
let numberOfDots = 0;
for (let i = 0; i < hostname.length; i += 1) {
const code = hostname.charCodeAt(i);
if (code === 46 /* '.' */) {
numberOfDots += 1;
}
else if (code < 48 /* '0' */ || code > 57 /* '9' */) {
return false;
}
}
return (numberOfDots === 3 &&
hostname.charCodeAt(0) !== 46 /* '.' */ &&
hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */);
}
/**
* Similar to isProbablyIpv4.
*/
function isProbablyIpv6(hostname) {
if (hostname.length < 3) {
return false;
}
let start = hostname.startsWith('[') ? 1 : 0;
let end = hostname.length;
if (hostname[end - 1] === ']') {
end -= 1;
}
// We only consider the maximum size of a normal IPV6. Note that this will
// fail on so-called "IPv4 mapped IPv6 addresses" but this is a corner-case
// and a proper validation library should be used for these.
if (end - start > 39) {
return false;
}
let hasColon = false;
for (; start < end; start += 1) {
const code = hostname.charCodeAt(start);
if (code === 58 /* ':' */) {
hasColon = true;
}
else if (!(((code >= 48 && code <= 57) || // 0-9
(code >= 97 && code <= 102) || // a-f
(code >= 65 && code <= 90)) // A-F
)) {
return false;
}
}
return hasColon;
}
/**
* Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4).
* This *will not* work on any string. We need `hostname` to be a valid
* hostname.
*/
function isIp(hostname) {
return isProbablyIpv6(hostname) || isProbablyIpv4(hostname);
}
/**
* Implements fast shallow verification of hostnames. This does not perform a
* struct check on the content of labels (classes of Unicode characters, etc.)
* but instead check that the structure is valid (number of labels, length of
* labels, etc.).
*
* If you need stricter validation, consider using an external library.
*/
function isValidAscii(code) {
return ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127);
}
/**
* Check if a hostname string is valid. It's usually a preliminary check before
* trying to use getDomain or anything else.
*
* Beware: it does not check if the TLD exists.
*/
function isValidHostname (hostname) {
if (hostname.length > 255) {
return false;
}
if (hostname.length === 0) {
return false;
}
if (
/*@__INLINE__*/ !isValidAscii(hostname.charCodeAt(0)) &&
hostname.charCodeAt(0) !== 46 && // '.' (dot)
hostname.charCodeAt(0) !== 95 // '_' (underscore)
) {
return false;
}
// Validate hostname according to RFC
let lastDotIndex = -1;
let lastCharCode = -1;
const len = hostname.length;
for (let i = 0; i < len; i += 1) {
const code = hostname.charCodeAt(i);
if (code === 46 /* '.' */) {
if (
// Check that previous label is < 63 bytes long (64 = 63 + '.')
i - lastDotIndex > 64 ||
// Check that previous character was not already a '.'
lastCharCode === 46 ||
// Check that the previous label does not end with a '-' (dash)
lastCharCode === 45 ||
// Check that the previous label does not end with a '_' (underscore)
lastCharCode === 95) {
return false;
}
lastDotIndex = i;
}
else if (!( /*@__INLINE__*/(isValidAscii(code) || code === 45 || code === 95))) {
// Check if there is a forbidden character in the label
return false;
}
lastCharCode = code;
}
return (
// Check that last label is shorter than 63 chars
len - lastDotIndex - 1 <= 63 &&
// Check that the last character is an allowed trailing label character.
// Since we already checked that the char is a valid hostname character,
// we only need to check that it's different from '-'.
lastCharCode !== 45);
}
function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname = true, mixedInputs = true, validHosts = null, validateHostname = true, }) {
return {
allowIcannDomains,
allowPrivateDomains,
detectIp,
extractHostname,
mixedInputs,
validHosts,
validateHostname,
};
}
const DEFAULT_OPTIONS = /*@__INLINE__*/ setDefaultsImpl({});
function setDefaults(options) {
if (options === undefined) {
return DEFAULT_OPTIONS;
}
return /*@__INLINE__*/ setDefaultsImpl(options);
}
/**
* Returns the subdomain of a hostname string
*/
function getSubdomain$1(hostname, domain) {
// If `hostname` and `domain` are the same, then there is no sub-domain
if (domain.length === hostname.length) {
return '';
}
return hostname.slice(0, -domain.length - 1);
}
/**
* Implement a factory allowing to plug different implementations of suffix
* lookup (e.g.: using a trie or the packed hashes datastructures). This is used
* and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints.
*/
function getEmptyResult() {
return {
domain: null,
domainWithoutSuffix: null,
hostname: null,
isIcann: null,
isIp: null,
isPrivate: null,
publicSuffix: null,
subdomain: null,
};
}
function resetResult(result) {
result.domain = null;
result.domainWithoutSuffix = null;
result.hostname = null;
result.isIcann = null;
result.isIp = null;
result.isPrivate = null;
result.publicSuffix = null;
result.subdomain = null;
}
function parseImpl(url, step, suffixLookup, partialOptions, result) {
const options = /*@__INLINE__*/ setDefaults(partialOptions);
// Very fast approximate check to make sure `url` is a string. This is needed
// because the library will not necessarily be used in a typed setup and
// values of arbitrary types might be given as argument.
if (typeof url !== 'string') {
return result;
}
// Extract hostname from `url` only if needed. This can be made optional
// using `options.extractHostname`. This option will typically be used
// whenever we are sure the inputs to `parse` are already hostnames and not
// arbitrary URLs.
//
// `mixedInput` allows to specify if we expect a mix of URLs and hostnames
// as input. If only hostnames are expected then `extractHostname` can be
// set to `false` to speed-up parsing. If only URLs are expected then
// `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint
// and will not change the behavior of the library.
if (!options.extractHostname) {
result.hostname = url;
}
else if (options.mixedInputs) {
result.hostname = extractHostname(url, isValidHostname(url));
}
else {
result.hostname = extractHostname(url, false);
}
// Check if `hostname` is a valid ip address
if (options.detectIp && result.hostname !== null) {
result.isIp = isIp(result.hostname);
if (result.isIp) {
return result;
}
}
// Perform hostname validation if enabled. If hostname is not valid, no need to
// go further as there will be no valid domain or sub-domain. This validation
// is applied before any early returns to ensure consistent behavior across
// all API methods including getHostname().
if (options.validateHostname &&
options.extractHostname &&
result.hostname !== null &&
!isValidHostname(result.hostname)) {
result.hostname = null;
return result;
}
if (step === 0 /* FLAG.HOSTNAME */ || result.hostname === null) {
return result;
}
// Extract public suffix
suffixLookup(result.hostname, options, result);
if (step === 2 /* FLAG.PUBLIC_SUFFIX */ || result.publicSuffix === null) {
return result;
}
// Extract domain
result.domain = getDomain$1(result.publicSuffix, result.hostname, options);
if (step === 3 /* FLAG.DOMAIN */ || result.domain === null) {
return result;
}
// Extract subdomain
result.subdomain = getSubdomain$1(result.hostname, result.domain);
if (step === 4 /* FLAG.SUB_DOMAIN */) {
return result;
}
// Extract domain without suffix
result.domainWithoutSuffix = getDomainWithoutSuffix$1(result.domain, result.publicSuffix);
return result;
}
function fastPathLookup (hostname, options, out) {
// Fast path for very popular suffixes; this allows to by-pass lookup
// completely as well as any extra allocation or string manipulation.
if (!options.allowPrivateDomains && hostname.length > 3) {
const last = hostname.length - 1;
const c3 = hostname.charCodeAt(last);
const c2 = hostname.charCodeAt(last - 1);
const c1 = hostname.charCodeAt(last - 2);
const c0 = hostname.charCodeAt(last - 3);
if (c3 === 109 /* 'm' */ &&
c2 === 111 /* 'o' */ &&
c1 === 99 /* 'c' */ &&
c0 === 46 /* '.' */) {
out.isIcann = true;
out.isPrivate = false;
out.publicSuffix = 'com';
return true;
}
else if (c3 === 103 /* 'g' */ &&
c2 === 114 /* 'r' */ &&
c1 === 111 /* 'o' */ &&
c0 === 46 /* '.' */) {
out.isIcann = true;
out.isPrivate = false;
out.publicSuffix = 'org';
return true;
}
else if (c3 === 117 /* 'u' */ &&
c2 === 100 /* 'd' */ &&
c1 === 101 /* 'e' */ &&
c0 === 46 /* '.' */) {
out.isIcann = true;
out.isPrivate = false;
out.publicSuffix = 'edu';
return true;
}
else if (c3 === 118 /* 'v' */ &&
c2 === 111 /* 'o' */ &&
c1 === 103 /* 'g' */ &&
c0 === 46 /* '.' */) {
out.isIcann = true;
out.isPrivate = false;
out.publicSuffix = 'gov';
return true;
}
else if (c3 === 116 /* 't' */ &&
c2 === 101 /* 'e' */ &&
c1 === 110 /* 'n' */ &&
c0 === 46 /* '.' */) {
out.isIcann = true;
out.isPrivate = false;
out.publicSuffix = 'net';
return true;
}
else if (c3 === 101 /* 'e' */ &&
c2 === 100 /* 'd' */ &&
c1 === 46 /* '.' */) {
out.isIcann = true;
out.isPrivate = false;
out.publicSuffix = 'de';
return true;
}
}
return false;
}
const exceptions = (function () {
const _65 = [1, {}], _66 = [0, { "city": _65 }];
const exceptions = [0, { "ck": [0, { "www": _65 }], "jp": [0, { "kawasaki": _66, "kitakyushu": _66, "kobe": _66, "nagoya": _66, "sapporo": _66, "sendai": _66, "yokohama": _66 }] }];
return exceptions;
})();
const rules = (function () {
const _67 = [1, {}], _68 = [1, { "com": _67, "edu": _67, "gov": _67, "mil": _67, "net": _67, "org": _67 }], _69 = [1, { "com": _67, "edu": _67, "gov": _67, "net": _67, "org": _67 }], _70 = [1, { "gov": _67 }], _71 = [0, { "*": _67 }], _72 = [1, { "co": _67, "com": _67, "edu": _67, "gov": _67, "net": _67, "org": _67 }], _73 = [1, { "com": _67, "edu": _67, "net": _67, "org": _67 }], _74 = [1, { "co": _67, "net": _67, "org": _67 }], _75 = [1, { "co": _67, "com": _67, "edu": _67, "gov": _67, "mil": _67, "net": _67, "nom": _67, "org": _67 }], _76 = [1, { "biz": _67, "com": _67, "edu": _67, "gov": _67, "info": _67, "net": _67, "org": _67 }], _77 = [1, { "gs": _67 }], _78 = [0, { "nes": _67 }], _79 = [1, { "k12": _67, "cc": _67, "lib": _67 }], _80 = [1, { "cc": _67 }], _81 = [1, { "cc": _67, "lib": _67 }];
const rules = [0, { "ac": _68, "ad": _67, "ae": [1, { "ac": _67, "co": _67, "gov": _67, "mil": _67, "net": _67, "org": _67, "sch": _67 }], "aero": [1, { "airline": _67, "airport": _67, "accident-investigation": _67, "accident-prevention": _67, "aerobatic": _67, "aeroclub": _67, "aerodrome": _67, "agents": _67, "air-surveillance": _67, "air-traffic-control": _67, "aircraft": _67, "airtraffic": _67, "ambulance": _67, "association": _67, "author": _67, "ballooning": _67, "broker": _67, "caa": _67, "cargo": _67, "catering": _67, "certification": _67, "championship": _67, "charter": _67, "civilaviation": _67, "club": _67, "conference": _67, "consultant": _67, "consulting": _67, "control": _67, "council": _67, "crew": _67, "design": _67, "dgca": _67, "educator": _67, "emergency": _67, "engine": _67, "engineer": _67, "entertainment": _67, "equipment": _67, "exchange": _67, "express": _67, "federation": _67, "flight": _67, "freight": _67, "fuel": _67, "gliding": _67, "government": _67, "groundhandling": _67, "group": _67, "hanggliding": _67, "homebuilt": _67, "insurance": _67, "journal": _67, "journalist": _67, "leasing": _67, "logistics": _67, "magazine": _67, "maintenance": _67, "marketplace": _67, "media": _67, "microlight": _67, "modelling": _67, "navigation": _67, "parachuting": _67, "paragliding": _67, "passenger-association": _67, "pilot": _67, "press": _67, "production": _67, "recreation": _67, "repbody": _67, "res": _67, "research": _67, "rotorcraft": _67, "safety": _67, "scientist": _67, "services": _67, "show": _67, "skydiving": _67, "software": _67, "student": _67, "taxi": _67, "trader": _67, "trading": _67, "trainer": _67, "union": _67, "workinggroup": _67, "works": _67 }], "af": _69, "ag": [1, { "co": _67, "com": _67, "net": _67, "nom": _67, "org": _67 }], "ai": [1, { "com": _67, "net": _67, "off": _67, "org": _67 }], "al": _68, "am": [1, { "co": _67, "com": _67, "commune": _67, "net": _67, "org": _67 }], "ao": [1, { "co": _67, "ed": _67, "edu": _67, "gov": _67, "gv": _67, "it": _67, "og": _67, "org": _67, "pb": _67 }], "aq": _67, "ar": [1, { "bet": _67, "com": _67, "coop": _67, "edu": _67, "gob": _67, "gov": _67, "int": _67, "mil": _67, "musica": _67, "mutual": _67, "net": _67, "org": _67, "seg": _67, "senasa": _67, "tur": _67 }], "arpa": [1, { "e164": _67, "home": _67, "in-addr": _67, "ip6": _67, "iris": _67, "uri": _67, "urn": _67 }], "as": _70, "asia": _67, "at": [1, { "ac": [1, { "sth": _67 }], "co": _67, "gv": _67, "or": _67 }], "au": [1, { "asn": _67, "com": _67, "edu": [1, { "act": _67, "catholic": _67, "nsw": [1, { "schools": _67 }], "nt": _67, "qld": _67, "sa": _67, "tas": _67, "vic": _67, "wa": _67 }], "gov": [1, { "qld": _67, "sa": _67, "tas": _67, "vic": _67, "wa": _67 }], "id": _67, "net": _67, "org": _67, "conf": _67, "oz": _67, "act": _67, "nsw": _67, "nt": _67, "qld": _67, "sa": _67, "tas": _67, "vic": _67, "wa": _67 }], "aw": [1, { "com": _67 }], "ax": _67, "az": [1, { "biz": _67, "co": _67, "com": _67, "edu": _67, "gov": _67, "info": _67, "int": _67, "mil": _67, "name": _67, "net": _67, "org": _67, "pp": _67, "pro": _67 }], "ba": _68, "bb": [1, { "biz": _67, "co": _67, "com": _67, "edu": _67, "gov": _67, "info": _67, "net": _67, "org": _67, "store": _67, "tv": _67 }], "bd": _71, "be": [1, { "ac": _67 }], "bf": _70, "bg": [1, { "0": _67, "1": _67, "2": _67, "3": _67, "4": _67, "5": _67, "6": _67, "7": _67, "8": _67, "9": _67, "a": _67, "b": _67, "c": _67, "d": _67, "e": _67, "f": _67, "g": _67, "h": _67, "i": _67, "j": _67, "k": _67, "l": _67, "m": _67, "n": _67, "o": _67, "p": _67, "q": _67, "r": _67, "s": _67, "t": _67, "u": _67, "v": _67, "w": _67, "x": _67, "y": _67, "z": _67 }], "bh": _69, "bi": [1, { "co": _67, "com": _67, "edu": _67, "or": _67, "org": _67 }], "biz": _67, "bj": [1, { "africa": _67, "agro": _67, "architectes": _67, "assur": _67, "avocats": _67, "co": _67, "com": _67, "eco": _67, "econo": _67, "edu": _67, "info": _67, "loisirs": _67, "money": _67, "net": _67, "org": _67, "ote": _67, "restaurant": _67, "resto": _67, "tourism": _67, "univ": _67 }], "bm": _69, "bn": _69, "bo": [1, { "com": _67, "edu": _67, "gob": _67, "int": _67, "mil": _67, "net": _67, "org": _67, "tv": _67, "web": _67, "academia": _67, "agro": _67, "arte": _67, "blog": _67, "bolivia": _67, "ciencia": _67, "cooperativa": _67, "democracia": _67, "deporte": _67, "ecologia": _67, "economia": _67, "empresa": _67, "indigena": _67, "industria": _67, "info": _67, "medicina": _67, "movimiento": _67, "musica": _67, "natural": _67, "nombre": _67, "noticias": _67, "patria": _67, "plurinacional": _67, "politica": _67, "profesional": _67, "pueblo": _67, "revista": _67, "salud": _67, "tecnologia": _67, "tksat": _67, "transporte": _67, "wiki": _67 }], "br": [1, { "9guacu": _67, "abc": _67, "adm": _67, "adv": _67, "agr": _67, "aju": _67, "am": _67, "anani": _67, "aparecida": _67, "app": _67, "arq": _67, "art": _67, "ato": _67, "b": _67, "barueri": _67, "belem": _67, "bet": _67, "bhz": _67, "bib": _67, "bio": _67, "blog": _67, "bmd": _67, "boavista": _67, "bsb": _67, "campinagrande": _67, "campinas": _67, "caxias": _67, "cim": _67, "cng": _67, "cnt": _67, "com": _67, "contagem": _67, "coop": _67, "coz": _67, "cri": _67, "cuiaba": _67, "curitiba": _67, "def": _67, "des": _67, "det": _67, "dev": _67, "ecn": _67, "eco": _67, "edu": _67, "emp": _67, "enf": _67, "eng": _67, "esp": _67, "etc": _67, "eti": _67, "far": _67, "feira": _67, "flog": _67, "floripa": _67, "fm": _67, "fnd": _67, "fortal": _67, "fot": _67, "foz": _67, "fst": _67, "g12": _67, "geo": _67, "ggf": _67, "goiania": _67, "gov": [1, { "ac": _67, "al": _67, "am": _67, "ap": _67, "ba": _67, "ce": _67, "df": _67, "es": _67, "go": _67, "ma": _67, "mg": _67, "ms": _67, "mt": _67, "pa": _67, "pb": _67, "pe": _67, "pi": _67, "pr": _67, "rj": _67, "rn": _67, "ro": _67, "rr": _67, "rs": _67, "sc": _67, "se": _67, "sp": _67, "to": _67 }], "gru": _67, "imb": _67, "ind": _67, "inf": _67, "jab": _67, "jampa": _67, "jdf": _67, "joinville": _67, "jor": _67, "jus": _67, "leg": _67, "leilao": _67, "lel": _67, "log": _67, "londrina": _67, "macapa": _67, "maceio": _67, "manaus": _67, "maringa": _67, "mat": _67, "med": _67, "mil": _67, "morena": _67, "mp": _67, "mus": _67, "natal": _67, "net": _67, "niteroi": _67, "nom": _71, "not": _67, "ntr": _67, "odo": _67, "ong": _67, "org": _67, "osasco": _67, "palmas": _67, "poa": _67, "ppg": _67, "pro": _67, "psc": _67, "psi": _67, "pvh": _67, "qsl": _67, "radio": _67, "rec": _67, "recife": _67, "rep": _67, "ribeirao": _67, "rio": _67, "riobranco": _67, "riopreto": _67, "salvador": _67, "sampa": _67, "santamaria": _67, "santoandre": _67, "saobernardo": _67, "saogonca": _67, "seg": _67, "sjc": _67, "slg": _67, "slz": _67, "sorocaba": _67, "srv": _67, "taxi": _67, "tc": _67, "tec": _67, "teo": _67, "the": _67, "tmp": _67, "trd": _67, "tur": _67, "tv": _67, "udi": _67, "vet": _67, "vix": _67, "vlog": _67, "wiki": _67, "zlg": _67 }], "bs": _69, "bt": _69, "bv": _67, "bw": [1, { "ac": _67, "co": _67, "gov": _67, "net": _67, "org": _67 }], "by": [1, { "gov": _67, "mil": _67, "com": _67, "of": _67 }], "bz": _72, "ca": [1, { "ab": _67, "bc": _67, "mb": _67, "nb": _67, "nf": _67, "nl": _67, "ns": _67, "nt": _67, "nu": _67, "on": _67, "pe": _67, "qc": _67, "sk": _67, "yk": _67, "gc": _67 }], "cat": _67, "cc": _67, "cd": _70, "cf": _67, "cg": _67, "ch": _67, "ci": [1, { "ac": _67, "xn--aroport-bya": _67, "aéroport": _67, "asso": _67, "co": _67, "com": _67, "ed": _67, "edu": _67, "go": _67, "gouv": _67, "int": _67, "net": _67, "or": _67, "org": _67 }], "ck": _71, "cl": [1, { "co": _67, "gob": _67, "gov": _67, "mil": _67 }], "cm": [1, { "co": _67, "com": _67, "gov": _67, "net": _67 }], "cn": [1, { "ac": _67, "com": _67, "edu": _67, "gov": _67, "mil": _67, "net": _67, "org": _67, "xn--55qx5d": _67, "公司": _67, "xn--od0alg": _67, "網絡": _67, "xn--io0a7i": _67, "网络": _67, "ah": _67, "bj": _67, "cq": _67, "fj": _67, "gd": _67, "gs": _67, "gx": _67, "gz": _67, "ha": _67, "hb": _67, "he": _67, "hi": _67, "hk": _67, "hl": _67, "hn": _67, "jl": _67, "js": _67, "jx": _67, "ln": _67, "mo": _67, "nm": _67, "nx": _67, "qh": _67, "sc": _67, "sd": _67, "sh": _67, "sn": _67, "sx": _67, "tj": _67, "tw": _67, "xj": _67, "xz": _67, "yn": _67, "zj": _67 }], "co": [1, { "com": _67, "edu": _67, "gov": _67, "mil": _67, "net": _67, "nom": _67, "org": _67 }], "com": _67, "coop": _67, "cr": [1, { "ac": _67, "co": _67, "ed": _67, "fi": _67, "go": _67, "or": _67, "sa": _67 }], "cu": [1, { "com": _67, "edu": _67, "gob": _67, "inf": _67, "nat": _67, "net": _67, "org": _67 }], "cv": [1, { "com": _67, "edu": _67, "id": _67, "int": _67, "net": _67, "nome": _67, "org": _67, "publ": _67 }], "cw": _73, "cx": _70, "cy": [1, { "ac": _67, "biz": _67, "com": _67, "ekloges": _67, "gov": _67, "ltd": _67, "mil": _67, "net": _67, "org": _67, "press": _67, "pro": _67, "tm": _67 }], "cz": _67, "de": _67, "dj": _67, "dk": _67, "dm": _72, "do": [1, { "art": _67, "com": _67, "edu": _67, "gob": _67, "gov": _67, "mil": _67, "net": _67, "org": _67, "sld": _67, "web": _67 }], "dz": [1, { "art": _67, "asso": _67, "com": _67, "edu": _67, "gov": _67, "net": _67, "org": _67, "pol": _67, "soc": _67, "tm": _67 }], "ec": [1, { "abg": _67, "adm": _67, "agron": _67, "arqt": _67, "art": _67, "bar": _67, "chef": _67, "com": _67, "cont": _67, "cpa": _67, "cue": _67, "dent": _67, "dgn": _67, "disco": _67, "doc": _67, "edu": _67, "eng": _67, "esm": _67, "fin": _67, "fot": _67, "gal": _67, "gob": _67, "gov": _67, "gye": _67, "ibr": _67, "info": _67, "k12": _67, "lat": _67, "loj": _67, "med": _67, "mil": _67, "mktg": _67, "mon": _67, "net": _67, "ntr": _67, "odont": _67, "org": _67, "pro": _67, "prof": _67, "psic": _67, "psiq": _67, "pub": _67, "rio": _67, "rrpp": _67, "sal": _67, "tech": _67, "tul": _67, "tur": _67, "uio": _67, "vet": _67, "xxx": _67 }], "edu": _67, "ee": [1, { "aip": _67, "com": _67, "edu": _67, "fie": _67, "gov": _67, "lib": _67, "med": _67, "org": _67, "pri": _67, "riik": _67 }], "eg": [1, { "ac": _67, "com": _67, "edu": _67, "eun": _67, "gov": _67, "info": _67, "me": _67, "mil": _67, "name": _67, "net": _67, "org": _67, "sci": _67, "sport": _67, "tv": _67 }], "er": _71, "es": [1, { "com": _67, "edu": _67, "gob": _67, "nom": _67, "org": _67 }], "et": [1, { "biz": _67, "com": _67, "edu": _67, "gov": _67, "info": _67, "name": _67, "net": _67, "org": _67 }], "eu": _67, "fi": [1, { "aland": _67 }], "fj": [1, { "ac": _67, "biz": _67, "com": _67, "gov": _67, "info": _67, "mil": _67, "name": _67, "net": _67, "org": _67, "pro": _67 }], "fk": _71, "fm": _73, "fo": _67, "fr": [1, { "asso": _67, "com": _67, "gouv": _67, "nom": _67, "prd": _67, "tm": _67, "avoues": _67, "cci": _67, "greta": _67, "huissier-justice": _67 }], "ga": _67, "gb": _67, "gd": [1, { "edu": _67, "gov": _67 }], "ge": [1, { "com": _67, "edu": _67, "gov": _67, "net": _67, "org": _67, "pvt": _67, "school": _67 }], "gf": _67, "gg": _74, "gh": [1, { "biz": _67, "com": _67, "edu": _67, "gov": _67, "mil": _67, "net": _67, "org": _67 }], "gi": [1, { "com": _67, "edu": _67, "gov": _67, "ltd": _67, "mod": _67, "org": _67 }], "gl": [1, { "co": _67, "com": _67, "edu": _67, "net": _67, "org": _67 }], "gm": _67, "gn": [1, { "ac": _67, "com": _67, "edu": _67, "gov": _67, "net": _67, "org": _67 }], "gov": _67, "gp": [1, { "asso": _67, "com": _67, "edu": _67, "mobi": _67, "net": _67, "org": _67 }], "gq": _67, "gr": _69, "gs": _67, "gt": [1, { "com": _67, "edu": _67, "gob": _67, "ind": _67, "mil": _67, "net": _67, "org": _67 }], "gu": [1, { "com": _67, "edu": _67, "gov": _67, "guam": _67, "info": _67, "net": _67, "org": _67, "web": _67 }], "gw": _67, "gy": _72, "hk": [1, { "com": _67, "edu": _67, "gov": _67, "idv": _67, "net": _67, "org": _67, "xn--ciqpn": _67, "个人": _67, "xn--gmqw5a": _67, "個人": _67, "xn--55qx5d": _67, "公司": _67, "xn--mxtq1m": _67, "政府": _67, "xn--lcvr32d": _67, "敎育": _67, "xn--wcvs22d": _67, "教育": _67, "xn--gmq050i": _67, "箇人": _67, "xn--uc0atv": _67, "組織": _67, "xn--uc0ay4a": _67, "組织": _67, "xn--od0alg": _67, "網絡": _67, "xn--zf0avx": _67, "網络": _67, "xn--mk0axi": _67, "组織": _67, "xn--tn0ag": _67, "组织": _67, "xn--od0aq3b": _67, "网絡": _67, "xn--io0a7i": _67, "网络": _67 }], "hm": _67, "hn": [1, { "com": _67, "edu": _67, "gob": _67, "mil": _67, "net": _67, "org": _67 }], "hr": [1, { "com": _67, "from": _67, "iz": _67, "name": _67 }], "ht": [1, { "adult": _67, "art": _67, "asso": _67, "com": _67, "coop": _67, "edu": _67, "firm": _67, "gouv": _67, "info": _67, "med": _67, "net": _67, "org": _67, "perso": _67, "pol": _67, "pro": _67, "rel": _67, "shop": _67 }], "hu": [1, { "2000": _67, "agrar": _67, "bolt": _67, "casino": _67, "city": _67, "co": _67, "erotica": _67, "erotika": _67, "film": _67, "forum": _67, "games": _67, "hotel": _67, "info": _67, "ingatlan": _67, "jogasz": _67, "konyvelo": _67, "lakas": _67, "media": _67, "news": _67, "org": _67, "priv": _67, "reklam": _67, "sex": _67, "shop": _67, "sport": _67, "suli": _67, "szex": _67, "tm": _67, "tozsde": _67, "utazas": _67, "video": _67 }], "id": [1, { "ac": _67, "biz": _67, "co": _67, "desa": _67, "go": _67, "kop": _67, "mil": _67, "my": _67, "net": _67, "or": _67, "ponpes": _67, "sch": _67, "web": _67 }], "ie": _70, "il": [1, { "ac": _67, "co": _67, "gov": _67, "idf": _67, "k12": _67, "muni": _67, "net": _67, "org": _67 }], "xn--4dbrk0ce": [1, { "xn--4dbgdty6c": _67, "xn--5dbhl8d": _67, "xn--8dbq2a": _67, "xn--hebda8b": _67 }], "ישראל": [1, { "אקדמיה": _67, "ישוב": _67, "צהל": _67, "ממשל": _67 }], "im": [1, { "ac": _67, "co": [1, { "ltd": _67, "plc": _67 }], "com": _67, "net": _67, "org": _67, "tt": _67, "tv": _67 }], "in": [1, { "5g": _67, "6g": _67, "ac": _67, "ai": _67, "am": _67, "bihar": _67, "biz": _67, "business": _67, "ca": _67, "cn": _67, "co": _67, "com": _67, "coop": _67, "cs": _67, "delhi": _67, "dr": _67, "edu": _67, "er": _67, "firm": _67, "gen": _67, "gov": _67, "gujarat": _67, "ind": _67, "info": _67, "int": _67, "internet": _67, "io": _67, "me": _67, "mil": _67, "net": _67, "nic": _67, "org": _67, "pg": _67, "post": _67, "pro": _67, "res": _67, "travel": _67, "tv": _67, "uk": _67, "up": _67, "us": _67 }], "info": _67, "int": [1, { "eu": _67 }], "io": _75, "iq": _68, "ir": [1, { "ac": _67, "co": _67, "gov": _67, "id": _67, "net": _67, "org": _67, "sch": _67, "xn--mgba3a4f16a": _67, "ایران": _67, "xn--mgba3a4fra": _67, "ايران": _67 }], "is": _67, "it": [1, { "edu": _67, "gov": _67, "abr": _67, "abruzzo": _67, "aosta-valley": _67, "aostavalley": _67, "bas": _67, "basilicata": _67, "cal": _67, "calabria": _67, "cam": _67, "campania": _67, "emilia-romagna": _67, "emiliaromagna": _67, "emr": _67, "friuli-v-giulia": _67, "friuli-ve-giulia": _67, "friuli-vegiulia": _67, "friuli-venezia-giulia": _67, "friuli-veneziagiulia": _67, "friuli-vgiulia": _67, "friuliv-giulia": _67, "friulive-giulia": _67, "friulivegiulia": _67, "friulivenezia-giulia": _67, "friuliveneziagiulia": _67, "friulivgiulia": _67, "fvg": _67, "laz": _67, "lazio": _67, "lig": _67, "liguria": _67, "lom": _67, "lombardia": _67, "lombardy": _67, "lucania": _67, "mar": _67, "marche": _67, "mol": _67, "molise": _67, "piedmont": _67, "piemonte": _67, "pmn": _67, "pug": _67, "puglia": _67, "sar": _67, "sardegna": _67, "sardinia": _67, "sic": _67, "sicilia": _67, "sicily": _67, "taa": _67, "tos": _67, "toscana": _67, "trentin-sud-tirol": _67, "xn--trentin-sd-tirol-rzb": _67, "trentin-süd-tirol": _67, "trentin-sudtirol": _67, "xn--trentin-sdtirol-7vb": _67, "trentin-südtirol": _67, "trentin-sued-tirol": _67, "trentin-suedtirol": _67, "trentino": _67, "trentino-a-adige": _67, "trentino-aadige": _67, "trentino-alto-adige": _67, "trentino-altoadige": _67, "trentino-s-tirol": _67, "trentino-stirol": _67, "trentino-sud-tirol": _67, "xn--trentino-sd-tirol-c3b": _67, "trentino-süd-tirol": _67, "trentino-sudtirol": _67, "xn--trentino-sdtirol-szb": _67, "trentino-südtirol": _67, "trentino-sued-tirol": _67, "trentino-suedtirol": _67, "trentinoa-adige": _67, "trentinoaadige": _67, "trentinoalto-adige": _67, "trentinoaltoadige": _67, "trentinos-tirol": _67, "trentinostirol": _67, "trentinosud-tirol": _67, "xn--trentinosd-tirol-rzb": _67, "trentinosüd-tirol": _67, "trentinosudtirol": _67, "xn--trentinosdtirol-7vb": _67, "trentinosüdtirol": _67, "trentinosued-tirol": _67, "trentinosuedtirol": _67, "trentinsud-tirol": _67, "xn--trentinsd-tirol-6vb": _67, "trentinsüd-tirol": _67, "trentinsudtirol": _67, "xn--trentinsdtirol-nsb": _67, "trentinsüdtirol": _67, "trentinsued-tirol": _67, "trentinsuedtirol": _67, "tuscany": _67, "umb": _67, "umbria": _67, "val-d-aosta": _67, "val-daosta": _67, "vald-aosta": _67, "valdaosta": _67, "valle-aosta": _67, "valle-d-aosta": _67, "valle-daosta": _67, "valleaosta": _67, "valled-aosta": _67, "valledaosta": _67, "vallee-aoste": _67, "xn--valle-aoste-ebb": _67, "vallée-aoste": _67, "vallee-d-aoste": _67, "xn--valle-d-aoste-ehb": _67, "vallée-d-aoste": _67, "valleeaoste": _67, "xn--valleaoste-e7a": _67, "valléeaoste": _67, "valleedaoste": _67, "xn--valledaoste-ebb": _67, "valléedaoste": _67, "vao": _67, "vda": _67, "ven": _67, "veneto": _67, "ag": _67, "agrigento": _67, "al": _67, "alessandria": _67, "alto-adige": _67, "altoadige": _67, "an": _67, "ancona": _67, "andria-barletta-trani": _67, "andria-trani-barletta": _67, "andriabarlettatrani": _67, "andriatranibarletta": _67, "ao": _67, "aosta": _67, "aoste": _67, "ap": _67, "aq": _67, "aquila": _67, "ar": _67, "arezzo": _67, "ascoli-piceno": _67, "ascolipiceno": _67, "asti": _67, "at": _67, "av": _67, "avellino": _67, "ba": _67, "balsan": _67, "balsan-sudtirol": _67, "xn--balsan-sdtirol-nsb": _67, "balsan-südtirol": _67, "balsan-suedtirol": _67, "bari": _67, "barletta-trani-andria": _67, "barlettatraniandria": _67, "belluno": _67, "benevento": _67, "bergamo": _67, "bg": _67, "bi": _67, "biella": _67, "bl": _67, "bn": _67, "bo": _67, "bologna": _67, "bolzano": _67, "bolzano-altoadige": _67, "bozen": _67, "bozen-sudtirol": _67, "xn--bozen-sdtirol-2ob": _67, "bozen-südtirol": _67, "bozen-suedtirol": _67, "br": _67, "brescia": _67, "brindisi": _67, "bs": _67, "bt": _67, "bulsan": _67, "bulsan-sudtirol": _67, "xn--bulsan-sdtirol-nsb": _67, "bulsan-südtirol": _67, "bulsan-suedtirol": _67, "bz": _67, "ca": _67, "cagliari": _67, "caltanissetta": _67, "campidano-medio": _67, "campidanomedio": _67, "campobasso": _67, "carbonia-iglesias": _67, "carboniaiglesias": _67, "carrara-massa": _67, "carraramassa": _67, "caserta": _67, "catania": _67, "catanzaro": _67, "cb": _67, "ce": _67, "cesena-forli": _67, "xn--cesena-forl-mcb": _67, "cesena-forlì": _67, "cesenaforli": _67, "xn--cesenaforl-i8a": _67, "cesenaforlì": _67, "ch": _67, "chieti": _67, "ci": _67, "cl": _67, "cn": _67, "co": _67, "como": _67, "cosenza": _67, "cr": _67, "cremona": _67, "crotone": _67, "cs": _67, "ct": _67, "cuneo": _67, "cz": _67, "dell-ogliastra": _67, "dellogliastra": _67, "en": _67, "enna": _67, "fc": _67, "fe": _67, "fermo": _67, "ferrara": _67, "fg": _67, "fi": _67, "firenze": _67, "florence": _67, "fm": _67, "foggia": _67, "forli-cesena": _67, "xn--forl-cesena-fcb": _67, "forlì-cesena": _67, "forlicesena": _67, "xn--forlcesena-c8a": _67, "forlìcesena": _67, "fr": _67, "frosinone": _67, "ge": _67, "genoa": _67, "genova": _67, "go": _67, "gorizia": _67, "gr": _67, "grosseto": _67, "iglesias-carbonia": _67, "iglesiascarbonia": _67, "im": _67, "imperia": _67, "is": _67, "isernia": _67, "kr": _67, "la-spezia": _67, "laquila": _67, "laspezia": _67, "latina": _67, "lc": _67, "le": _67, "lecce": _67, "lecco": _67, "li": _67, "livorno": _67, "lo": _67, "lodi": _67, "lt": _67, "lu": _67, "lucca": _67, "macerata": _67, "mantova": _67, "massa-carrara": _67, "massacarrara": _67, "matera": _67, "mb": _67, "mc": _67, "me": _67, "medio-campidano": _67, "mediocampidano": _67, "messina": _67, "mi": _67, "milan": _67, "milano": _67, "mn": _67, "mo": _67, "modena": _67, "monza": _67, "monza-brianza": _67, "monza-e-della-brianza": _67, "monzabrianza": _67, "monzaebrianza": _67, "monzaedellabrianza": _67, "ms": _67, "mt": _67, "na": _67, "naples": _67, "napoli": _67, "no": _67, "novara": _67, "nu": _67, "nuoro": _67, "og": _67, "ogliastra": _67, "olbia-tempio": _67, "olbiatempio": _67, "or": _67, "oristano": _67, "ot": _67, "pa": _67, "padova": _67, "padua": _67, "palermo": _67, "parma": _67, "pavia": _67, "pc": _67, "pd": _67, "pe": _67, "perugia": _67, "pesaro-urbino": _67, "pesarourbino": _67, "pescara": _67, "pg": _67, "pi": _67, "piacenza": _67, "pisa": _67, "pistoia": _67, "pn": _67, "po": _67, "pordenone": _67, "potenza": _67, "pr": _67, "prato": _67, "pt": _67, "pu": _67, "pv": _67, "pz": _67, "ra": _67, "ragusa": _67, "ravenna": _67, "rc": _67, "re": _67, "reggio-calabria": _67, "reggio-emilia": _67, "reggiocalabria": _67, "reggioemilia": _67, "rg": _67, "ri": _67, "rieti": _67, "rimini": _67, "rm": _67, "rn": _67, "ro": _67, "roma": _67, "rome": _67, "rovigo": _67, "sa": _67, "salerno": _67, "sassari": _67, "savona": _67, "si": _67, "siena": _67, "siracusa": _67, "so": _67, "sondrio": _67, "sp": _67, "sr": _67, "ss": _67, "xn--sdtirol-n2a": _67, "südtirol": _67, "suedtirol": _67, "sv": _67, "ta": _67, "taranto": _67, "te": _67, "tempio-olbia": _67, "tempioolbia": _67, "teramo": _67, "terni": _67, "tn": _67, "to": _67, "torino": _67, "tp": _67, "tr": _67, "trani-andria-barletta": _67, "trani-barletta-andria": _67, "traniandriabarletta": _67, "tranibarlettaandria": _67, "trapani": _67, "trento": _67, "treviso": _67, "trieste": _67, "ts": _67, "turin": _67, "tv": _67, "ud": _67, "udine": _67, "urbino-pesaro": _67, "urbinopesaro": _67, "va": _67, "varese": _67, "vb": _67, "vc": _67, "ve": _67, "venezia": _67, "venice": _67, "verbania": _67, "vercelli": _67, "verona": _67, "vi": _67, "vibo-valentia": _67, "vibovalentia": _67, "vicenza": _67, "viterbo": _67, "vr": _67, "vs": _67, "vt": _67, "vv": _67 }], "je": _74, "jm": _71, "jo": [1, { "agri": _67, "ai": _67, "com": _67, "edu": _67, "eng": _67, "fm": _67, "gov": _67, "mil": _67, "net": _67, "org": _67, "per": _67, "phd": _67, "sch": _67, "tv": _67 }], "jobs": _67, "jp": [1, { "ac": _67, "ad": _67, "co": _67, "ed": _67, "go": _67, "gr": _67, "lg": _67, "ne": _67, "or": _67, "aichi": [1, { "aisai": _67, "ama": _67, "anjo": _67, "asuke": _67, "chiryu": _67, "chita": _67, "fuso": _67, "gamagori": _67, "handa": _67, "hazu": _67, "hekinan": _67, "higashiura": _67, "ichinomiya": _67, "inazawa": _67, "inuyama": _67, "isshiki": _67, "iwakura": _67, "kanie": _67, "kariya": _67, "kasugai": _67, "kira": _67, "kiyosu": _67, "komaki": _67, "konan": _67, "kota": _67, "mihama": _67, "miyoshi": _67, "nishio": _67, "nisshin": _67, "obu": _67, "oguchi": _67, "oharu": _67, "okazaki": _67, "owariasahi": _67, "seto": _67, "shikatsu": _67, "shinshiro": _67, "shitara": _67, "tahara": _67, "takahama": _67, "tobishima": _67, "toei": _67, "togo": _67, "tokai": _67, "tokoname": _67, "toyoake": _67, "toyohashi": _67, "toyokawa": _67, "toyone": _67, "toyota": _67, "tsushima": _67, "yatomi": _67 }], "akita": [1, { "akita": _67, "daisen": _67, "fujisato": _67, "gojome": _67, "hachirogata": _67, "happou": _67, "higashinaruse": _67, "honjo": _67, "honjyo": _67, "ikawa": _67, "kamikoani": _67, "kamioka": _67, "katagami": _67, "kazuno": _67, "kitaakita": _67, "kosaka": _67, "kyowa": _67, "misato": _67, "mitane": _67, "moriyoshi": _67, "nikaho": _67, "noshiro": _67, "odate": _67, "oga": _67, "ogata": _67, "semboku": _67, "yokote": _67, "yurihonjo": _67 }], "aomori": [1, { "aomori": _67, "gonohe": _67, "hachinohe": _67, "hashikami": _67, "hiranai": _67, "hirosaki": _67, "itayanagi": _67, "kuroishi": _67, "misawa": _67, "mutsu": _67, "nakadomari": _67, "noheji": _67, "oirase": _67, "owani": _67, "rokunohe": _67, "sannohe": _67, "shichinohe": _67, "shingo": _67, "takko": _67, "towada": _67, "tsugaru": _67, "tsuruta": _67 }], "chiba": [1, { "abiko": _67, "asahi": _67, "chonan": _67, "chosei": _67, "choshi": _67, "chuo": _67, "funabashi": _67, "futtsu": _67, "hanamigawa": _67, "ichihara": _67, "ichikawa": _67, "ichinomiya": _67, "inzai": _67, "isumi": _67, "kamagaya": _67, "kamogawa": _67, "kashiwa": _67, "katori": _67, "katsuura": _67, "kimitsu": _67, "kisarazu": _67, "kozaki": _67, "kujukuri": _67, "kyonan": _67, "matsudo": _67, "midori": _67, "mihama": _67, "minamiboso": _67, "mobara": _67, "mutsuzawa": _67, "nagara": _67, "nagareyama": _67, "narashino": _67, "narita": _67, "noda": _67, "oamishirasato": _67, "omigawa": _67, "onjuku": _67, "otaki": _67, "sakae": _67, "sakura": _67, "shimofusa": _67, "shirako": _67, "shiroi": _67, "shisui": _67, "sodegaura": _67, "sosa": _67, "tako": _67, "tateyama": _67, "togane": _67, "tohnosho": _67, "tomisato": _67, "urayasu": _67, "yachimata": _67, "yachiyo": _67, "yokaichiba": _67, "yokoshibahikari": _67, "yotsukaido": _67 }], "ehime": [1, { "ainan": _67, "honai": _67, "ikata": _67, "imabari": _67, "iyo": _67, "kamijima": _67, "kihoku": _67, "kumakogen": _67, "masaki": _67, "matsuno": _67, "matsuyama": _67, "namikata": _67, "niihama": _67, "ozu": _67, "saijo": _67, "seiyo": _67, "shikokuchuo": _67, "tobe": _67, "toon": _67, "uchiko": _67, "uwajima": _67, "yawatahama": _67 }], "fukui": [1, { "echizen": _67, "eiheiji": _67, "fukui": _67, "ikeda": _67, "katsuyama": _67, "mihama": _67, "minamiechizen": _67, "obama": _67, "ohi": _67, "ono": _67, "sabae": _67, "sakai": _67, "takahama": _67, "tsuruga": _67, "wakasa": _67 }], "fukuoka": [1, { "ashiya": _67, "buzen": _67, "chikugo": _67, "chikuho": _67, "chikujo": _67, "chikushino": _67, "chikuzen": _67, "chuo": _67, "dazaifu": _67, "fukuchi": _67, "hakata": _67, "higashi": _67, "hirokawa": _67, "hisayama": _67, "iizuka": _67, "inatsuki": _67, "kaho": _67, "kasuga": _67, "kasuya": _67, "kawara": _67, "keisen": _67, "koga": _67, "kurate": _67, "kurogi": _67, "kurume": _67, "minami": _67, "miyako": _67, "miyama": _67, "miyawaka": _67, "mizumaki": _67, "munakata": _67, "nakagawa": _67, "nakama": _67, "nishi": _67, "nogata": _67, "ogori": _67, "okagaki": _67, "okawa": _67, "oki": _67, "omuta": _67, "onga": _67, "onojo": _67, "oto": _67, "saigawa": _67, "sasaguri": _67, "shingu": _67, "shinyoshitomi": _67, "shonai": _67, "soeda": _67, "sue": _67, "tachiarai": _67, "tagawa": _67, "takata": _67, "toho": _67, "toyotsu": _67, "tsuiki": _67, "ukiha": _67, "umi": _67, "usui": _67, "yamada": _67, "yame": _67, "yanagawa": _67, "yukuhashi": _67 }], "fukushima": [1, { "aizubange": _67, "aizumisato": _67, "aizuwakamatsu": _67, "asakawa": _67, "bandai": _67, "date": _67, "fukushima": _67, "furudono": _67, "futaba": _67, "hanawa": _67, "higashi": _67, "hirata": _67, "hirono": _67, "iitate": _67, "inawashiro": _67, "ishikawa": _67, "iwaki": _67, "izumizaki": _67, "kagamiishi": _67, "kaneyama": _67, "kawamata": _67, "kitakata": _67, "kitashiobara": _67, "koori": _67, "koriyama": _67, "kunimi": _67, "miharu": _67, "mishima": _67, "namie": _67, "nango": _67, "nishiaizu": _67, "nishigo": _67, "okuma": _67, "omotego": _67, "ono": _67, "otama": _67, "samegawa": _67, "shimogo": _67, "shirakawa": _67, "showa": _67, "soma": _67, "sukagawa": _67, "taishin": _67, "tamakawa": _67, "tanagura": _67, "tenei": _67, "yabuki": _67, "yamato": _67, "yamatsuri": _67, "yanaizu": _67, "yugawa": _67 }], "gifu": [1, { "anpachi": _67, "ena": _67, "gifu": _67, "ginan": _67, "godo": _67, "gujo": _67, "hashima": _67, "hichiso": _67, "hida": _67, "higashishirakawa": _67, "ibigawa": _67, "ikeda": _67, "kakamigahara": _67, "kani": _67, "kasahara": _67, "kasamatsu": _67, "kawaue": _67, "kitagata": _67, "mino": _67, "minokamo": _67, "mitake": _67, "mizunami": _67, "motosu": _67, "nakatsugawa": _67, "ogaki": _67, "sakahogi": _67, "seki": _67, "sekigahara": _67, "shirakawa": _67, "tajimi": _67, "takayama": _67, "tarui": _67, "toki": _67, "tomika": _67, "wanouchi": _67, "yamagata": _67, "yaotsu": _67, "yoro": _67 }], "gunma": [1, { "annaka": _67, "chiyoda": _67, "fujioka": _67, "higashiagatsuma": _67, "isesaki": _67, "itakura": _67, "kanna": _67, "kanra": _67, "katashina": _67, "kawaba": _67, "kiryu": _67, "kusatsu": _67, "maebashi": _67, "meiwa": _67, "midori": _67, "minakami": _67, "naganohara": _67, "nakanojo": _67, "nanmoku": _67, "numata": _67, "oizumi": _67, "ora": _67, "ota": _67, "shibukawa": _67, "shimonita": _67, "shinto": _67, "showa": _67, "takasaki": _67, "takayama": _67, "tamamura": _67, "tatebayashi": _67, "tomioka": _67, "tsukiyono": _67, "tsumagoi": _67, "ueno": _67, "yoshioka": _67 }], "hiroshima": [1, { "asaminami": _67, "daiwa": _67, "etajima": _67, "fuchu": _67, "fukuyama": _67, "hatsukaichi": _67, "higashihiroshima": _67, "hongo": _67, "jinsekikogen": _67, "kaita": _67, "kui": _67, "kumano": _67, "kure": _67, "mihara": _67, "miyoshi": _67, "naka": _67, "onomichi